使用clpfd保持逻辑纯度!
以下是操作方法:
:- use_module(library(clpfd)).
count_elems([],_,0).
count_elems([X|Xs],Z,Count) :-
X #=< Z,
count_elems(Xs,Z,Count).
count_elems([X|Xs],Z,Count) :-
X #> Z,
Count #= Count0 + 1,
count_elems(Xs,Z,Count0).
让我们看看多功能的
count_elems/3
如何使用:
?- count_elems([1,2,3,4,5,4,3,2],2,Count)。
计数=5;(留下无用的选择点)
假。
?- count_elems([1,2,3,4,5,4,3,2],X,3)。
X=3;
假。
?- count_elems([1,2,3,4,5,4,3,2],X,Count)。
计数=0,X在5..sup中;
计数=1,X=4;
计数=3,X=计数;
计数=5,X=2;
计数=7,X=1;
计数=8,X在inf..0中。
编辑于2015年5月5日
我们还可以使用元谓词tcount/3
,与(#<)/2
的具象化版本结合使用:
#<(X,Y,Truth) :- integer(X), integer(Y), !, ( X<Y -> Truth=true ; Truth=false ).
#<(X,Y,true) :- X #< Y.
#<(X,Y,false) :- X #>= Y.
让我们再次运行上面的查询!
?- tcount(#<(2),[1,2,3,4,5,4,3,2],Count).
Count = 5.
?- tcount(#<(X),[1,2,3,4,5,4,3,2],3).
X = 3 ;
false.
?- tcount(#<(X),[1,2,3,4,5,4,3,2],Count).
Count = 8, X in inf..0 ;
Count = 7, X = 1 ;
Count = 5, X = 2 ;
Count = 3, X = Count ;
Count = 1, X = 4 ;
Count = 0, X in 5..sup .
关于效率的说明:
count_elems([1,2,3,4,5,4,3,2],2,Count)
留下了一个无用的选择点。
tcount(#<(2),[1,2,3,4,5,4,3,2],Count)
成功地确定了结果。
(=)/3
,因为它涉及到语法相等,但你想要基于CLPFD模块的相等性。 - false(#=<)/3
定义为与(=)/2
类似。 - false