Prolog
Z Varhoo
Obsah |
Instalace interpretu
Fedora:
yum install ppl-swi-prolog
Interpret swi-prolog
Načtení zdrojového souboru. Stejný příkaz se provede i pro znovu načtení.:
compile('test.pl').
Příklady
Procházení stavového prostoru:
Povolení přepisování dat
:- dynamic pos/2, size/2.
Vytvoření dalšího kroku v prostoru
next_step(SX,SY,NSX,NSY):- NSX is SX+1, NSY is SY, test(NSX,NSY) . next_step(SX,SY,NSX,NSY):- NSX is SX , NSY is SY+1, test(NSX,NSY) . next_step(SX,SY,NSX,NSY):- NSX is SX-1, NSY is SY, test(NSX,NSY) . next_step(SX,SY,NSX,NSY):- NSX is SX , NSY is SY-1, test(NSX,NSY) .
Kontrola zda bod patří do prostoru
test(SX,SY) :- size(W,H), SX < W, SY < H, SX >= 0, SY >= 0 .
Inicializace procházení
chess(W,H,[SX,SY],[CX,CY],R) :- retractall(size(_,_)), retractall(pos(_,_)), assert(size(W,H)), test(CX,CY), test(SX,SY), setof(RR,search([SX,SY],[CX,CY],RR),[RSH|RST]), length(RSH,AL), short(RST,RSH,AL,R).
Procházení stavového prostoru
search([SX,SY],[SX,SY],[(SX,SY)]). search([SX,SY],[SX,SY],_) :- !, fail. search([SX,SY],[CX,CY],[RH|TR]) :- writeln([SX,SY]), RH = (SX,SY), assert(pos(SX,SY)), next_step(SX,SY,NSX,NSY), not(pos(NSX,NSY)), search([NSX,NSY],[CX,CY],TR).
Zpětné mazání posledního kroku, je důležité, aby se našli všechny možné cesty
search([X,Y],_,_):- pos(X,Y), retract(pos(X,Y)), !, fail.
Nalezení nejkratší cesty
short([],A,_,A). short([H|T],A,LA,R) :- /* writeln([1,H,A]), */ length(H,LH), LH == LA, !, short(T,[H|A],LH,R). short([H|T],A,LA,R) :- length(H,LH), LH < LA, !, short(T,[H],LH,R). short([H|T],A,AL,R) :- short(T,A,AL,R) .