作为一个Prolog新手,我发现在2012年底发生了一个非常有趣的讨论。
当时我注意到,在Prolog社区中有两种“semidet”的概念,分别是:
- 最多只成功一次的计算。
- 成功后不留下选择点的计算。
显然第二个概念意味着第一个,但反之则不然。
阅读这个帖子,我明白了第一个概念是Neumerkel博士的想法,而第二个概念是Wielemaker、O'Keefe博士等人的想法。
Google搜索时,我看到一些数据库研究者认为“半确定性”(semi-deterministic)是指仅能回答一个等价类的查询,更接近第一个概念。
Neumerkel博士说(指称那里的call_semidet
谓词):
在进行优化和基准测试之前,实现可能会得到改进,但需要先解决实际含义的问题。
那么,这个含义已经解决了吗?
“det”的情况如何?
根据SWI-Prolog的定义(见下面),习惯上将谓词分类为它们的解的数量。'det'可以进行完全非确定性(比如并行)计算,只要它承诺现在一定存在一个解决方案即可。类比一下,我猜想可能有两种'det'的概念:
- 仅成功一次的计算。
- 成功一次且在成功之后不留下选择点的计算。
第一个更加逻辑但通常是不可判定的,直到计算结束。第二个一旦找到解决方案就很容易判断,但是程序化的,其含义取决于Prolog所使用的特定搜索策略,即深度优先搜索。
我想知道社区是否已经达成共识?为什么不把这两个不同的概念命名为不同的名称呢?
以下是SWI-Prolog页面中的摘录:
det [determinism]
缩写:确定性的。
deterministic
如果一个谓词成功一次并且没有留下选择点,则它是确定性的。
semidet
半确定性的缩写。
semi deterministic
半确定性的谓词无论是失败还是恰好成功一次,都不会有选择点。另见确定性。
call_semidet/1
的含义。 - false