role(red)
role(blue)
role(orange)
role(cyan)

team(hot, red)
team(hot, orange)
team(cold, blue)
team(cold, cyan)

base(cell(X,Y,P)) :- x(X) & y(Y) & role(P)
base(control(red))
base(control(blue))
base(control(orange))
base(control(cyan))

input(P,drop(X)) :- role(P) & x(X)
input(P,noop) :- role(P)
init(control(red))
legal(R,drop(X)) :- role(R) & true(control(R)) & columnopen(X)
legal(R,noop) :- role(R) & role(X) & distinct(X,R) & true(control(X))

next(cell(X,1,Player)) :- does(Player,drop(X)) & columnempty(X)
next(cell(X,Y2,Player)) :- does(Player,drop(X)) & cellopen(X,Y2) & succ(Y1,Y2) & ~cellopen(X,Y1)
next(cell(X,Y,Player)) :- true(cell(X,Y,Player))

next(control(red)) :- true(control(cyan))
next(control(cyan)) :- true(control(orange))
next(control(orange)) :- true(control(blue))
next(control(blue)) :- true(control(red))

goal(X,100) :- team(hot,X) & line(hot)
goal(X,50) :-  team(hot,X) & ~line(hot) & ~line(cold) & ~boardopen
goal(X,0) :- team(hot,X) & line(cold)
goal(X,0) :- team(hot,X) & ~line(hot) & ~line(col) & boardopen
goal(X,100) :- team(cold,X) & line(cold)
goal(X,50) :- team(cold,X) & ~line(hot) & ~line(cold) & ~boardopen
goal(X,0) :- team(cold,X) & line(hot)
goal(X,0) :- team(cold,X) & ~line(hot) & ~line(cold) & boardopen
terminal :- line(hot)
terminal :- line(cold)
terminal :- ~boardopen
cellopen(X,Y) :- x(X) & y(Y) & ~true(cell(X,Y,red)) & ~true(cell(X,Y,blue)) & ~true(cell(X,Y,orange)) & ~true(cell(X,Y,cyan))
columnopen(X) :- cellopen(X,6)
columnempty(X) :- cellopen(X,1)
boardopen :- x(X) & columnopen(X)


line(Team) :- team(Team,Player1) & true(cell(X1,Y,Player1)) & succ(X1,X2) & team(Team,Player2) & true(cell(X2,Y,Player2)) & succ(X2,X3) & team(Team,Player3) & true(cell(X3,Y,Player3)) & succ(X3,X4) & team(Team,Player4) & true(cell(X4,Y,Player4))

line(Team) :- team(Team,Player1) & true(cell(X,Y1,Player1)) & succ(Y1,Y2) & team(Team,Player2) & true(cell(X,Y2,Player2)) & succ(Y2,Y3) & team(Team,Player3) & true(cell(X,Y3,Player3)) & succ(Y3,Y4) & team(Team,Player4) & true(cell(X,Y4,Player4))

line(Team) :- team(Team,Player1) & true(cell(X1,Y1,Player1)) & succ(Y1,Y2) & succ(X1,X2) & team(Team,Player2) & true(cell(X2,Y2,Player2)) & succ(Y2,Y3) & succ(X2,X3) & team(Team,Player3) & true(cell(X3,Y3,Player3)) & succ(Y3,Y4) & succ(X3,X4) & team(Team,Player4) & true(cell(X4,Y4,Player4))

line(Team) :- team(Team,Player1) & true(cell(X1,Y4,Player1)) & succ(Y1,Y2) & succ(X1,X2) & team(Team,Player2) & true(cell(X2,Y3,Player2)) & succ(Y2,Y3) & succ(X2,X3) & team(Team,Player3) & true(cell(X3,Y2,Player3)) & succ(Y3,Y4) & succ(X3,X4) & team(Team,Player4) & true(cell(X4,Y1,Player4))


succ(1,2)
succ(2,3)
succ(3,4)
succ(4,5)
succ(5,6)
succ(6,7)
succ(7,8)
x(1)
x(2)
x(3)
x(4)
x(5)
x(6)
x(7)
x(8)
y(1)
y(2)
y(3)
y(4)
y(5)
y(6)