aboutsummaryrefslogtreecommitdiff
path: root/asp/20_rubikigne.lp.bak
diff options
context:
space:
mode:
Diffstat (limited to 'asp/20_rubikigne.lp.bak')
-rwxr-xr-xasp/20_rubikigne.lp.bak184
1 files changed, 184 insertions, 0 deletions
diff --git a/asp/20_rubikigne.lp.bak b/asp/20_rubikigne.lp.bak
new file mode 100755
index 0000000..454f319
--- /dev/null
+++ b/asp/20_rubikigne.lp.bak
@@ -0,0 +1,184 @@
1%%% RIVISTO 15/12/2016 per GRINGO 4
2
3%% dimensione del cubo
4#const e = 2.
5%% numero di cubies
6#const c = e**3.
7%% upperbound mosse
8%#const t = 10.
9
10%% posizione dei cubetti
11cubie(0..c-1).
12%% def colori
13color(red;blue;green;yellow;orange;white).
14
15time(0..t).
16
17%% le rotazioni sono codificate secondo la terminologia degli angoli di eulero
18rotation(yaw;pitch;roll).
19side(0;1).
20dir(1;-1).
21
22%% Determina la posizione di arrivo di un dato cubetto dopo una rotazione positiva.
23
24reach(yaw,0,0,1). % yaw up
25reach(yaw,0,1,2). % yaw up
26reach(yaw,0,2,3). % yaw up
27reach(yaw,0,3,0). % yaw up
28
29reach(yaw,1,4,5). % yaw down
30reach(yaw,1,5,6). % yaw down
31reach(yaw,1,6,7). % yaw down
32reach(yaw,1,7,4). % yaw down
33
34reach(pitch,0,0,4). % pitch right
35reach(pitch,0,4,5). % pitch right
36reach(pitch,0,5,1). % pitch right
37reach(pitch,0,1,0). % pitch right
38
39reach(pitch,1,3,7). % pitch left
40reach(pitch,1,7,6). % pitch left
41reach(pitch,1,6,2). % pitch left
42reach(pitch,1,2,3). % pitch left
43
44reach(roll,0,0,3). % roll front
45reach(roll,0,3,7). % roll front
46reach(roll,0,7,4). % roll front
47reach(roll,0,4,0). % roll front
48
49reach(roll,1,1,2). % roll back
50reach(roll,1,2,6). % roll back
51reach(roll,1,6,5). % roll back
52reach(roll,1,5,1). % roll back
53
54%% Solo una mossa per instante t, fino a quando non è risolto il cubo.
551 { move(T1,R,S,D) : rotation(R), side(S), dir(D) } 1 :-
56 time(T1), time(T2), not solved(T2), T2 <= T1.
57:- time(T1), time(T2), solved(T2), T2 < T1, move(T1,R,S,D).
58
59%% Vieta 3 rotazioni uguali nello stesso senso.
60:- move(T,R,S,D), move(T+1,R,S,D), move(T+2,R,S,D),
61 rotation(R), side(S), dir(D), time(T), time(T+1), time(T+2).
62
63%% Vieta la rotazione di 180 gradi con mosse negative.
64:- move(T,R,S,-1), move(T+1,R,S,-1),
65 rotation(R), side(S), time(T), time(T+1).
66
67%% Elimina sequenze di mosse che formano dei cicli nella sequenza di stati
68%% (sembra piuttosto pesante come controllo)
69:- equal(T1,T2), time(T1;T2), T1 < T2.
70equal(T1,T2) :- not different(T1,T2), time(T1), time(T2), T1 < T2.
71different(T1,T2) :- cubie(X), is(T1,X,Col1,_,_),is(T2,X,Col2,_,_), time(T1), time(T2), color(Col1;Col2), Col1 != Col2, T1 < T2.
72different(T1,T2) :- cubie(X), is(T1,X,_,Col1,_),is(T2,X,_,Col2,_), time(T1), time(T2), color(Col1;Col2), Col1 != Col2, T1 < T2.
73different(T1,T2) :- cubie(X), is(T1,X,_,_,Col1),is(T2,X,_,_,Col2), time(T1), time(T2), color(Col1;Col2), Col1 != Col2, T1 < T2.
74
75%% In alternativa si può usare un più semplice controllo che vieta una seguenza di due mosse, l'una opposta all'altra.
76% :- move(T,R,S,D), move(T1,R,S,D1),
77% T1 = T + 1, time(T;T1),
78% dir(D;D1), D = -D1,
79% rotation(R),side(S).
80
81%% Evoluzione dello stato.
82is(T+1,C1,Col3,Col2,Col1) :- is(T,C,Col1,Col2,Col3),%
83 move(T,yaw,S,1),reach(yaw,S,C,C1),%
84 time(T),time(T+1),
85 cubie(C),cubie(C1),
86 color(Col1), color(Col2), color(Col3),
87 side(S).
88
89is(T+1,C1,Col3,Col2,Col1) :- is(T,C,Col1,Col2,Col3),%
90 move(T,yaw,S,-1),reach(yaw,S,C1,C),%
91 time(T),time(T+1),%
92 cubie(C),cubie(C1),
93 color(Col1), color(Col2), color(Col3),
94 side(S).
95
96is(T+1,C1,Col1,Col3,Col2) :- is(T,C,Col1,Col2,Col3),%
97 move(T,pitch,S,1),reach(pitch,S,C,C1),%
98 time(T),time(T+1),%
99 cubie(C),cubie(C1),
100 color(Col1), color(Col2), color(Col3),
101 side(S).
102
103is(T+1,C1,Col1,Col3,Col2) :- is(T,C,Col1,Col2,Col3),%
104 move(T,pitch,S,-1),reach(pitch,S,C1,C),%
105 time(T),time(T+1),%
106 cubie(C),cubie(C1),
107 color(Col1), color(Col2), color(Col3),
108 side(S).
109
110is(T+1,C1,Col2,Col1,Col3) :- is(T,C,Col1,Col2,Col3),%
111 move(T,roll,S,1),reach(roll,S,C,C1),%
112 time(T),time(T+1),%
113 cubie(C),cubie(C1),color(Col1;Col2;Col3),side(S).
114
115is(T+1,C1,Col2,Col1,Col3) :- is(T,C,Col1,Col2,Col3),%
116 move(T,roll,S,-1),reach(roll,S,C1,C),%
117 time(T),time(T+1),%
118 cubie(C),cubie(C1),
119 color(Col1), color(Col2), color(Col3),
120 side(S).
121
122%% catch all
123is(T+1,C,Col1,Col2,Col3) :- is(T,C,Col1,Col2,Col3),%
124 move(T,R,S,_), not reach(R,S,C,_), not reach(R,S,_,C),%
125 time(T),time(T+1),%
126 cubie(C), color(Col1), color(Col2), color(Col3),
127 rotation(R),side(S).
128
129%% configurazione risolta del cubo
130solved(N) :- is(N,0,Col4,Col1,Col3), is(N,1,Col4,Col1,Col5), is(N,2,Col6,Col1,Col5), is(N,3,Col6,Col1,Col3),
131 is(N,4,Col4,Col2,Col3), is(N,5,Col4,Col2,Col5), is(N,6,Col6,Col2,Col5), is(N,7,Col6,Col2,Col3),
132 time(N),faces(Col1,Col2,Col3,Col4,Col5,Col6).
133solved(N+1) :- time(N),time(N+1),solved(N).
134
135%% limita il check alle sole configurazioni risolte effettivamente ottenibili.
136%% Ad esempio se green e blue sono colori opposti, non esisterà mai una configurazione
137%% risolta che li vede vicini (ma senza faces/6 la regola sopra controllerebbe anche quello!)
138faces(green,blue,red,white,orange,yellow).
139faces(Col1,Col2,Col4,Col5,Col6,Col3) :- faces(Col1,Col2,Col3,Col4,Col5,Col6).
140faces(Col2,Col1,Col6,Col5,Col4,Col3) :- faces(Col1,Col2,Col3,Col4,Col5,Col6).
141faces(Col3,Col5,Col4,Col1,Col6,Col2) :- faces(Col1,Col2,Col3,Col4,Col5,Col6).
142
143%% chiedo che il cubo sia risolto
144solved :- solved(_).
145:- not solved.
146
147%% Predicato per distinguere la configurazione iniziale.
148init(C,Col1,Col2,Col3) :- is(0,C,Col1,Col2,Col3),cubie(C),color(Col1;Col2;Col3).
149
150%% Minimizzazione ripetto al numero di mosse.
151#minimize { T@1,solved : solved(T), time(T)}.
152
153%% INPUT 1 %%
154% is(0,0,red,white,green).
155% is(0,1,white,green,orange).
156% is(0,2,orange,white,blue).
157% is(0,3,green,red,yellow).
158% is(0,4,blue,orange,yellow).
159% is(0,5,white,red,blue).
160% is(0,6,blue,yellow,red).
161% is(0,7,yellow,green,orange).
162
163%% INPUT 2 %%
164% is(0,0,yellow,green,orange).
165% is(0,1,blue,white,orange).
166% is(0,2,yellow,orange,blue).
167% is(0,3,blue,yellow,red).
168% is(0,4,green,orange,white).
169% is(0,5,red,blue,white).
170% is(0,6,green,red,yellow).
171% is(0,7,red,white,green).
172
173%% INPUT 3 %%
174is(0,0,orange,yellow,green).
175is(0,1,white,green,orange).
176is(0,2,orange,white,blue).
177is(0,3,red,blue,yellow).
178is(0,4,white,blue,red).
179is(0,5,blue,yellow,orange).
180is(0,6,green,white,red).
181is(0,7,yellow,red,green).
182
183#show move/4.
184#show solved/1.