char jako równanie

0

Dobry wieczór!
Chcę sobie napisać program, który będzie mi sprawdzał, czy dwa równania boolowskie są równoważne, na zasadzie:

Zakładam, że ilość zmiennych nie przekracza 10
Wprowadzam jedno równanie np.: F=(/ab+a)(/b+/bc) --- /a znaczy "nie a"
Wprowadzam drugie równanie G=a*/b
Program wprowadza wszystkie możliwe kombinacje 0 i 1 pod zmienne do obydwu funkcji i porównuje wyniki i informuje mnie, czy są równoważne, czy nie (w powyższym przypadku są)

I chcę to zrobić to najprościej jak się da - stąd pytanie do Was, czy da się zrobić tak, że wprowadzam jakiś ciąg znaków do np. tablicy wzor1, a potem w takiej formie w jakiej go wpisałem wrzucić do kodu jako
y=jakasfunkcja(wzor1)?
Jest na to jakiś prosty sposób? Oczywiście na początku chcę zrobić coś bardziej prostego, bez zaprzeczeń itd. czy np. a+b == b+a etc.
Pozdrawiam!

3

Dla równań ze zmiennymi typu bool możesz spokojnie zrobić sobie tabelkę prawdy dla 10 zmiennych - będzie tam zaledwie 1024 kombinacji.

Nie widzę prostszego sposobu niż utworzenie prostego parsera i sprawdzenie wyniku dla każdej z kombinacji - ale to nie znaczy, że jest to niemożliwe.

Ogółem, chciałbyś coś takiego (przykład dla 3 zmiennych):

// COMBINATIONS = pow(2, ilosc_zmiennych)
bool compare(char const* f1, char const* f2)
{
    for(unsigned i = 0; i < COMBINATIONS; ++i){
        if(eval(f1, i & 1, i & 2, i & 4) != eval(f2, i & 1, i & 2, i & 4)){
            return false;
        }
    }
    return true;
}

Możliwe, że da się prościej i czegoś oczywistego nie zauważam.

0

Dzięki kq
Jestem takim noobem, że nawet nie wiem czy Twój kod załatwia mój problem.. mógłbyś mnie naprowadzić, gdzie mogę znaleźć opis funkcji eval w C? Bo chyba jestem ślepy.
Coś na wikipedii znalazłem i jeśli dobrze rozumiem - bierze stringa i traktuje je jak faktyczne równanie, tak?
Jeśli tak, to tylko tego było mi trzeba i dzięki :)

2

To pseudokod, eval byś musiał napisać sam. Tutaj założyłem, że przekazujesz funkcję (w formie tekstowej) w 1. parametrze, a potem jej argumenty, np:

eval("a ^ b", 0, 0) ⟶ 0
eval("a ^ b", 0, 1) ⟶ 1
eval("a ^ b", 1, 0) ⟶ 1
eval("a ^ b", 1, 1) ⟶ 0
0

Aaah, dobra, rozumiem.. Czyli załatwia problem ciut inaczej niż założyłem :) Ciocia wikipedia mnie ciut zbiła z tropu
https://en.wikipedia.org/wiki/Eval - jeśli dobrze zrozumiałem, to założenie takiej funkcji eval byłoby idealne. Ale spróbuję wpierw faktycznie z tą tabelką prawdy, a potem może spróbuję stworzyć własną funkcję eval, taką jaką opisuje wiki.
Jeszcze raz dzięki!

2

eval wykonuje tekst jako funkcję (ewaluuje ;) ). Tabelkę prawdy robisz sobie dla wykonania podanej funkcji za pomocą Twojego eval dla wszystkich możliwych kombinacji wejść (tak jak wyżej pokazałem dla a xor b).

Jak byś tak chciał robić to na pewno nie jest to optymalne rozwiązanie pod pewnymi względami - np. parsowanie tekstu do AST zdecydowanie nie ma sensu za każdym razem, ale na potrzeby przykładowego programu może być.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0