EyeXion 3 years ago
parent
commit
f45c7ab2e5
1 changed files with 89 additions and 0 deletions
  1. 89
    0
      TP3/tp3.pl

+ 89
- 0
TP3/tp3.pl View File

@@ -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).

Loading…
Cancel
Save