作为Prolog的新手,我遇到了一个非常有趣的discussion,发生在2012年末。 我注意到的是,当时有两个概念 ' semidet'在Prolog社区,即:
显然,第二个意味着第一个,但反之亦然。
阅读帖子,我明白第一个是 Dr.Neumerkel的观点,第二个是Drs.Wielemaker,O' Keefe和其他人。
谷歌搜索,我已经看到一些数据库研究人员的意思 '半确定性'一个最多可回答一个等价的查询 上课,更接近第一个概念。
Dr.Neumerkel说(参考那里名为call_semidet
的谓词):
实施可能会有所改进,但在优化之前 bechnmarking的实际意义需要解决。
那么,意义已经解决了吗?
似乎习惯上根据谓词对谓词进行分类 解决方案。根据{{3}}(见下文),' det'可以做得很充分 非确定性(并行)计算,只要它提交即可 现在保证存在的解决方案。所以,通过类比,我猜那里 可能是' det'的两个概念:
第一个更符合逻辑,但一般不可判断,直到结束 计算。一旦找到解决方案,第二个很容易判定,但是 程序及其含义取决于Prolog的特定搜索策略 采用,即深度优先搜索。
我想知道是否还没有社区的共识?为什么不命名 这两个不同的概念有何不同?
以上是SWI-Prolog页面的摘录:
det [determinism]
确定性的缩写。
确定性
如果谓词恰好成功一次,则谓词是确定性的 没有选择点。
semidet
半确定性的简写。
半确定性
半确定性的谓词失败或成功 一次没有选择点。另见确定性。
答案 0 :(得分:8)
这是一个非常好的问题!
来自Mercury determinism categories,这也是非常权威的解释:
6.1确定性类别
对于谓词或函数的每种模式,我们将该模式根据其成功的次数进行分类,以及在生成其第一个解决方案之前它是否会失败。
如果所有可能的调用返回到调用者的谓词或函数的特定模式(调用终止,不抛出异常并且不会导致致命的运行时错误)
- 只有一个解决方案,那么该模式是确定性的(det);
- 要么没有解决方案要么有一个解决方案,那么该模式是半决定的(半模式);
- 至少有一个解决方案,但可能有更多,然后该模式是多分辨率(多个);
- 有零个或多个解决方案,那么该模式是不确定的(nondet); 如果没有产生解决方案就会失败,那么该模式就会有失败的决定因素。
(强调我的)
请注意,在此定义中甚至在整个部分中都没有提到是否留下选择点。 Mercury与Prolog不同,但重点是该定义原则上也适用于Prolog 100%。显然,它对应于您的变体(1)。
在我看来,这是正确的:是否留下选择点是相当无关紧要的,并且取决于 - 例如 - 系统的参数有多强大和多样化索引是。一个好的索引方案可能会阻止创建其他系统引入的选择点。依赖于特定Prolog系统的特定特性并且可能从一个版本突破到另一个版本(引入更好的参数索引等)的概念不是非常强大,并且没有多大价值。
确实,我们经常说“谓词是确定性的”,当我们的意思是:“谓词是确定性的,没有留下任何选择点”,但即便如此,主要观点几乎总是在这种情况下谓词< strong>成功一次。请注意,“确定性”是一个相当过载的形容词,也有其他含义。在SWI文档中,这种模糊性延续到半确定性。然而,甚至SWI也在other places中的这个相当面向实现的定义中反过来踩了一下:
2.2.2测试半确定性谓词
半确定性谓词是谓词失败或成功一次,而表现良好的谓词,不留任何选择点。
所以一个不是表现良好的半确定性谓词(?)也可以留下选择点......
在讨论中,请特别注意以下内容:Ulrich在这里使用较弱且更强大的概念来获得适用于两个定义的的谓词。
因此,无论您选择哪种变体,call_semidet/1
都很有用!由此,引用的含义变得更加清晰。当乌尔里希说:
(实施可能会有所改进,但在优化和标记之前,需要解决实际意义。)
显然不意味着“semidet”的含义必须在两个变体之间解决,但首先要清楚 call_semidet/1
实际上保证:它比人们思想 Ulrich发布的内容更有用。例如,Jan给出的定义:
call_semidet(Goal) :- call_cleanup(Goal, Det=true), ( Det == true -> true ; throw(error(mode_error(semidet,Goal),_)) ).
仅使用 与您的第二个“semidet”定义。
答案 1 :(得分:5)
目前正在使用的分类,例如正如@mat提到的那样,在SWI-Prolog中取自Mercury。使用的模式名称(det
,semidet
,multi
和nondet
)选择非常差(也不够)。它们不仅是缩写,还需要新用户查找文档以了解其含义!具有讽刺意味的是,对这些模式的含义的描述已经表明了最好的非缩写和清晰的名称。请记住,我们正在谈论解决方案的数量:zero
,one
,zero_or_one
,zero_or_more
,one_or_more
(以及可能由于其有用性error
,可用于指示给定的呼叫模式导致错误)。顺便说一句,这些是Logtalk中使用的模式名称。
将谓词(在给定模式中)的解决方案数量的规范与剩余选择点的问题混合在一起也是一个糟糕的选择,如同@mat所描述的那样,模糊不清。代码优化问题与解决方案数量的规范正交。此外,当解决方案耗尽时,zero
以外的任何模式都可能留下虚假的选择点。因此,这不仅仅是对命名不佳的det
和semidet
模式之间的区别。