マッチ棒を動かして10を3つ作るパズル

出典:【マッチ棒パズル1】https://twitter.com/puzzlegiver_bot/status/298325496985448449
「棒を3本動かして3つの式の答えをそれぞれ10にして下さい。」
  5 – 1 + 5
  4 × 7 – 5
  6 – 4 + 8

1つ目の答えを出すのに数時間かかった。もう1つは未確認。酷い。

出典:【マッチ棒パズル1】https://twitter.com/puzzlegiver_bot/status/298325496985448449
「棒を3本動かして3つの式の答えをそれぞれ10にして下さい。」
  5 – 1 + 5
  4 × 7 – 5
  6 – 4 + 8

1つ目の答えを出すのに数時間かかった。もう1つは未確認。酷い。

([Bef|Tail], [Aft|Tail], (Bef, Aft)).
([X|BefTail], [X|AftTail], Replace) :-
(BefTail, AftTail, Replace).
%
(X) :- (X, _).
((number, Ptn), Char) :- ((number, Ptn), Char).
((operator, Ptn), Char) :- ((operator, Ptn), Char).
((number, [1, 1, 1, 1, 0, 1, 1]), 0). % 8
((number, [0, 0, 1, 0, 0, 1, 0]), 1).
((number, [0, 1, 1, 1, 1, 0, 1]), 2).
((number, [0, 1, 1, 0, 1, 1, 1]), 3).
((number, [1, 0, 1, 0, 1, 1, 0]), 4).
((number, [1, 1, 0, 0, 1, 1, 1]), 5).
((number, [1, 1, 0, 1, 1, 1, 1]), 6).
((number, [1, 1, 1, 0, 0, 1, 0]), 7). % “
((number, [1, 1, 1, 1, 1, 1, 1]), 8).
((number, [1, 1, 1, 0, 1, 1, 1]), 9).
((operator, [1, 1, 0, 0]), '+').
((operator, [0, 1, 0, 0]), '-').
((operator, [0, 0, 1, 1]), '*'). % ×
%((operator, [0, 0, 0, 1]), '/'). %
([]).
([Head|Tail]) :- (Head), (Tail).
([], []).
([DH|DigitString], [H|String]) :-
(DH, H), (DigitString, String).
1((Type, Ptn), (Type, PtnAfter)) :- %
(Ptn, PtnAfter, (0, 1)).
1((Type, Ptn), (Type, PtnAfter)) :-
(Ptn, PtnAfter, (1, 0)).
1(Chars, CharsAfter) :-
1(Chars, CharsTmp1),
1(CharsTmp1, CharsAfter),
Chars \== CharsAfter.
1([Char|Tail], [CharAfter|Tail]) :-
1(Char, CharAfter).
1([X|CharsTail], [X|CharsAfterTail]) :-
1(CharsTail, CharsAfterTail).
1([Char|Tail], [CharAfter|Tail]) :-
1(Char, CharAfter).
1([X|CharsTail], [X|CharsAfterTail]) :-
1(CharsTail, CharsAfterTail).
% ( + - * / )
([X, Op1, Y, Op2, Z], Expr) :-
current_op(Op1Priority, _, Op1),
current_op(Op2Priority, _, Op2),
Op1Priority =< Op2Priority
-> ( Expr1 =.. [Op1, X, Y], Expr =.. [Op2, Expr1, Z] )
; ( Expr1 =.. [Op2, Y, Z], Expr =.. [Op1, X, Expr1] ).
% ?- ([1, '+', 2, '+', 3], X).
% ?- ([1, '*', 2, '+', 3], X).
% ?- ([1, '+', 2, '*', 3], X).
% ?- ([1, '*', 2, '*', 3], X).
% (AZ-Prolog length )
mylen([], 0).
mylen([_|Tail], N) :- N > 0, N1 is N - 1, mylen(Tail, N1).
append([], L, L).
append([H|T1], L, [H|T2]) :- append(T1, L, T2).
append_fold([], []).
append_fold([H|Tail], Sum) :- append_fold(Tail, TailSum), append(H, TailSum, Sum).
%
?- Q = [
5, '-', 1, '+', 4,
4, '*', 7, '-', 5,
6, '-', 4, '+', 8
],
% A Q 3
(Enc0, Q),
1(Enc0, Enc1),
1(Enc1, Enc2), Enc0 \== Enc2,
1(Enc2, Enc3), Enc0 \== Enc3, Enc1 \== Enc3,
(Enc3, A),
% write(A), nl,
% 310
mylen(A1, 5), mylen(A2, 5), mylen(A3, 5),
append_fold([A1, A2, A3], A),
(A1, E1), 10 is E1, % E1 is 10
(A2, E2), 10 is E2,
(A3, E3), 10 is E3.
% 2
% A = [7,-,1,+,4,4,*,4,-,6,6,-,4,+,8]
% A = [5,+,1,+,4,1,*,7,+,3,6,-,4,+,8]
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX