作为Prolog的新手,我在2012年末遇到了一个非常有趣的讨论.我注意到当时在Prolog社区中有两个"semidet"概念,即:
显然,第二个意味着第一个,但反之则不然.
阅读帖子,我明白第一个是Dr.Neumerkel的概念,第二个是Drs.Wielemaker,O'Keefe和其他人.
谷歌搜索,我看到一些数据库研究人员的意思是'半确定'一个查询,它最多可以回答一个等价类,更接近第一个概念.
Dr.Neumerkel说(参考call_semidet
那里的谓词):
实施可能会得到改进,但在优化和标记之前,需要解决实际意义.
那么,意义已经解决了吗?
习惯上根据解决方案的数量对谓词进行分类.根据SWI-Prolog的定义(见下文),'det'可以进行完全非确定性(比如并行)计算,只要它提交到现在保证存在的解决方案.因此,通过类比我猜可能有两个'det'的概念:
第一个更符合逻辑,但在计算结束之前一般都是不可判定的.一旦找到解决方案,第二个很容易判定,但程序及其含义取决于Prolog采用的特定搜索策略,即深度优先搜索.
我想知道是否还没有社区的共识?为什么不区别这两个不同的概念呢?
以下是上面SWI-Prolog页面的摘录:
det [determinism]
确定性的缩写.
确定性
如果谓词在没有离开选择点的情况下成功完成一次,则谓词是确定性的.
semidet
半确定性的简写.
半确定性的
半确定性的谓词要么失败要么在没有选择点的情况下成功完成一次.另见确定性.
我在网络和我自己的项目中无处不在地看到具有以下模式的代码:
Sub Func()
Application.EnableEvents = False
' some code
Application.EnableEvents = True
End Sub
Run Code Online (Sandbox Code Playgroud)
由于VBA
对象的生命周期似乎是确定性的,我认为我可以像我们所做的那样用所谓的哨兵对象替换这个模式C++
,这样就可以自动解决异常退出(err.raise)的问题.
但是怎么样?我不知道,因为我是新手,VBA
甚至不知道什么时候通过引用传递对象.理想情况下,我希望代码看起来像这样:
Sub Func()
dim Sentry
Set Sentry = CreateSentry(Application.EnableEvents,False)
' From now on we should not need to care if the variable was actually
' True or False beforehand, what kind of error handling is used in this function, etc.
End Sub
Run Code Online (Sandbox Code Playgroud)