egison-3.2.2: lib/tree/tree.egi
(define $b-tree
(lambda [$a $b]
(algebraic-data-matcher
{<leaf b> <node (b-tree a b) (b-tree a b)>})))
(define $tree
(lambda [$a $b]
(matcher
{[,$val []
{[$tgt (match [val tgt] [(tree a b) (tree a b)]
{[[<lnode $x $ts> <lnode ,x ,ts>] {[]}]
[[_ _] {}]})]}]
[<leaf $> b
{[<Leaf $x> {x}]
[_ {}]}]
[<lnode $ $> [a (list (tree a b))] ; Node whose children are seen as a list.
{[<Node $x $ts> {[x ts]}]
[_ {}]}]
[<mnode $ $> [a (multiset (tree a b))] ; Node whose children are seen as a multiset.
{[<Node $x $ts> {[x ts]}]
[_ {}]}]
[<descendant $> [(tree a b)]
{[$t {t @(match-all t (tree a b)
[<mnode _ <cons <descendant $x> _>> x])}]}]
[$ [something]
{[$tgt {tgt}]}]
})))