首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >城市间测井路径的递归

城市间测井路径的递归
EN

Stack Overflow用户
提问于 2012-04-19 15:46:24
回答 2查看 5.1K关注 0票数 2

我正试图在此页的底部完成我的练习,我发现自己在第三题上完全搞不懂。

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

代码语言:javascript
复制
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).

要找出两个城市之间是否可以旅行是很简单的。我刚做了这个:

代码语言:javascript
复制
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).

然而,当我不得不用变量来统一路径时,我完全糊涂了!

我写了这个:

代码语言:javascript
复制
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统一起来!

我真的不能对这件事全神贯注。有人能给我个提示让我朝正确的方向前进吗?只是我失踪了什么的吗?

编辑:

现在我有:

代码语言:javascript
复制
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).

但它会像这样卡住:

代码语言:javascript
复制
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))等等.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-19 15:57:43

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

代码语言:javascript
复制
travel(X, Y, go(X, Y)) :- connected(X, Y).

递归情况看起来非常相似,只不过您正在构建的go/3术语必须有位置作为它的前两个参数,而路径(另一个go/2go/3项)作为它的第二个参数。

票数 2
EN

Stack Overflow用户

发布于 2014-05-13 13:34:02

我让aBathologist用以下方式向我解释了这一点:

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

要解决这个问题,旅行/3谓词需要有一个From、To和Path,但是它必须以不带路径的简单go(From,To)结束。简单的出行(从,到)是你旅行/3的基本条件,所以:

代码语言:javascript
复制
travel(X, Y, go(X, Y)) :- connected(X, Y).

这正是拉里曼斯所说的。

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

代码语言:javascript
复制
travel(X, Y, go(X, Z, Path)) :-
 connected(X, Z),
 travel(Z, Y, Path).

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10231815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档