packages feed

egison-3.6.0: sample/n-queen.egi

(define $eight-queen
  (match-all {1 2 3 4 5 6 7 8} (multiset integer)
    [<cons $a_1
      <cons (& !,(- a_1 1) !,(+ a_1 1)
               $a_2)
       <cons (& !,(- a_1 2) !,(+ a_1 2)
                !,(- a_2 1) !,(+ a_2 1)
                $a_3)
        <cons (& !,(- a_1 3) !,(+ a_1 3)
                 !,(- a_2 2) !,(+ a_2 2)
                 !,(- a_3 1) !,(+ a_3 1)
                 $a_4)
          <cons (& !,(- a_1 4) !,(+ a_1 4)
                   !,(- a_2 3) !,(+ a_2 3)
                   !,(- a_3 2) !,(+ a_3 2)
                   !,(- a_4 1) !,(+ a_4 1)
                   $a_5)
           <cons (& !,(- a_1 5) !,(+ a_1 5)
                    !,(- a_2 4) !,(+ a_2 4)
                    !,(- a_3 3) !,(+ a_3 3)
                    !,(- a_4 2) !,(+ a_4 2)
                    !,(- a_5 1) !,(+ a_5 1)
                    $a_6)
            <cons (& !,(- a_1 6) !,(+ a_1 6)
                     !,(- a_2 5) !,(+ a_2 5)
                     !,(- a_3 4) !,(+ a_3 4)
                     !,(- a_4 3) !,(+ a_4 3)
                     !,(- a_5 2) !,(+ a_5 2)
                     !,(- a_6 1) !,(+ a_6 1)
                     $a_7)
             <cons (& !,(- a_1 7) !,(+ a_1 7)
                      !,(- a_2 6) !,(+ a_2 6)
                      !,(- a_3 5) !,(+ a_3 5)
                      !,(- a_4 4) !,(+ a_4 4)
                      !,(- a_5 3) !,(+ a_5 3)
                      !,(- a_6 2) !,(+ a_6 2)
                      !,(- a_7 1) !,(+ a_7 1)
                      $a_8)
              <nil>>>>>>>>>
     a]))

(test eight-queen)

(define $n-queen
  (lambda [$n]
    (match-all (between 1 n) (multiset integer)
      [<cons $a_1
             (loop $i [2 n]
                   <cons (loop $i1 [1 (- i 1)]
                               (& !,(- a_i1 (- i i1))
                                  !,(+ a_i1 (- i i1))
                                  ...)
                               $a_i)
                         ...>
                   <nil>)>
      a])))

(test (n-queen 4))