No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tp3.pl 1.9KB

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