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
和TownX
之间找到一条路,然后从TownX
开始,有一条路线可以完成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实际上在做什么,并重新确定您的编程反应。它永远不会变老。