[Prolog]各部分の和が等しいように輪を分割するパズル

元ネタ:https://twitter.com/puzzlegiver_bot/status/217544145630281729
ただし、解はアルファベットではなく、与えたリストの中での位置を返す。

元ネタ:https://twitter.com/puzzlegiver_bot/status/217544145630281729
ただし、解はアルファベットではなく、与えたリストの中での位置を返す。

append([], List, List).
append([Head|Tail], List, [Head|TailR]) :- append(Tail, List, TailR).
(List, (I, I), []).
(List, (0, End), SubList) :-
number(End), End > 0, _(List, End, SubList).
([Head|Tail], (Bgn, End), SubList) :-
number(Bgn), Bgn > 0, Bgn1 is Bgn - 1,
number(End), End > 0, End1 is End - 1,
(Tail, (Bgn1, End1), SubList).
_(_, 0, []).
_([Head|Tail], Cnt, [Head|TailAcc]) :-
Cnt > 0, Cnt1 is Cnt - 1, _(Tail, Cnt1, TailAcc).
(L, L, R) :- L =< R.
(N, L, R) :- L =< R, L1 is L + 1, (N, L1, R).
([Head|Tail], Sum) :- _acc(Tail, Sum, Head).
_acc([], Sum, SumAcc) :- Sum is SumAcc.
_acc([Head|Tail], Sum, SumAcc) :- _acc(Tail, Sum, Head + SumAcc).
(List, (I, I), []).
(List, (0, End), Arc) :- (List, (0, End), Arc).
(List, (Bgn, 0), Arc) :- length(List, N), (List, (Bgn, N), Arc).
(List, (Bgn_, End_), Arc) :-
number(Bgn_), number(End_), Bgn_ =\= 0, End_ =\= 0,
length(List, N),
Bgn is ((Bgn_ mod N) + N) mod N, %
End is ((End_ mod N) + N) mod N,
( Bgn < End
-> (List, (Bgn, End), Arc)
; (List, (Bgn, 0), ArcLead), (List, (0, End), ArcTrail),
append(ArcLead, ArcTrail, Arc)
).
(List, [X|Answer], Div) :-
(List, ListSum), ArcSum is ListSum / Div,
length(List, N),
(X, 0, N), % ()
(List, [X|Cut], Div, ArcSum, N, N),
append(Answer, [X], Cut).
(_, [_], 0, _, _, 0).
(List, [Bgn, End|Cut], Div, Sum, LenFull, LenRemain) :-
(Len, 1, LenRemain), End is (Bgn + Len) mod LenFull,
(List, (Bgn, End), Arc),
(Arc, Sum),
Div1 is Div - 1, LenRemain1 is LenRemain - Len,
(List, [End|Cut], Div1, Sum, LenFull, LenRemain1).
%
?- ( [1, 12, 5, 8, 10, 3, 11, 9, 6, 7, 4, 2], Answer, 3 ).
/*
Answer = [2,6,9]. % 5, 11, 7 B, F, I
*/
% ---------------------
% (3)
between(L, L, R) :- L < R.
between(N, L, R) :- L < R, L1 is L + 1, between(N, L1, R).
(1, 12). (12, 5). (5, 8). (8, 10). (10, 3). (3, 11).
(11, 9). (9, 6). (6, 7). (7, 4). (4, 2). (2, 1).
(X, R) :- (X, R) ; (X \== R, (R1, R), (X, R1)).
(X, R, Sum) :- (X, R), _acc(X, R, Sum, 0).
_acc(X, X, Sum, SumAcc) :- !, Sum is SumAcc.
_acc(X, R, Sum, SumAcc) :- (X, X1), _acc(X1, R, Sum, SumAcc + X).
( [X, Y, Z], Sum ) :-
between(X, 1, 13),
(X, Y, Sum), (Y, Z, Sum), (Z, X, Sum).
?- Sum is ((12*(12 + 1))/2) / 3, (A, Sum).
% A = [5,11,7] % B, F, I
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX