Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.66 KB | None | 0 0
  1. class Rectangle {
  2.  
  3. /* système de coords
  4. y
  5. |
  6. |
  7. | (1,2)
  8. | (1,1) (2,1)
  9. ________>x
  10. */
  11. predicate positif(i:int)
  12. {
  13. i >= 0
  14. }
  15.  
  16. var hauteur: int;
  17. var largeur: int;
  18. var emplacementX:int;
  19. var emplacementY:int;
  20.  
  21. predicate isNeighbour(r1: Rectangle)
  22. reads r1
  23. reads this
  24. requires r1 != null;
  25. {
  26. (emplacementX+largeur)==r1.emplacementX || (emplacementY+hauteur)==r1.emplacementY
  27. || (r1.emplacementX+r1.largeur)==emplacementX || (r1.emplacementY+r1.hauteur)==emplacementY
  28. }
  29.  
  30. method min(i: int, j: int) returns (m:int)
  31. {
  32. if(i<j) {
  33. m:=i;
  34. }
  35. else {
  36. m:=j;
  37. }
  38.  
  39. }
  40.  
  41. /* un peu la même chose que avec canMerge, voir si r1 est a gauche,a droite, en bas ou au dessus
  42. pour déterminer le nouveau x et y */
  43.  
  44. method merge(r1:Rectangle)
  45. returns (r2: Rectangle)
  46. requires r1!=null;
  47. ensures r2!=null
  48. {
  49. if hauteur == r1.hauteur && largeur==r1.largeur { //memes dimensions
  50. if(emplacementX == r1.emplacementX){
  51. var min := min(emplacementY,r1.emplacementY);
  52. r2:= new Rectangle(hauteur+r1.hauteur, largeur, emplacementX, min); //merge vertical
  53. }
  54. else{
  55. var min := min(emplacementX,r1.emplacementX);
  56. r2:= new Rectangle(hauteur, largeur + r1.largeur, min, emplacementY); //merge horizontal
  57. }
  58. }
  59. else{
  60. if largeur==r1.largeur {
  61. if emplacementY+hauteur == r1.emplacementY {
  62. r2 :=new Rectangle(hauteur+r1.hauteur,largeur,emplacementX,emplacementY); /*au dessus*/
  63. }
  64. else{
  65. r2 :=new Rectangle(hauteur+r1.hauteur,largeur,r1.emplacementX,r1.emplacementY); /* en dessous*/
  66. }
  67. }
  68. else{
  69. if emplacementX+largeur == r1.emplacementX {
  70. r2:=new Rectangle(hauteur,r1.largeur+largeur,emplacementX,emplacementY); /* a droite*/
  71. }
  72. else {
  73. r2:=new Rectangle(hauteur,r1.largeur+largeur,r1.emplacementX,r1.emplacementY); /*a gauche*/
  74. }
  75. }
  76. }
  77.  
  78. }
  79.  
  80.  
  81. /* Si largeur et hauteur sont les mêmes ==> merge
  82. si largeur est la même==> que merge si le deuxième est dans la continuation de l'axe Y du premier ( est soit en dessous, soit au dessus)
  83. si hauteur est la même==> que merge si le deuxième est dans la continuation de l'axe X du premier ( est soit a gauche soit a droite)
  84. */
  85.  
  86. method canMerge(r1: Rectangle) returns (canM: bool)
  87. requires r1!=null
  88. {
  89. assert r1 != null;
  90. if hauteur == r1.hauteur && largeur==r1.largeur {
  91. canM:=true; return;
  92. }
  93. else {
  94. if largeur==r1.largeur && (emplacementY+hauteur == r1.emplacementY || r1.emplacementY+r1.hauteur == emplacementY) {
  95. canM:=true; return;
  96. }
  97. else{
  98. if hauteur==r1.hauteur && (emplacementX+largeur == r1.emplacementX || r1.emplacementX+r1.largeur == emplacementX){
  99. canM:=true; return;
  100. }
  101. else {canM:=false; return;}
  102. }
  103. }
  104. }
  105.  
  106. constructor (h:int , l: int , x:int , y :int)
  107. modifies this
  108. {
  109. hauteur:=h;
  110. largeur:=l;
  111. emplacementX:=x;
  112. emplacementY:=y;
  113. }
  114. }
  115.  
  116.  
  117.  
  118. class Couverture {
  119.  
  120. var rectangles: array<Rectangle>;
  121.  
  122. // Ceci est votre invariant de représentation.
  123. // C'est plus simple d'avoir ok() dans les pre et les posts que le le recoper à chaque fois.
  124. predicate ok()
  125. reads this,rectangles;
  126. {
  127. rectangles != null
  128. }
  129.  
  130. constructor (qs: array<Rectangle>)
  131. requires qs != null
  132. modifies this
  133. ensures ok()
  134. ensures rectangles == qs
  135. {
  136. rectangles := qs;
  137. }
  138.  
  139. method merge(i: int , j:int)
  140. requires ok()
  141. requires rectangles!=null
  142. requires 0<=i<rectangles.Length
  143. requires 0<=j<rectangles.Length
  144. requires rectangles[i]!=null
  145. requires rectangles[j]!=null
  146. requires rectangles.Length>2
  147. modifies rectangles
  148. {
  149. var r3 := rectangles[i].merge(rectangles[j]);
  150. rectangles[i] := r3;
  151. rectangles[j] := null;
  152. }
  153.  
  154. method improve() returns (imp:bool)
  155. requires ok()
  156. modifies rectangles
  157. {
  158. var mod := false;
  159. var i:=0;
  160. var n := rectangles.Length;
  161. while i < n && rectangles != null && rectangles.Length>2 && !mod
  162. invariant 0 <= i <= n
  163. {
  164. if i < rectangles.Length && i >=0 && rectangles[i] != null {
  165. var j:=i+1;
  166. while j < n && rectangles != null && rectangles.Length>2 && !mod
  167. invariant 0 <= j <= n
  168. {
  169. if i < rectangles.Length && i >=0 && j < rectangles.Length && j > 0 && rectangles[j] != null && rectangles[i] != null
  170. && ((rectangles[i].emplacementX+rectangles[i].largeur)==(rectangles[j].emplacementY)
  171. || (rectangles[i].emplacementY+rectangles[i].hauteur)==(rectangles[j].emplacementY)
  172. || (rectangles[j].emplacementX+rectangles[j].largeur)==(rectangles[i].emplacementY)
  173. || (rectangles[j].emplacementY+rectangles[j].hauteur)==(rectangles[i].emplacementY))
  174. {
  175. var mergeable := (rectangles[i]).canMerge(rectangles[j]);
  176. if mergeable{
  177. merge(i,j);
  178. mod := true;
  179. }
  180.  
  181. }
  182. j := j+1;
  183. }
  184. }
  185. i := i+1;
  186.  
  187. }
  188. imp:=mod;
  189. }
  190.  
  191. method optimize()
  192. requires ok()
  193. modifies rectangles
  194. {
  195. var merged := true;
  196. var i := rectangles.Length + 1;
  197. while merged && i>=0 && rectangles != null
  198. decreases i
  199. {
  200. merged:=improve();
  201. i := i-1;
  202. }
  203. }
  204.  
  205. method dump()
  206. requires ok()
  207. {
  208. var i := 0;
  209. var first := true;
  210. print "[ ";
  211. while i < rectangles.Length
  212. {
  213. if !first { print ", "; }
  214. if rectangles[i] !=null {
  215. print "(";
  216. print rectangles[i].emplacementX;
  217. print ",";
  218. print rectangles[i].emplacementY;
  219. print ") --> ";
  220. print rectangles[i].largeur;
  221. print " / ";
  222. print rectangles[i].hauteur;
  223. }
  224. else {print "null";}
  225. i := i + 1;
  226. first := false;
  227. print "\n";
  228. }
  229. print " ] \n";
  230. }
  231. }
  232. method Test(c: Couverture)
  233. requires c!=null
  234. requires c.ok()
  235. modifies c, c.rectangles
  236. {
  237. c.optimize();
  238. if c!= null && c.rectangles != null {c.dump();}
  239. }
  240. method Main()
  241. {
  242. // Vous devez écrire ici trois tests de votre méthode optimize
  243. var g1 := new Rectangle(1,1,0,0);
  244. var g2 := new Rectangle(1,1,1,0);
  245. var g3 := new Rectangle(1,1,2,0);
  246. var g4 := new Rectangle(1,1,0,1);
  247. var g5 := new Rectangle(1,1,1,1);
  248. var g6 := new Rectangle(1,1,2,1);
  249. var g7 := new Rectangle(1,1,0,2);
  250. var g8 := new Rectangle(1,1,1,2);
  251. var g9 := null;
  252.  
  253. var a := new Rectangle[9];
  254. a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]:= g1,g2,g3,g4,g5,g6,g7,g8,g9;
  255. var couv := new Couverture(a);
  256. Test(couv);
  257.  
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement