2017-03-07 62 views
4

假設我有知識基礎prolog答案可以不確定,而不僅僅是或不是?

如果我們問Prolog自己是否

|?- likes(mary,john) 

會回答沒有因爲我們並不能斷言。除非我們明確說明,否則有任何方法可以使序言回答未知

\+ likes(mary,john) 

換句話說,我們可以問序言治療未綁定表達式儘可能而不是假的。我一直在使用IDP系統,它允許存在性量化和對待非斷言的關係,好像是無約束的而不是假的,但我想使用更主流的東西。 http://adams.cs.kuleuven.be/idp/server.html

例如在IDP可以使語句

vocabulary V{ 
    type Person 
    Likes(Person,Person) 
} 


theory T: V{ 

    //Everyone might like someone and disallow narcisiscm 
    !x : ?y: Likes(x,y) & ~Likes(x,x). 

} 

//some instance without special meaning 
structure S:V{ 
    Person={A..C} 
} 

procedure main(){ 
    //Print all possible solutions 
    printmodels(allmodels(T,S)) 
} 

其中產量

Number of models: 27 
Model 1 
======= 
structure : V { 
    Person = { "A"; "B"; "C" } 
    Likes = { "A","B"; "A","C"; "B","A"; "B","C"; "C","A"; "C","B" } 
} 
//... 
+3

你知道的[封閉世界假定(https://en.wikipedia.org/wiki/Closed-world_assumption)與[開放世界假定(https://en.wikipedia.org/wiki/Open-world_assumption)? –

+0

你是說prolog只能回答一個封閉的系統嗎?因爲我想你可以說我問它可以考慮一個開放的系統,或者它在這方面是有限的,我應該嘗試一種不同的語言。 – awiebe

+0

'喜歡(瑪麗,約翰)'會成功的,因爲'mary'和'john'是人。這就是你的第二個條款所說的。 –

回答

2

如前所述,Prolog是採用封閉世界假定,即詢問如果事實確實如此意味着我們問如果我們知道這是真的 - no意味着我們不知道它是真的,而不是它是假的。當然,作爲一個圖靈完備的語言,你可以模擬一個開放的世界 - 是這樣的:

like(true, mary, john). 
like(false, mary, nick). 
like(unknown, X, Y). 

也許最好能有一些額外的包裝,以應對極端情況(例如,具有一對真假兩),並可能使用一些高階謂詞技巧來避免編寫大量的樣板文件 - 但實現的核心是您明確地聲明什麼是錯誤的,什麼是真的,其餘是未知的。

+0

我覺得更合理的定義,以搭上邊的情況下會像'(未知,X,Y): - \ +一樣(真實,X,Y),\ +一樣(假,X,Y).' – awiebe

+0

@儘管有可能會有'像(真,瑪麗,約翰)'這樣的機會。像(假,瑪麗,約翰)',可能是偶然。一般來說,如果對「純」數據和相關邏輯有單獨的謂詞,我認爲更容易推理它 –

1

到目前爲止所說的話是非常正確的:Prolog在所謂的下運行Closed  世界假設  (CWA)。不過,除了已發佈的內容之外,我想提供一個互補的視角。

首先,Prolog程序甚至可以不終止,所以我們可能永遠不會得到你所提到的可能的答案要麼

但即使確實程序終止,我們可以仍然獲得既不等同於true也不false答案。

例如,使用GNU序言:

 
| ?- X #\= 3. 

X = _#2(0..2:[email protected]) 

此處,答案是一個懸而未決約束,即比目魚說,因爲它的道理沒有明確確定的目標。

這樣的答案可能會或可能不會描述的解決方案。

例如:

 
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1). 

X = _#2(0..1) 
Y = _#20(0..1) 
Z = _#50(0..1) 

yes 

在這種情況下,沒有解決方案存在!看到這一點,我們需要明確搜索他們:

 
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1), 
    fd_labeling([X,Y,Z]). 

no 

因此,在上面的例子中,它可能真的是更可取的maybe而不是  yes回答。

此外,我們從基本的邏輯定理知道,這些問題是不可避免的時推理整數。

在這個意義上說,Prolog的系統才能真正給出答案,其真相併不 不僅,但另外不能被 確定。

相關問題