1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
1
Más Invariante
Ejercicios tomados del recuperatorio del parcial de imperativo del 2do
cuatrimestre del 2007
1er Cuatrimestre 2008 Algoritmos 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• (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
1er Cuatrimestre 2008 Algoritmos 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|
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
4
Más InvarianteTransición de Estadoswhile (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
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
5
Más InvarianteSolució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..]
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
6
Más InvarianteSolució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 :
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
7
Más InvarianteSolución: {I B} cuerpo {I}
0 par n == |a@P| :
//Estado E vale par@E < n == |a@P|
//Estado Fvale par == par@E n == n@E
//Estado Gvale 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 | 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
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
8
Más InvarianteSolució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 Fvale a@E[par] mod 2 == 0 total == total@E + a@E[par]vale a@E[par] mod 2 != 0 total == total@Evale par == par@Evale 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 Gvale par == par@E+1 total == total@Fimplica 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 | 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
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
9
Más InvarianteSolució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 Gvale 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
1er Cuatrimestre 2008 Algoritmos 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 amedio == pre(a) div n ;
aux medio : Z = n div 2 ;}
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
11
Más InvarianteSolució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
1er Cuatrimestre 2008 Algoritmos y Estructura de Datos 1
12
Más InvarianteSolució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
Top Related