|
@@ -0,0 +1,89 @@
|
|
1
|
+:- use_module(library(lists)).
|
|
2
|
+
|
|
3
|
+disque(a, [-1,0,0,0,0,0]).
|
|
4
|
+disque(b, [-1,-1,0,0,0,0]).
|
|
5
|
+disque(c, [-1,0,-1,0,0,0]).
|
|
6
|
+disque(d, [-1,0,0,-1,0,0]).
|
|
7
|
+disque(e, [-1,-1,-1,0,0,0]).
|
|
8
|
+disque(f, [-1,-1,0,-1,0,0]).
|
|
9
|
+disque(g, [-1,0,-1,0,-1,0]).
|
|
10
|
+disque(h, [-1,-1,-1,-1,0,0]).
|
|
11
|
+disque(i, [-1,-1,-1,0,-1,0]).
|
|
12
|
+disque(j, [-1,-1,0,-1,-1,0]).
|
|
13
|
+disque(k, [-1,-1,-1,-1,-1,0]).
|
|
14
|
+disque(l, [-1,-1,-1,-1,-1,-1]).
|
|
15
|
+
|
|
16
|
+liste_des_disques(L) :-
|
|
17
|
+ findall(X,disque(X,_),L).
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+% rotation_droite([Head | []],[Head]).
|
|
21
|
+
|
|
22
|
+/* rotation_droite([Head | Tail], R) :-
|
|
23
|
+ rotation_droite(Tail, RAux),
|
|
24
|
+ append(RAux,[Head], R). */
|
|
25
|
+
|
|
26
|
+rev([], []).
|
|
27
|
+
|
|
28
|
+rev([Head | Tail], Res) :-
|
|
29
|
+ rev(Tail, X),
|
|
30
|
+ append(X, [Head],Res).
|
|
31
|
+
|
|
32
|
+/* rotation_droite(M, [Head | R]) :-
|
|
33
|
+ rev(M, [Head | Tail]),
|
|
34
|
+ rev(Tail, R). */
|
|
35
|
+
|
|
36
|
+rotation_droite([Head | Tail], Res) :-
|
|
37
|
+ append(Tail, [Head], Res).
|
|
38
|
+
|
|
39
|
+orienter(M1,M1,0,_).
|
|
40
|
+
|
|
41
|
+orienter(M1,M2,N,Ref) :-
|
|
42
|
+ rotation_droite(M1,Aux),
|
|
43
|
+ Aux \= Ref,
|
|
44
|
+ orienter(Aux,M2,Naux,Ref),
|
|
45
|
+ N is Naux + 1.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+empilement_secteur(0,0,0).
|
|
49
|
+empilement_secteur(2,-1,1).
|
|
50
|
+empilement_secteur(0,-1,2).
|
|
51
|
+empilement_secteur(1,-1 ,0).
|
|
52
|
+
|
|
53
|
+empilement([], [], []).
|
|
54
|
+
|
|
55
|
+empilement([Head1 | Tail1], [HeadM | TailM], [Head2 | Tail2]) :-
|
|
56
|
+ empilement_secteur(Head1,HeadM,Head2),
|
|
57
|
+ empilement(Tail1,TailM,Tail2).
|
|
58
|
+
|
|
59
|
+etat_initial([[0,0,0,0,0,0], L]) :-
|
|
60
|
+ liste_des_disques(L).
|
|
61
|
+
|
|
62
|
+etat_final([[0,0,0,0,0,0], []]).
|
|
63
|
+
|
|
64
|
+arc([S1,L1],[S2, L2],[D,N]) :-
|
|
65
|
+ S1 = [0,0,0,0,0,0],
|
|
66
|
+ N = 0,
|
|
67
|
+ select(D, L1, L2),
|
|
68
|
+ disque(D, F),
|
|
69
|
+ orienter(F,F2,N,F),
|
|
70
|
+ empilement(S1,F2,S2).
|
|
71
|
+
|
|
72
|
+arc([S1,L1],[S2, L2],[D,N]) :-
|
|
73
|
+ S1 \= [0,0,0,0,0,0],
|
|
74
|
+ select(D, L1, L2),
|
|
75
|
+ disque(D, F),
|
|
76
|
+ orienter(F,F2,N,F),
|
|
77
|
+ empilement(S1,F2,S2).
|
|
78
|
+
|
|
79
|
+trouver_solution([], EtatFinal, EtatFinal).
|
|
80
|
+
|
|
81
|
+trouver_solution([ResAux1 | ResAux2], EtatCourant, EtatFinal) :-
|
|
82
|
+ arc(EtatCourant, EtatSuivant, ResAux1),
|
|
83
|
+ trouver_solution(ResAux2, EtatSuivant, EtatFinal).
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+solution(S) :-
|
|
87
|
+ etat_initial(EtatInit),
|
|
88
|
+ etat_final(EtatFinal),
|
|
89
|
+ trouver_solution(S,EtatInit,EtatFinal).
|