role(robot1)
role(robot2)
role(robot3)
role(robot4)

team(robot1, a)
team(robot2, a)
team(robot3, b)
team(robot4, b)

init(moveCount(0))
init(cell(1,10,knight1))
init(cell(5,10,knight2))
init(cell(1,1,knight3))
init(cell(5,1,knight4))
init(cell(3,10,flag1))
init(cell(3,1,flag4))

base(moveCount(0))
base(moveCount(M)) :- add(1,count,N,M)
base(cell(M,N,P)) :- col(M) & row(N) & piece(P)
base(cell(M,N,P)) :- col(M) & row(N) & flag(P)


piece(knight1)
piece(knight2)
piece(knight3)
piece(knight4)
flag(flag1)
%flag(flag2)
%flag(flag3)
flag(flag4)
%flag(flag5)
%flag(flag6)

owns(knight1, robot1)
owns(knight2, robot2)
owns(knight3, robot3)
owns(knight4, robot4)
owns(flag1, b)
%owns(flag2, a)
%owns(flag3, a)
owns(flag4, a)
%owns(flag5, b)
%owns(flag6, b)

input(R,move(X1,Y1,X2,Y2)) :- role(R) & col(X1) & row(Y1) & knightMove(X1,Y1,X2,Y2)
input(R,noop) :- role(R)

legal(R,move(X1,Y1,X2,Y2)) :- owns(K,R) & true(cell(X1,Y1,K)) & knightMove(X1,Y1,X2,Y2)
legal(R,noop) :- owns(K,R) & true(cell(X1,Y1,K)) & true(cell(X2,Y2,F)) & distinct(X1,X2) & distinct(Y1,Y2) 

next(moveCount(NewCount)) :- true(moveCount(OldCount)) & add(1,count,OldCount,NewCount)

nextmove(cell(X2,Y2,K)) :- piece(K) & owns(K,R) & does(R,move(X1,Y1,X2,Y2))
nextmove(cell(X,Y,K)) :- piece(K) & owns(K,R) & does(R,noop) & true(cell(X,Y,K))

nextmove(cell(X2,Y2,F)) :- flag(F) & owns(F,T) & team(R,T) & does(R,move(X1,Y1,X2,Y2)) & true(cell(X1,Y1,F)) 

%next(cell(X2,Y2,P)) :- nextmove(cell(X2,Y2,P))
next(cell(X,Y,F)) :- flag(F) & row(Y2) & col(X2) & ~nextmove(cell(X2,Y2,F)) & true(cell(X,Y,F))

next(cell(X2,Y2,P)) :- nextmove(cell(X2,Y2,P)) & ~captured(P)
next(cell(X,Y,P)) :- init(cell(X,Y,P)) & captured(P)


captured(F) :- flag(F) & team(R,T) & ~owns(F,T) & owns(K,R) & nextmove(cell(X,Y,F)) & nextmove(cell(X,Y,K))
captured(K) :- piece(K) & owns(K,R) & team(R,a) & team(R2,b) & owns(K2,R2) & nextmove(cell(X,Y,K)) & nextmove(cell(X,Y,K2)) & left(Y) & flag(F) & owns(F,b) & ~nextmove(cell(X,Y,F))
captured(K) :- piece(K) & owns(K,R) & team(R,b) & team(R2,a) & owns(K2,R2) & nextmove(cell(X,Y,K)) & nextmove(cell(X,Y,K2)) & right(Y) & flag(F) & owns(F,a) & ~nextmove(cell(X,Y,F))
captured(K) :- piece(K) & flag(F) & team(R,T) & owns(F,T) & owns(K,R) & piece(K2) & owns(K2,R2) & ~team(R2,T) & nextmove(cell(X,Y,K)) & nextmove(cell(X,Y,F)) & nextmove(cell(X,Y,K2))

flagcap(a) :- true(cell(X,10,F)) & owns(F,a)
flagcap(b) :- true(cell(X,1,F)) & owns(F,b)

goal(R,100) :- role(R) & team(R,a) & flagcap(a) & ~flagcap(b)
goal(R,0) :- role(R) & team(R,b) & flagcap(a) & ~flagcap(b)
goal(R,100) :- role(R) & team(R,b) & flagcap(b) & ~flagcap(a)
goal(R,0) :- role(R) & team(R,a) & flagcap(b) & ~flagcap(a)
goal(R,75) :- role(R) & flagcap(a) & flagcap(b)
goal(R,50) :- role(R) & expired

terminal :- expired
terminal :- flagcap(T)

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)
expired :- true(moveCount(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,x,6,7)
%add(1,x,7,8)
%add(1,x,8,9)
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(1,y,10,11)
%add(1,y,11,12)
%add(1,y,12,13)
%add(1,y,13,14)
%add(1,y,14,15)
%add(1,y,15,16)
%add(1,y,16,17)
%add(1,y,17,18)
add(2,x,1,3)
add(2,x,2,4)
add(2,x,3,5)
%add(2,x,4,6)
%add(2,x,5,7)
%add(2,x,6,8)
%add(2,x,7,9)
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)
%add(2,y,9,11)
%add(2,y,10,12)
%add(2,y,11,13)
%add(2,y,12,14)
%add(2,y,13,15)
%add(2,y,14,16)
%add(2,y,15,17)
%add(2,y,16,18)

left(1)
left(2)
left(3)
left(4)
left(5)
right(6)
right(7)
right(8)
right(9)
right(10)
row(1)
row(2)
row(3)
row(4)
row(5)
row(6)
row(7)
row(8)
row(9)
row(10)
%row(11)
%row(12)
%row(13)
%row(14)
%row(15)
%row(16)
%row(17)
%row(18)
col(1)
col(2)
col(3)
col(4)
col(5)
%col(6)
%col(7)
%col(8)
%col(9)
