Recursion Prolog中的递归&寻找城市间的路径

Recursion Prolog中的递归&寻找城市间的路径,recursion,prolog,unification,Recursion,Prolog,Unification,我正在努力完成下面的练习,我发现自己对第三点完全困惑了 我们获得了以下旅游信息知识库: 很容易就可以知道是否有可能在两个城市之间旅行。我只是这样做了: connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y). travel(X, Y) :- connected(X, Y). travel(X, Z) :- connected(Y, Z), travel(X, Y). 然而,当我必须用一个变量来统一路径时,我完全糊涂了 我写道:

我正在努力完成下面的练习,我发现自己对第三点完全困惑了

我们获得了以下旅游信息知识库:

很容易就可以知道是否有可能在两个城市之间旅行。我只是这样做了:

connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
travel(X, Y) :- connected(X, Y).
travel(X, Z) :- connected(Y, Z), travel(X, Y).
然而,当我必须用一个变量来统一路径时,我完全糊涂了

我写道:

connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
connected(Y, Z, Out) :- connected(Y, Z).
travel(X, Y, Out) :- connected(X, Y).
travel(A, Z, Out) :- connected(Y, Z),travel(A, Y, connected(Y, Z, Out)).
并被称为
travel(纽约州洛杉矶市瓦尔蒙特)。

在跟踪过程中,除了末尾的匿名变量外,还有一个点显示了正确的路径:

travel(瓦尔蒙特、梅茨、连通(梅茨、巴黎、连通(巴黎、洛杉矶、17))

但我实际上不知道如何将它与变量
X
统一起来

我实在想不起这件事。谁能给我一个提示,把我推向正确的方向?我只是缺少一个终止条件还是什么

编辑:

现在我有:

connected(X,Y) :- byCar(X,Y);byTrain(X,Y);byPlane(X,Y).

go(X,Y) :- connected(X,Y).

travel(X,Y,go(X,Y)) :- connected(X,Y).
travel(A,Z,Path) :- travel(Y,Z,Path),go(A,Y,Path).

go(A,Y,Path) :- travel(A,Y,Path).
但它会像这样被卡住:

4    4  Exit: byPlane(paris,losAngeles) ? 
3    3  Exit: connected(paris,losAngeles) ? 
2    2  Exit: travel(paris,losAngeles,go(paris,losAngeles)) ? 
5    2  Call: go(metz,paris,go(paris,losAngeles)) ? 
6    3  Call: travel(metz,paris,go(paris,losAngeles)) ? 
7    4  Call: travel(_217,paris,go(paris,losAngeles)) ? 
8    5  Call: travel(_242,paris,go(paris,losAngeles)) ? 
9    6  Call: travel(_267,paris,go(paris,losAngeles)) ? 
10    7  Call: travel(_292,paris,go(paris,losAngeles)) ? 

我已经尝试过了,但是我无法让它构建整个
go(a,b,go(b,c))
等等。

我将给你递归的基本情况:

travel(X, Y, go(X, Y)) :- connected(X, Y).

递归情况看起来非常相似,除了您正在构建的
go/3
术语必须将位置作为其前两个参数,并将路径(另一个
go/2
go/3
术语)作为其第二个参数。

我已经由一位分析学家用以下方式向我解释了这一点:

您的目标是获得X=go(valmont,metz,go(metz,paris,go(paris,losAngeles)),以响应查询travel(valmont,losAngeles,X)

要解决这个问题,travel/3谓词需要有From、To和Path,但必须以一个没有Path的简单go(From、To)结束。简单的go(From,To)是您旅行的基本条件/3,因此:

travel(X, Y, go(X, Y)) :- connected(X, Y).
这正是拉斯曼所说的

现在,您需要创建递归旅行/3谓词:

travel(X, Y, go(X, Z, Path)) :-
 connected(X, Z),
 travel(Z, Y, Path).

您的go/2谓词是多余的,并且有点混乱,因为travel/3谓词有一些类似go谓词的内容。通过删除go/2谓词,代码更易于阅读和理解。

但我不是应该构建一个go/3,并将路径作为第三个参数吗?@JPTG:除了基本情况外,其他情况都是这样。(请更仔细地查看示例的末尾。)在其他情况下,前两个术语将与go/2中的相同,第三个术语将是路径。我可能已经定义了这个问题,所以基本情况也是go/3,有一个空列表或一些类似于基本情况的,但那只是我。@JohnPeterThompsonGarcés:oops,是的,我的意思是
go/3
,我说的
go/2
。所有这些go/3术语都不好。没有理由@larsmans忘记添加最后一个参数:列出一些东西(无论是城市还是路过(从,到,中等))绝对是更好的选择。我不应该用列表来解决这个问题。到目前为止,我有:
connected(X,Y):-byCar(X,Y);乘火车(X,Y);乘飞机(X,Y)。go(X,Y):-已连接(X,Y)。行程(X,Y,go(X,Y)):-已连接(X,Y)。旅行(A,Z,路径):-旅行(Y,Z,路径),走(A,Y,路径)。go(A,Y,Path):-travel(A,Y,Path)。
但我不知道如何处理第二个循环(X,Y,go(X,Y))它不会统一。这让我觉得我采取了一种完全错误的方法。
travel(X, Y, go(X, Z, Path)) :-
 connected(X, Z),
 travel(Z, Y, Path).