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/2
,by_train/2
和by_plane/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。因此,我们需要填充X
一系列以go/3
终止的嵌套结构go/2
。这是我们的基本条件。然后,它是简单地重复的第二条款的问题travel/2
,但包括一个go/3
在第三个参数,将捕获实例化以值From
和Through
在每次迭代:
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