このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/952
#  [1] 授業単元:Cプログラミング初級 
#  [2] 問題文(含コード&リンク): 
#  http://ime.nu/detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1035220915 
#  (バブルソートでやっていただけると助かります) 
#   
#  (資料) 
#  http://ime.nu/www.geocities.jp/hagure874/kapu.html#1 
#  http://ime.nu/detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1337454033 
#   
#  
#  任意の4桁の数字(ぞろ目を除き、0023なども存在する)を入力し、最終的なカプレカ数と
#  その反復回数を出力するプログラムの作り方を教えてください。

カプレカ数(X) :-
        findall(Y,(
                    for(1,N,10000),
                    U is random mod 1000,
                    カプレカ数(U,_,Y)),
                L),
        all(L,X).

カプレカ数(N,_反復回数,_カプレカ数) :-
        カプレカ数(N,[],[],_反復回数,_カプレカ数).        

カプレカ数(N,[N|R],Ln,_反復回数,_カプレカ数) :-
        length(Ln,_反復回数),!.
カプレカ数(N,L1,Ln,X) :-
        N4 is N // 1000,
        N41 is N mod 1000,
        N3 is N41 // 100,
        N31 is N41 mod 100,
        N2 is N31 // 10,
        N1 is N31 mod 10,
        \+([N1,N2,N3,N4]=[A,A,A,A]),
        カプレカ最小数([N1,N2,N3,N4],_最小数),
        カプレカ最大数([N1,N2,N3,N4],_最大数),
        N5 is _最大数 - _最小数,
        カプレカ数(N5,[N|L1],[_|Ln],X).

カプレカ最小数([N1,N2,N3,N4],_最小数) :-
        パブルソート([N1,N2,N3,N4],[A,B,C,D]),
        _最小数 is A * 1000 + B * 100 + C * 10 + D,!.

カプレカ最大数([N1,N2,N3,N4],_最大数) :-
        バブルソート([N1,N2,N3,N4],[D,C,B,A]),
        _最大数 is A * 1000 + B * 100 + C * 10 + D,!.

バブルソート(_対象ならび,_整列済みならび) :-
        交換(_対象ならび,_対象ならびの一),!,
        バブルソート(_対象ならびの一,_整列済みならび).
バブルソート(_整列済みならび,_整列済みならび).

交換([],[]) :- !,fail.
交換([A,B|R],[B,A|R]) :-
        A @> B,!.
交換([A|R1],[A|R2]) :-
        交換(R1,R2).