我正在Prolog中编写一个仿函数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
,它会返回从一个位置到另一个位置的所有ID
的列表。以下是调用仿函数的示例:
| ?- findPaths('TYO','OSA',Path,['TYO']).
Path = [2] ? ;
Path = [1,4] ? ;
no
因此,它找到仅ID
:2的路径以及由航班ID
组成的路径:1和ID
:4。
我希望我的仿函数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
使其第一个参数成为其第二个参数的成员,但我相信我错误地将其视为一种命令式语言。我不知道如何纠正我的推理和我的算子。
答案 0 :(得分:3)
使用findall/3
。
findall(Path, findPaths('TYO', 'OSA', Path, ['TYO']), ListOfPathLists).