;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Best Sukoshi
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Components
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (role robot)

  (<= (base (cell ?i ?j ?k ?l ?x))
      (index ?i)
      (index ?j)
      (index ?k)
      (index ?l)
      (filler ?x))

  (<= (input robot (mark ?i ?j ?k ?l ?x))
      (index ?i)
      (index ?j)
      (index ?k)
      (index ?l)
      (digit ?x))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; init
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= (init (cell ?i ?j 1 1 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 1 2 1)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 1 3 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 2 1 2)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 2 2 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 2 3 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 3 1 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 3 2 b)) (index ?i) (index ?j))
  (<= (init (cell ?i ?j 3 3 b)) (index ?i) (index ?j))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; legal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= (legal robot (mark ?i ?j ?k ?l ?x))
      (true (cell ?i ?j ?k ?l b))
      (digit ?x)
      (not (row ?i ?j ?k ?x))
      (not (col ?i ?j ?l ?x)))

  (<= (row ?i ?j ?k ?x) (true (cell ?i ?j ?k 1 ?x)))
  (<= (row ?i ?j ?k ?x) (true (cell ?i ?j ?k 2 ?x)))
  (<= (row ?i ?j ?k ?x) (true (cell ?i ?j ?k 3 ?x)))

  (<= (col ?i ?j ?l ?x) (true (cell ?i ?j 1 ?l ?x)))
  (<= (col ?i ?j ?l ?x) (true (cell ?i ?j 2 ?l ?x)))
  (<= (col ?i ?j ?l ?x) (true (cell ?i ?j 3 ?l ?x)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= (next (cell ?i ?j ?k ?l ?x))
      (does ?role (mark ?i ?j ?k ?l ?x)))

  (<= (next (cell ?i ?j ?k ?l ?x))
      (true (cell ?i ?j ?k ?l ?x))
      (distinct ?x b))

  (<= (next (cell ?i ?j ?k ?l b))
      (true (cell ?i ?j ?k ?l b))
      (not (marking ?i ?j)))

  (<= (next (cell ?i ?j ?k ?l b))
      (does ?role (mark ?i ?j ?m ?n ?x))
      (true (cell ?i ?j ?k ?l b))
      (distinct ?m ?k))

  (<= (next (cell ?i ?j ?k ?l b))
      (does ?role (mark ?i ?j ?m ?n ?x))
      (true (cell ?i ?j ?k ?l b))
      (distinct ?n ?l))

  (<= (marking ?i ?j) (does ?role (mark ?i ?j ?k ?l ?x)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; goal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= (goal robot 100) (index ?i) (index ?j) (not (open ?i ?j)))

  (<= (goal robot 0)
      (open 1 1)
      (open 1 2)
      (open 1 3)
      (open 2 1)
      (open 2 2)
      (open 2 3)
      (open 3 1)
      (open 3 2)
      (open 3 3))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; terminal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= terminal (index ?i) (index ?j) (not (playable ?i ?j)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; views
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (<= (filler ?x) (index ?x))
  (filler b)

  (<= (open ?i ?j) (true (cell ?i ?j ?k ?l b)))

  (<= (playable ?i ?j)
      (true (cell ?i ?j ?k ?l b))
      (digit ?x)
      (not (row ?i ?j ?k ?x))
      (not (col ?i ?j ?l ?x)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (index 1)
  (index 2)
  (index 3)

  (digit 1)
  (digit 2)
  (digit 3)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
