Prolog中的递归问题

时间:2011-11-26 17:20:06

标签: recursion prolog backtracking

我在prolog中遇到了一些困难,我正在尝试编写一个谓词,它将返回两个城市之间的所有路径,尽管目前它返回它在无限循环中找到的第一条路径。我不知道自己哪里出错了,但我一整天都想弄清楚这一点,而且我无处可去。

可以提供任何可以提供的帮助。

go:-
    repeat,
    f([],0,lon,spa,OP,OD),
    write(OP),
    write(OD),
    fail.

city(lon).
city(ath).
city(spa).
city(kol).

path(lon,1,ath).
path(ath,3,spa).
path(spa,2,kol).
path(lon,1,kol).

joined(X,Y,D):-
    path(X,D,Y);path(Y,D,X).

f(Ci_Vi,Di,De,De,PaO,Di):-
    append([De],Ci_Vi,PaO),
    !.
f(Cities_Visited,Distance,Start,Destination,Output_Path,Output_Distance):-
    repeat,
    city(X),
    joined(Start,X,D),
    not_member(X,Cities_Visited),
    New_Distance is Distance + D,
    f([Start|Cities_Visited],New_Distance,X,Destination,Output_Path,Output_Distance).

not_member(X,List):-
    member(X,List),
    !,
    fail.
not_member(X,List).

我期待的输出是[spa,ath,lon] 4 [spa,kol,lon] 3。

再次,任何帮助将不胜感激。

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

您的解决方案基本上是正确的。键入f([],0,lon,spa,OP,OD),然后按预期获得第一个路径。我能看到的唯一错误是您在搜索谓词中使用repeat,这就是您继续计算相同解决方案的原因。在业务逻辑中几乎不需要repeat - 解决方案的回溯已经内置到REP循环中。拿出来,你会得到预期的第二条路径,然后(正确)失败。