;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Triple Sukoshi
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Components
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (role red)
  (role green)
  (role blue)


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


  (<= (input ?role (mark ?i ?j ?x))
      (role ?role)
      (index ?i)
      (index ?j)
      (marker ?x))

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

  (init (cell red 1 1 b))
  (init (cell red 1 2 1))
  (init (cell red 1 3 b))
  (init (cell red 2 1 2))
  (init (cell red 2 2 b))
  (init (cell red 2 3 b))
  (init (cell red 3 1 b))
  (init (cell red 3 2 b))
  (init (cell red 3 3 b))

  (init (cell green 1 1 b))
  (init (cell green 1 2 1))
  (init (cell green 1 3 b))
  (init (cell green 2 1 b))
  (init (cell green 2 2 2))
  (init (cell green 2 3 b))
  (init (cell green 3 1 b))
  (init (cell green 3 2 b))
  (init (cell green 3 3 b))

  (init (cell blue 1 1 b))
  (init (cell blue 1 2 b))
  (init (cell blue 1 3 3))
  (init (cell blue 2 1 b))
  (init (cell blue 2 2 b))
  (init (cell blue 2 3 b))
  (init (cell blue 3 1 b))
  (init (cell blue 3 2 b))
  (init (cell blue 3 3 2))

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

  (<= (legal ?role ?x)
      (legalmove ?role ?x))

  (<= (legal ?role (mark ?i ?j x))
      (true (cell ?role ?i ?j b))
      (not (playable ?role)))


  (<= (legalmove ?role (mark ?i ?j ?x))     
      (true (cell ?role ?i ?j b))
      (index ?x)
      (not (row ?role ?i ?x))
      (not (col ?role ?j ?x)))


  (<= (playable ?role) (legalmove ?role ?x))


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

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

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

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

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

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

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

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

  (<= (goal red 100) (not (open red)) (not (bad red)))
  (<= (goal green 100) (not (open green)) (not (bad green)))
  (<= (goal blue 100) (not (open blue)) (not (bad blue)))

  (<= (goal ?role 0) (open ?role))
  (<= (goal ?role 0) (bad ?role))

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

  (<= terminal (role ?role) (not (open ?role)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Views
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

  (<= (marker ?x) (index ?x))
  (marker x)

  (<= (open ?role) (true (cell ?role ?i ?j b)))

  (<= (bad ?role) (true (cell ?role ?i ?j x)))

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

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

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