[英]Making a list of lists in Prolog
我正在Prolog中编写一个functor find/3
,它应该返回一个从一个目的地到另一个目的地的路径列表,这是由事实数据库给出的。 此数据库中的事实采用该形式
flight(Carrier,ID,Start,Destination,Hours,Cost).
这些是为了模拟航班数据库。 每个flight/6
都有一个唯一的ID
。 我现在只处理3个事实:
flight('FL', 1, 'TYO', 'PAR', 2, 1800).
flight('WN', 4, 'PAR', 'OSA', 16, 100).
flight('FL', 2, 'TYO', 'OSA', 13, 500).
我有一个findPaths/4
函数findPaths/4
,它返回从一个位置到另一个位置的所有ID
的列表。 以下是调用仿函数的示例:
| ?- findPaths('TYO','OSA',Path,['TYO']).
Path = [2] ? ;
Path = [1,4] ? ;
no
因此它找到了ID
2的路径以及由航班ID
:1和ID
:4组成的路径。
我希望我的functor find/3
返回findPaths/4
找到的每个路径的列表,但我完全不知道如何做到这一点。
目前,这是我定义find/3
:
find(Start,Destination,Paths) :-
findPaths(Start,Destination,Path,[Start]),
memberchk(Path,Paths).
以下是调用它的示例:
| ?- find('TYO','OSA',List).
List = [[2]|_] ? ;
List = [[1,4]|_] ? ;
no
我不确定我在这里缺少什么。 我希望memberchk/2
让它的第一个参数成为它的第二个参数的成员,但我相信我错误地认为这就像是一种命令式语言。 我不知道如何纠正我的推理和我的算子。
使用findall/3
。
findall(Path, findPaths('TYO', 'OSA', Path, ['TYO']), ListOfPathLists).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.