Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porRoberto Flores Vargas Modificado hace 10 años
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
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.