首页 > 解决方案 > Prolog - 我将如何递归地建立一个列表?

问题描述

我正在完成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 来确定是否可以通过将汽车、火车和飞机旅行链接在一起来从一个地方旅行到另一个地方。例如,您的程序应该对查询 travel(valmont,raglan) 回答“是”。

因此,通过使用 travel/2 查询上述数据库,可以发现从 Valmont 到 Raglan 是可能的。如果您正在计划这样的航行,那么了解这些信息已经很有用了,但您可能更希望获得从 Valmont 到 Raglan 的精确路线。写一个谓词 travel/3 告诉你从一个地方到另一个地方旅行时要走哪条路线。例如,程序应该响应 X = go(valmont,metz, go(metz,paris, go(paris,losAngeles))) 到查询 travel(valmont,losAngeles,X) 。

这是我的 go 函子:

go(X).
go(X,Y).

这是我的 travel/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) .

但这并不是问题需要的完整列表。我不太确定如何做到这一点。我是否需要重写我的谓词。非常感谢您提供的任何帮助以帮助我了解我做错了什么!

标签: listprologlogicpredicate

解决方案


你没有在谓词G中适当地改变。travel/3

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

推荐阅读