Prolog中的这个程序做什么?

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

这样做的目的是什么:

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, !.
你在告诉序言,如果你在
Town1
和Town
X
之间找到一条路,然后从Town
X
开始,有一条路线可以完成
Town1
Town2
之间的路径,然后递归;如果在
X
Town2
之间有一条直达路,那么谓词在yo你的问题成立。如果不是,它将递归循环。最终,
Dist2
将有一个最终值,该值将浮回到该谓词

这就是
的用武之地。一旦你有了一条有效的路线,它会说“停下来,不要试图找到另一条路线,我只想要一条路线。”。不要回溯任何其他可能的路线。”否则,您将得到多个
写入(“从坦帕到堪萨斯城的距离为”,X),nl.
,具有不同的
X
值,这对本程序的作者可能没有意义


另外,正如@DavidTonhofer所说,
=
应该替换为
is
,因为后者将强制进行算术计算。例如
X=2+4
X
与未计算的表达式
2+4
进行比较,但是使用
is
时,您将
X
6
进行比较,我建议您使用下午(或两个)查看youtube上的这个频道:
意味着一旦你找到了一个解决方案,就停下来,不要再找了。我很快会写一个正式答案。我不太相信我没有在这个答案中出错;这是我的第一个
序言
答案。如果是这样,请随意编辑和更正。是的,
意味着提交到当前子句”。不要为此谓词尝试任何其他子句,也不要回溯到“!”的左侧。这就是为什么子句通常可以被理解为:
head:-guard\u to\u test\u前提条件,!,额外的\u计算。
。阅读
路线(Town1,Town2,Distance)也更容易
条款作为声明:如果有一条道路从
Town1
X
且距离为
Dist1
,并且有一条从
X
Town2
且距离为
Dist2
的道路,则
Dist1
Dist2
(虽然
=
应该是
is
)。这就解释了为什么可以调用
route(坦帕,戈登,300)
,Prolog说是。cut致力于找到的第一个解决方案。“cut”的有趣部分“它经常迫使您后退一步,重新思考Prolog实际上在做什么,并重新确定您的编程反应。它永远不会变老。