Хочу распечатать путь, но получаю ошибки - PullRequest
1 голос
/ 28 ноября 2011
  domains
  list=symbol*

  predicates
     path(symbol,symbol)
     solve(symbol,symbol,list)
     insert(symbol,list,list)

  clauses
  path(a,b). 
  path(b,c).
  path(c,d).
  path(d,e). 
  path(a,d).
  path(c,e).

solve(X, Z, P):-
    path(X,Z),
insert(Z,Temp,P),
P=Temp.

solve(X,Z,P):-
path(X,Y),
insert(Y,Temp,P),
P=Temp,
    solve(Y,Z,P).

insert(X,[X|Tail],Tail).
insert(X,[Y|Tail],[Y|Tail1]):-
insert(X,Tail,Tail1).

Хочу напечатать путь, по которому я шел при переходе от одной точки к другой. Но получаю ошибки. Например, я хочу:

goal
solve(a,c,P).

Ответ: Р = [а, б, в]

Ответы [ 2 ]

1 голос
/ 28 ноября 2011
search_path(Node, End, Temp, Path) :- path(Node,End),reverse([End | [Node | Temp]], Path).
search_path(Node, End, Temp, Path) :- 
  path(Node, Next),
  not(member(Node, Temp)),
  search_path(Next, End, [Node | Temp], Path).

solve(Start, End, Path) :- search_path(Start, End, [], Path).
1 голос
/ 28 ноября 2011

Я не понимаю, что делает ваш предикат решения. Вот мое предположение о том, как это должно быть:

solve(Start, End, [Start|PathMinusStart]) :-
    solve_(Start, End, PathMinusStart).
solve_(Start, End, [End]) :-
    path(Start, End).
solve_(Start, End, [Waypoint|Path]) :-
    path(Start, Waypoint),
    solve_(Waypoint, End, Path).

solve будет давать вам пути один за другим, используя ; для их просмотра (ну, я думаю, по крайней мере, поскольку я ничего не знаю о используемой вами реализации пролога).

...