2015-10-16 19 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)使您的程序可以在所有方向使用,从而增加通用性和易于理解。

请参阅,了解更多信息。

相关问题