packages feed

egison-1.0: etc/lib/graph.egi

(define $Node Integer)

(define $NodeInfo
  (type
    {[$var-match (lambda [$tgt] {tgt})]
     [$inductive-match
      (destructor
        {[node [Node (Multiset Node) (Multiset Node)]
          {[<node $n $in $out> {[n in out]}]}]})]
     [$equal? (lambda [$val $tgt]
                (match [val tgt] [NodeInfo NodeInfo]
                  {[[<node $n $in $out> <node ,n ,in ,out>] <true>]
                   [[_ _] <false>]}))]}))

(define $Graph (Multiset NodeInfo))


(define $hamilton-cycle
  (lambda [$g]
    (let {[$n (size g)]}
      (match-all g Graph
        [<cons <node $a_1 <cons $a_2 _> _>
               (loop $l $i [3 n]
                     <cons <node ,a_(- i 1) <cons $a_i _> _>
                           l>
                     <cons <node ,a_n <cons ,a_1 _> _>
                           _>)>
         (loop $l $i [1 n] {a_i @l} {})]))))

(define $hamilton-path
  (lambda [$g]
    (let {[$n (size g)]}
      (match-all g Graph
        [<cons <node $a_1 <cons $a_2 _> _>
               (loop $l $i [3 n]
                     <cons <node ,a_(- i 1) <cons $a_i _> _>
                           l>
                     <cons <node ,a_n _ _>
                           <nil>>)>
         (loop $l $i [1 n] {a_i @l} {})]))))