Download - Más Invariante

Transcript
Page 1: Más Invariante

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

Page 2: Más Invariante

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

Page 3: Más Invariante

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|

Page 4: Más Invariante

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

Page 5: Más Invariante

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..]

Page 6: Más Invariante

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 :

Page 7: Más Invariante

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

Page 8: Más Invariante

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

Page 9: Más Invariante

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

Page 10: Más Invariante

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 ;}

Page 11: Más Invariante

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

Page 12: Más Invariante

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