2010-09-23 65 views
0
emissionOf(alpha). 
emissionOf(beta). 

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta). 

我面臨的問題,對於一些(可能是明顯的)原因Prolog不接受上述代碼的最後一行。其中的原因是與:幫助prolog的條款

detected(proton), detected(electron) 

如果我嘗試只

detected(proton) 

它正確的行爲。

什麼問題?我試圖說明,如果同時存在alpha和beta發射,那麼就會出現質子和電子的檢測結果。

謝謝

回答

5

你是對的,PROLOG中的子句是Horn子句。此外,它恰巧在諸如條款的頭部的結合:

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta). 

...(這不是一個角子句)實際上等同於以下兩個單獨的霍恩子句:

detected(proton) :- emissionOf(alpha), emissionOf(beta). 
detected(electron) :- emissionOf(alpha), emissionOf(beta). 

...因爲事實detected(proton)detected(electron)暗示在身體目標的聯合。

注意,可能還有其他幾個等價的方法來編碼您打算什麼程序來表示,如下面的(作爲一個例子):

emissionOf(alpha). 
emissionOf(beta). 

detected(X) :- 
    emissionOf(alpha), 
    emissionOf(beta), 
    (X = proton; X = electron). 

執行目標detected(X)將綁定X到原子proton,然後到electron回溯。

0

從告訴我的是,這是Prolog的算法固有的。每個陳述的句子必須是Horn clause

1

這相當於

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta). 

你基本上是試圖重新定義,/2操作,這是不允許的。你收到了什麼錯誤信息?

你在說什麼?如果​​和emissionOf(beta)屬實,那麼detected(proton)detected(electron)都爲真?在這種情況下,你需要在分裂成兩個分句爲@sharky說:

detected(proton) :- emissionOf(alpha), emissionOf(beta). 
detected(electron) :- emissionOf(alpha), emissionOf(beta). 

這會給你回溯這兩種解決方案。我認爲這是他的第二個建議,當然更清楚。