Prolog分类

Prolog classification

我正在开发一款关于寻找动物的序幕游戏。用户在 his/her 脑海中保留一只动物,回答游戏中的问题,AI 将尝试找到该动物。

我的问题是关于分离动物 类:

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

我想把这两个 类 分开。如果动物是哺乳动物,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]).

等等