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 リストに要素が 1 つしかない場合にのみ機能します。「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 に答える