Prolog

Z Varhoo
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(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, 01: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) .
Osobní nástroje