Más Invariante

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

description

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 - PowerPoint PPT Presentation

Transcript of Más Invariante

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