;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Battle of Numbers
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; components
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (role red)
  (role green)


  (<= (base (cell ?i ?j ?n ?r))
      (indexX ?i)
      (indexY ?j)
      (number ?n)
      (role ?r))

  (<= (base (capture ?r 0)) (role ?r))
  (<= (base (capture ?r ?n)) (role ?r) (captureadd ?m ?n))
  (base (step 1))
  (<= (base (step ?n)) (stepcount ?m ?n))
  (<= (base (control ?r)) (role ?r))


  (<= (input ?r (move ?x1 ?y1 ?x2 ?y2))
      (role ?r)
      (orthogonal ?x1 ?y1 ?x2 ?y2))

  (<= (input ?r (move ?x1 ?y1 ?x2 ?y2))
      (role ?r)
      (diagonal ?x1 ?y1 ?x2 ?y2))

  (<= (input ?r noop) (role ?r))

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

(init (cell 1 1 1 red))
(init (cell 2 1 3 red))
(init (cell 3 1 5 red))
(init (cell 4 1 4 red))
(init (cell 5 1 2 red))
(init (cell 6 1 1 red))
(init (cell 7 1 3 red))
(init (cell 8 1 5 red))
(init (cell 9 1 4 red))
(init (cell 10 1 2 red))

(init (cell 1 5 2 green))
(init (cell 2 5 4 green))
(init (cell 3 5 5 green))
(init (cell 4 5 3 green))
(init (cell 5 5 1 green))
(init (cell 6 5 2 green))
(init (cell 7 5 4 green))
(init (cell 8 5 5 green))
(init (cell 9 5 3 green))
(init (cell 10 5 1 green))

(init (control red))
(init (capture red 0))
(init (capture green 0))

(init (step 1))

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

(<= (legal ?player ?move)
    (legal2 ?player ?move))

(<= (legal ?player noop)
    (role ?player)
    (not (true (control ?player))))

(<= (legal ?player noop)
    (true (control ?player))
    (not (hasLegalMove ?player)))

(<= (hasLegalMove ?player)
    (legal2 ?player ?move))

(<= (legal2 ?player (move ?x1 ?y1 ?x2 ?y2))
    (true (control ?player))
    (true (cell ?x1 ?y1 ?n ?player))
    (orthogonal ?x1 ?y1 ?x2 ?y2)
    (forward ?x1 ?y1 ?x2 ?y2 ?player)
    (opencell ?x2 ?y2))

;could comment this out to only allow diagonals if capturing.
(<= (legal2 ?player (move ?x1 ?y1 ?x2 ?y2))
    (true (control ?player))
    (true (cell ?x1 ?y1 ?n ?player))
    (diagonal ?x1 ?y1 ?x2 ?y2)
    (forward ?x1 ?y1 ?x2 ?y2 ?player)
    (opencell ?x2 ?y2))

(<= (legal2 ?player1 (move ?x1 ?y1 ?x2 ?y2))
    (true (control ?player1))
    (true (cell ?x1 ?y1 ?n1 ?player1))
    (diagonal ?x1 ?y1 ?x2 ?y2)
    (true (cell ?x2 ?y2 ?n2 ?player2))
    (distinct ?player1 ?player2)
    (eatable ?n1 ?n2))

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

(<= (next (cell ?x2 ?y2 ?n ?player))
	(true (cell ?x1 ?y1 ?n ?player))
	(does ?player (move ?x1 ?y1 ?x2 ?y2)))

(<= (next (cell ?x ?y ?n ?player))
	(true (cell ?x ?y ?n ?player))
	(not (camefrom ?x ?y))
    (not (wentto ?x ?y)))

(<= (next (capture ?player ?count))
    (true (capture ?player ?count))
    (not (captured ?player)))

(<= (next (capture ?player ?count2))
    (true (capture ?player ?count1))
    (captured ?player)
    (captureadd ?count1 ?count2))

(<= (next (control red))
	(true (control green)))

(<= (next (control green))
	(true (control red)))

(<= (next (step ?t2))
    (true (step ?t1))
    (stepcount ?t1 ?t2))

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

  (<= (goal ?player1 100)
      (true (capture ?player1 ?count1))
      (true (capture ?player2 ?count2))
      (distinct ?player1 ?player2)
      (greater ?count1 ?count2))

  (<= (goal ?player2 0)
      (true (capture ?player1 ?count1))
      (true (capture ?player2 ?count2))
      (distinct ?player1 ?player2)
      (greater ?count1 ?count2))

  (<= (goal ?player1 50)
      (true (capture ?player1 ?count1))
      (true (capture ?player2 ?count2))
      (distinct ?player1 ?player2)
      (not (distinct ?count1 ?count2)))

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

  (<= terminal (true (step 61)))
  (<= terminal (true (capture ?r 10)))
  (<= terminal
      (not (hasLegalMove green))
      (not (hasLegalMove red)))

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

  (<= (camefrom ?x1 ?y1) (does ?player (move ?x1 ?y1 ?x2 ?y2)))
  (<= (wentto ?x2 ?y2) (does ?player (move ?x1 ?y1 ?x2 ?y2)))

  (<= (captured ?player)
      (true (control ?player))
      (wentto ?x ?y)
      (true (cell ?x ?y ?n ?player2)))

  (<= (forward ?x1 ?y1 ?x2 ?y2 green)
      (succ ?y2 ?y1)
      (indexX ?x1)
      (indexX ?x2))

  (<= (forward ?x1 ?y1 ?x2 ?y2 red)
      (succ ?y1 ?y2)
      (indexX ?x1)
      (indexX ?x2))

  (<= (orthogonal ?x1 ?y ?x2 ?y)
      (succ ?x1 ?x2)
      (indexY ?y))

  (<= (orthogonal ?x1 ?y ?x2 ?y)
      (succ ?x2 ?x1)
      (indexY ?y))

  (<= (orthogonal ?x ?y1 ?x ?y2)
      (succ ?y1 ?y2)
      (indexX ?x))

  (<= (orthogonal ?x ?y1 ?x ?y2)
      (succ ?y2 ?y1)
      (indexX ?x))


  (<= (diagonal ?x1 ?y1 ?x2 ?y2)
      (succ ?x1 ?x2)
      (succ ?y1 ?y2))

  (<= (diagonal ?x1 ?y1 ?x2 ?y2)
      (succ ?x1 ?x2)
      (succ ?y2 ?y1))

  (<= (diagonal ?x1 ?y1 ?x2 ?y2)
      (succ ?x2 ?x1)
      (succ ?y1 ?y2))

  (<= (diagonal ?x1 ?y1 ?x2 ?y2)
      (succ ?x2 ?x1)
      (succ ?y2 ?y1))

  (<= (onboard ?x ?y)
      (indexX ?x)
      (indexY ?y))

  (<= (opencell ?x ?y)
      (onboard ?x ?y)
      (not (occupiedcell ?x ?y)))

  (<= (occupiedcell ?x ?y)
      (onboard ?x ?y)
      (number ?n)
      (role ?player)
      (true (cell ?x ?y ?n ?player)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(indexX 1)
(indexX 2)
(indexX 3)
(indexX 4)
(indexX 5)
(indexX 6)
(indexX 7)
(indexX 8)
(indexX 9)
(indexX 10)

(indexY 1)
(indexY 2)
(indexY 3)
(indexY 4)
(indexY 5)

(number 1)
(number 2)
(number 3)
(number 4)
(number 5)

(succ 1 2)
(succ 2 3)
(succ 3 4)
(succ 4 5)
(succ 5 6)
(succ 6 7)
(succ 7 8)
(succ 8 9)
(succ 9 10)

(eatable 5 5)
(eatable 5 4)
(eatable 5 3)
(eatable 5 2)
(eatable 4 4)
(eatable 4 3)
(eatable 4 2)
(eatable 4 1)
(eatable 3 3)
(eatable 3 2)
(eatable 3 1)
(eatable 2 2)
(eatable 2 1)
(eatable 1 1)
(eatable 1 5)

(captureadd 0 1)
(captureadd 1 2)
(captureadd 2 3)
(captureadd 3 4)
(captureadd 4 5)
(captureadd 5 6)
(captureadd 6 7)
(captureadd 7 8)
(captureadd 8 9)
(captureadd 9 10)

(stepcount 1 2 )
(stepcount 2 3 )
(stepcount 3 4 )
(stepcount 4 5 )
(stepcount 5 6 )
(stepcount 6 7 )
(stepcount 7 8 )
(stepcount 8 9 )
(stepcount 9 10 )
(stepcount 10 11 )
(stepcount 11 12 )
(stepcount 12 13 )
(stepcount 13 14 )
(stepcount 14 15 )
(stepcount 15 16 )
(stepcount 16 17 )
(stepcount 17 18 )
(stepcount 18 19 )
(stepcount 19 20 )
(stepcount 20 21 )
(stepcount 21 22 )
(stepcount 22 23 )
(stepcount 23 24 )
(stepcount 24 25 )
(stepcount 25 26 )
(stepcount 26 27 )
(stepcount 27 28 )
(stepcount 28 29 )
(stepcount 29 30 )
(stepcount 30 31 )
(stepcount 31 32 )
(stepcount 32 33 )
(stepcount 33 34 )
(stepcount 34 35 )
(stepcount 35 36 )
(stepcount 36 37 )
(stepcount 37 38 )
(stepcount 38 39 )
(stepcount 39 40 )
(stepcount 40 41 )
(stepcount 41 42 )
(stepcount 42 43 )
(stepcount 43 44 )
(stepcount 44 45 )
(stepcount 45 46 )
(stepcount 46 47 )
(stepcount 47 48 )
(stepcount 48 49 )
(stepcount 49 50 )
(stepcount 50 51 )
(stepcount 51 52 )
(stepcount 52 53 )
(stepcount 53 54 )
(stepcount 54 55 )
(stepcount 55 56 )
(stepcount 56 57 )
(stepcount 57 58 )
(stepcount 58 59 )
(stepcount 59 60 )
(stepcount 60 61 )

(greater  1 0 )
(greater  2 0 )
(greater  2 1 )
(greater  3 0 )
(greater  3 1 )
(greater  3 2 )
(greater  4 0 )
(greater  4 1 )
(greater  4 2 )
(greater  4 3 )
(greater  5 0 )
(greater  5 1 )
(greater  5 2 )
(greater  5 3 )
(greater  5 4 )
(greater  6 0 )
(greater  6 1 )
(greater  6 2 )
(greater  6 3 )
(greater  6 4 )
(greater  6 5 )
(greater  7 0 )
(greater  7 1 )
(greater  7 2 )
(greater  7 3 )
(greater  7 4 )
(greater  7 5 )
(greater  7 6 )
(greater  8 0 )
(greater  8 1 )
(greater  8 2 )
(greater  8 3 )
(greater  8 4 )
(greater  8 5 )
(greater  8 6 )
(greater  8 7 )
(greater  9 0 )
(greater  9 1 )
(greater  9 2 )
(greater  9 3 )
(greater  9 4 )
(greater  9 5 )
(greater  9 6 )
(greater  9 7 )
(greater  9 8 )
(greater  10 0 )
(greater  10 1 )
(greater  10 2 )
(greater  10 3 )
(greater  10 4 )
(greater  10 5 )
(greater  10 6 )
(greater  10 7 )
(greater  10 8 )
(greater  10 9 )

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