egison-1.2.1: etc/lib/number.egi
(define $Integer
(type
{[$var-match (lambda [$tgt] {tgt})]
[$equal? (lambda [$val $tgt] (= val tgt))]}))
(define $Double
(type
{[$var-match (lambda [$tgt] {tgt})]
[$equal? (lambda [$val $tgt] (=f val tgt))]}))
(define $Nat
(type
{[$var-match (lambda [$tgt] {tgt})]
[$inductive-match
(destructor
{[o []
{[0 {[]}]
[_ {}]}]
[s [Nat]
{[$tgt (match (compare-integer tgt 0) Order
{[<greater> {(- tgt 1)}]
[_ {}]})]}]})]
[$equal? (lambda [$val $tgt] (= val tgt))]}))
(define $between
(lambda [$m $n]
(match (compare-integer m n) Order
{[<less> {m @(between (+ m 1) n)}]
[<equal> {n}]
[<greater> {}]
})))
(define $min
(lambda [$ns]
(match ns (List Integer)
{[<cons $n <nil>> n]
[<cons $n $rs>
(let {[$r (min rs)]}
(match (compare-integer n r) Order
{[<less> n]
[_ r]}))]})))
(define $max
(lambda [$ns]
(match ns (List Integer)
{[<cons $n <nil>> n]
[<cons $n $rs>
(let {[$r (max rs)]}
(match (compare-integer n r) Order
{[<greater> n]
[_ r]}))]})))
(define $gcd
(lambda [$ns]
(match ns (Set Integer)
{[<cons $n <nil>> n]
[<cons (& ,(min ns) $m)
$rs>
(gcd {m @((remove-all Integer)
(map (lambda [$r] (mod r m))
rs)
0)})]})))