Cards.vpp

/*
 * 誰もが知っているトランプを題材にしてみます。
 */
class Cards
types
    -- スートとも呼ばれます
    public マーク型 = <スペード> | <ハート> | <クラブ> | <ダイヤ>;

    -- それぞれのマークについて1〜13までのカードがあります。
    public ジョーカーを除くカード型 ::
        マーク: マーク型
        番号:   int         -- 1から13
    inv c == 1 <= c.番号 and c.番号 <= 13;

    -- さらにジョーカーも含まれます(ジョーカーは1枚としています)。
    public カード型 = ジョーカーを除くカード型 | <ジョーカー>;

instance variables
    -- マークの集合
    public マーク集合: set of マーク型 := { <スペード>, <ハート>, <クラブ>, <ダイヤ> };

    -- 52枚のカードを作成しています。
    public ジョーカーを除くカード: set of ジョーカーを除くカード型 := 
        { mk_ジョーカーを除くカード型(mark, number) |
            mark in set マーク集合, number in set { 1, ... ,13}};

    -- ジョーカーを含む53枚のカードを作成しています。
    public すべてのカード: set of カード型 := ジョーカーを除くカード union { <ジョーカー> };

end Cards
/*
>> init
>> create cards := new Cards()
>> p card cards.すべてのカード
53
>> p cards.すべてのカード
p { {c1,c2} | c1,c2 in set {1,2,3}}
p card { {c1,c2} | c1,c2 in set cards.すべてのカード}
1431        -- 十数秒ぐらいかかる。
p card { {c1,c2} | c1,c2 in set cards.すべてのカード & c1 <> c2}
1378        -- 53*52/2
p card { c1 | c1 in set power cards.すべてのカード & card c1 = 2}
Run-Time Error 79: Set too big for 'power' - limit is 16
 -- 3枚のカードの全組み合わせ。時間がかかりすぎます。20分でも終わりませんでした。
p card { {c1,c2,c3} | c1,c2,c3 in set cards.すべてのカード & c1 <> c2 and c1 <> c3 and c2 <> c3 }
23426   -- 53*52*51/2*3
 */