(define $Suit (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (destructor {[spade [] {[ {[]}] [_ {}]}] [heart [] {[ {[]}] [_ {}]}] [club [] {[ {[]}] [_ {}]}] [diamond [] {[ {[]}] [_ {}]}]})] [$equal? (lambda [$val $tgt] (match [val tgt] [Suit Suit] {[[ ] ] [[ ] ] [[ ] ] [[ ] ] [[_ _] ]}))]})) (define $Mod (lambda [$m] (type {[$var-match (lambda [$tgt] {(mod tgt m)})] [$equal? (lambda [$val $tgt] (= (mod val m) (mod tgt m)))]}))) (define $Card (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (destructor {[card [Suit (Mod 13)] {[ {[s n]}]}]})] [$equal? (lambda [$val $tgt] (match [val tgt] [Card Card] {[[ ] ] [[_ _] ]}))]})) (define $poker-hands (lambda [$Cs] (match Cs (Multiset Card) {[ !>>>>> ] [ ! ! !>>>>> ] [ ! !>>>>> ] [ ! ! ! ! !>>>>> ] [ !>>>>> ] [ >>>>> ] [ ! !>>>>> ] [ >>>>> ] [>>>>> ]})))