2012-10-28 34 views
3

我想知道我会如何得到这样的工作。 这似乎是一个简单的概念,但我对Prolog很新,我似乎无法弄清楚我会如何正确地做到这一点。序言陈述/命令与动物(逻辑帮助)

例如,这里有两个表格。每个动物,不论类别,都有两个事实。

哺乳动物:

虎 - 条纹,强大

河马 - 大件,危险

大象 - 大,温柔

昆虫:

飞 - 黑色,翅

卡特彼勒 - 绿色,慢

蜗牛 - 粘糊糊的,缓慢的

如何将我写的所有的Prolog代码这些语句使得飞和它的特性将在昆虫进行分类和河马和它在哺乳动物的特点是什么?

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

guess(mammal, large) 

咨询代码后,我会写出这样的命令:

possibleanimal(mammal, X) 

和结论,该命令将是:

X = hippo 
X = elephant 

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

又如:

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

命令问咨询后:

possibleanimal(insect, Y) 
Y= caterpillar 

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

请以任何方式帮助我,谢谢!

回答

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 

现在棘手的问题是第二个例子中,由于 我们有多个猜测/ 2。

我想你会希望他们同时持有。 所以你需要一种福音。

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 

希望这有助于。

再见