動物を探すプロローグ ゲームを開発しています。ユーザーが頭の中に動物を置き、ゲーム内の質問に答えると、AI がその動物を見つけようとします。
私の問題は、動物のクラスを分離することです:
mammal :- verify(gives_milk), !.
bird :- verify(has_feathers), !.
この2つのクラスを互いに分離したいと思います。動物が哺乳類の場合、AI は「has_feathers」を尋ねません。
動物を探すプロローグ ゲームを開発しています。ユーザーが頭の中に動物を置き、ゲーム内の質問に答えると、AI がその動物を見つけようとします。
私の問題は、動物のクラスを分離することです:
mammal :- verify(gives_milk), !.
bird :- verify(has_feathers), !.
この2つのクラスを互いに分離したいと思います。動物が哺乳類の場合、AI は「has_feathers」を尋ねません。
動物が であるかどうかをどのように照会するかについては、よくわかりませんmammal
。動物の引数が必要になります。したがって、述語は次のようになります。
mammal(A) :-
verify(A,gives_milk),
!.
明らかに、次のようなある種のデータベースを使用しています。
verify(cow,gives_milk).
verify(crow,has_feathers).
% ...
次に、Prolog で否定を使用し\+
て、動物に羽毛がないことを判断できます。
mammal(A) :-
verify(A,gives_milk),
\+ verify(A,has_feathers),
!.
再利用しないでくださいbird
。またその逆も同様です。再利用すると、無限ループが作成されるためです(集計サポートを許可しない限り)。
より宣言的なスタイルは、おそらく保持すべき側面と保持できない側面を指定することです。何かのようなもの:
verifies(A,Pos,Neg) :-
verify_pos(A,Pos),
verify_neg(A,Neg).
verify_pos(_,[]).
verify_pos(A,[H|T]) :-
verify(A,H),
verify_pos(A,T).
verify_neg(_,[]).
verify_neg(A,[H|T]) :-
\+ verify(A,H),
verify_neg(A,T).
たとえば、次のように指定できます。
mammal(A) :-
verifies(A,[gives_milk],[has_feathers,produces_eggs]).
等