4

我有一个有点复杂的谓词,有四个参数,当第一个和最后一个参数都是接地/非接地,不是接地/接地或接地/接地,并且第二个和第三个参数都是接地时。

即谓词(A,B,C,D)。

我无法提供我的实际代码,因为它是作业的一部分。

我大部分时间都在工作,但是当 A 不接地但 D 接地时收到实例化错误。但是,我已经挑出了导致问题的一行代码。当我更改谓词的目标顺序时,它在 D 为基础而 A 不是时有效,但这样做时,它不再适用于 A 为基础而 D 不是时。我不确定有没有办法解决这个问题。

有没有办法使用两行代码,例如如果 A 接地,它将使用第一行,但如果 A 不接地,它将使用第二行,而忽略第一行?反之亦然。

4

1 回答 1

4

你可以这样做,但是,如果你这样做,几乎总是会破坏程序的声明性语义。

考虑一个简单的例子,看看这样一个非单调的和超逻辑的谓词是如何打破了众所周知的谓词的基本假设和典型的声明性属性,比如合取的交换性:

?-接地(X),X = a。
错误的。

但是,如果我们简单地通过合取交换性来交换目标,我们会得到不同的答案:

?- X = a,接地(X)。
X = 一个。

出于这个原因,最好避免使用此类元逻辑谓词,尤其是在您刚刚开始学习该语言时。

相反,最好留在 Prolog 的纯单调子集中。使用和 CLP(FD) 之类的约束dif/2使您的程序在各个方向上都可用,从而提高通用性和易于理解性。

有关详细信息,请参阅

于 2015-10-16T16:06:58.347 回答