- 上面的谓词 plus/3 真的是纯的吗?
它有一些奇怪的行为:有时它接受算术表达式,有时不接受;尽管所有参数都被评估:
?- plus(3,5-3,5).
true ...
?- plus(3,2,3+2).
false.
?- plus(3,2,3+b).
ERROR: </2: Arithmetic: `b/0' is not a function
?- plus(3,2,3+Z).
ERROR: </2: Arguments are not sufficiently instantiated
我宁愿担心nat/1
以下情况的效率低下:
?- time( ( nat(X), X > 9999 ) ).
% 50,025,002 inferences, 27.004 CPU in 27.107 seconds (100% CPU, 1852480 Lips)
X = 10000 ;
% 10,006 inferences, 0.015 CPU in 0.015 seconds (99% CPU, 650837 Lips)
X = 10001 ;
% 10,005 inferences, 0.016 CPU in 0.016 seconds (99% CPU, 631190 Lips)
X = 10002 ...
所以,在我看来,你的定义是纯粹的。然而,这种编程风格很难保证这个属性。微小的变化将产生灾难性的影响。
- 一般来说,你如何证明一个特定的关系具有逻辑纯度?
最简单的方法是施工。也就是说,仅使用纯单调构建块。即,Prolog 没有任何内置函数,仅使用常规目标的合取和析取。以这种方式构建的任何程序也将是纯粹且单调的。true
然后,在 Prolog 标志发生检查设置为或的情况下执行该程序error
。
添加到这个纯粹的内置插件,如(=)/2
和dif/2
。
添加到这个试图模拟纯关系并在它们无法这样做时产生实例化错误的内置函数。想想(is)/2
和算术比较谓词。其中一些非常接近边界call/N
,可能称为一些不纯谓词。
添加library(clpfd)
标志clpfd_monotonic
设置为true
.
许多构造对于某些用途来说是好的和纯粹的,但对于其他用途来说是不纯的。想想 if-then-else,它非常适合算术比较:
..., ( X > Y -> ... ; ... ), ...
但它不能与一个纯粹的目标一起工作,比如
..., ( X = Y -> ... ; ... ), ... % impure
剩下的是不纯的内置函数,可用于构造以纯方式表现的谓词;但其定义本身不再是纯粹的。
例如,考虑真正的绿色切割。这些非常罕见,在 SO 上甚至更罕见。看到这个那个。_
提供纯关系的另一种常见模式是条件,例如:
..., ( var(V) -> something with var ; the equivalent with nonvar ), ...
为了防止没有完全覆盖的情况,可以抛出错误。