Prolog

Z Varhoo
Přejít na: navigace, hledání

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) .
Osobní nástroje