我是否过度使用“剪切”?

时间:2021-05-21 23:04:51

标签: prolog prolog-cut

总的来说,我是 Prolog 和逻辑编程的新手,我正在编写一个小的定理证明器来取乐,为此我编写了一个规范化程序。我希望这个过程是确定性的和坚定的,所以我写了这样的东西:

function onChange(currentNode, selectedNodes) {
    console.log(selectedNodes)
}

我现在想知道这样做是否正确。它目前似乎有效,但我想知道这是否可能不符合我在某些边缘情况下期望的属性,我编写它的方式是否可能存在一些性能问题,或者这只是糟糕的编码风格/一般练习。

1 个答案:

答案 0 :(得分:3)

使用剪辑时会出现几个问题。

你在写什么样的 Prolog 程序?

这里有几种可能性。从纯程序开始,可以通过仅考虑解决方案集以声明方式理解。在这样的程序中,许多理想的属性都成立,但你的显然不是其中之一。毕竟,目标 normal_false(false, true) 成功了,但它的泛化 normal_false(V, true) 失败了(如预期的那样)。所以 normal_false/2 不是纯关系。

您的程序将 Prolog 变量视为对象。它是一个元逻辑程序,这并不奇怪,因为您希望通过重用 Prolog 的基础结构来实现证明器。在这里,仍然保留了许多不错的属性,例如,您仍然可以使用 来确定不终止的原因。但是,使用 var/1 特别容易出错,因为 Prolog 无法枚举所有可能的解决方案,因此很容易忘记一两个案例。在您的示例中(在添加缺少的运算符声明之后):

?- normal(X and true, N).
   X = N.                   % expected       
?- normal(true and X, N).
   X = true, N = true.      % unexpected

切口切掉了什么?

在第一个子句 normal/2normal(S, R):- var(S), !, ... 中,剪切确保所有后续子句仅考虑情况 nonvar(S)

Suspicious 是最后一个子句 normal(S, S):- !.,它在参数一致时切断。乍一看,这没什么区别,因为它是最后一个子句。但是在 freeze(S, ( T = 1 ; T = 2 ) ) 的情况下,您会得到不同的结果。但除此之外,normal/2 似乎还不错。

normal_and/2 中的削减不太令人信服。除了上述异常之外,这个定义是不稳定的。毕竟,结果受其最后一个论点的影响:

?- normal(true and true, N).
   N = true.      % expected
?- normal(true and true, true and true).
   true.          % unexpected  

这里的剪辑来得太晚了。

相关问题