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

我正在通过http://www.learnprolognow.org学习Prolog

,但在理解如何根据实践第3.4题第3个问题通过另一个递归调用" title="递归调用">递归调用的结果递归构建变量时遇到了一些麻烦。最初的问题很直接-

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事实:

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

以上是 Prolog递归和递归调用的构建输出 的全部内容, 来源链接: utcz.com/qa/404294.html

回到顶部