0

次のような Prolog ファイルで宣言されたデータがあります。

gen1(grass).
gen1(poison).
gen1(psychic).
gen1(bug).
gen1(rock).

...

gen1((poison, flying)).
gen1((ghost, poison)).
gen1((water, ice)).

...

weak1(grass, poison).
weak1(grass, bug).
weak1(poison, rock).

strong1(grass, rock).
strong1(poison, grass).
strong1(bug, grass).
strong1(poison, bug).
strong1(psychic, poison).
strong1(bug, poison).
strong1(bug, psychic).
strong1(rock, bug).

データは化合物に対してstrong1orを定義しないことに注意してください。これらは、最小限の作業例に寄与しないルールによって決定されます。それらが存在することを知っておくと役立つかもしれないので、それらについて言及します。weak1gen1(...)

サイクルを形成するこれらの用語間の関係を見つけようとしています。サンプル関数の 1 つを次に示します。

triangle1(A, B, C) :-
    setof(A-B-C, (
             gen1(A), gen1(B), gen1(C), A \= B, A \= C, B \= C,
              strong1(A, B), strong1(B, C), strong1(C, A)
             ), Tris),
    member(A-B-C, Tris).

Aこのセットアップでは、 、B、およびCが同じ順序になっている重複を削除します。ただし、異なる順序での重複は削除されません。例えば:

?- triangle1(A, B, C),
   member(A, [bug, grass, rock]),
   member(B, [bug, rock, grass]),
   member(C, [bug, rock, grass]).
A = bug,
B = grass,
C = rock ;
A = grass,
B = rock,
C = bug ;
A = rock,
B = bug,
C = grass ;
false.

そのクエリは の 1 セットのみを返す必要があり[A, B, C]ます。

を使うことも考えましsort/2たが、単純にソートすると答えの意味が変わってしまう場合があります。

?- triangle1(A, B, C),
   sort([A, B, C], [D, E, F]),
   \+member([D, E, F], [[A, B, C], [B, C, A], [C, A, B]]).
A = D, D = bug,
B = F, F = psychic,
C = E, E = poison .

<とも試し>ましたが、それらはアトムでは機能しないようです。

何かご意見は?

(私は同様の質問を見ましたが、ここで私がしていることを他の人がしていることと比較してどうすればよいかわかりません)

編集:最小限の作業例に関するコメントに従って。

4

1 に答える 1