Prolog 中的“行为良好的谓词”是啥?

Posted

技术标签:

【中文标题】Prolog 中的“行为良好的谓词”是啥?【英文标题】:What is a "well behaved predicate" in Prolog?Prolog 中的“行为良好的谓词”是什么? 【发布时间】:2018-03-26 12:52:37 【问题描述】:

SWI documentation 多次提到“对于表现良好的谓词,不要留下选择点”。我是否可以将其理解为,对于确定性或半确定性的“表现良好的谓词”,在找到答案后不应该留下任何选择点吗? 表现良好的谓词的定义是什么?它不在glossary 中。

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

澄清:

这是 SWI 文档中的用法:

确定性谓词是必须完全成功的谓词 一次,对于表现良好的谓词,不要留下选择点。

这是确定性谓词的定义:

确定性谓词是必须只成功一次且不留下选择点的谓词。

for well behaved predicates 显然是想以某种方式改变定义的含义,为什么还要加上呢?

可能的答案:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

对吗?他们用它来解释 plunit 的预期行为,就好像在这种情况下 表现良好 的含义很明显。从上下文中我提取他们认为它的意思是“应该返回单个结果而不留下选择点的谓词应该这样做。应该返回单个结果的谓词而留下选择点则有望做到这一点”。他们正在使用该术语的含义来解释该术语的含义,并且即使在解释无限递归时也没有按照逻辑来定义术语。它什么也没增加? @G_V 我同意,它什么也没增加。但有时在记录代码时,人们会觉得不得不添加文字:)

以上是关于Prolog 中的“行为良好的谓词”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PROLOG 中的垂直斜线函数到底是啥?是运营商吗?

visual prolog是啥编程软件?

列表替换中的 Prolog 元素

Prolog中的展平列表[重复]

prolog中的哈希表

Prolog中的双向链表