diff options
Diffstat (limited to 'asp/20_rubikigne.lp')
| -rwxr-xr-x | asp/20_rubikigne.lp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/asp/20_rubikigne.lp b/asp/20_rubikigne.lp new file mode 100755 index 0000000..98768fb --- /dev/null +++ b/asp/20_rubikigne.lp | |||
| @@ -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 | ||
| 11 | cubie(0..c-1). | ||
| 12 | %% def colori | ||
| 13 | color(red;blue;green;yellow;orange;white). | ||
| 14 | |||
| 15 | time(0..t). | ||
| 16 | |||
| 17 | %% le rotazioni sono codificate secondo la terminologia degli angoli di eulero | ||
| 18 | rotation(yaw;pitch;roll). | ||
| 19 | side(0;1). | ||
| 20 | dir(1;-1). | ||
| 21 | |||
| 22 | %% Determina la posizione di arrivo di un dato cubetto dopo una rotazione positiva. | ||
| 23 | |||
| 24 | reach(yaw,0,0,1). % yaw up | ||
| 25 | reach(yaw,0,1,2). % yaw up | ||
| 26 | reach(yaw,0,2,3). % yaw up | ||
| 27 | reach(yaw,0,3,0). % yaw up | ||
| 28 | |||
| 29 | reach(yaw,1,4,5). % yaw down | ||
| 30 | reach(yaw,1,5,6). % yaw down | ||
| 31 | reach(yaw,1,6,7). % yaw down | ||
| 32 | reach(yaw,1,7,4). % yaw down | ||
| 33 | |||
| 34 | reach(pitch,0,0,4). % pitch right | ||
| 35 | reach(pitch,0,4,5). % pitch right | ||
| 36 | reach(pitch,0,5,1). % pitch right | ||
| 37 | reach(pitch,0,1,0). % pitch right | ||
| 38 | |||
| 39 | reach(pitch,1,3,7). % pitch left | ||
| 40 | reach(pitch,1,7,6). % pitch left | ||
| 41 | reach(pitch,1,6,2). % pitch left | ||
| 42 | reach(pitch,1,2,3). % pitch left | ||
| 43 | |||
| 44 | reach(roll,0,0,3). % roll front | ||
| 45 | reach(roll,0,3,7). % roll front | ||
| 46 | reach(roll,0,7,4). % roll front | ||
| 47 | reach(roll,0,4,0). % roll front | ||
| 48 | |||
| 49 | reach(roll,1,1,2). % roll back | ||
| 50 | reach(roll,1,2,6). % roll back | ||
| 51 | reach(roll,1,6,5). % roll back | ||
| 52 | reach(roll,1,5,1). % roll back | ||
| 53 | |||
| 54 | %% Solo una mossa per instante t, fino a quando non è risolto il cubo. | ||
| 55 | 1 { 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. | ||
| 70 | equal(T1,T2) :- not different(T1,T2), time(T1), time(T2), T1 < T2. | ||
| 71 | different(T1,T2) :- cubie(X), is(T1,X,Col1,_,_),is(T2,X,Col2,_,_), time(T1), time(T2), color(Col1;Col2), Col1 != Col2, T1 < T2. | ||
| 72 | different(T1,T2) :- cubie(X), is(T1,X,_,Col1,_),is(T2,X,_,Col2,_), time(T1), time(T2), color(Col1;Col2), Col1 != Col2, T1 < T2. | ||
| 73 | different(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. | ||
| 82 | is(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 | |||
| 89 | is(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 | |||
| 96 | is(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 | |||
| 103 | is(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 | |||
| 110 | is(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 | |||
| 115 | is(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 | ||
| 123 | is(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 | ||
| 130 | solved(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). | ||
| 133 | solved(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!) | ||
| 138 | faces(green,blue,red,white,orange,yellow). | ||
| 139 | faces(Col1,Col2,Col4,Col5,Col6,Col3) :- faces(Col1,Col2,Col3,Col4,Col5,Col6). | ||
| 140 | faces(Col2,Col1,Col6,Col5,Col4,Col3) :- faces(Col1,Col2,Col3,Col4,Col5,Col6). | ||
| 141 | faces(Col3,Col5,Col4,Col1,Col6,Col2) :- faces(Col1,Col2,Col3,Col4,Col5,Col6). | ||
| 142 | |||
| 143 | %% chiedo che il cubo sia risolto | ||
| 144 | solved :- solved(_). | ||
| 145 | :- not solved. | ||
| 146 | |||
| 147 | %% Predicato per distinguere la configurazione iniziale. | ||
| 148 | init(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 %% | ||
| 174 | is(0,0,orange,yellow,green). | ||
| 175 | is(0,1,white,green,orange). | ||
| 176 | is(0,2,orange,white,blue). | ||
| 177 | is(0,3,red,blue,yellow). | ||
| 178 | is(0,4,white,blue,red). | ||
| 179 | is(0,5,blue,yellow,orange). | ||
| 180 | is(0,6,green,white,red). | ||
| 181 | is(0,7,yellow,red,green). | ||
| 182 | |||
| 183 | #show move/4. | ||
| 184 | #show solved/1. | ||
