2011-12-12 67 views
2

要確定該動物是鬥牛犬,我有以下斷言:Prolog的繼承規則

bulldog(X):- 
    body(X,muscular), 
    weight(X,heavy), 
    face(X,wrinkled), 
    nose(X,pushed-in). 

如果我有一隻狗,叫他「菲菲」,以及下面的事實:

body(fifi,muscular). 
weight(fifi,heavy). 
face(fifi,wrinkled). 
nose(fifi,pushed-in). 

當我輸入以下語句:

bulldog(fifi). 

它將返回true。

現在,讓我們說,我有另外的鬥牛犬 「FOFO」 及以下斷言:

bulldog(fofo). 

當我問類似

body(fofo,muscular)./weight(fofo,heavy). 

那麼它將返回false。我能做些什麼讓Prolog認識到牛頭犬的特徵,並回歸真實?

+0

這是功課? –

回答

1

您必須在知識庫中添加關於fofo的更多信息。 Prolog製作closed-world assumption,這意味着任何不能從程序中列出的事實/規則證明的東西都是錯誤的。

1

你寫的東西是牛頭犬,如果它是肌肉發達,沉重,皺紋和推入,但沒有,如果有什麼是牛頭犬,那麼它會是肌肉發達,沉重,皺摺推入。

這樣做,你可以寫:

body(X,muscular):- 
    bulldog(X). 

等等

但是,如果您有:

body(X,muscular):- 
    bulldog(X). 

bulldog(X):- 
    body(X,muscular), 
    .... 

你會陷入一個死循環。 您可以通過使用不同的謂詞名稱解決它:

body(X,muscular):- 
    bulldog(X). 

is_bulldog(X):- 
    body(X,muscular), 
    .... 

或以某種方式檢測到環路,並停止它(有些版本的序言像XSB支持建表)