は、ここであなたが質問で提案されている述語 "リピート" ことを実現できた方法は次のとおりです。
に基づいて
:- use_module (library (clpfd)).
if_/3
および(=)/3
を定義します。
each_n_reps([E|Es], N) :-
aux_n_reps(Es, E, 1, N).
aux_n_reps([], _, N, N). % internal auxiliary predicate
aux_n_reps([E|Es], E0, N0, N) :-
if_ (E0 = E,
(N0 #< N, N1 #= N0+1), % continue current run
(N0 #= N, N1 #= 1)), % start new run
aux_n_reps(Es, E, N1, N).
01公正列挙についてどのように
?- each_n_reps(Xs, 3).
Xs = [_A,_A,_A]
; Xs = [_A,_A,_A,_B,_B,_B] , dif(_A,_B)
; Xs = [_A,_A,_A,_B,_B,_B,_C,_C,_C], dif(_A,_B), dif(_B,_C)
...
:
サンプルSICStusプロローグ4.3.2を使用してを照会しますか? [A,B,C,D,E,F]
は、同じ長さの実行に分割することができますどのように
?- length(Xs, _), each_n_reps(Xs, N).
N = 1, Xs = [_A]
; N = 2, Xs = [_A,_A]
; N = 1, Xs = [_A,_B] , dif(_A,_B)
; N = 3, Xs = [_A,_A,_A]
; N = 1, Xs = [_A,_B,_C] , dif(_A,_B), dif(_B,_C)
; N = 4, Xs = [_A,_A,_A,_A]
; N = 2, Xs = [_A,_A,_B,_B], dif(_A,_B)
; N = 1, Xs = [_A,_B,_C,_D], dif(_A,_B), dif(_B,_C), dif(_C,_D)
...
?
?- each_n_reps([A,B,C,D,E,F], N).
N = 6, A=B , B=C , C=D , D=E , E=F
; N = 3, A=B , B=C , dif(C,D), D=E , E=F
; N = 2, A=B , dif(B,C), C=D , dif(D,E), E=F
; N = 1, dif(A,B), dif(B,C), dif(C,D), dif(D,E), dif(E,F).
脚注1:回答は、読みやすさを向上させるために再フォーマットされました。
ヒント: '[H、H | T]'はリストの先頭に 'H 'が2回現れるリストを表します。 – lurker
'double([X | Xs]、[X、X | Ys]): - double(Xs、Ys) double([]、[])。 '働く、ありがとう。しかし、繰り返し述語は何ですか? – Troley
他の述語について...別の質問を掲示するのはどうですか? – repeat