m s invariante n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Más Invariante PowerPoint Presentation
Download Presentation
Más Invariante

Loading in 2 Seconds...

play fullscreen
1 / 12

Más Invariante - PowerPoint PPT Presentation


  • 76 Views
  • Uploaded on

Más Invariante. Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre del 2007. Más Invariante. Dada la siguiente implementación, invariante y función variante, demostrar algunos puntos de la corrección y terminación del ciclo: P  I (I B )  Q

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Más Invariante' - gomer


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
m s invariante

Más Invariante

Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre del 2007

Algoritmos y Estructura de Datos 1

m s invariante1
Más Invariante

Dada la siguiente implementación, invariante y función variante, demostrar algunos puntos de la corrección y terminación del ciclo:

P  I

(IB)  Q

El cuerpo del ciclo preserva el invariante:

{ I  B } cuerpo { I }

Se cuenta con

aux cambiar(a:[T], i:, val:T) : T, que devuelve el resultado de poner val en la posición i de a, y de no hacer nada más.

Enunciado 1

Algoritmos y Estructura de Datos 1

m s invariante2
Más Invariante

Enunciado

int par,total,n;

int a[];

...

while (par < n) {

if (a[par] % 2 == 0) {

total = total + a[par];

} else {

a[par] = 0;

}

par++;

}

// estado P: par == total == 0 n == |a|

// I: 0  par  n == |a@P| total = suma([x | x a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x  a@P[..par)] ++ a@P[par..]

// Fv: n - par

// estado Q: total == suma([x | x  a@P,x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x  a@P]

// cota 0

Algoritmos y Estructura de Datos 1

m s invariante3
Más Invariante

Transición de Estados

// estado P: par == total == 0 && n == |a|

while (par < n) {

if (a[par] % 2 == 0) {

total = total + a[par];

} else {

a[par] = 0;

}

par++;

}

// estado E (I  B)

// vale 0  par < n == |a@P|  total == suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x a@P[..par)] ++ a@P[par..]

// estado F

// vale a@E[par] == a@P[par]

// vale a@E[par] mod 2 == 0  a[par] == a@E[par]  total == total@E + a@E[par]

// vale a@E[par] mod 2 != 0  a[par] == 0  total == total@E

// vale par == par@E  n == n@E

// vale a[..par) == ([if x mod 2 == 0 then x else 0 | x a@P[..par)] (1)

// vale a(par..] == a@P(par..]

// estado G

// vale par == par@E + 1  n == n@E  total == total@F  a == a@F

// estado Q: total == suma([x | x a@P,x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x a@P]

// cota 0

Algoritmos y Estructura de Datos 1

slide5

Más Invariante

Solución: P  I

P: par == total == 0  n == |a|

( 0  par  n == |a@P| (trivial)

( [x | x  a@P[..0),x mod 2 == 0]) =[]

suma([]) == 0 == total

total == suma([x | x  a@P[..par),x mod 2 == 0]) )

( [if x mod 2 == 0 then x else 0 | x  a@P[..0)] == [ ]  a@P == a@P[0..]

a == a@P == [if x mod 2 == 0 then x else 0 | x  a@P[..par)] ++ a@P[par..] ))

I: 0  par  n == |a| == |a@P|  total = suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x  a@P[..par)] ++ a@P[par..]

Algoritmos y Estructura de Datos 1

slide6

Más Invariante

Solución: I  B  Q

I  B :

0  par  n == |a@P| 

total == suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x  a@P[..par)] ++ a@P[par..] 

 (par < n)

par  n  par  n  par == n == |a@P|

total ==

suma([x | x  a@P[.. |a@P|),x mod 2 == 0]) 

a ==

[if x mod 2 == 0 then x else 0 | x  a@P[.. |a@P|)] ++ a@P[|a@P|..]

a@P[|a@P|..] == [ ] 

a == [if x mod 2 == 0 then x else 0 | x  a@P[.. |a@P|)] ++ [ ] 

total == suma([x | x  a@P[.. |a@P|),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | x  a@P[.. |a@P|)]

 Q

Algoritmos y Estructura de Datos 1

slide7
0  par  n == |a@P| :

//Estado E

vale par@E < n == |a@P|

//Estado F

vale par == par@E  n == n@E

//Estado G

vale par == par@E+1  par@E < n  n == n@E

implica 0 < par  n

implica 0  par  n  n == |a@P|

Más Invariante

Solución: {I  B} cuerpo {I}

// estado E (I  B)

  • vale 0  par < n == |a@P| 

total == suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | xa@P[..par)]

++ a@P[par..]

// estado F

  • // vale a@E[par] == a@P[par]
  • // vale a@E[par] mod 2 == 0  a[par] == a@E[par]  total == total@E + a@E[par]
  • // vale a@E[par] mod 2 != 0  a[par] == 0  total == total@E
  • // vale par == par@E  n == n@E
  • // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x  a@P[..par)] (1)
  • // vale a(par..] == a@P(par..]

// estado G

  • vale par == par@E + 1  n == n@E  total == total@F  a == a@F

Algoritmos y Estructura de Datos 1

slide8

Más Invariante

Solución: {I  B} cuerpo {I}

// estado E (I  B)

  • vale 0  par < n == |a@P| 

total == suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | xa@P[..par)]

++ a@P[par..]

// estado F

  • // vale a@E[par] == a@P[par]
  • // vale a@E[par] mod 2 == 0  a[par] == a@E[par]  total == total@E + a@E[par]
  • // vale a@E[par] mod 2 != 0  a[par] == 0  total == total@E
  • // vale par == par@E  n == n@E
  • // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x  a@P[..par)] (1)
  • // vale a(par..] == a@P(par..]

// estado G

  • vale par == par@E + 1  n == n@E  total == total@F  a == a@F

total == suma([x | x  a@P[..par),x mod 2 == 0]) :

//Estado E

vale total==suma([x | x  a@P[..par),x mod 2 == 0])

//Estado F

vale a@E[par] mod 2 == 0  total == total@E + a@E[par]

vale a@E[par] mod 2 != 0  total == total@E

vale par == par@E

vale a@E[par] == a@P[par] (1)

implica (reempazando)

a@E[par] mod 2 == 0  total ==

suma([x | x  a@P[..par),x mod 2 == 0]) + a@E[par] 

a@E[par] mod 2 != 0  total ==

suma([x | x  a@P[..par),x mod 2 == 0])

Implica (juntado y por 1)

total == suma([x | x  a@P[..par@E],x mod 2 == 0])

//Estado G

vale par == par@E+1  total == total@F

implica total == suma([x | x  a@P[..par),x mod 2 == 0])

Algoritmos y Estructura de Datos 1

slide9

Más Invariante

Solución: {I  B} cuerpo {I}

a == [if x mod 2 == 0 then x else 0 | x a@P[..par)] ++ a@P[par..]:

//Estado E

vale a == [if x mod 2 == 0 then x else 0 | x a@P[..par)]

++ a@P[par..]

//Estado F

vale a[..par) == ([if x mod 2 == 0 then x else 0 | x a@P[..par)] (1)

vale a(par..] == a@P(par..]

vale a@P[par] mod 2 == 0  a[par] == a@P[par] (2)

vale a@P[par] mod 2 != 0  a[par] == 0 (3)

vale par == par@E

implica (por 1,2y3)

a[..par] == ([if x mod 2 == 0 then x else 0 | x a@P[..par] ]

implica

a == ([if x mod 2 == 0 then x else 0 | x a@P[..par] ]

++ a@P(par..]

//Estado G

vale par == par@E+1

vale a == [if x mod 2 == 0 then x else 0 | x a@P[..par@E] ] ++ a@P(par@E..]

implica a == [if x mod 2 == 0 then x else 0 | x a@P[..par)] ++ a@P[par..]

// estado E (I  B)

  • vale 0  par < n == |a@P| 

total == suma([x | x  a@P[..par),x mod 2 == 0]) 

a == [if x mod 2 == 0 then x else 0 | xa@P[..par)]

++ a@P[par..]

// estado F

  • // vale a@E[par] == a@P[par]
  • // vale a@E[par] mod 2 == 0  a[par] == a@E[par]  total == total@E + a@E[par]
  • // vale a@E[par] mod 2 != 0  a[par] == 0  total == total@E
  • // vale par == par@E  n == n@E
  • // vale a[..par) == ([if x mod 2 == 0 then x else 0 | x  a@P[..par)] (1)
  • // vale a(par..] == a@P(par..]

// estado G

  • vale par == par@E + 1  n == n@E  total == total@F  a == a@F

Algoritmos y Estructura de Datos 1

slide10

Más Invariante

Enunciado 2

Escribir una implementación para la siguiente función sin utilizar arreglos auxiliares. (Sugerencia: este problema se puede resolver utilizando un solo ciclo. Hagan eso para simplificar enormemente el segundo ítem).

Dar una precondición, un invariante y una función variante, para cada uno de los ciclos que aparezcan en la solución, que permitan demostrar corrección usando el Teorema del Invariante. NO hacer ninguna demostración.

problema ejercicioArtificial (a,b : [Z],n : Z) {

requiere |a| == |b| == n  n mod 2 == 1 ;

modifica a; b ;

asegura pre(a) == reverse(a(medio..]) + + [pre(a)medio] + + reverse(a[..medio)) ;

asegura amedio ==  pre(a) div n ;

aux medio : Z = n div 2 ;

}

Algoritmos y Estructura de Datos 1

slide11

Más Invariante

Solución 1:

  • void EjercicioArtificial(inout [Z] a, inout [Z] b, in int n)
  • {
    • int i = 0;
    • int med = n div 2;
    • int acum = 0;
    • while (i<med)
    • {
    • int aux = a[i];
    • a[i] = a[n-1-i];
    • a[n-1-i] = aux;
    • acum += a[n-1-i] + a[i];
    • i++;
    • }
    • a[med] = acum/n;
  • }

P: i == 0  acum == 0

I: 0  i  n div 2 

acum ==  a@P[0..i-1]++a@P[n-i..n-1] 

a == reverse(a@P[n-i..n-1])++ a@P[i..n-1-i]

++ reverse(a@P[0..i-1])

Fv: med - i

Algoritmos y Estructura de Datos 1

slide12

Más Invariante

Solución 2:

  • void EjercicioArtificial(inout [Z] a, inout [Z] b, in int n)
  • {
    • int med = n div 2;
    • int i = med - 1;
    • int acum = a[med];
    • while (0i)
    • {
    • int aux = a[i];
    • a[i] = a[n-1-i];
    • a[n-1-i] = aux;
    • acum += a[n-1-i] + a[i];
    • i--;
    • }
    • a[med] = acum/n;
  • }

P: i == n div 2 – 1  acum == a[n div 2]

I: –1  i  n div 2 – 1 

acum ==  a@P(i..n-i-1) 

a == a@P[0..i]++ reverse(a@P(i..n-1-i))

++ a@P[n-1-i..n-1]

Fv: i

Algoritmos y Estructura de Datos 1