Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. Segment AB maximal
  2. Parmi les segments du tableau f dont la première valeur est A, dont la dernière valeur est B, trouver l’un de ceux dont la somme des éléments est maximale. Il faut d’abord formaliser cette spécification :R: r = (↑i,j : 0≤i<j<N ∧ f.i=A ∧ f.j=B : S.i.j) avec S.i.j = (Σk : i≤k≤j : f.k)
  3. var A,B : int
  4. ; var f(0..N-1) : array of int {1≤N}
  5. ; var r : int r: R
  6. En prévision d’un parcours linéaire du tableau, un invariant est introduit par la transformation de la constante N en une variable n.
  7. P0: 1≤n≤N
  8. P1: r = (↑i,j : 0≤i<j<n ∧ f.i=A ∧ f.j=B : S.i.j)
  9. D’où l’esquisse de programme suivante :
  10. n:=1 ; r:=-∞
  11. ; {inv P0 ∧ P1} {FdP N-n} do n6=N ->
  12. r: S
  13. ; { ?P1[n\n +1]} n:=n+1
  14. od { R }
  15. L’instruction n:=n+1 assure l’évolution de la fonction de progrès par un parcours linéaire du tableau. Par définition de l’affectation, pour que l’invariant soit maintenu, la précondition de l’instruction n:=n+1 doit être au moins aussi forte que l’assertion P1[n\n+1]. Ainsi, il faut construire un programme S qui réalise cette assertion. S doit mettre à jour la valeur de r pour que P1[n\n+1] soit vérifiée.
  16. Re P1[n\n+1]
  17. (↑i,j : 0≤i<j<n+1 ∧ f.i=A ∧ f.j=B : S.i.j)
  18. = { split pour j=n, correct car n≥1 par P0,
  19. P1 } r ↑ (↑i : 0≤i<n ∧ f.i=A ∧ f.n=B : S.i.n)
  20. = { soit f.n=B, soit f.n6=B, correct car 0≤n<N, le max sur un domaine vide vaut -∞}
  21. if f.n6=B -> r
  22. |f.n=B -> r ↑ (↑i : 0≤i<n ∧ f.i=A : S.i.n) fi
  23. La valeur : (↑i : 0≤i<n ∧ f.i=A : S.i.n) peut-elle être calculée avant la mise à jour de la variable r? Une nouvelle variable, s, est introduite pour stocker cette valeur. Puisque la valeur de s est utilisée pour le calcul de la mise à jour de r, s doit être mise à jour avant r. L’introduction d’une nouvelle variable s’accompagne d’un renforcement de l’invariant.
  24. P2: s=(↑i : 0≤i<n-1 ∧ f.i=A : S.i.(n-1))
  25. n:=1 ; r:=-∞ ; s:=-∞
  26. ; {inv P0 ∧ P1 ∧ P2} {FdP N-n} do n6=N ->
  27. s: T
  28. ; { ?P2[n\n+1]}{P0}{P 1} if f.n6=B -> skip
  29. |f.n=B -> r:= r↑s
  30. fi
  31. ; { P1[n\n +1]} n:=n+1
  32. od { R }
  33. Il faut réaliser P2[n\n+1] pour construire le programme T qui met à jour la variable s.
  34. Re P2[n\n+1]
  35. (↑i : 0≤i<n ∧ f.i=A : S.i.n)
  36. = { S.i.n = f.n + S.i.(n-1),
  37. + distribue sur ↑ }
  38. f.n + (↑i : 0≤i<n ∧ f.i=A : S.i.(n-1))
  39. = { split sur i=n-1, correct car 1≤n d’après P0,
  40. P2 }
  41. f.n + (s ↑ (↑i : i=n-1 ∧ f.i=A : S.i.(n-1)))
  42. = { S.(n-1).(n-1) = f.(n-1), max sur un domaine vide vaut −∞, alternative }
  43. if f.(n-1)6=A -> f.n + s|f.(n-1)=A -> f.n + (s ↑ f.(n-1)) fi
  44. D’où le programme :
  45. var A,B : int
  46. ; var f(0..N-1) : array of int {1≤N}
  47. ; var r,s : int
  48. ; n:=1 ; r:=-∞ ; s:=-∞
  49. ; do n6=N -> if f.(n-1)6=A -> s:= f.n + s
  50. |f.(n-1)=A -> s:= f.n + (s↑f.(n-1))
  51. fi
  52. ; if f.n6=B -> skip
  53. |f.n=B -> r:= r↑s
  54. fi ; n:=n+1 od
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement