(define $Suit (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (destructor {[,$suit [] {[$tgt (if (= tgt suit) {[]} {})]}] [ [] {[ {[]}] [_ {}]}] [ [] {[ {[]}] [_ {}]}] [ [] {[ {[]}] [_ {}]}] [ [] {[ {[]}] [_ {}]}]})] [$= eq?]})) (define $Mod (lambda [$m] (type {[$var-match (lambda [$tgt] {(mod tgt m)})] [$inductive-match (destructor {[,$n [] {[$tgt (if (= tgt n) {[]} {})]}]})] [$= (lambda [$val $tgt] (eq-n? (mod val m) (mod tgt m)))]}))) (define $Card (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (destructor {[,$card [] {[$tgt (if (= tgt card) {[]} {})]}] [ [Suit (Mod 13)] {[ {[s n]}]}]})] [$= (lambda [$val $tgt] (match [val tgt] [Card Card] {[[ ] #t] [[_ _] #f]}))]})) (define $poker-hands (lambda [$Cs] (match Cs (Multiset Card) {[ !>>>>> ] [ ! ! !>>>>> ] [ ! !>>>>> ] [ ! ! ! ! !>>>>> ] [ !>>>>> ] [ >>>>> ] [ ! !>>>>> ] [ >>>>> ] [>>>>> ]})))