このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/731
#  ../test/read.cgi/tech/1311089619/726 
#  すみません。提出することが出来ました。 
#  明日に行う課題を出されました。 
#  出来れば教えていただけますか? 
#  [1] 授業単元:C言語プログラミング 
#  [2] 問題文:4つの数値をを入力して結果が20になる数式(+,-,*,/)を全て表示させる. 
#  ()は考えない。  
#  組み合わせがない場合はエラー表示とする。入力できる数値は一桁のみとする。  
#  

'4つの数値を入力して結果が20になる数式(+,-,*,/)を全て表示させる' :-
        '4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4),
        '結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび),
        表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび).

'結果が20になる数式(+,-,*,/)を全て'(_数値1,_数値2,_数値3,_数値4,_式ならび) :-
        findall(_式,(
                    順列([_数値1,_数値2,_数値3,_数値4],4,L1),
                    順列(['+','-','*','/'],3,L2),
                    式を構成する(L1,L2,_式),
                    20 is truncate(_式))),
                _式ならび).

'4つの数値を入力して'(_数値1,_数値2,_数値3,_数値4) :-
        整数入力(_数値1),
        整数入力(_数値2),
        整数入力(_数値3),
        整数入力(_数値4),!.

式を構成する(L1,L2,_式) :-
        演算子を挿入する(L1,L2,L3),
        concat_atom(L3,S),
        atom_to_term(S,_式,_).

演算子を挿入する([A],_,[A]) :- !.
演算子を挿入する([_,0|R1],[/|R2],R3) :- !,fail.
演算子を挿入する([A|R1],[B|R2],[A,B|R3]) :-
        演算子を挿入する(R1,R2,R3).

表示させる(_数値1,_数値2,_数値3,_数値4,[]) :-
        writef('この4つの数値 %t,%t,%t,%t からは解が得られません\n',[_数値1,_数値2,_数値3,_数値4]),!.
表示させる(_数値1,_数値2,_数値3,_数値4,_式ならび) :-
        append(_,[_式|R],_式ならび),
        writef('20 = %t.\n',[_式]),
        R = [].

整数入力(_整数) :-
        write('整数を入力してください : '),
        get_line(Line),
        整数入力診断(Line,_整数),!.
整数入力(_整数) :-
        整数入力(_整数).

整数入力診断(Line,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),!.
整数入力診断(Line,_整数) :-
        writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

順列(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).

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

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).

del(X = [A|X] - A).
del([B|Y] = [B|X] - A) :-
        del(Y = X - A).