1

我在 Prolog 中有以下谓词:

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

其中“Archer”、“Kirk”、“Picard”、“Janeway”和“Almak”是舰长,“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”,但我不确定这是正确的方法。

4

1 回答 1

1

从您的数据(和您的代码)来看,您是否允许每个指挥官拥有多艘舰艇(或每艘舰艇拥有多艘指挥官 :) 尚不清楚。

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

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

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

于 2013-04-12T15:09:44.547 回答