递归在序言 - 寻找城市之间的路径(Recursion in Prolog - Finding Pa

2019-09-16 15:16发布

我试图在底部通过练习来工作,我的方式这个页面 ,我发现自己的3号心乱如麻。

我们给出的旅游信息下面的知识库:

byCar(auckland, hamilton). 
byCar(hamilton, raglan). 
byCar(valmont, saarbruecken). 
byCar(valmont, metz). 

byTrain(metz, frankfurt). 
byTrain(saarbruecken, frankfurt). 
byTrain(metz, paris). 
byTrain(saarbruecken, paris). 

byPlane(frankfurt, bangkok). 
byPlane(frankfurt, singapore). 
byPlane(paris, losAngeles). 
byPlane(bangkok, auckland). 
byPlane(singapore, auckland). 
byPlane(losAngeles, auckland).

这很简单,以找出是否有可能两个城市之间旅行。 我只是这样做:

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(valmont, losAngeles,X).

还有就是正确的路径从末匿名变量显示出来,除了跟踪过程中的一个点:

travel(valmont, metz, connected(metz, paris, connected(paris, losAngeles, _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))等...

Answer 1:

我给你递归的基本情况:

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

递归情况下看起来非常相似,不同的是go/3 ,你正在构建必须有地方作为它的前两个参数项和路径(另一个go/2go/3项)作为其第二。



Answer 2:

我有这个由aBathologist向我解释方式如下:

你的目标是让X =去(维蒙特,梅斯,去(梅斯,巴黎,去(巴黎,洛杉矶)))响应查询旅游(维蒙特,洛杉矶,X)。

为了解决这个问题,你的旅行/ 3谓词需要有一个发件人,收件人和路径,但必须用一个简单的围棋(发件人,收件人)未经路径结束。 简约归(发件人,收件人)是旅游/ 3的你的基本条件,所以:

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

这是完全一样的larsmans状态。

现在,你需要创建递归旅游/ 3谓词:

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

你走/ 2谓词是多余的,有点混乱给出的旅行/ 3谓词有东西,看起来像一个去断言。 通过消除GO / 2谓词,代码变得更容易阅读和理解。



文章来源: Recursion in Prolog - Finding Path Between Cities