Vyhodnocování logických výrazů. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= "Contrariwise," continued Tweedledee, "if it was so, it might be, and if it were so, it would be; but as it isn't, it ain't. That's logic!" -- Lewis Carroll, "Through the Looking Glass" Jedna z věcí, na které se prolog často používá je rozpoznávání různých gramatik a jejich interpretace. V prologu existují i systémy pro analýzu Angličtiny (a asi i Češtiny). Popsal jsem tu logický kalkul. Jeho základem jsou logické výrazy a tak bych tu ukázal program, který je umí řešit. Úkolem je napsat predikát, který dostane dva parametry - výraz a tabulku proměných a na výstupním parametru bude 1, nebo 0 podle pravdivosti výrazu. Definice upraveného jazyka pro logické výrazy může být asi následující: Formule jsou: - Logické proměné - var(X) a pravdivostní hodnota se určuje podle hodnoty proměné X - Je li X formule potom i not X je formula a její pravdivostní hodnota je opačná - Jsou-li X a Y formule potom i and(X,Y) je formule a její pravdivostní hodnota se řídí tabulkou: X Y and(X,Y) 1 1 1 1 0 0 0 1 0 0 0 0 Formule tedy jsou: 1, not(1), and(1,0), and(not(1),1) atd... Podobně bych mohl dodefinovat i další spojky. Program pro prolog je vpodstatě přímočarým zápisem popsaných pravidel. Proměné jsem se rozhodl uložit jako seznam obsahující dvojice jméno-hodnota. Tedy například [a-0,b-1,c-0] atd... vyhodnot(0,_,0). %formule 0 vyhodnot(1,_,1). %formule 1 vyhodnot(var(N),Var,P) :- member(N-P,Var). %proměné vyhodnot(not(V),P,V2) :- vyhodnot(V,P,V1), vnot(V1,V2). %negace %hodnota not(X) se urcuje pomocí hodnoty X a %pravdivostní tabulki pro negaci: vnot(1,0). vnot(0,1). vyhodnot(and(X,Y),P,V) :- vyhodnot(X,P,X1),vyhodnot(Y,P,Y1), vand(X1,Y1,V) vand(1,1,1). %pravdivostní tabulka pro and vand(0,1,0). vand(1,0,0). vand(0,0,0). Program lze samozřejmě opět použít i na jiné účely. Například pro zjištění hodnot proměných, aby výraz byl (ne)pravdivý, nebo na určení pravdivostní tabulky funkce: ?- vyhodnot(and(not(var(b)),var(a)),[a-A,b-B],1). B = 0 A = 1 ; Podobným způsobem jde samozřejmě napsat překladač apod. výheň