/*
* 誰もが知っているトランプを題材にしてみます。
*/
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
*/