role(robot1)
role(robot2)

base(moveCount(M)) :- scoreMap(M,N)
base(cell(M,N,P)) :- col(M) & row(N) & piece(P)
input(R,move(X1,Y1,X2,Y2)) :- role(R) & col(X1) & row(Y1) & knightMove(X1,Y1,X2,Y2)
row(1)
row(2)
row(3)
row(4)
row(5)
row(6)
row(7)
row(8)
row(9)
row(10)
col(1)
col(2)
col(3)
col(4)
col(5)
col(6)
piece(knight1)
piece(knight2)
piece(hole)
init(moveCount(0))
init(cell(3,5,knight1))
init(cell(3,6,knight2))

legal(robot1,move(X1,Y1,X2,Y2)) :- true(cell(X1,Y1,knight1)) & knightMove(X1,Y1,X2,Y2)
legal(robot2,move(X1,Y1,X2,Y2)) :- true(cell(X1,Y1,knight2)) & knightMove(X1,Y1,X2,Y2)


next(moveCount(NewCount)) :- true(moveCount(OldCount)) & add(1,count,OldCount,NewCount)
next(cell(X,Y,hole)) :- true(cell(X,Y,hole))
next(cell(X1,Y1,hole)) :- role(R) & does(R,move(X1,Y1,X2,Y2))

next(cell(X2,Y2,knight1)) :- does(robot1,move(X1,Y1,X2,Y2))
next(cell(X2,Y2,knight2)) :- does(robot2,move(X1,Y1,X2,Y2))

goal(R,Goal) :- role(R) & true(moveCount(Count)) & scoreMap(Count,Goal)

terminal :- true(cell(X,Y,knight1)) & true(cell(X,Y,hole))
terminal :- true(cell(X,Y,knight2)) & true(cell(X,Y,hole))
terminal :- true(cell(X,Y,knight1)) & true(cell(X,Y,knight2))

knightMove(X1,Y1,X2,Y2) :- add(1,x,X1,X2) & add(2,y,Y1,Y2)
knightMove(X1,Y1,X2,Y2) :- add(1,x,X1,X2) & add(2,y,Y2,Y1)
knightMove(X1,Y1,X2,Y2) :- add(1,x,X2,X1) & add(2,y,Y1,Y2)
knightMove(X1,Y1,X2,Y2) :- add(1,x,X2,X1) & add(2,y,Y2,Y1)
knightMove(X1,Y1,X2,Y2) :- add(2,x,X1,X2) & add(1,y,Y1,Y2)
knightMove(X1,Y1,X2,Y2) :- add(2,x,X1,X2) & add(1,y,Y2,Y1)
knightMove(X1,Y1,X2,Y2) :- add(2,x,X2,X1) & add(1,y,Y1,Y2)
knightMove(X1,Y1,X2,Y2) :- add(2,x,X2,X1) & add(1,y,Y2,Y1)
add(1,count,0,1)
add(1,count,1,2)
add(1,count,2,3)
add(1,count,3,4)
add(1,count,4,5)
add(1,count,5,6)
add(1,count,6,7)
add(1,count,7,8)
add(1,count,8,9)
add(1,count,9,10)
add(1,count,10,11)
add(1,count,11,12)
add(1,count,12,13)
add(1,count,13,14)
add(1,count,14,15)
add(1,count,15,16)
add(1,count,16,17)
add(1,count,17,18)
add(1,count,18,19)
add(1,count,19,20)
add(1,count,20,21)
add(1,count,21,22)
add(1,count,22,23)
add(1,count,23,24)
add(1,count,24,25)
add(1,count,25,26)
add(1,count,26,27)
add(1,count,27,28)
add(1,count,28,29)
add(1,count,29,30)
add(1,x,1,2)
add(1,x,2,3)
add(1,x,3,4)
add(1,x,4,5)
add(1,x,5,6)
add(1,y,1,2)
add(1,y,2,3)
add(1,y,3,4)
add(1,y,4,5)
add(1,y,5,6)
add(1,y,6,7)
add(1,y,7,8)
add(1,y,8,9)
add(1,y,9,10)
add(2,x,1,3)
add(2,x,2,4)
add(2,x,3,5)
add(2,x,4,6)
add(2,y,1,3)
add(2,y,2,4)
add(2,y,3,5)
add(2,y,4,6)
add(2,y,5,7)
add(2,y,6,8)
add(2,y,7,9)
add(2,y,8,10)
scoreMap(0,0)
scoreMap(1,3)
scoreMap(2,6)
scoreMap(3,9)
scoreMap(4,12)
scoreMap(5,15)
scoreMap(6,18)
scoreMap(7,21)
scoreMap(8,24)
scoreMap(9,27)
scoreMap(10,30)
scoreMap(11,33)
scoreMap(12,36)
scoreMap(13,39)
scoreMap(14,42)
scoreMap(15,45)
scoreMap(16,48)
scoreMap(17,51)
scoreMap(18,54)
scoreMap(19,57)
scoreMap(20,60)
scoreMap(21,63)
scoreMap(22,66)
scoreMap(23,69)
scoreMap(24,72)
scoreMap(25,75)
scoreMap(26,80)
scoreMap(27,85)
scoreMap(28,90)
scoreMap(29,96)
scoreMap(30,100)
