(define $Something (type {[$var-match (lambda [$tgt] {tgt})] })) (define $Suit (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[spade [] {[ {[]}] [_ {}]}] [heart [] {[ {[]}] [_ {}]}] [club [] {[ {[]}] [_ {}]}] [diamond [] {[ {[]}] [_ {}]}] })] [$= (lambda [$val $tgt] (match [val tgt] [Card Card] {[[ ] ] [[ ] ] [[ ] ] [[ ] ] [[_ _] ]}))] })) (test (match-map Suit [ ])) (define $Nat (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[o [] {[ {[]}] [_ {}] }] [s [Nat] {[ {x}] [_ {}] }] })] [$= (lambda [$val $tgt] (match [val tgt] [Nat Nat] {[[ ] ] [[ ] (= n1 n2)] [[_ _] ]}))] })) (define $monus (lambda [$m $n] (match [m n] [Nat Nat] {[[_ ] m] [[ _] ] [[ ] (monus m1 n1)]}))) (test (monus >> >)) (define $mod (lambda [$m $n] (match (monus m n) Nat {[ m] [$m1 (mod m1 n)]}))) (test (mod >>>> >>>)) (define $Mod (lambda [$m] (let {[$Loop (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[o [] {[ {[]}] [_ {}] }] [s [Loop] {[ {x}] [ {m}] }]})] [$= (lambda [$val $tgt] ((type-ref Nat =) (mod val m) tgt))]})]} (type {[$var-match (lambda [$tgt] {(mod tgt m)})] [$inductive-match (lambda [$tgt] ((type-ref Loop inductive-match) (mod tgt m)))] [$= (lambda [$val $tgt] ((type-ref Nat =) (mod val m) (mod tgt m)))]})))) (test (match >>>> (Mod >>>) {[ ] [> ] [>> ]})) (define $List (lambda [$a] (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[nil [] {[{} {[]}] [_ {}] }] [cons [a (List a)] {[{$x .$xs} {[x xs]}] [_ {}] }] [snoc [a (List a)] {[{.$xs $x} {[x xs]}] [_ {}] }] [join [(List a) (List a)] {[$tgt (let {[$loop (lambda [$ts] (match ts (List a) {[ {[{} {}]}] [ {[{} ts] @(map (lambda [$as $bs] [{x @as} bs]) (loop xs))}]}))]} (loop tgt))] }] [nioj [(List a) (List a)] {[$tgt (let {[$loop (lambda [$ts] (match ts (List a) {[ {[{} {}]}] [ {[{} ts] @(map (lambda [$as $bs] [{@as x} bs]) (loop xs))}]}))]} (loop tgt))] }] })] [$= (lambda [$val $tgt] (match [val tgt] [(List a) (List a)] {[[ ] ] [[ ] ] [[_ _] ]}))] }))) (test ((type-ref (List Nat) =) { >} { >})) (test (match-map { > >>} (List Nat) [ [x xs]])) (test (match-map { > >>} (List Nat) [ [xs ys]])) (define $map (lambda [$fn $ls] (match ls (List Something) {[ {}] [ {(fn x) @(map fn xs)}]}))) (test (map (lambda [$a] ) { >})) (test (match {} (List Something) {[ [hs ts]]})) (test (match-map { } (List Something) [ [hs ts]])) (test (match-map { } (List Something) [> [hs x ts]])) (define $remove (lambda [$a] (lambda [$xs $x] (match xs (List a) {[ {}] [ rs] [ {y @((remove a) rs x)}]})))) (test ((remove Nat) { >} )) (define $remove-collection (lambda [$a] (lambda [$xs $ys] (match ys (List a) {[ xs] [ ((remove-collection a) ((remove a) xs y) rs)]})))) (test ((remove-collection Nat) { > >>} { >>})) (define $subcollection (lambda [$xs] (match xs (List Something) {[ {{}}] [ (let {[$subs (subcollection rs)]} {@subs @(map (lambda [$sub] {x @sub}) subs)})] }))) (test (subcollection { > >>})) (define $Multiset (lambda [$a] (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[nil [] {[{} {[]}] [_ {}] }] [cons [a (Multiset a)] {[$tgt (map (lambda [$t] [t ((remove a) tgt t)]) tgt)] }] [join [(Multiset a) (Multiset a)] {[$tgt (map (lambda [$ts] [ts ((remove-collection a) tgt ts)]) (subcollections tgt))] }] })] [$= (lambda [$val $tgt] (match [val tgt] [(Multiset a) (Multiset a)] {[[ ] ] [[ ] ] [[_ _] ]}))] }))) (define $one-pair (lambda [$ns] (match ns (Multiset Nat) {[> ] [_ ] }))) (test (one-pair { > })) (define $full-house (lambda [$ns] (match ns (Multiset Nat) {[ >>>>> ] [_ ] }))) (test (full-house { > >})) (define $thirteen >>>>>>>>>>>>>) (define $Card (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[card [Suit (Mod thirteen)] {[ {[s n]}]}]})] [$= ]})) (define $poker-hands (lambda [$Cs] (match Cs (Multiset Card) {[ ! >>>>> ] [ ! ! ! >>>>> ] [ ! ! ! >>>>> ] [ ! ! ! ! ! >>>>> ] [ ! >>>>> ] [ ! >>>>> ] [ ! ! >>>>> ] [ ! >>>>> ] [ >>>>> ]}))) (define $poker-hands-without-strait (lambda [$Cs] (match Cs (Multiset Card) {[ ! ! ! >>>>> ] [ ! ! ! >>>>> ] [ ! ! ! ! ! >>>>> ] [ ! >>>>> ] [ ! ! >>>>> ] [ ! >>>>> ] [ >>>>> ]}))) (test (poker-hands-without-strait { > >> > > >>})) (define $car (lambda [$as] (match as (List Something) {[ a]}))) (define $reverse (lambda [$as] (match as (List Something) {[ {}] [ {@(reverse rs) a}]})))