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/