Prolog
Z Varhoo
(Rozdíly mezi verzemi)
(→Interpret) |
|||
Řádka 10: | Řádka 10: | ||
compile('test.pl'). |
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) . |
Aktuální verze z 13. 5. 2012, 00:02
Obsah |
[editovat] Instalace interpretu
Fedora:
yum install ppl-swi-prolog
[editovat] Interpret swi-prolog
Načtení zdrojového souboru. Stejný příkaz se provede i pro znovu načtení.:
compile('test.pl').
[editovat] Příklady
[editovat] 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) .