この回答では、2 つの異なるclpfd "フレーバー" を使用しています: sicstus-prologとgnu-prologです。
:- use_module (ライブラリ(clpfd) )。
limited_repetitions__SICStus(Zs) :-
長さ(Zs、10)、
ドメイン(Zs、1、4)、
ドメイン([C1,C2,C3,C4], 0, 5),
global_cardinality (Zs, [1-C1,2-C2,3-C3,4-C4]),
ラベル付け([], Zs).
limited_repetitions__gprolog(Zs) :-
長さ(Zs, 10),
fd_domain (Zs, 1, 4),
maplist ( fd_atmost (5,Zs), [1,2,3,4]),
fd_labeling (Zs).
SICStus Prologバージョン 4.3.2 およびGNU Prolog 1.4.4で実行される簡単なサンプル クエリ:
?- limited_repetitions__SICStus(Zs). % ?- limited_repetitions__gprolog(Zs).
Zs = [1,1,1,1,1,2,2,2,2,2] % Zs = [1,1,1,1,1,2,2,2,2,2]
; Zs = [1,1,1,1,1,2,2,2,2,3] %; Zs = [1,1,1,1,1,2,2,2,2,3]
; Zs = [1,1,1,1,1,2,2,2,2,4] %; Zs = [1,1,1,1,1,2,2,2,2,4]
; Zs = [1,1,1,1,1,2,2,2,3,2] %; Zs = [1,1,1,1,1,2,2,2,3,2]
; Zs = [1,1,1,1,1,2,2,2,3,3] %; Zs = [1,1,1,1,1,2,2,2,3,3]
; Zs = [1,1,1,1,1,2,2,2,3,4] %; Zs = [1,1,1,1,1,2,2,2,3,4]
; Zs = [1,1,1,1,1,2,2,2,4,2] %; Zs = [1,1,1,1,1,2,2,2,4,2]
... % ...
解の数を数えるのにかかる時間を測ってみよう!
call_succeeds_n_times(G_0, N) :-
findall (t, call(G_0), Ts),
length (Ts, N).
?- call_time (call_succeeds_n_times(limited_repetitions__SICStus(_), N), T_ms)。
N = 965832、T_ms = 6550。% w/SICStus Prolog 4.3.2
?- call_time(call_succeeds_n_times(limited_repetitions__gprolog(_), N), T_ms)。
N = 965832、T_ms = 276。% w/GNU Prolog 1.4.4