保持逻辑上纯,很容易:使用元谓词 tcount/3
亦随物化型测试谓词number_t/2
(简称number_truth/2
):
number_t(X,Truth) :- number(X), !, Truth = true.
number_t(X,Truth) :- nonvar(X), !, Truth = false.
number_t(X,true) :- freeze(X, number(X)).
number_t(X,false) :- freeze(X,\+number(X)).
让我们运行查询OP建议:
?- tcount(number_t,[1,2,c,h,4],N).
N = 3. % succeeds deterministically
请注意,这是单调的:延迟变量绑定总是l听起来很健康。试想一下:
?- tcount(number_t,[A,B,C,D,E],N), A=1, B=2, C=c, D=h, E=4.
N = 3, A = 1, B = 2, C = c, D = h, E = 4 ; % succeeds, but leaves choice point
false.
最后,让我们看一些下面相当一般查询的答案:
?- tcount(number_t,[A,B,C],N).
N = 3, freeze(A, number(A)), freeze(B, number(B)), freeze(C, number(C)) ;
N = 2, freeze(A, number(A)), freeze(B, number(B)), freeze(C,\+number(C)) ;
N = 2, freeze(A, number(A)), freeze(B,\+number(B)), freeze(C, number(C)) ;
N = 1, freeze(A, number(A)), freeze(B,\+number(B)), freeze(C,\+number(C)) ;
N = 2, freeze(A,\+number(A)), freeze(B, number(B)), freeze(C, number(C)) ;
N = 1, freeze(A,\+number(A)), freeze(B, number(B)), freeze(C,\+number(C)) ;
N = 1, freeze(A,\+number(A)), freeze(B,\+number(B)), freeze(C, number(C)) ;
N = 0, freeze(A,\+number(A)), freeze(B,\+number(B)), freeze(C,\+number(C)).
啊我看,这工作得非常好。谢谢,但是,如果我想避免使用内置的谓词,你能指出我正确的方向吗?就像在现有代码中实现“只使用数字”一样。从我看到的情况看来,只有在咨询序言的时候,你可以使用数字/ 1,这是真的吗? – Majusbeh 2013-04-21 16:49:11