序言:如何判断一个谓语是确定性或不

问题描述 投票:7回答:3

所以,从我了解的确定性谓词:

确定性谓词= 1种溶液

非谓语确定性=多种解决方案

有没有为你如何可以检测如果断言是一个或其他任何类型的规则?就像在看搜索树等。

prolog predicate deterministic
3个回答
11
投票

目前还没有明确,这些概念普遍接受的共识。然而,他们通常比较所观察到的答案,而不是基于基于解决方案的数量。在某些情况下的概念是非常实施有关。非确定性可能意味着:留下一个选择点开放。有时确定的方式:甚至从来没有创建一个选择点。

答案与解决方案

要看到差距,考虑目标length(L, 1)。多少解决它呢? L = [a]是其中之一,另一个L = [23] ......但所有这些解决方案都紧凑地一个答案替换表示:L = [_]其因此包含无穷多的解决方案。在任何情况下,我所知道的一切的实现,length(L, 1)是一个确定的目标。

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

如果您有兴趣的制约,事情变得更加进化。在library(clpfd),目标X #> Y, Y #> X无解,但还是一个答案。与repeat结合这一点:无限多的答案,无解。

此外,目标append(Xs, Ys, [])只能有一个解决方案,也只有一个答案,但它被认为是不确定性在许多实现,因为在那些实现它留下一个选择点开放。

在一个理想的实现,就没有解决方案(除了false)没有答案,会有不确定性,只有当有一个以上的答案。不过,这一切都是在一般情况下大多判定的。

所以,当你使用这些概念确保在什么级别的东西的意思。而是明确地说:多个答案,多解,没有留下(不必要的)选择点开放。


0
投票

你需要了解DET,DET半下的区别,它不仅仅是一系列的解决方案更多。

因为在没有Prolog的闭环控制操作,循环(未递归)被构造为,随后所述循环体“序列生成”谓词(undet)。也与一些的findall组的谓词的列表和循环后与会员/ 2谓词可以存储解决方案。

因此,任何一件你的程序是建设循环或常用流的部分或者一部分。因此,有在设计DET的差异和undet谓词几乎是在预期用途。如果你可以用一个序列工作,你总是做undet并评论,因为这样。有一个很好的单元测试扩展在SWI-序言,可以检查wheter您的谓词总是在DET / semidet / undet的意思是相同的(semidet是使用方式与undet相同的,但作为一个头“如果”建设)。

所以,不同的是预先设计,而这个问题不应该与现有的谓词来arised。这是一个很好的做法总是评的预期使用像评论。

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

-1
投票

Deterministic:总是有一个简单的答案,始终是对于相同的输入同样的成功。想想三个项目的静态列表,而你告诉你的函数返回值一个。每一次你会得到相同的答案。此外,运算功能。 1 + 1 = 2 X + Y = Z。

Semi-deterministic:则成功有一个答案,这始终是相同的输入相同,但它可能会失败。认为需要数列表的功能,你问你的函数,如果在列表中存在的一些数字。它要么做,要么没有,根据给出的列表,并要求数的内容。

Non-deterministic:则成功与单一的答案,但可以在不同的运行表现出不同的行为,即使是相同的输入。认为任何一种像math.random(min,max) random/3功能

在本质上,这是由选择点的概念完全独立的,作为选择点的Prolog的函数。当我想到这些术语的Prolog的混乱来自是序言能找到一个答案,然后回去,并尝试另一种解决方案,你必须使用剪切操作!告诉它你希望明确放弃你的选择要点。

这是非常有用的与Prolog Unit Testing工作时就知道

© www.soinside.com 2019 - 2024. All rights reserved.