2012-10-28 74 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 

希望這有助於。

再見