Prolog构建列表来自谓词列表

时间:2013-04-12 14:51:30

标签: prolog

我在Prolog中有以下谓词:

rules('Archer','NX-01').
rules('Kirk','NCC-1701').
rules('Picard','NCC-1701-D').
rules('Janeway','Voyager').
rules('Almak','IRWTMet').

“弓箭手”,“柯克”,“皮卡德”,“珍威”和“阿尔马克”都是舰艇指挥官 和'NX-01','NCC-1701','NCC-1701-D','Voyager'和'IRWTMet'都是船只。

所以我想,如果船只清单返回船舶指挥官名单。

我正在尝试这个:

list_ship_commanders([],_).
list_ship_commanders([Ship|T],R):-
   findall(Commander,rules(Commander,Ship),R),
   list_ship_commanders(T,R).

上述代码仅在Ship列表只有一个元素时有效。我正在使用“findall”,但我不确定这是正确的方法。

1 个答案:

答案 0 :(得分:1)

根据您的数据(和您的代码),您不清楚每个指挥官是否允许多艘船(或每艘船多个指挥官:)。

如果您对此类细节不感兴趣,可以尝试:

list_ship_commanders(Ships, Commanders) :-
    findall(Commander, (member(S, Ships), rules(Commander, S)), Commanders).

您将获得一个可能重复的指挥官列表,并且没有指向相关规则的链接/。