Logični problemi in igre
Iz E-študij, proste zakladnice študentskega znanja
Prolog se uporablja pri reševanju logičnih problemov in za implementiranje strategij igranja logičnih iger. Če postavimo prologu vprašanje, kdo je sin Tonetove, mame, a ni Tonetov brat:
?- mama(M,tone) ,sin(X,M),not(brat (X,tone)).
bo prolog pravilno odgovoril:
M = marija X = tone
Igra z vžigalicami
Imamo poljubno število kupčkov spoljubnim številom vžigalic. Vsak igralec v eni potezi vzame neničelno število vžigalic z enega kupčka (lahko tudi cel kupček). Zgubi tisti, ki prvi nima poteze.
poteza(S,X,S1) :- brisi(X,S,S1).% izprazni kupček poteza(S,X,[Y1|S1]) : - brisi(Y,S,S1), % vzemi kupček med(X,0,Y),% vrni zmanjšan kupček Y1 is Y - X; brisi(X,[X|R],R). brisi(X,[Y|R],[Y|R1]) :- brisi(X,R,R1).
?- poteza([2,1],X,S). S = [1]; S = [2]; S = [1,1]; no
Iskanje zmagovite poteze s preiskovanjem celotnega drevesa:
%zmaga(Seznam_kupčkov, Vzeto_št_vžigalic, Nov_seznam) zmaga([X],X,[]) .% robni pogoj zmaga(Sez,X,Sez1) :- poteza(Sez,X,Sez1), % napravi potezo tako, da not(zmaga(Sez1,_,_)). % nasprotnik ne more zmagati
Izpolnjevanje logičnih izrazov
Procedura izpolni bo pri danem logičnem izrazu poiskala take vrednosti logičnih spremenljivk, da je izraz resničen:
?- izpolni(A & B <=> C). A = true B = true C = true; A = false B = true C = false; A = false B = false C = false; A = true B = false C = false; no
:- op(200,fy, neg). :- op(300,xfy, & ). :- op(400,xfy, v ). :- op(500,xfx, => ). :- op(600,xfx, <=> ).
izpolni(true). izpolni(X & Y) :- izpolni(X), izpolni(Y). izpolni(X v Y) :- izpolni(X); izpolni(Y). izpolni(X => Y) :- izpolni(Y v neg X). izpolni(X <=> Y) :- izpolni((Y => X) & (X => Y)). izpolni(neg X) :- ne_izpolni(X). ne_izpolni (false). ne_izpolni(X & Y) :- ne_izpolni(X); ne_izpolni(Y). ne_izpolni(X v Y) :- ne_izpolni(X), ne_izpolni(Y). ne_izpolni(X => Y) :- ne_izpolni(Y v neg X). ne_izpolni(X <=> Y) :- ne_izpolni((Y => X) & (X => Y)). ne_izpolni(neg X) :- izpolni(X).