このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/165
#  [1] 授業単元:C言語  
#  [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/YKwOhX0L 
#  
#  /*
#  ・仕様
#  ・配るカードは13枚
#  ・スートはSuiteという列挙体で定義され、Spade(スペード)、Club(クラブ)、Heart(ハート)
#  Dia(ダイア)という定数を持つ
#  ・カードはCARDという構造体で定義され、Suite列挙体のsuiteと、カードのランクを表す
#  int型のrankという2つのメンバを持つ
#  ・カードは配列
#  ・13枚のカードのスートとランクは乱数で決定。現実にはありえないカードの配り方
#  になってもよい(例:13枚の中にスペードのエースが5枚ある等)
#  ・スートはスペード→ハート→クラブ→ダイヤの順にソートし、ランクは小さい順(1,2,3,…13)
#  にソート、またランクよりもスートを優先
#  例:4枚のカードの内訳がスペードの2と5、ハートの3、クラブの10なら
#  スペードの2→スペードの5→ハートの3→クラブの10とソートされる
#  ・ソートのアルゴリズムはバブルソートを使う
#  ソートの前とソートの後のカードを表示する
#  */

'乱数を使ってカードを13枚配りそれをバブルソートする'(_配られたカード,_ソートされたカード) :-
        '乱数を使ってカードを13枚配り'(_配られたカード),
        それをバブルソートする(_配られたカード,_ソートされたカード).

'乱数を使ってカードを13枚配り'(_配られたカード) :-
        'カードを13枚'(_配られたカード),
        スートとランクを当て嵌める(_配られたカード).

'カードを13枚'(_配られたカード) :-
        length(_配られたカード,13).

スートとランクを当て嵌める(_配られたカード) :-
        findall([_スート,_ランク],(
                    member(_カード,_配られたカード),
                    スートを決める(_スート),
                    ランクを決める(_ランク)),
                _配られたカード).

スートを決める(_スート) :-
        _乱数 is random(4),
        スートを決める(_乱数,_スート).

スートを決める(0,スペード).
スートを決める(1,ハート).
スートを決める(2,クラブ).
スートを決める(3,ダイヤ).

ランクを決める(_ランク) :-
        _ランク is random(13) + 1.

それをバブルソートする(_配られたカード,_ソートされたカード) :-
        'スート・ランク仕様のバブルソート'(_配られたカード,_ソートされたカード).

'スート・ランク仕様のバブルソート'(L1,L2) :-
        軽い泡はちょっと浮き上がる(L1,L3),
        泡が浮き上がったら最初からやり直す(L3,L2),!.
'スート・ランク仕様のバブルソート'(L,L) :-
        浮き上がる泡がなくなったらバブルソート終了.

軽い泡はちょっと浮き上がる(L1,L3) :-
        append(L0,[_重い泡,_軽い泡|R],L1),
        泡の重さを量る(_重い泡,_軽い泡),
        append(L0,[_軽い泡,_重い泡|R],L3).

泡の重さを量る([_スート_1,_],[_スート_2,_]) :-
        スート強度(_スート_1,_スート_2),!.
泡の重さを量る([_スート,_ランク_1],[_スート,_ランク_2]) :-
        _ランク_1 >= _ランク_2.

スート強度(_スート_1,_スート_2) :-
        nth1(N1,[ダイヤ,クラブ,ハート,スペード],_スート_1),
        nth1(N2,[ダイヤ,クラブ,ハート,スペード],_スート_2),
        N1 > N2,!.

泡が浮き上がったら最初からやり直す(L3,L2) :-
        'スート・ランク仕様のバブルソート'(L3,L2).

浮き上がる泡がなくなったらバブルソート終了.