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ň