这个程序在Prolog中做什么?

  • 本文关键字:Prolog 程序 prolog
  • 更新时间 :
  • 英文 :


这样做的目的是什么:

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).

我们说"如果在Town1Town2之间有一条直接的路,那么我们就完成了,不需要检查通过任何其他城镇的路线,因为这个一条路线,只要给我距离。"换句话说,我们在说"如果有一个匹配前两个参数的定义子句,那么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,如果你在Town1X之间找到一条路,然后从XTown1Town2之间有一条路,然后递归;如果在XTown2之间有一条直接的道路,那么你的问题顶部的谓词成立。如果不是,它将递归循环。最终,Dist2将有一个最终值,该值将浮动到该谓词。

这就是!的用武之地。一旦你有了一条站得住脚的路线,它就会说:"停,不要再找别的路线了,我只想要一条路线。"不要折回任何其他可能的路线。否则,您将得到具有不同X值的多个write("Distance from Tampa to Kansas City is ",X),nl.,这对于本程序的作者来说可能没有意义。

此外,正如@DavidTonhofer所说,=应该被is取代,因为后者将强制进行算术计算。例如,X = 2+4X与未求值的表达式2+4进行比较,但对于is,您将比较X6

最新更新