【发布时间】:2021-05-29 03:23:02
【问题描述】:
我正在完成Learn Prolog Now! 上的练习,最后一个问题让我很困惑。鉴于以下事实:
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 来确定是否可以通过将汽车、火车、 和飞机旅行。例如,您的程序应该对 查询旅行(valmont,raglan)。
所以,通过 travel/2 查询上面的数据库,可以发现 从 Valmont 到 Raglan 是可能的。如果您正在计划 这样的航程,这已经是有用的知识了,但你会 可能更喜欢从 Valmont 到 Raglan 的精确路线。 写一个谓词 travel/3 告诉你什么时候走哪条路线 从一个地方到另一个地方旅行。例如,程序应该 响应 X = go(valmont,metz, 去(梅斯,巴黎, go(paris,losAngeles))) 到查询 travel(valmont,losAngeles,X) 。
这是我的 go 函子:
go(X).
go(X,Y).
这是我的旅行/2 谓词:
travel(X,Y) :- byCar(X,Y).
travel(X,Y) :- byCar(X,Z), travel(Z,Y).
travel(X,Y) :- byTrain(X,Y).
travel(X,Y) :- byTrain(X,Z), travel(Z,Y).
travel(X,Y) :- byPlane(X,Y).
travel(X,Y) :- byPlane(X,Z), travel(Z,Y).
但是,我的 travel/3 谓词有问题:
travel(X,Y,G) :- byCar(X,Y), G = go(X, Y).
travel(X,Y,G) :- byCar(X,Z), travel(Z,Y,G).
travel(X,Y,G) :- byTrain(X,Y), G = go(X, Y).
travel(X,Y,G) :- byTrain(X,Z), travel(Z,Y,G).
travel(X,Y,G) :- byPlane(X,Y), G = go(X, Y).
travel(X,Y,G) :- byPlane(X,Z), travel(Z,Y,G).
当我在问题中运行谓词时,我得到:
?- travel(valmont,losAngeles,X).
X = go(paris, losAngeles) .
但这并不是问题所需的完整列表。我不太确定如何做到这一点。我是否需要重写我的谓词。非常感谢您提供的任何帮助以帮助我了解我做错了什么!
【问题讨论】:
标签: list prolog logic predicate