Prolog在列表错误中找到最小值

时间:2013-04-16 20:13:03

标签: prolog gnu-prolog

我试图让我的代码工作,但不知怎的,我陷入了一个问题,我是prolog的新手。这是我的代码。

    dist(valmiera, riga, 107).
%dist(riga, valmiera, 107).
dist(cesis, riga, 70).
dist(valmiera, rujiena,  50).
dist(rujiena, valka, 30).
dist(valmiera, strenci, 200).
dist(strenci, valka, 30).
dist(valmiera, cesis, 40).
dist(liepaja, saldus, 100).
dist(saldus, riga, 200).
dist(liepaja, jelgava, 270).
dist(jelgava, riga, 50).

path(A,B,C,[A,B]):- dist(A,B,C).
path(A,B,D,[A|As]):- dist(A,W,C), path(W,B,E,As), D is C+E.
%, findMin(YList, E), path(A,B,X,E),!.
shortestPath(A,B,X,E):-findall(Y,path(A,B,S,Y),YList), findMin(YList, E), path(A,B,X,E),!.


findMin([],fail).
findMin([H],E):-E=H,!.
findMin([H,V],E):-H<V, E=H,!; V<H, E=V, !; H=:=V, E=H, !.
findMin([H|T],E):-findMin(T,U), H<U, E=H,!;findMin(T,U), U<H, E=U,!;findMin(T,U), U=:=H, E=U,!.

但是当我调用findMin()时出现此错误

未捕获的异常:错误(type_error(可评估,'。'/ 2),(&lt;)/ 2)

我真的被卡住了,不知道该怎么办。任何帮助将不胜感激。

应用程序的目的是通过调用shortestPath()获取最短路径,路径在dist(a,b,distance)

1 个答案:

答案 0 :(得分:1)

例外情况是因为您要比较的术语是列表。

[liepaja,saldus,riga]<[liepaja,jelgava,riga] ?

表达式:

Term1 < Term2 

成功

eval(Term1) < eval(Term2)

因此,Term1和Term2必须是可评估的术语(例如,(1 + 1)&lt;(2 + 2))。

尝试更改shortestPath / 4正文:

shortestPath(A,B,X,E):-
   findall(couple(W,P),path(A,B,W,P),WP_List),
   findMin(WP_List, couple(Weight,ShortestPath)),...

通过这种方式,您可以获得一对夫妇(重量,路径),在findMin中,您可以获得每个路径的权重。