這是一個基本的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.全部XY:透氣(X)→(部分(X,Y)和原子(Y,O))2.部分(空氣,氧氣)3.透氣(空氣),它純粹演繹地在第一4.邏輯原子(氧,o)。我懷疑這與你最後兩句話有關,我並不完全明白。你能舉個例子嗎? –
@VelvetGhost因爲您將事實和規則混合在一起,您可以「推斷」,但只有當您假設您當前可用的事實是您的一組事實。我(很差)試圖在我的回答中解釋,如果事實得到增強,扣除額可能會改變。如果嚴格從規則的角度來看待它,則無法在沒有附加規則的情況下推導出您想要的結果。 – lurker
謝謝。接受這個答案。我使用Prolog代碼實現了一個誘人的邏輯編程系統來獲得我想要的東西。 –