このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/420
#  [1] 授業単元:プログラミング基礎 
#  [2] 問題文(含コード&リンク): 
#  車のナンバーや電車の切符の裏などにある4桁の数字。その数字を四則演算し10にするというクイズを解くプログラムをお願いします。 
#  1 2 3 4  と言う4つの数字であれば、すべて足せば10になりますし 
#  2 3 5 7  は{(3+7)/2+5}で10になります。 
#   
#  数字の順番は変えてもOK(上のように2357を3725と並び替えている) 
#  二つの数字をくっつけて1つにしてもOK(0 0 1 2を20-10) 
#   
#  数字を4つ入力し、全パターンを出力するプログラムをお願いします。 
% 四則演算 と 置換([A,B|R],[C|R]) :- C is 10 * A + B

t687(L,_式) :-
    順列(L,4,L1),
    t687_1(L1,_式,10).

t687_1([A],A,A).
t687_1([A,B|R1],C,X) :-
    C is 10 * A + B,
    t687_1(R1,_式_2,Y).
t687_1([A,B|R1],_式,X) :-
    \+(R1=[]),
    C is 10 * A + B,
    t687_1(R1,_式_2,Y),
    t687_2(C,_関数,Y,X),
    _式 =.. [_関数,C,_式_2].
t687_1([A|R1],_式,X) :-
    t687_1(R1,_式_2,Y),
    t687_2(A,_関数,Y,X),
    _式 =.. [_関数,A,_式_2].

t687_2(A,+,B,X) :-
    X is A + B.
t687_2(A,-,B,X) :-
    X is A - B.
t687_2(A,*,B,X) :-
    X is A * B.
t687_2(A,//,B,X) :-
    0 is A mod B,
    X is A // B.

% *** user: 順列 / 4 ***
順列(Y,0,_,[]).
順列(Y,N,EL,[A|X]) :-
    \+(member(A,EL)),
    del(Z = Y - A),
    M is N - 1,
    順列(Z,M,EL,X).
順列(Y,N,EL,[_|X]) :-
    member(A,EL),
    順列(Z,M,EL,X).

% *** user: 順列 / 3 ***
順列(Y,0,[]).
順列(Y,N,[A|X]) :-
    del(Z = Y - A),
    M is N - 1,
    順列(Z,M,X).

% *** user: del / 3 ***
del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
    del(A,X,Y).

% *** user: del / 1 ***
del(X = [A|X] - A).
del([B|Y] = [B|X] - A) :-
    del(Y = X - A).

% *** user: 重複順列 / 3 ***
重複順列(L,N,X) :- length(X,N),重複順列(L,X).
重複順列(L,[]).
重複順列(L,[A|R]) :- member(A,L),重複順列(L,R).