Prolog:您能否根据值是否为基础值来使谓词表现不同?

标签 prolog logical-purity

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

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

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

我基本上可以正常工作,但是当 A 未接地但 D 接地时,我会收到实例化错误。但是,我挑出了一行导致问题的代码。当我更改谓词的目标顺序时,当 D 为基础且 A 不是时它起作用,但这样做时,当 A 为基础而 D 不是时它不再起作用。我不确定是否有办法解决这个问题。

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

最佳答案

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

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

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

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

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

因此,最好避免使用此类元逻辑谓词,特别是如果您刚刚开始学习该语言。

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

参见 , 了解更多信息。

关于Prolog:您能否根据值是否为基础值来使谓词表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33173787/

相关文章:

prolog - 计算机功能必须满足哪些要求才能被视为 "monotonic"?

prolog - 序言中的“如果”?

序言: avoid redundant choice points (non-determinism) with and without cut operator

prolog - 使用不纯原语的 Prolog 谓词的纯度

prolog - 制定效果公理

序言——生成整数 "unwindably"

解析 Prolog 中的表达式并返回抽象语法

prolog - NU-Prolog 和 Gödel 的逻辑和声音 `if-then-else` 扩展

recursion - SWI Prolog - 列表递归

Prolog 递归练习已达到堆栈限制