prolog - Prolog 中的 "well behaved predicate"是什么?

标签 prolog

SWI documentation多次提到“对于行为良好的谓词,不留下任何选择点”。我是否可以认为这意味着对于确定性或半确定性的“行为良好的谓词”,在找到答案后不应该留下任何选择点? well behaved predicate 的定义是什么?它不在 glossary 中.

我希望它的意思是“按预期工作”,但我还没有找到明确定义的定义。

为了澄清:

这是 SWI 文档中的用法:

  • 确定性谓词是必须完全成功的谓词 once and,对于表现良好的谓词,不留下任何选择点。

这是确定性谓词的定义:

  • 确定性谓词是必须恰好成功一次且不留下任何选择点的谓词。

for behaved predicates 显然是为了以某种方式改变定义的含义,为什么还要添加它?

可能的答案:

正如@DanielLyons 指出的那样,行为良好 部分可能意味着“按预期工作”,在 plunit 中这意味着您必须传递标志,例如 [nondet, fail] 指示测试谓词应该 的行为方式。谓词可以正常工作,但会提供多个解决方案,其中一个是预期的,反之亦然,然后不再匹配标记的预期行为并生成警告。

最佳答案

我看到的所有这种构造都出现在 plunit 文档中,并且指的是确定性或半确定性(单一解决方案或 0/1 解决方案)谓词。这里的含义似乎是,如果谓词产生单个解决方案并留下一个选择点,则您可以将其称为确定性谓词(因此您恰好获得了一次成功的统一,但可能有更多尝试肯定会失败)。这与半确定性谓词的情况相同(但可能仅在它们找到单一成功的情况下)。

我不认为这是一个定义明确的术语。产生单一结果的谓词最好不要不必要地留下选择点,但也许 plunit 出于某种原因依赖于这种行为,它只是警告你。 Prolog 无法真正知道或跟踪您的谓词是否是确定性的。其他语言,尤其是 Mercury,可以。但是这里的区别似乎是 plunit 所关心的,可能是为了避免产生有关测试失败或其他内容的虚假错误消息。

关于prolog - Prolog 中的 "well behaved predicate"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491955/

相关文章:

list - 在序言中依次迭代列表元素

Java 帮助 - StringIndexOutOfBoundsException - 字符串索引超出范围 : -1

prolog - 列表总和必须为 16

Prolog - 从列表列表中获取第一个列表

prolog - 计算 Prolog 列表中出现的次数

haskell - 将 haskell 函数转换为 prolog 错误

prolog - 所有可达节点的祖先

prolog - CLP 中变量的暂定绑定(bind)

prolog - 理解 Prolog 中的递归性

list - Prolog:生成一个包含满足谓词的成员的子列表