list - 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) .
但这并不是问题需要的完整列表。我不太确定如何做到这一点。我是否需要重写我的谓词。非常感谢您提供的任何帮助以帮助我了解我做错了什么!
解决方案
你没有在谓词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
推荐阅读
- c++ - 如何从 C++17 编写的代码中导出 C++03 的 abi
- javascript - 通过过滤在数组中查找匹配数据
- python - 使用 win32com 的 CANoe 多个实例
- android - dataSet.createDataPoint().setTimeInterval() 已被弃用 Fitness History API
- c# - Http Client 无法从传输连接中读取数据:现有连接被远程主机强行关闭
- python - 当 python 脚本转换为 exe 时,来自网络驱动器的图像不会显示
- java - java.lang.OutOfMemoryError:使用 TransferManager 将大文件上传到 Amazon AWS S3 存储桶时的 Java 堆空间
- java - 我可以在 java-11 spring boot 2 项目中使用 java-8 编译的项目/库吗?
- python - 通过 Python 请求从 Google Drives 下载数据
- oracle - ORACLE 在 POSTGRES 中的 UTL_TCP 等效项