egison-3.0.12: lib/graph/graph.egi
;;;
;;; graph.egi
;;;
(define $graph
(lambda [$a]
(multiset (nodeInfo a))))
(define $nodeInfo
(lambda [$a]
(algebraic-data-matcher
{<node a (multiset a) (multiset a)>})))
(define $hamilton-cycle
(pattern-function [$a]
(& $g
<cons <node (& a_1 $h_1) <cons (& a_2 $h_2) _> _>
(loop $i (between 3 (size g))
<cons <node ,h_(- i 1) <cons (& a_i $h_i) _> _>
...>
<cons <node ,h_(size g) <cons ,h_1 _> _>
<nil>>)>)))
(define $hamilton-path
(pattern-function [$a]
(& $g
<cons <node (& a_1 $h_1) <cons (& a_2 $h_2) _> _>
(loop $i (between 3 (size g))
<cons <node ,h_(- i 1) <cons (& a_i $h_i) _> _>
...>
<cons <node ,h_(size g) _ _>
<nil>>)>)))
(define $hamilton-path2
(pattern-function [$a]
(& $g
(let {[$n (size g)]}
<cons <node (& a_1 $h_1) <cons (& a_2 $h_2) _> _>
(loop $i (between 3 n)
<cons <node ,h_(- i 1) <cons (& a_i $h_i) _> _>
...>
<cons <node ,h_n _ _>
<nil>>)>)
)))
(define $all-paths
(pattern-function [$s $e $p $rest]
(| <cons <node (& s p_1) <cons (& e p_2) _> _> rest>
<cons <node (& s p_1) <cons (& p_2 $h_2) _> _>
(loop $i (from 2) ;; TEMPORARY
<cons <node ,h_(- i 1) <cons (& p_i $h_i) _> _>
...>
rest)>)))