2015-10-16 23 views
4

當第一個和最後一個參數都是地面/非地面,不是地面/地面或地面/地面,並且第二個和第三個參數都是地面時,我有一個複雜的謂詞有四個參數需要工作。序言:你能否使一個謂詞的行爲有所不同,取決於一個值是否被打磨?

即謂詞(A,B,C,d)。

因爲它是一個任務的一部分,我不能提供我的實際代碼。

我有它大多工作,但我收到錯誤實例當A不接地,但d是。但是,我列出了一些導致問題的代碼。當我改變謂詞的目標順序時,它在D被磨削和A不被磨削時起作用,但是當這樣做時,它不再適用於磨削A和磨削D不適用的情況。我不確定有沒有辦法解決這個問題。

是否有使用兩行代碼,這樣如果A是地面例如將使用第一線的方式,但如果沒有接地,它會使用第二個,而忽視了第一?反之亦然。

+5

'VAR(A)'和'nonvar(A)'也許你想 –

+0

非常感謝你的!我的課程中還沒有遇到過,但他們做到了! – Wolff

+0

很高興幫助! :) –

回答

4

你能做到這一點,但,幾乎無一例外,你會打破你的計劃的聲明語義如果你做到這一點。

考慮一個簡單的例子來看看如何這種非單調的和額外的邏輯謂詞已經打破了基本假設和知名謂詞典型聲明屬性,如結合的交換性:

 
?- ground(X), X = a. 
false. 

但是,如果我們只需結合的交換性交流的目標,我們得到了一個不同答案:

 
?- X = a, ground(X). 
X = a. 

出於這個原因,這樣的元邏輯謂詞,最好避免,特殊如果你剛剛開始學習這門語言。

取而代之的是,更好地留在序言的純淨和單調的子集。使用限制dif/2和CLP(FD)使您的程序可以在所有方向使用,從而增加通用性和易於理解。

請參閱,瞭解更多信息。

相關問題