Post by Lars Ericson on Sept 1, 2015 5:15:00 GMT -8
Problem was I didn't have T in row, col, square predicates:
Solution: On Intel core i5-2320 running 3GHz:
Almost: Looking at the solution, we can see the clock is not advancing, the computer solves the puzzle all at once! I will have to fiddle with the translation a little bit more to make sure that doesn't happen, so stay tuned.
#const steps = 51.
time(1..steps).
digit(1..9).
index(1..3).
filler(b).
1{ does(M,T) : input(M) }1 :- time(T), legal(M,T), 1 <= T, T <= steps-1.
filler(X) :- time(T), digit(X).
base(cell(I,J,K,L,X)) :- index(I), index(J), index(K), index(L), filler(X).
input(mark(I,J,K,L,X)) :- index(I), index(J), index(K), index(L), digit(X).
row(K,L,X,T) :- time(T), true(cell(1..3,1..3,K,L,X),T).
col(I,J,X,T) :- time(T), true(cell(I,J,1..3,1..3,X),T).
square(I,K,X,T) :- time(T), true(cell(I,1..3,K,1..3,X),T).
true(cell(I,J,K,L,X),T+1) :- time(T), does(mark(I,J,K,L,X),T).
true(cell(I,J,K,L,X),T+1) :- time(T), true(cell(I,J,K,L,X),T), does(mark(S,T,U,V,Y),T), S!=I.
true(cell(I,J,K,L,X),T+1) :- time(T), true(cell(I,J,K,L,X),T), does(mark(S,T,U,V,Y),T), T!=J.
true(cell(I,J,K,L,X),T+1) :- time(T), true(cell(I,J,K,L,X),T), does(mark(S,T,U,V,Y),T), U!=K.
true(cell(I,J,K,L,X),T+1) :- time(T), true(cell(I,J,K,L,X),T), does(mark(S,T,U,V,Y),T), V!=L.
playable(T) :- time(T), legal(mark(I,J,K,L,X),T).
terminal(T) :- time(T), not playable(T).
open(T) :- time(T), true(cell(I,J,K,L,b),T).
goal(100,T) :- time(T), not open(T).
goal(0,T) :- time(T), open(T).
legal(mark(I,J,K,L,X),T) :- time(T), true(cell(I,J,K,L,b),T), digit(X), not row(K,L,X,T), not col(I,J,X,T), not square(I,K,X,T).
:- not goal(100,steps).
:- does(M,T), not legal(M,T).
true(cell(1,1,1,1,9),1).
true(cell(1,1,1,2,7),1).
true(cell(1,1,1,3,b),1).
true(cell(1,1,2,1,3),1).
true(cell(1,1,2,2,b),1).
true(cell(1,1,2,3,4),1).
true(cell(1,1,3,1,b),1).
true(cell(1,1,3,2,6),1).
true(cell(1,1,3,3,5),1).
true(cell(1,2,1,1,b),1).
true(cell(1,2,1,2,2),1).
true(cell(1,2,1,3,b),1).
true(cell(1,2,2,1,5),1).
true(cell(1,2,2,2,b),1).
true(cell(1,2,2,3,6),1).
true(cell(1,2,3,1,b),1).
true(cell(1,2,3,2,8),1).
true(cell(1,2,3,3,b),1).
true(cell(1,3,1,1,b),1).
true(cell(1,3,1,2,b),1).
true(cell(1,3,1,3,b),1).
true(cell(1,3,2,1,b),1).
true(cell(1,3,2,2,b),1).
true(cell(1,3,2,3,b),1).
true(cell(1,3,3,1,b),1).
true(cell(1,3,3,2,b),1).
true(cell(1,3,3,3,b),1).
true(cell(2,1,1,1,b),1).
true(cell(2,1,1,2,b),1).
true(cell(2,1,1,3,5),1).
true(cell(2,1,2,1,8),1).
true(cell(2,1,2,2,b),1).
true(cell(2,1,2,3,2),1).
true(cell(2,1,3,1,9),1).
true(cell(2,1,3,2,b),1).
true(cell(2,1,3,3,b),1).
true(cell(2,2,1,1,b),1).
true(cell(2,2,1,2,b),1).
true(cell(2,2,1,3,2),1).
true(cell(2,2,2,1,b),1).
true(cell(2,2,2,2,4),1).
true(cell(2,2,2,3,b),1).
true(cell(2,2,3,1,3),1).
true(cell(2,2,3,2,b),1).
true(cell(2,2,3,3,b),1).
true(cell(2,3,1,1,b),1).
true(cell(2,3,1,2,b),1).
true(cell(2,3,1,3,8),1).
true(cell(2,3,2,1,7),1).
true(cell(2,3,2,2,b),1).
true(cell(2,3,2,3,5),1).
true(cell(2,3,3,1,1),1).
true(cell(2,3,3,2,b),1).
true(cell(2,3,3,3,b),1).
true(cell(3,1,1,1,b),1).
true(cell(3,1,1,2,b),1).
true(cell(3,1,1,3,b),1).
true(cell(3,1,2,1,b),1).
true(cell(3,1,2,2,b),1).
true(cell(3,1,2,3,b),1).
true(cell(3,1,3,1,b),1).
true(cell(3,1,3,2,b),1).
true(cell(3,1,3,3,b),1).
true(cell(3,2,1,1,b),1).
true(cell(3,2,1,2,6),1).
true(cell(3,2,1,3,b),1).
true(cell(3,2,2,1,2),1).
true(cell(3,2,2,2,b),1).
true(cell(3,2,2,3,8),1).
true(cell(3,2,3,1,b),1).
true(cell(3,2,3,2,3),1).
true(cell(3,2,3,3,b),1).
true(cell(3,3,1,1,8),1).
true(cell(3,3,1,2,4),1).
true(cell(3,3,1,3,b),1).
true(cell(3,3,2,1,1),1).
true(cell(3,3,2,2,b),1).
true(cell(3,3,2,3,9),1).
true(cell(3,3,3,1,b),1).
true(cell(3,3,3,2,2),1).
true(cell(3,3,3,3,7),1).
#show does/2.
#show goal/2.
Solution: On Intel core i5-2320 running 3GHz:
clingo version 4.5.1
Reading from bar1.lp
Solving...
Answer: 1
does(mark(1,1,1,3,1),1) does(mark(1,1,2,2,1),1) does(mark(1,1,2,2,2),1) does(mark(1,1,2,2,8),1) does(mark(1,1,3,1,2),1) does(mark(2,1,1,1,1),1) does(mark(2,1,1,1,3),1) does(mark(2,1,1,1,4),1) does(mark(2,1,1,1,6),1) does(mark(2,1,1,1,7),1) does(mark(2,1,1,2,1),1) does(mark(2,1,1,2,3),1) does(mark(2,1,2,2,1),1) does(mark(2,1,2,2,3),1) does(mark(2,1,2,2,6),1) does(mark(2,1,3,2,4),1) does(mark(2,1,3,2,7),1) does(mark(2,1,3,3,4),1) does(mark(2,1,3,3,6),1) does(mark(3,1,1,1,1),1) does(mark(3,1,1,1,2),1) does(mark(3,1,1,1,3),1) does(mark(3,1,1,1,5),1) does(mark(3,1,1,1,7),1) does(mark(3,1,1,2,1),1) does(mark(3,1,1,2,3),1) does(mark(3,1,1,2,5),1) does(mark(3,1,1,2,9),1) does(mark(3,1,1,3,1),1) does(mark(3,1,1,3,3),1) does(mark(3,1,1,3,7),1) does(mark(3,1,1,3,9),1) does(mark(3,1,2,1,4),1) does(mark(3,1,2,1,6),1) does(mark(3,1,2,2,3),1) does(mark(3,1,2,2,5),1) does(mark(3,1,2,2,6),1) does(mark(3,1,2,2,7),1) does(mark(3,1,2,3,3),1) does(mark(3,1,2,3,7),1) does(mark(3,1,3,1,4),1) does(mark(3,1,3,1,5),1) does(mark(3,1,3,1,6),1) does(mark(3,1,3,1,8),1) does(mark(3,1,3,2,1),1) does(mark(3,1,3,2,4),1) does(mark(3,1,3,2,5),1) does(mark(3,1,3,2,9),1) does(mark(3,1,3,3,1),1) does(mark(3,1,3,3,4),1) does(mark(3,1,3,3,6),1) does(mark(3,1,3,3,8),1) does(mark(3,1,3,3,9),1) does(mark(1,2,1,1,1),1) does(mark(1,2,1,1,3),1) does(mark(1,2,1,1,4),1) does(mark(1,2,1,3,1),1) does(mark(1,2,1,3,3),1) does(mark(1,2,1,3,4),1) does(mark(1,2,2,2,1),1) does(mark(1,2,2,2,7),1) does(mark(1,2,2,2,9),1) does(mark(1,2,3,1,4),1) does(mark(1,2,3,1,7),1) does(mark(1,2,3,3,1),1) does(mark(1,2,3,3,3),1) does(mark(1,2,3,3,4),1) does(mark(1,2,3,3,9),1) does(mark(1,3,1,1,1),1) does(mark(1,3,1,1,3),1) does(mark(1,3,1,1,4),1) does(mark(1,3,1,1,5),1) does(mark(1,3,1,1,6),1) does(mark(1,3,1,2,1),1) does(mark(1,3,1,2,3),1) does(mark(1,3,1,2,5),1) does(mark(1,3,1,2,8),1) does(mark(1,3,1,3,1),1) does(mark(1,3,1,3,3),1) does(mark(1,3,1,3,4),1) does(mark(1,3,1,3,6),1) does(mark(1,3,2,1,9),1) does(mark(1,3,2,2,1),1) does(mark(1,3,2,2,2),1) does(mark(1,3,2,2,7),1) does(mark(1,3,2,2,8),1) does(mark(1,3,2,2,9),1) does(mark(1,3,2,3,1),1) does(mark(1,3,2,3,7),1) does(mark(1,3,3,1,2),1) does(mark(1,3,3,1,4),1) does(mark(1,3,3,1,7),1) does(mark(1,3,3,2,1),1) does(mark(1,3,3,2,4),1) does(mark(1,3,3,2,7),1) does(mark(1,3,3,2,9),1) does(mark(1,3,3,3,1),1) does(mark(1,3,3,3,2),1) does(mark(1,3,3,3,3),1) does(mark(1,3,3,3,4),1) does(mark(1,3,3,3,9),1) does(mark(2,2,1,1,1),1) does(mark(2,2,1,1,6),1) does(mark(2,2,1,1,7),1) does(mark(2,2,1,2,1),1) does(mark(2,2,1,2,9),1) does(mark(2,2,2,1,6),1) does(mark(2,2,2,1,9),1) does(mark(2,2,2,3,1),1) does(mark(2,2,3,2,5),1) does(mark(2,2,3,2,7),1) does(mark(2,2,3,3,6),1) does(mark(2,2,3,3,8),1) does(mark(2,3,1,1,3),1) does(mark(2,3,1,1,4),1) does(mark(2,3,1,1,6),1) does(mark(2,3,1,2,3),1) does(mark(2,3,1,2,9),1) does(mark(2,3,2,2,3),1) does(mark(2,3,2,2,6),1) does(mark(2,3,2,2,9),1) does(mark(2,3,3,2,4),1) does(mark(2,3,3,3,2),1) does(mark(2,3,3,3,4),1) does(mark(2,3,3,3,6),1) does(mark(3,2,1,1,1),1) does(mark(3,2,1,1,5),1) does(mark(3,2,1,1,7),1) does(mark(3,2,1,3,1),1) does(mark(3,2,1,3,7),1) does(mark(3,2,1,3,9),1) does(mark(3,2,2,2,5),1) does(mark(3,2,2,2,7),1) does(mark(3,2,3,1,4),1) does(mark(3,2,3,1,5),1) does(mark(3,2,3,3,1),1) does(mark(3,2,3,3,4),1) does(mark(3,2,3,3,9),1) does(mark(3,3,1,3,3),1) does(mark(3,3,2,2,3),1) does(mark(3,3,2,2,5),1) does(mark(3,3,2,2,6),1) does(mark(3,3,3,1,5),1) does(mark(3,3,3,1,6),1) goal(100,3) goal(100,4) goal(100,5) goal(100,6) goal(100,7) goal(100,8) goal(100,9) goal(100,10) goal(100,11) goal(100,12) goal(100,13) goal(100,14) goal(100,15) goal(100,16) goal(100,17) goal(100,18) goal(100,19) goal(100,20) goal(100,21) goal(100,22) goal(100,23) goal(100,24) goal(100,25) goal(100,26) goal(100,27) goal(100,28) goal(100,29) goal(100,30) goal(100,31) goal(100,32) goal(100,33) goal(100,34) goal(100,35) goal(100,36) goal(100,37) goal(100,38) goal(100,39) goal(100,40) goal(100,41) goal(100,42) goal(100,43) goal(100,44) goal(100,45) goal(100,46) goal(100,47) goal(100,48) goal(100,49) goal(100,50) goal(100,51) goal(0,1) goal(0,2)
SATISFIABLE
Models : 1
Calls : 1
Time : 1.092s (Solving: 0.06s 1st Model: 0.00s Unsat: 0.06s)
CPU Time : 1.030s
Almost: Looking at the solution, we can see the clock is not advancing, the computer solves the puzzle all at once! I will have to fiddle with the translation a little bit more to make sure that doesn't happen, so stay tuned.