2

我想知道如何让这样的事情发挥作用。这似乎是一个简单的概念,但我对 Prolog 很陌生,我似乎无法弄清楚如何正确地做到这一点。

例如,这里有两个表。每只动物,无论属于哪个类别,都有两个事实。

哺乳动物:

虎纹,有力

河马——大而危险

大象——大而温柔

昆虫:

飞 - 黑色,有翼

毛毛虫 - 绿色,缓慢

蜗牛——黏糊糊的,慢的

我将如何在 Prolog 代码中编写所有这些语句,以便将苍蝇及其特征归类为昆虫,将河马及其特征归类为哺乳动物?

那么,如果我插入这样的规则呢?

guess(mammal, large) 

在查阅代码后,我会写出这个命令:

possibleanimal(mammal, X) 

该命令的结论是:

X = hippo 
X = elephant 

因为河马和大象都有大的特点。

另一个例子:

guess(insect, slow) 
guess(insect, green)

指挥部咨询后问:

possibleanimal(insect, Y) 
Y= caterpillar 

我们可以省略蜗牛,因为即使它很慢,它也不是绿色的。

请尽一切可能帮助我,谢谢!

4

1 回答 1

1

第一个例子看起来像传递性,所以试试这个:

% 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

希望这可以帮助。

再见

于 2012-10-29T11:43:36.870 回答