【问题标题】:Prolog: How to tell if a predicate is deterministic or notProlog:如何判断谓词是否是确定性的
【发布时间】:2014-10-19 11:45:06
【问题描述】:

所以根据我对确定性谓词的理解:

确定性谓词 = 1 个解决方案

非确定性谓词 = 多个解决方案

关于如何检测谓词是一个还是另一个,是否有任何类型的规则?比如看搜索树等等。

【问题讨论】:

标签: prolog predicate deterministic


【解决方案1】:

关于这些概念没有明确的、普遍接受的共识。但是,它们通常基于观察到的答案,而不是基于解决方案的数量。在某些情况下,这些概念与实现非常相关。不确定可能意味着:留下一个选择点。有时确定的意思是:从不创建选择点。

答案与解决方案

要查看差异,请考虑目标length(L, 1)。它有多少解决方案? L = [a] 是一个,L = [23] 是另一个......但是所有这些解决方案都用一个答案替换紧凑地表示:L = [_] 因此包含无限多个解决方案。 无论如何,在我知道的所有实现中,length(L, 1) 是一个确定的目标。

现在考虑目标repeat,它只有一个解决方案,但有无限多个答案。这个目标被认为是不确定的。

如果您对约束感兴趣,事情会变得更加进化。在library(clpfd) 中,目标X #> Y, Y #> X 没有解决方案,但仍然有一个答案。将此与repeat 结合使用:答案无限多,但没有解决方案。

此外,目标append(Xs, Ys, []) 有一个解决方案和一个答案,但是在许多实现中它被认为是不确定的,因为在这些实现中它留下了一个选择点。

在理想的实现中,没有解决方案就没有答案(false 除外),只有当有多个答案时才会出现不确定性。但是,在一般情况下,所有这一切大多是无法确定的。

因此,每当您使用这些概念时,请确保事物的含义是什么级别。而是明确地说:多个答案,多个解决方案,没有(不必要的)选择点开放。

【讨论】:

    【解决方案2】:

    您需要了解 det、semidet 和 undet 之间的区别,它不仅仅是解决方案的数量。

    因为 Prolog 中没有循环控制运算符,所以循环(不是递归)被构造为“序列生成”谓词(undet),后跟循环体。您还可以将带有一些 findall-group 谓词的解决方案存储为列表,然后使用 member/2 谓词循环。

    因此,您的程序的任何部分要么是循环构造的一部分,要么是通常流程的一部分。因此,几乎在预期用途中设计 det 和 undet 谓词是有区别的。如果你可以使用一个序列,你总是会这样做 undet 并评论它。 swi-prolog 中有一个很好的单元测试扩展,它可以检查你的谓词在 det/semidet/undet 的平均值上是否始终相同(semide 的用法与 undet 相同,但作为“if”构造的负责人)。

    所以,区别在于预先设计,这个问题不应该出现在已经存在的谓词上。始终在评论中评论预期用途是一种很好的做法。

    % member(?El, ?List) is undet.
    

    【讨论】:

      【解决方案3】:

      Deterministic:对于相同的输入,总是以一个相同的答案成功。考虑一个包含三个项目的静态列表,然后告诉您的函数返回值 1。你每次都会得到相同的答案。此外,算术函数。 1 + 1 = 2。X + Y = Z。

      Semi-deterministic:对于相同的输入,只有一个答案总是相同的,但它可能会失败。考虑一个接受数字列表的函数,然后询问函数列表中是否存在某个数字。根据给定列表的内容和要求的数量,它要么做,要么不做。

      Non-deterministic:以单一答案成功,但在不同的运行中可能表现出不同的行为,即使对于相同的输入也是如此。想想任何类型的math.random(min,max) 函数,比如random/3

      本质上,这与选择点的概念完全分开,因为选择点是 Prolog 的函数。我认为 Prolog 对这些术语的混淆来自于 Prolog 可以找到一个答案,然后返回并尝试另一种解决方案,并且您必须使用 cut 运算符 ! 告诉它您要放弃您的选择明确指出。

      在使用Prolog Unit Testing 时了解这一点非常有用

      【讨论】:

      • 在 Prolog 的上下文中对 non-deterministic 的错误使用!你给出的例子(一个真正的 RNG)被认为是超逻辑的。​​
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      相关资源
      最近更新 更多