2016-09-24 73 views
1

我只是在學習序言,有一件事我不能理解我的頭。Prolog統一不是()

假設我有以下程序

value(v). 

a(X) :- not(value(X)). 

所以a(v).給我假的,因爲value(v)可以證明是正確的。

a(w)給我的真實,因爲沒有事實value(w),因此,即使在嘗試時,它不能被證明是正確的。

據我瞭解,要求a(X).應該給我第一個可能的值,使得value(X)不可證實。應該有無限的可能性,因爲只有value(v)是正確的。

但是爲什麼Prolog會繼續回答false

+1

這取決於你如何查看***僞造***,什麼是假的?你如何證明某件事是假的?一種觀點認爲,*不可證明的一切都是錯誤的*,這是一種觀點,你可以想象你生活在一個真實的***可證明的世界裏(這是有爭議的課程)。在序言中,'\ +'運算符與否定作爲失敗語義,這正是我上面所描述的。希望能夠給出一些線索。 – Limmen

+0

是的,如果我們將false定義爲不可證明的話,那麼Prolog可以通過提供它無法證明正確的例子來實現目標? – user3207838

+0

但我想問題是,Prolog總是希望讓事情**真實**,在這種情況下,我們基本上會顛倒引擎? – user3207838

回答

2

首先,請使用ISO謂詞(\+)/1,而不是not/1

其次,請不要使用(\+)/1表示方面的disequality(\+)/1在Prolog中是不完整的,因而沒有邏輯上的聲音。它是而不是邏輯否定,而是表示「not  可證明」。

你的情況:?- value(X).成功,所以它是可證明的,所以?- \+ value(X).雖然有實例,使查詢成功失敗。

特別是,?- \+ value(a).成功

因此,我們有:

 
?-  \+ value(V). 
false. 

更具體查詢成功:

 
?- V = a, \+ value(V). 
V = a. 

這顯然有悖於我們從純粹的關係,期望邏輯性質。請參閱

爲了表示術語disequality,使用dif/2。如果您的Prolog系統不支持dif/2,請詢問其是否包含在內,或者使用iso_dif/2作爲邏輯上合理的安全近似值。有關更多信息,請參閱

+0

好吧,我明白了。因此,爲了實現我想要的功能,Prolog需要提出一個無法通過設計來解決的不可證實的例子。 所以基本上,人們可以在Prolog中實現這個(儘管可能不需要)並獲得我提到的行爲?還是我錯過了一些基本的邏輯概念? – user3207838

+0

就你而言,只需使用'dif/2'或其他約束來表達不等式:'dif(X,v)'表明'X'與原子'v'有**不同**。這成功了,只要目標未知,就剩下剩餘目標。對於其他領域,有類似的約束。例如,'X#\ = 3'表示'X'是一個**整數**,不同於3。 – mat

1

Prolog在「封閉的世界假設」下運作–它只知道我們告訴它的內容。特別的是,我們已經告訴過什麼都沒有關於否wu,或者其他的東西,那它怎麼會產生它們給我們?並且爲什麼w應該在u之前,而不是反之呢?

明智的唯一的事可能是產生(X, dif(X,v)),但它會回答一個不同問題,即「如何使a(X)可證明的?」,而不是一個Prolog實際上正在回答,即「是a(X)可證明?」

爲了減輕你的認知負擔,在你的腦袋重命名的Prolog提示的答覆從trueYes,並從falseNo

Yes意味着Prolog告訴我們「是的,我可以證明它!」,並且No –「不,我無法證明它。

另外重命名爲「不」爲讀爲\+not_provable,精神上。