packages feed

egison-3.9.1: sample/five-color.egi

;;;
;;; 5-color
;;;


(define $node [integer (maybe integer)])
(define $graph (set [node (multiset node)]))

(define $colors (between 1 5))

(define $graph-data
  {[[1 Nothing] {[2 Nothing]}]
   [[2 Nothing] {[1 Nothing]}]})

(define $main
  (lambda [$graph-data]
    (match [colors graph-data] [(set integer) graph]
      {; 周りのノードでまだ5色全部使われていない場合.
       [[<cons $c _> <cons [[$id (nothing)] !<cons [_ (just ,c)] _>] _>]
        (main (assign-color id c graph-data))]
       ; 次数が5で周りで5色全部使われているノードしか残っていない場合.
       [[_ <cons [[$id (nothing)] <cons [$nid_1 (just $c_1)] <cons [$nid_2 (just $c_2)] <cons [$nid_3 (just $c_3)] <cons [$nid_4 (just $c_4)] <cons [$nid_5 (just $c_5)] <nil>>>>>>] _>]
        undefined]
       ; すべてのノードに色付け完了.
       [_ graph-data]
       })))

(define $assign-color
  (lambda [$id $c $graph-data]
    (map (lambda [$n]
           [(rewrite-node id c (2#%1 n)) (map (lambda [$n] (rewrite-node id c n)) (2#%2 n))])
         graph-data)))

(define $rewrite-node
  (lambda [$id $c $n]
    (match n node
      {[[,id (nothing)] [id (Just c)]]
       [_ n]})))

(rewrite-node 1 5 [1 Nothing]) ; [1 {5}]
(assign-color 1 5 graph-data) ; {[[1 {5}] {[2 {}]}] [[2 {}] {[1 {5}]}]}
(main graph-data) ; {[[1 {1}] {[2 {2}]}] [[2 {2}] {[1 {1}]}]}