第一个例子看起来像传递性,所以试试这个:
% animal(Animal, Property)
animal(tiger, striped).
animal(tiger, powerful).
animal(hippo, large).
animal(hippo, dangerous).
animal(elephant, large).
animal(elephant, gentle).
% guess(Category, Property)
guess(mammal, large).
% possibleanimal(Category, Animal)
possibleanimal(C, A) :-
guess(C, P),
animal(A, P).
?- possibleanimal(mammal, X).
X = hippo ;
X = elephant
现在棘手的部分是第二个例子,因为我们有多个guess/2。
我猜你希望他们同时持有。所以你需要一种forall。
Forall 可以在 Prolog 中定义如下:
% forall(Goal,Goal)
forall(A, B) :- \+ (A, \+ B).
参见例如:
http ://www.swi-prolog.org/pldoc/man?predicate=forall%2F2
所以你可以试试这个:
% possible(Animal)
possible(fly).
possible(caterpillar).
possible(snail).
% animal(Animal, Property)
animal(fly, black).
animal(fly, winged).
animal(caterpillar, green).
animal(caterpillar, slow).
animal(snail, slimy).
animal(snail, slow).
% guess(Category, Property)
guess(insect, green).
guess(insect, slow).
% possibleanimal(Category, Animal)
possibleanimal(C, A) :-
possible(A),
forall(guess(C,P), animal(A,P)).
?- possibleanimal(insect,X).
X = caterpillar ;
No
希望这可以帮助。
再见