我正在开发一个关于寻找动物的序言游戏。用户在他/她的脑海中保留一只动物,回答游戏中的问题,人工智能正在尝试寻找动物。
我的问题是关于分离动物类:
mammal :- verify(gives_milk), !.
bird :- verify(has_feathers), !.
我想将这两个类彼此分开。如果动物是哺乳动物,AI 不会询问“has_feathers”。
我正在开发一个关于寻找动物的序言游戏。用户在他/她的脑海中保留一只动物,回答游戏中的问题,人工智能正在尝试寻找动物。
我的问题是关于分离动物类:
mammal :- verify(gives_milk), !.
bird :- verify(has_feathers), !.
我想将这两个类彼此分开。如果动物是哺乳动物,AI 不会询问“has_feathers”。
我不太了解您将如何查询动物是否是 a 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]).
等等