(define $product (letrec {[$subproduct (lambda [$xs $ys] (match xs (List Something) {[ {}] [ {@(map (lambda [$y] {z @y}) ys) @(subproduct zs ys)}]}))]} (lambda [$xs] (match xs (List Something) {[ {}] [> (map (lambda [$z] {z}) y)] [ (subproduct y (product ys))]})))) (define $COC (lambda [$a $b] ;; a : collection-type b : contents-type see. an example below (type {[,$val [] {[$tgt (match tgt (List (a b)) {[,val {[]}] [_ {}]})]}] [ [] ;; nil when some contents is nil {[$tgt (letrec {[$helper (lambda [$xs] (match xs (List Something) {[ {}] [ (match y [(a b)] {[ {[]}] [_ (helper ys)]})]}))]} (helper tgt))]}] [ [(COC a b)] {[$tgt (letrec {[$helper (lambda [$xs $ys] (match [xs ys] [(List Something) (List Something)] {[[ ] {}] [[ ] {(match-all y [(a b)] [ xs]) @(helper xs ys)}]}))]} (product (helper xs tgt)))]}] [ [(List b) (COC a b)] {[$tgt (letrec {[$helper (lambda [$xs] (match xs (List Something) {[ {}] [ {(match-all y [(a b)] [ [z zs]]) @(helper ys)}]}))] [$lt2tl (lambda [$xs] (match xs (List [Something Something]) {[ [{} {}]] [ (let {[[$p $q] (lt2tl ys)]} [{y @p} {z @q}])]}))]} (map lt2tl (product (helper tgt))))]}] [_ [Something] {[$tgt {tgt}]}]}))) ;; (define $n-queen ;; (lambda [$n] ;; (match-all {(between 1 n) (between 2 (* 2 n)) (between (- 1 n) (- n 1))} (COC Multiset Integer) ;; [(loop $l $i (between 1 n) l> ) ;; (loop $l $i (between 1 n) {a_i @l} {})])))