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ň