首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog递归和从递归调用生成输出

Prolog递归和从递归调用生成输出
EN

Stack Overflow用户
提问于 2014-05-02 19:23:44
回答 1查看 1.4K关注 0票数 2

我正在通过http://www.learnprolognow.org学习Prolog,并且我很难理解如何用另一个递归调用的结果递归地构建一个变量,就像实际会话3.4中的问题3一样。最初的问题是一个直接的递归调用,以确定一个路由是否可行。但是接下来的问题要求你显示出到达路线尽头的实际路径。

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

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

编写谓词旅行/2,通过将汽车、火车和飞机旅行链接在一起,确定是否有可能从一个地方旅行到另一个地方。例如,您的程序应该回答是查询旅行(valmont,raglan)。

我用以下代码解决了这个问题:

代码语言:javascript
复制
travel(From,To) :-
 byCar(From,To).

travel(From,To) :-
 byTrain(From,To).

travel(From,To) :-
 byPlane(From,To).

travel(From,To) :-
  byCar(From,NewTo),
  travel(NewTo,To).

travel(From,To) :-
  byTrain(From,NewTo),
  travel(NewTo,To).

travel(From,To) :-
  byPlane(From,NewTo),
  travel(NewTo,To).

接下来的问题是:

因此,通过使用travel/2查询上面的数据库,您可以发现从Valmont到Raglan是可能的。如果你正计划这样一次航行,那已经是很有用的事情了,但你可能更喜欢有确切的路线从瓦尔蒙到拉格兰。写一个谓词旅行/3,告诉你在从一个地方到另一个地方旅行时应该走哪条路线。例如,程序应该响应

代码语言:javascript
复制
X  =  go(valmont,metz,go(metz,paris,go(paris,losAngeles)))

查询旅行(valmont,losAngeles,X)

我一直在努力用一系列的go(从,到)来填充X,这些都显示了旅程的连续步骤。这看起来是一个递归问题,但我不知道应该如何处理它。这种技术似乎是Prolog编程的基础,我对解决这个问题的思考过程很感兴趣,我期待着您能提供的任何见解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-03 03:50:00

我试过这个。我对您的第一个解决方案做了一个更改,只是为了消除一些冗余。我使用谓词connected/2概括了出现在by_car/2by_train/2by_plane/2事实中的所有连接的公共关系:

代码语言:javascript
复制
connected(From, To) :- by_car(From, To).
connected(From, To) :- by_train(From, To).
connected(From, To) :- by_plane(From, To).

然后,我将travel/2定义为connected/2上的递归关系。

代码语言:javascript
复制
travel(From, To) :-
    connected(From, To).
travel(From, To) :-
    connected(From, Through),
    travel(Through, To).

转到travel/3,注意嵌套go...术语中的最后连接是一个结构go/2,其余的是go/3,所以我们需要用一系列以go/2结尾的嵌套go/3结构填充X。最后这是我们的基础条件。然后,简单地重复travel/2的第二个子句,但是在第三个参数中包含一个go/3,该参数将捕获在每次迭代中实例化到FromThrough的值:

代码语言:javascript
复制
travel(From, To, go(From, To)) :-
    connected(From, To).
travel(From, To, go(From, Through, Route)) :-
    connected(From, Through),
    travel(Through, To, Route).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23435514

复制
相关文章

相似问题

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