繁体   English   中英

在Prolog中列出列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM