このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/6
#  [1] 授業単元: C言語プログラミング 
#  [2] 問題文(含コード&リンク):となりどおしの数字の差がその下の数字となるように、 
#  1から15までの数を1回だけ使って例に従ってマスにいれなさい。  
#  

積み上げ(L) :-
        組合せならびの生成(_組合せならびの生成),
        L = [[_],[_,_],[_,_,_],[_,_,_,_],[_,_,_,_,_]],
        積み上げ(_組合せならびの生成,[],LY,L),
        reverse(L,L2),
        '5段から1段まで表示する'(['          ','        ','      ','    ','  ',''],L2).

積み上げ(LX,LY1,LY,[L1,L2|R]) :-
        一行積み上げ(L1,LX,LY1,LY2,L2),
        積み上げ(LX,LY2,LY,[L2|R]).

一行積み上げ([],LX,LY,LY,[]) :- !.
一行積み上げ([S],LX,LY1,[N1,N2|LY1],[N1,N2]) :-
        member([S,N1,N2],LX),
        \+(member(N1,LY)),
        \+(member(N2,LY)),
        S is abs(N1-N2),!.
一行積み上げ([S|R1],LX,LY1,LY,[N1,N2|R2]) :-
        member([S,N1,N2],LX),
        \+(member(N1,LY)),
        \+(member(N2,LY)),
        S is abs(N1-N2),
        一行積み上げ(R1,LX,[N1,N2|LY1],LY,[N2|R2]).

組合せならびの生成(_組合せならびの生成) :-
        findall([S,N1,N2],(
                    組合せ([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],2,[N1,N2]),
                    S is abs(N1-N2),
                    \+(member(S,[N1,N2]))),
                _組合せならび),

'5段から1段まで表示する'([],[]) :- !.
'5段から1段まで表示する'([_空白|R1],[L|R2]) :-
        concat_atom(L,'  ',S),
        writef('%t%t\n',[_空白,S]),
        '5段から1段まで表示する'(R1,R2).