La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 1 Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre.

Presentaciones similares


Presentación del tema: "1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 1 Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre."— Transcripción de la presentación:

1 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 1 Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre del 2007

2 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 2 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

3 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 3 Más Invariante int par,total,n; int a[];... while (par < n) { if (a[par] % 2 == 0) { total = total + a[par]; } else { a[par] = 0; } par++; } Enunciado // 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 // 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 P: par == total == 0  n == |a|

4 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 4 Más Invariante Transición de Estados while (par < n) { if (a[par] % 2 == 0) { total = total + a[par]; } else { a[par] = 0; } 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 // 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 P: par == total == 0 && n == |a| // 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

5 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 5 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..]  

6 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 6 Más Invariante Solución: I  B  Q 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 I  B :

7 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 7 Más Invariante Solución: {I  B} cuerpo {I} 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| // 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

8 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 8 Más Invariante Solución: {I  B} cuerpo {I} 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]) // 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

9 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 9 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

10 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 10 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 a medio ==  pre(a) div n ; aux medio : Z = n div 2 ; }

11 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 11 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

12 1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 12 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


Descargar ppt "1er Cuatrimestre 2008Algoritmos y Estructura de Datos 1 1 Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre."

Presentaciones similares


Anuncios Google