小编mni*_*ish的帖子

Prolog中的"semidet"概念是否已解决?

作为Prolog的新手,我在2012年末遇到了一个非常有趣的讨论.我注意到当时在Prolog社区中有两个"semidet"概念,即:

  1. 计算最多成功一次.
  2. 一种计算,一旦成功,就不会留下任何选择点.

显然,第二个意味着第一个,但反之则不然.

阅读帖子,我明白第一个是Dr.Neumerkel的概念,第二个是Drs.Wielemaker,O'Keefe和其他人.

谷歌搜索,我看到一些数据库研究人员的意思是'半确定'一个查询,它最多可以回答一个等价类,更接近第一个概念.

Dr.Neumerkel说(参考call_semidet那里的谓词):

实施可能会得到改进,但在优化和标记之前,需要解决实际意义.

那么,意义已经解决了吗?

'det'怎么样?

习惯上根据解决方案的数量对谓词进行分类.根据SWI-Prolog的定义(见下文),'det'可以进行完全非确定性(比如并行)计算,只要它提交到现在保证存在的解决方案.因此,通过类比我猜可能有两个'det'的概念:

  1. 一次成功的计算.
  2. 这正是成功的一次计算其一旦成功,没有留下的选择点.

第一个更符合逻辑,但在计算结束之前一般都是不可判定的.一旦找到解决方案,第二个很容易判定,但程序及其含义取决于Prolog采用的特定搜索策略,即深度优先搜索.

我想知道是否还没有社区的共识?为什么不区别这两个不同的概念呢?

以下是上面SWI-Prolog页面的摘录:

det [determinism]

确定性的缩写.

确定性

如果谓词在没有离开选择点的情况下成功完成一次,则谓词是确定性的.

semidet

半确定性的简写.

半确定性的

半确定性的谓词要么失败要么在没有选择点的情况下成功完成一次.另见确定性.

prolog

12
推荐指数
2
解决办法
400
查看次数

VBA中的Sentry对象

我在网络和我自己的项目中无处不在地看到具有以下模式的代码:

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)

excel vba excel-vba

1
推荐指数
1
解决办法
139
查看次数

标签 统计

excel ×1

excel-vba ×1

prolog ×1

vba ×1