一尘不染

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

algorithm

我正在通过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编程来说似乎很基础,并且我对解决该问题的思考过程非常感兴趣,并且我希望您能提供任何见解。


阅读 374

收藏
2020-07-28

共1个答案

一尘不染

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

connected(From, To) :- by_car(From, To).
connected(From, To) :- by_train(From, To).
connected(From, To) :- by_plane(From, To).

然后,我定义travel/2connected/2

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

转到travel/3,请注意,嵌套go...术语中的最终连接是一个结构go/2,而其余​​的是go/3s。因此,我们需要填充X一系列以go/3终止的嵌套结构go/2。这是我们的基本条件。然后,它是简单地重复的第二条款的问题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).
2020-07-28