120 likes | 210 Views
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
E N D
Más Invariante Ejercicios tomados del recuperatorio del parcial de imperativo del 2do cuatrimestre del 2007 Algoritmos y Estructura de Datos 1
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 (IB) 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 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 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
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
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
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 | xa@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
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 | xa@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
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 | xa@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
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
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
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 (0i) • { • 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