role(red)
role(black)
base(cell(M,N,Mark)) :- index(M) & index(N) & mark(Mark)
base(score(Role,0)) :- role(Role)
base(score(Role,N)) :- role(Role) & incr(M,N)
base(control(Role)) :- role(Role)
base(step(1)) :- true
base(step(N)) :- succ(M,N)
input(Role,move(U,V,X,Y)) :- role(Role) & doublet(U,V,X,Y)
input(Role,jump(U,V,W,X,Y,Z)) :- role(Role) & triplet(U,V,W,X,Y,Z)
input(Role,noop) :- role(Role)
index(1)
index(2)
index(3)
index(4)
index(5)
mark(black)
mark(red)
mark(blank)
init(cell(1,1,black))
init(cell(1,2,black))
init(cell(1,3,black))
init(cell(1,4,black))
init(cell(1,5,black))
init(cell(2,1,black))
init(cell(2,2,black))
init(cell(2,3,black))
init(cell(2,4,black))
init(cell(2,5,black))
init(cell(3,1,blank))
init(cell(3,2,blank))
init(cell(3,3,blank))
init(cell(3,4,blank))
init(cell(3,5,blank))
init(cell(4,1,red))
init(cell(4,2,red))
init(cell(4,3,red))
init(cell(4,4,red))
init(cell(4,5,red))
init(cell(5,1,red))
init(cell(5,2,red))
init(cell(5,3,red))
init(cell(5,4,red))
init(cell(5,5,red))
init(score(red,0))
init(score(black,0))
init(control(red))
init(step(1))
legal(Role,move(U,V,X,Y)) :- true(control(Role)) & true(cell(U,V,Role)) & doublet(U,V,X,Y) & true(cell(X,Y,blank))
legal(red,jump(U,V,W,X,Y,Z)) :- true(control(red)) & true(cell(U,V,red)) & triplet(U,V,W,X,Y,Z) & true(cell(W,X,black)) & true(cell(Y,Z,blank))
legal(black,jump(U,V,W,X,Y,Z)) :- true(control(black)) & true(cell(U,V,black)) & triplet(U,V,W,X,Y,Z) & true(cell(W,X,red)) & true(cell(Y,Z,blank))
legal(red,noop) :- true(control(black))
legal(black,noop) :- true(control(red))
haslegalmove(Role) :- legal(Role,Move)
next(cell(U,V,blank)) :- does(Role,move(U,V,X,Y))
next(cell(X,Y,Role)) :- does(Role,move(U,V,X,Y))
next(cell(M,N,Mark)) :- does(Role,move(U,V,X,Y)) & true(cell(M,N,Mark)) & distinctcell(M,N,U,V) & distinctcell(M,N,X,Y)
next(cell(U,V,blank)) :- does(Role,jump(U,V,W,X,Y,Z))
next(cell(W,X,blank)) :- does(Role,jump(U,V,W,X,Y,Z))
next(cell(Y,Z,Role)) :- does(Role,jump(U,V,W,X,Y,Z))
next(cell(M,N,Mark)) :- does(Role,jump(U,V,W,X,Y,Z)) & true(cell(M,N,Mark)) & distinctcell(M,N,U,V) & distinctcell(M,N,W,X) & distinctcell(M,N,Y,Z)
next(score(Role,N)) :- does(Anyone,move(U,V,X,Y)) & true(score(Role,N))
next(score(Role,N)) :- does(Role,jump(U,V,W,X,Y,Z)) & true(score(Role,M)) & incr(M,N)
next(score(Role,N)) :- does(Role,noop) & true(score(Role,N))
next(control(black)) :- true(control(red))
next(control(red)) :- true(control(black))
next(step(N)) :- true(step(M)) & succ(M,N)
goal(Role,N) :- true(score(Role,N))
terminal :- true(score(Role,100))
terminal :- true(control(Role)) & ~haslegalmove(Role)
terminal :- true(step(30))
distinctcell(U,V,X,Y) :- index(U) & index(X) & distinct(U,X) & index(V) & index(Y)
distinctcell(U,V,X,Y) :- index(V) & index(Y) & distinct(V,Y) & index(U) & index(X)
doublet(U,V,X,Y) :- horizontal(U,V,X,Y)
doublet(U,V,X,Y) :- horizontal(X,Y,U,V)
doublet(U,V,X,Y) :- vertical(U,V,X,Y)
doublet(U,V,X,Y) :- vertical(X,Y,U,V)
doublet(U,V,X,Y) :- slash(U,V,X,Y)
doublet(U,V,X,Y) :- slash(X,Y,U,V)
doublet(U,V,X,Y) :- backslash(U,V,X,Y)
doublet(U,V,X,Y) :- backslash(X,Y,U,V)
triplet(U,V,W,X,Y,Z) :- horizontal(U,V,W,X) & horizontal(W,X,Y,Z)
triplet(U,V,W,X,Y,Z) :- horizontal(Y,Z,W,X) & horizontal(W,X,U,V)
triplet(U,V,W,X,Y,Z) :- vertical(U,V,W,X) & vertical(W,X,Y,Z)
triplet(U,V,W,X,Y,Z) :- vertical(Y,Z,W,X) & vertical(W,X,U,V)
triplet(U,V,W,X,Y,Z) :- slash(U,V,W,X) & slash(W,X,Y,Z)
triplet(U,V,W,X,Y,Z) :- slash(Y,Z,W,X) & slash(W,X,U,V)
triplet(U,V,W,X,Y,Z) :- backslash(U,V,W,X) & backslash(W,X,Y,Z)
triplet(U,V,W,X,Y,Z) :- backslash(Y,Z,W,X) & backslash(W,X,U,V)
horizontal(U,V,X,V) :- nex(U,X) & index(V)
vertical(U,V,U,Y) :- nex(V,Y) & index(U)
slash(3,1,2,2)
slash(2,2,1,3)
slash(5,1,4,2)
slash(4,2,3,3)
slash(3,3,2,4)
slash(2,4,1,5)
slash(5,3,4,4)
slash(4,4,3,5)
backslash(3,1,4,2)
backslash(4,2,5,3)
backslash(1,1,2,2)
backslash(2,2,3,3)
backslash(3,3,4,4)
backslash(4,4,5,5)
backslash(1,3,2,4)
backslash(2,4,3,5)
nex(1,2)
nex(2,3)
nex(3,4)
nex(4,5)
incr(0,10)
incr(10,20)
incr(20,30)
incr(30,40)
incr(40,50)
incr(50,60)
incr(60,70)
incr(70,80)
incr(80,90)
incr(90,100)
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)
succ(10,11)
succ(11,12)
succ(12,13)
succ(13,14)
succ(14,15)
succ(15,16)
succ(16,17)
succ(17,18)
succ(18,19)
succ(19,20)
succ(20,21)
succ(21,22)
succ(22,23)
succ(23,24)
succ(24,25)
succ(25,26)
succ(26,27)
succ(27,28)
succ(28,29)
succ(29,30)
