以下是您如何以纯逻辑的方式找到“二的幂”!
使用sicstus-prolog 4.3.5library(reif)
和library(clpz)
:
:- use_module([ library(reif) , library(clpz) ])。
power_of_two_t(I, T) :-
L #= min(I,1),
M #= I /\ (I-1),
调用((L = 1,M = 0),T)。% 使用 (=)/3 和 (',')/3 of library(reif)
使用元谓词结合的示例查询1:tfilter/3
power_of_two_t/2
?- tfilter(power_of_two_t, [0,2,3,-5,-2,1,8,7,4], Ps).
Ps = [2,1,8,4]. % succeeds deterministically
这是评论建议的更一般的查询:
?- tfilter(power_of_two_t, [X], Ps).
Ps = [X], 0#=X/\_A, _A+1#=X, X in 1..sup, _A in 0..sup
; Ps = [], dif(_A,0), _A#=X/\_B, _B+1#=X, X in 1..sup, _B in 0..sup
; Ps = [], dif(_A,1), _A#=min(X,1), _B#=X/\_C, _C+1#=X, X#>=_A, _A in inf..1.
脚注 1:上面显示的应答序列经过整理以表明呼叫的确定性。
脚注 2:要重现结果,请使用call_det/2
如下定义:
call_det(G_0, Det) :-
call_cleanup(G_0,标志=设置),
(非变量(标志)
-> 检测 = 真
; 检测 = 假
)。