List Prolog-如何递归地构建列表?

List Prolog-如何递归地构建列表?,list,prolog,logic,predicate,List,Prolog,Logic,Predicate,我正在练习,最后一个问题我被难住了。鉴于以下事实: byCar(auckland,hamilton). byCar(hamilton,raglan). byCar(valmont,saarbruecken). byCar(valmont,metz). byTrain(metz,frankfurt). byTrain(saarbruecken,frankfurt). byTrain(metz,paris). byTrain(saarbruecken,

我正在练习,最后一个问题我被难住了。鉴于以下事实:

   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/2查询上述数据库,您可以发现 从瓦尔蒙特到拉格伦是可能的。如果你正在计划 这样一次航行,这已经是很有用的事情了,但你会的 可能更喜欢从瓦尔蒙特到拉格兰的精确路线。 写一个谓词travel/3,告诉你什么时候走哪条路线 从一个地方到另一个地方旅行。例如,程序应该 响应X=go(瓦尔蒙特、梅茨、, go(metz,巴黎, 转到(巴黎,洛杉矶)))查询旅行(valmont,洛杉矶,X)

这是我的围棋函子:

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(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).
但是,我的旅行遇到了问题/3谓词:

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

但这并不是问题所需要的全部清单。我真的不知道如何做到这一点;我是否需要重写谓词。非常感谢您能提供任何帮助,帮助我了解我做错了什么

您没有在
travel/3
谓词中适当地更改
G

travel(X,Y, go(X, Y)) :- byCar(X,Y).
travel(X,Y, go(X, Y)) :- byTrain(X,Y).
travel(X,Y, go(X, Y)) :- byPlane(X,Y).

travel(X,Y, go(X, Z, G)) :- byCar(X,Z), travel(Z,Y, G).
travel(X,Y, go(X, Z, G)) :- byTrain(X,Z), travel(Z,Y, G).
travel(X,Y, go(X, Z, G)) :- byPlane(X,Z), travel(Z,Y, G).
你会得到:

| ?- travel(valmont, losAngeles, G).
G = go(valmont,saarbruecken,go(saarbruecken,paris,go(paris,losAngeles))) ? ;
G = go(valmont,metz,go(metz,paris,go(paris,losAngeles))) ? ;
no
作为奖励,您还可以嵌入旅行类型:

travel_(X,Y, car(X, Y)) :- byCar(X,Y).
travel_(X,Y, train(X, Y)) :- byTrain(X,Y).
travel_(X,Y, plane(X, Y)) :- byPlane(X,Y).
      
travel_(X,Y, car(X, Z, G)) :- byCar(X,Z), travel_(Z,Y, G).
travel_(X,Y, train(X, Z, G)) :- byTrain(X,Z), travel_(Z,Y, G).
travel_(X,Y, plane(X, Z, G)) :- byPlane(X,Z), travel_(Z,Y, G).
现在您可以:

| ?- travel_(valmont, losAngeles, G).
G = car(valmont,saarbruecken,train(saarbruecken,paris,plane(paris,losAngeles))) ? ;
G = car(valmont,metz,train(metz,paris,plane(paris,losAngeles))) ? ;
no

您没有在
travel/3
谓词中适当地更改
G

travel(X,Y, go(X, Y)) :- byCar(X,Y).
travel(X,Y, go(X, Y)) :- byTrain(X,Y).
travel(X,Y, go(X, Y)) :- byPlane(X,Y).

travel(X,Y, go(X, Z, G)) :- byCar(X,Z), travel(Z,Y, G).
travel(X,Y, go(X, Z, G)) :- byTrain(X,Z), travel(Z,Y, G).
travel(X,Y, go(X, Z, G)) :- byPlane(X,Z), travel(Z,Y, G).
你会得到:

| ?- travel(valmont, losAngeles, G).
G = go(valmont,saarbruecken,go(saarbruecken,paris,go(paris,losAngeles))) ? ;
G = go(valmont,metz,go(metz,paris,go(paris,losAngeles))) ? ;
no
作为奖励,您还可以嵌入旅行类型:

travel_(X,Y, car(X, Y)) :- byCar(X,Y).
travel_(X,Y, train(X, Y)) :- byTrain(X,Y).
travel_(X,Y, plane(X, Y)) :- byPlane(X,Y).
      
travel_(X,Y, car(X, Z, G)) :- byCar(X,Z), travel_(Z,Y, G).
travel_(X,Y, train(X, Z, G)) :- byTrain(X,Z), travel_(Z,Y, G).
travel_(X,Y, plane(X, Z, G)) :- byPlane(X,Z), travel_(Z,Y, G).
现在您可以:

| ?- travel_(valmont, losAngeles, G).
G = car(valmont,saarbruecken,train(saarbruecken,paris,plane(paris,losAngeles))) ? ;
G = car(valmont,metz,train(metz,paris,plane(paris,losAngeles))) ? ;
no

非常感谢。它现在起作用了;你的回答帮助我理解了问题的下一部分——展示了(汽车、火车或平原)路线是如何走的。“更改G”涉及指定它在函子本身中的位置,以便它可以与基本情况具体统一!现在这很有道理!非常感谢。它现在起作用了;你的回答帮助我理解了问题的下一部分——展示了(汽车、火车或平原)路线是如何走的。“更改G”涉及指定它在函子本身中的位置,以便它可以与基本情况具体统一!现在这很有道理!