我正在通过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/2,by_train/2和by_plane/2事实:
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/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在第三个参数,将捕获实例化以值From和Through在每次迭代:
travel/3
go...
go/2
go/3
X
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).