0

動物を探すプロローグ ゲームを開発しています。ユーザーが頭の中に動物を置き、ゲーム内の質問に答えると、AI がその動物を見つけようとします。

私の問題は、動物のクラスを分離することです:

mammal    :- verify(gives_milk), !.
bird      :- verify(has_feathers), !.

この2つのクラスを互いに分離したいと思います。動物が哺乳類の場合、AI は「has_feathers」を尋ねません。

4

1 に答える 1

1

動物が であるかどうかをどのように照会するかについては、よくわかりません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]).

于 2016-01-13T09:12:30.070 に答える