繁体   English   中英

Prolog递归和递归调用的构建输出

[英]Prolog recursion and building output from recursive calls

我正在通过http://www.learnprolognow.org学习Prolog,但在理解如何根据实践第3.4题第3个问题通过另一个递归调用的结果递归构建变量时遇到了一些麻烦。最初的问题很直接-forward递归调用以确定路由是否可行。 但是后续问题要求您显示到达路线终点的实际路径。

我们为您提供以下旅行信息知识库:

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). 

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

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

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。 如果您计划进行这样的航行,这已经是个有用的知识,但是您可能更希望拥有从瓦尔蒙特到拉格兰的精确路线。 写一个谓词travel / 3,告诉您从一个地方到另一个地方要走的路线。 例如,程序应响应

X  =  go(valmont,metz,go(metz,paris,go(paris,losAngeles)))

到查询旅行(valmont,losAngeles,X)

我一直在努力用一系列go(From,To)填充X,以显示旅程的后续步骤。 它看起来像一个递归问题,但我不知道应该如何解决。 这项技术对于Prolog编程而言似乎是基础,并且我对解决该问题的思考过程非常感兴趣,并且我期待您能提供的任何见解。

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

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的递归关系:

travel(From, To) :-
    connected(From, To).
travel(From, To) :-
    connected(From, Through),
    travel(Through, To).

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

travel(From, To, go(From, To)) :-
    connected(From, To).
travel(From, To, go(From, Through, Route)) :-
    connected(From, Through),
    travel(Through, To, Route).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM