所以,从我了解的确定性谓词:
确定性谓词= 1种溶液
非谓语确定性=多种解决方案
有没有为你如何可以检测如果断言是一个或其他任何类型的规则?就像在看搜索树等。
目前还没有明确,这些概念普遍接受的共识。然而,他们通常比较所观察到的答案,而不是基于基于解决方案的数量。在某些情况下的概念是非常实施有关。非确定性可能意味着:留下一个选择点开放。有时确定的方式:甚至从来没有创建一个选择点。
要看到差距,考虑目标length(L, 1)
。多少解决它呢? L = [a]
是其中之一,另一个L = [23]
......但所有这些解决方案都紧凑地一个答案替换表示:L = [_]
其因此包含无穷多的解决方案。在任何情况下,我所知道的一切的实现,length(L, 1)
是一个确定的目标。
现在考虑其中有且只有一个解决方案,但无限多的答案目标repeat
。这个目标被认为是不确定性。
如果您有兴趣的制约,事情变得更加进化。在library(clpfd)
,目标X #> Y, Y #> X
无解,但还是一个答案。与repeat
结合这一点:无限多的答案,无解。
此外,目标append(Xs, Ys, [])
只能有一个解决方案,也只有一个答案,但它被认为是不确定性在许多实现,因为在那些实现它留下一个选择点开放。
在一个理想的实现,就没有解决方案(除了false
)没有答案,会有不确定性,只有当有一个以上的答案。不过,这一切都是在一般情况下大多判定的。
所以,当你使用这些概念确保在什么级别的东西的意思。而是明确地说:多个答案,多解,没有留下(不必要的)选择点开放。
你需要了解DET,DET半下的区别,它不仅仅是一系列的解决方案更多。
因为在没有Prolog的闭环控制操作,循环(未递归)被构造为,随后所述循环体“序列生成”谓词(undet)。也与一些的findall组的谓词的列表和循环后与会员/ 2谓词可以存储解决方案。
因此,任何一件你的程序是建设循环或常用流的部分或者一部分。因此,有在设计DET的差异和undet谓词几乎是在预期用途。如果你可以用一个序列工作,你总是做undet并评论,因为这样。有一个很好的单元测试扩展在SWI-序言,可以检查wheter您的谓词总是在DET / semidet / undet的意思是相同的(semidet是使用方式与undet相同的,但作为一个头“如果”建设)。
所以,不同的是预先设计,而这个问题不应该与现有的谓词来arised。这是一个很好的做法总是评的预期使用像评论。
% member(?El, ?List) is undet.
Deterministic
:总是有一个简单的答案,始终是对于相同的输入同样的成功。想想三个项目的静态列表,而你告诉你的函数返回值一个。每一次你会得到相同的答案。此外,运算功能。 1 + 1 = 2 X + Y = Z。
Semi-deterministic
:则成功有一个答案,这始终是相同的输入相同,但它可能会失败。认为需要数列表的功能,你问你的函数,如果在列表中存在的一些数字。它要么做,要么没有,根据给出的列表,并要求数的内容。
Non-deterministic
:则成功与单一的答案,但可以在不同的运行表现出不同的行为,即使是相同的输入。认为任何一种像math.random(min,max)
random/3功能
在本质上,这是由选择点的概念完全独立的,作为选择点的Prolog的函数。当我想到这些术语的Prolog的混乱来自是序言能找到一个答案,然后回去,并尝试另一种解决方案,你必须使用剪切操作!
告诉它你希望明确放弃你的选择要点。
这是非常有用的与Prolog Unit Testing工作时就知道