Post by Lars Ericson on Jul 25, 2015 19:14:29 GMT -8
OneStep required some tweaks to my Python translator from KIF to LP, versus Best Buttons & Lights. This gives a solution to OneStep. Obviously since it is a 2-player game there may be many solutions. I think the trick will be to gather as many solutions as possible in the time limit, then pick the opening move that occurs most frequently among solutions, i.e. the move with the most "outs". Here is the working LP for OneStep for role "white":
role(white).
role(black).
true(o1,1).
legal(white,a,T) :- time(T).
legal(white,b,T) :- time(T).
legal(black,a,T) :- time(T).
true(o2,T+1) :- time(T), does(white,a,T), true(o1,T).
true(o3,T+1) :- time(T), does(white,b,T), true(o1,T).
goal(white,0,T) :- time(T), true(o1,T).
goal(white,10,T) :- time(T), true(o2,T).
goal(white,90,T) :- time(T), true(o3,T).
goal(black,0,T) :- time(T), true(o1,T).
goal(black,90,T) :- time(T), true(o2,T).
goal(black,10,T) :- time(T), true(o3,T).
terminal(T) :- time(T), true(o2,T).
terminal(T) :- time(T), true(o3,T).
1{ does(R,M,T) }1 :- role(R), time(T), legal(R,M,T).
:- does(R,M,T), not legal(R,M,T).
:- 0{ terminal(T) : time(T) }0.
:- terminal(T), role(white), not goal(white,90,T).
time(1..2).
and here is the Clingo solution, obtained in 0.000s:
clingo version 4.5.1
Reading from onestep_white.lp
Solving...
Answer: 1
role(white) role(black) true(o1,1) time(1) time(2) legal(white,a,1) legal(white,a,2) legal(white,b,1) legal(white,b,2) legal(black,a,1) legal(black,a,2) true(o2,2) does(white,a,1) true(o3,2) does(white,b,1) goal(white,0,1) goal(white,10,2) goal(white,90,2) goal(black,0,1) goal(black,90,2) goal(black,10,2) terminal(2) does(white,a,2) does(white,b,2) does(black,a,1) does(black,a,2)
SATISFIABLE
Models : 1
Calls : 1
Time : 0.000s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
role(white).
role(black).
true(o1,1).
legal(white,a,T) :- time(T).
legal(white,b,T) :- time(T).
legal(black,a,T) :- time(T).
true(o2,T+1) :- time(T), does(white,a,T), true(o1,T).
true(o3,T+1) :- time(T), does(white,b,T), true(o1,T).
goal(white,0,T) :- time(T), true(o1,T).
goal(white,10,T) :- time(T), true(o2,T).
goal(white,90,T) :- time(T), true(o3,T).
goal(black,0,T) :- time(T), true(o1,T).
goal(black,90,T) :- time(T), true(o2,T).
goal(black,10,T) :- time(T), true(o3,T).
terminal(T) :- time(T), true(o2,T).
terminal(T) :- time(T), true(o3,T).
1{ does(R,M,T) }1 :- role(R), time(T), legal(R,M,T).
:- does(R,M,T), not legal(R,M,T).
:- 0{ terminal(T) : time(T) }0.
:- terminal(T), role(white), not goal(white,90,T).
time(1..2).
and here is the Clingo solution, obtained in 0.000s:
clingo version 4.5.1
Reading from onestep_white.lp
Solving...
Answer: 1
role(white) role(black) true(o1,1) time(1) time(2) legal(white,a,1) legal(white,a,2) legal(white,b,1) legal(white,b,2) legal(black,a,1) legal(black,a,2) true(o2,2) does(white,a,1) true(o3,2) does(white,b,1) goal(white,0,1) goal(white,10,2) goal(white,90,2) goal(black,0,1) goal(black,90,2) goal(black,10,2) terminal(2) does(white,a,2) does(white,b,2) does(black,a,1) does(black,a,2)
SATISFIABLE
Models : 1
Calls : 1
Time : 0.000s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s