2017-07-18 78 views
1

這是一個基本的Prolog問題。我試圖實現可能非正式表達如下的推理:Prolog中的扣除

x(X)爲真的(必要但不充分)條件是a(X)和b(X)必須成立。我們知道x(瑪麗)。這些條件一定是爲x(瑪麗)而定的。它的情況。因此,(瑪麗)和b(瑪麗)都是真的。

下面的代碼顯然做什麼,我心裏有:

a(jim). 
b(jack). 
x(X) :- a(X), b(X). 
x(mary). 

如果我現在問一個(瑪麗),Prolog的答案與第

我敢當然我明白爲什麼這樣回答。我只是不知道如何正確實現我想要的。

更新:

上面的例子被簡化了。在我正在處理的實際問題中,a和b是交織在一起的。而不是x(X) :- a(X), b(X).,我實際上有r(A,B,C) :- p(A,D), p(C,E), a(D,n), a(E,c), s(B,E,F,2), s(C,E,D,1), s(C,E,F,1).。也就是說,對於r(A,B,C)來說,右邊的所有相互連接的條件必須一起保存。現在用一系列規則p(A,D) :- r(A,B,C). a(D,n) :- r(A,B,C).等來替換它是不正確的,因爲據我所知,p(A,D)中的D不再與a(D,n)中的D相同,這些現在是完全獨立的規則。我可以很容易地在一階邏輯的(演繹式)自動定理證明器中實現我想要的推理,這比我在Prolog中更熟悉。

另一個例子。考慮這個Prolog代碼:

breathable(X) :- part(X,Y), atom(Y,o). 
part(air,oxygen). 
breathable(air). 

空氣是透氣的。空氣中含有氧氣。我想推斷atom(oxygen,o)。但是Prolog會回答第

回答

1

在你breathable例子,你需要一個額外的規則:

atom(X, Y) :- breathable(Y), part(Y, X). 

如果沒有這個規則,這是邏輯不會是隱式和始終如一的逼真與您現有的規則庫和事實架構。這部分是對現有規則的反駁。從純粹邏輯的角度來看,蘊含的相反並不一定是正確的,因爲原來的含義是正確的。在給出的簡單例子中,atom(oxygen, o)的真值是由現有規則加上的相反現有的具體事實確定的。這基本上是一種外形邏輯,而不是扣除作爲您的問題標題建議。如果沒有新的atom/2規則,如果以後再添加新的part事實,甚至沒有更改事實架構,那麼該導出過程可能會導致示例查詢失敗或不可證明,與當前結果不同。沒有明確的規則就不可靠。

+0

您的回答非常有幫助,謝謝。令我困惑的是,我可以使用純粹的扣除(不涉及綁架)獲得預期的結果(例如手工)。從句子來看1.全部XY:透氣(X)→(部分(X,Y)和原子(Y,O))2.部分(空氣,氧氣)3.透氣(空氣),它純粹演繹地在第一4.邏輯原子(氧,o)。我懷疑這與你最後兩句話有關,我並不完全明白。你能舉個例子嗎? –

+1

@VelvetGhost因爲您將事實和規則混合在一起,您可以「推斷」,但只有當您假設您當前可用的事實是您的一組事實。我(很差)試圖在我的回答中解釋,如果事實得到增強,扣除額可能會改變。如果嚴格從規則的角度來看待它,則無法在沒有附加規則的情況下推導出您想要的結果。 – lurker

+0

謝謝。接受這個答案。我使用Prolog代碼實現了一個誘人的邏輯編程系統來獲得我想要的東西。 –

1

你可能會認爲它是錯誤的。目前你已經寫道:「x(X)保留給定a(X)b(X)保留,或者Xmary」。

不是相反的方式。如果你想要寫: 「a(A)保存給予AjimX(A)」,你應該寫:

a(jim). 
a(A) :- 
    x(A). 

所以你可能會這樣寫:

a(jim). 
a(A) :- 
    x(A). 

b(jack). 
b(B) :- 
    x(B). 

x(mary). 
+0

這適用於我給出的簡化示例,但一般不會做我想要的。請參閱最新的問題。謝謝。 –

1

「這些條件必須有舉行x(瑪麗)就是這樣,情況就是這樣,因此(瑪麗)和b(瑪麗)都是真的。「

讓我們在代碼中表達,我們?

a(X) :- x(X). 
b(X) :- x(X). 

這應該會產生預期的結果。

+0

這適用於我給出的簡化示例,但一般不會做我想要的。請參閱最新的問題。謝謝。 –