这样做的目的是什么:
route(Town1,Town2,Distance):-
road(Town1,Town2,Distance).
同样,!
在这种情况下意味着什么?如果有人知道这是什么意思,因为我听到的都是"切";没有任何其他解释
%TRAVELLING SALESMAN PROBLEM
DOMAINS
town = symbol
distance = integer
PREDICATES
nondeterm road(town,town,distance)
nondeterm route(town,town,distance)
CLAUSES
road("tampa","houston",200).
road("gordon","tampa",300).
road("houston","gordon",100).
road("houston","kansas_city",120).
road("gordon","kansas_city",130).
route(Town1,Town2,Distance):-
road(Town1,Town2,Distance).
route(Town1,Town2,Distance):-
road(Town1,X,Dist1),
route(X,Town2,Dist2),
Distance=Dist1+Dist2, !.
GOAL
route("tampa", "kansas_city", X),
write("Distance from Tampa to Kansas City is ",X),nl.
Prolog程序大量使用递归,这就是为什么您需要一个基本情况来停止递归。:
route(Town1,Town2,Distance):-
road(Town1,Town2,Distance).
我们说"如果在Town1
和Town2
之间有一条直接的路,那么我们就完成了,不需要检查通过任何其他城镇的路线,因为这个是一条路线,只要给我距离。"换句话说,我们在说"如果有一个匹配前两个参数的定义子句,那么Distance
必须是什么才能完全匹配它?">
!
是cut/1
谓词。它停止了回溯。下面是更详细的描述:
有时需要有选择地关闭回溯。Prolog提供了一个执行此功能的谓词。它被称为cut/1,由一个感叹号(!)表示。
cut/1有效地告诉Prolog冻结到目前为止在该谓词中做出的所有决策。也就是说,如果需要回溯,它将自动失败而不尝试其他替代方法。
在你的代码中:
route(Town1,Town2,Distance):-
road(Town1,X,Dist1),
route(X,Town2,Dist2),
Distance=Dist1+Dist2, !.
你在告诉Prolog,如果你在Town1
和X
之间找到一条路,然后从X
到Town1
和Town2
之间有一条路,然后递归;如果在X
和Town2
之间有一条直接的道路,那么你的问题顶部的谓词成立。如果不是,它将递归循环。最终,Dist2
将有一个最终值,该值将浮动到该谓词。
这就是!
的用武之地。一旦你有了一条站得住脚的路线,它就会说:"停,不要再找别的路线了,我只想要一条路线。"不要折回任何其他可能的路线。否则,您将得到具有不同X
值的多个write("Distance from Tampa to Kansas City is ",X),nl.
,这对于本程序的作者来说可能没有意义。
此外,正如@DavidTonhofer所说,=
应该被is
取代,因为后者将强制进行算术计算。例如,X = 2+4
将X
与未求值的表达式2+4
进行比较,但对于is
,您将比较X
与6
。