%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Here is the smodels program time(0..t). disk(1..k). % 31 away %on0(3,4). %on0(8,9). %on0(7,8). %on0(6,7). %on0(5,6). %on0(2,5). % 32 away %on0(1,4). %on0(8,9). %on0(7,8). %on0(6,7). %on0(5,6). %on0(2,5). % 33 away %on0(4,9). %on0(1,4). %on0(7,8). %on0(6,7). %on0(5,6). %on0(2,5). % 34 away %on0(4,9). %on0(1,4). %on0(3,8). %on0(6,7). %on0(5,6). %on0(2,5). % 35 away %on0(1,4). %on0(8,9). %on0(3,8). %on0(6,7). %on0(5,6). %on0(2,5). % 36 away %on0(4,7). %on0(1,4). %on0(8,9). %on0(3,8). %on0(5,6). %on0(2,5). % 37 away %on0(4,7). %on0(1,4). %on0(3,8). %on0(6,9). %on0(5,6). %on0(2,5). % 38 away %on0(7,8). %on0(4,7). %on0(1,4). %on0(6,9). %on0(5,6). %on0(2,5). % 39 away %on0(8,9). %on0(7,8). %on0(4,7). %on0(1,4). %on0(5,6). %on0(2,5). % 40 away %on0(8,9). %on0(7,8). %on0(4,7). %on0(1,4). %on0(2,5). %on0(3,6). % 41 away %on0(7,8). %on0(4,7). %on0(1,4). %on0(2,5). %on0(6,9). %on0(3,6). % 42 away %on0(4,7). %on0(1,4). %on0(5,8). %on0(2,5). %on0(6,9). %on0(3,6). % 43 away %on0(4,7). %on0(1,4). %on0(8,9). %on0(5,8). %on0(2,5). %on0(3,6). % 44 away %on0(1,4). %on0(8,9). %on0(5,8). %on0(2,5). %on0(6,7). %on0(3,6). % 63 away %on0(1,4). %on0(4,5). %on0(5,6). %on0(6,7). %on0(7,8). %on0(8,9). % 7 disks now, 127 away on0(1,4). on0(4,5). on0(5,6). on0(6,7). on0(7,8). on0(8,9). on0(9,10). % k disks 1,2,...,k. Disks 1, 2, 3 are pegs. Disks 4, 5, ... are "movable" % The larger the number of the disk, the "smaller" it is. % Read in data on(T,N,N1) means at time T, disk N1 is on disk N on(0,N,N1) :- disk(N;N1), on0(N,N1). % :- disk(N;N1), on(0,N,N1), not on0(N,N1). % Specify valid arrangements of disks % Each regular disk is on something % 1{on(T,N1,N):disk(N1)}1 :- time(T), disk(N), N>=4. % :- not on(T,N1,N), time(T), disk(N), N>=4. % :- 2{on(T,N1,N):disk(N1)}, time(T), disk(N), N>=4. % Basic condition. Smaller disks are on larger ones :- time(T), disk(N1;N), on(T,N1,N), N1>=N. % disks 1,2,3 are pegs and are not on anything % :- time(T), disk(N1;N), on(T,N,N1), N1<=3. % Specify a valid move (only for T0, T on(T+1,N1,N). on(T+1,N1,N) :- time(T), disk(N;N1), T