Академический Документы
Профессиональный Документы
Культура Документы
Resumen
El presente documento ilustra mediante un sencillo ejemplo c
omo se
pueden usar las especificaciones algebraicas para demostrar formalmente,
es decir, de forma matem
atica, ciertas propiedades de un Tipo Abstracto
de Datos. La demostraci
on rigurosa de dichas propiedades es una condici
on necesaria para la construcci
on de software de alta fiabilidad cuya
correcci
on tenga que ser verificada formalmente, certificando por tanto
que dicho software es correcto y carece de errores.
1.
Introducci
on
puede usar para verificar que ninguna llamada a un metodo viola la precondici
on
de dicho metodo.
A lo largo de este documento mostraremos como probar para una lista que la
propiedad invertir(invertir(l)) == l es verdadera. La Seccion 2 proporciona la
especificacion algebraica del TAD Lista. La Seccion 3 contiene la demostracion
por inducci
on de la propiedad. La Seccion 4 contiene un breve sumario del
documento.
2.
Especificaci
on Algebraica del TAD Lista
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
espec Sequence ( L i s t )
usa Boolean , N a tu r a l , Entero
generos Sequence ( Element ) como Seq
parametro
generos Element como E
operaciones
e q u a l : Element Element > Boolean
variables
x , y , z : Element ;
ecuaciones
e q u a l ( x , x ) = TRUE
equal (x , y ) = equal (y , x)
[ e q u a l ( x , y ) and e q u a l ( y , z ) ] e q u a l ( x , z ) = TRUE;
fparametro
operaciones
emptySeq
: > Seq
addTail , addHead : Seq E > Seq
add
: Seq E N a tu r a l > Seq
g e t T a i l , getHead : Seq > E
get
: Seq N a tu r a l > E
replace
: Seq N a tu r a l E > Seq
removeAll , r e m o v e F i r s t , removeLast : Seq E > Seq
remove
: Seq N a tu r a l > Seq
contains
: Seq E > Boolean
f i n d F i r s t I n d e x , f i n d L a s t I n d e x : Seq E > Entero
size
: Seq
> N a tu r a l
number
: Seq E > N a tu r a l
isEmpty
: Seq
> Boolean
c o n c a t , e q u a l : Seq Seq > Seq
equal
: Seq Seq > Boolean
invertir
: Seq > Seq
fspec ( c o n t i n u a )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
espec Sequence ( L i s t ) ( c o n t i n u a c i o
n )
vars
s , s 2 : Seq ; n : N a tu r a l ; x , y : Element ;
precondiciones
[ 0 <= n <= s i z e ( s ) ] add ( s , n )
[ isEmpty ( s ) == FALSE ] g e t T a i l ( s ) , getHead ( s )
[ 0 <= n < s i z e ( s ) ] g e t ( s , n ) , remove ( s , n ) , r e p l a c e s ( s , n , x )
ecuaciones
// Las g e n e r a d o r a s son emptySeq y addT ai l y son l i b r e s
// Los p a t r o n e s d e l t i p o son :
//
emptySeq
//
addT ai l ( s , x )
addHead ( emptySeq , x ) = a d d T a i l ( emptySeq , x )
addHead ( a d d T a i l ( s , x ) , y ) = a d d T a i l ( addHead ( s , y ) , x )
s i z e ( emptySeq ) = 0
s i z e ( addTail ( s , x ) ) = 1 + s i z e ( s )
add ( emptySeq , x , 0 ) = a d d T a i l ( emptySeq , x )
[ n == s i z e ( a d d T a i l ( s , x ) ) ]
add ( a d d T a i l ( s , x ) , y , n ) = a d d T a i l ( a d d T a i l ( s , x ) , y )
[ n < s i z e ( addTail ( s , x ) ) ]
add ( a d d T a i l ( s , x ) , y , n ) = a d d T a i l ( add ( s , y , n ) , x )
g e t T a i l ( addTail ( s , x ) ) = x
getHead ( a d d T a i l ( emptySeq , x ) ) = x
getHead ( a d d T a i l ( a d d T a i l ( s , x ) ) ) = getHead ( a d d T a i l ( s , x ) )
[ n == ( s i z e ( s ) 1 ) ] g e t ( a d d T a i l ( s , x ) , n ) = x
[ n < ( s i z e ( s ) 1 ) ] g e t ( a d d T a i l ( s , x ) , n ) = g e t ( s , n1)
r e m o v e A l l ( emptySeq , x ) = emptySeq
[ e q u a l ( x , y ) == TRUE]
removeAll ( addTail ( s , x ) , y ) = removeAll ( s , y )
[ e q u a l ( x , y ) != TRUE]
removeAll ( addTail ( s , x ) , y ) = addTail ( removeAll ( s , y ) , x )
[ n == ( s i z e ( s ) 1 ) ]
remove ( a d d T a i l ( s , x ) , n ) = s
[ n < ( s i z e ( s ) 1) ]
remove ( a d d T a i l ( s , x ) , n ) = a d d T a i l ( remove ( s , n ) , x )
r e p l a c e ( s , n , y ) = add ( remove ( s , n ) , y , n )
c o n t a i n s ( emptySeq , x ) = FALSE
[ e q u a l ( x , y ) == TRUE]
c o n t a i n s ( a d d T a i l ( s , x ) , y ) = TRUE
[ e q u a l ( x , y ) != TRUE]
con tai n s ( addTail ( s , x ) , y ) = con tai n s ( s , y )
fspec ( c o n t i n u a )
1 espec Sequence ( L i s t ) ( c o n t i n u a c i o
n )
2
3
f i n d L a s t I n d e x ( emptySeq , x ) = 1
4
[ ( e q u a l ( x , y ) == TRUE) ]
5
f i n d L as tIn d ex ( addTail ( s , x ) , y ) = s i z e ( s ) ;
6
[ ( e q u a l ( x , y ) != TRUE) ]
7
f i n d L as tIn d ex ( addTail ( s , x ) , y ) = f i n d L as tIn d ex ( s , y ) ;
8
9
f i n d F i r s t I n d e x ( emptySeq , x ) = 1
10
[ ( e q u a l ( x , y ) != TRUE) ]
11
f i n d F i r s t I n d e x ( addTail ( s , x ) , y ) = f i n d F i r s t I n d e x ( s , y ) ;
12
[ ( e q u a l ( x , y ) == TRUE) and ( c o n t a i n s ( s , y ) == TRUE) ]
13
f i n d F i r s t I n d e x ( addTail ( s , x ) , y ) = f i n d F i r s t I n d e x ( s , y ) ;
14
[ ( e q u a l ( x , y ) == TRUE) and ( c o n t a i n s ( s , y ) != TRUE) ]
15
f i n d F i r s t I n d e x ( addTail ( s , x ) , y ) = s i z e ( s ) ;
16
17
[ f i n d F i r s t I n d e x ( s , x ) != 1]
18
r e m o v e F i r s t ( s , x ) = remove ( s , f i n d F i r s t I n d e x ( s , x ) ) ;
19
[ f i n d F i r s t I n d e x ( s , x ) == 1] r e m o v e F i r s t ( s , x ) = s ;
20
21
[ f i n d L a s t I n d e x ( s , x ) != 1]
22
removeLast ( s , x ) = remove ( s , f i n d L a s t I n d e x ( s , x ) ) ;
23
[ f i n d L a s t I n d e x ( s , x ) == 1] removeLast ( s , x ) = s ;
24
25
number ( emptySeq , x ) = 0
26
[ e q u a l ( x , y ) == TRUE]
27
number ( a d d T a i l ( s , x ) , y ) = 1 + number ( s , y )
28
[ e q u a l ( x , y ) != TRUE]
29
number ( a d d T a i l ( s , x ) , y ) = number ( s , y )
30
31
isEmpty ( emptySeq )
= TRUE
32
isEmpty ( a d d T a i l ( s , x ) ) = FALSE
33
34
c o n c a t ( s , emptySeq ) = s
35
c o n c a t ( s , a d d T a i l ( s2 , x ) ) = a d d T a i l ( c o n c a t ( s , s 2 ) , x )
36
37
e q u a l ( emptySeq , emptySeq )
= TRUE
38
e q u a l ( a d d T a i l ( s , x ) , emptySeq ) = FALSE
39
e q u a l ( emptySeq , a d d T a i l ( s , x ) ) = FALSE
40
[ e q u a l ( x , y ) == TRUE]
41
e q u a l ( a d d T a i l ( s , x ) , a d d T a i l ( s2 , y ) ) = e q u a l ( s , s 2 )
42
[ e q u a l ( x , y ) != TRUE] e q u a l ( a d d T a i l ( s , x ) , a d d T a i l ( s2 , y ) ) =
FALSE
43
44
i n v e r t i r ( emptySeq ) = emptySeq
45
i n v e r t i r ( a d d T a i l ( s , x ) ) = addHead ( i n v e r t i r ( s ) , x )
46 f e s p e c
3.
Demostraci
on por Inducci
on
(1)
Caso Base Tenemos que demostrar la ecuacion (1) es verdadera para la lista
vaca, tal como muestra la ecuacion (2).
invertir(invertir(emptySeq)) == emptySeq
(2)
(3)
Hip
otesis de Inducci
on Asumimos, de acuerdo con la tecnica de demostraci
on por inducci
on, que la ecuacion (4) es verdadera para lista de tama
no
n.
invertir(invertir(l)) = l
(4)
(5)
Para ello tendremos que hacer uso de una nueva propiedad, que parece razonable, pero que hemos tambien de demostrar matematicamente.
En (7) se muestra la reduccion llevada a cabo para igualar el termino izquierdo de la ecuacion (11) con el termino derecho de la misma. Para realizar el
segundo paso de dicha reduccion hemos asumido que la propiedad de la ecuaci
on (6) es verdadera. Dicha propiedad dice que la inversa de una lista cuyo
elemento en la cabeza es x es igual a la inversa de la lista sin la cabeza, y con
dicha cabeza x como cola.
invertir(addHead(l, x)) = addT ail(invertir(l), x)
5
(6)
(7)
(8)
Para ello reducimos los terminos derechos e izquierdo hasta llegar a un mismo
termino, tal como muestran las ecuaciones (??) y (10).
invertir(addHead(emptySeq, x)) =
[Aplica F igura 2, ec. 16] = invertir(addT ail(emptySeq, x))
[Aplica F igura 3, ec. 45] = addHead(invertir(emptySeq), x) (9)
[Aplica F igura 3, ec. 44] = addHead(emptySeq, x)
[Aplica F igura 2, ec. 16] = addT ail(emptySeq, x)
addT ail(invertir(emptySeq), x) =
[Aplica F igura 3, ec44] = addT ail(emptySeq, x)
Hip
otesis de Inducci
on
listas de tama
no n.
(10)
4.
Sumario
Este documento ha presentado un sencillo ejemplo que ilustra como se pueden utilizar las especificaciones algebraicas para demostrar mediante inducci
on
matematica ciertas propiedades de un Tipo Abstracto de Datos. Demostrar dichas propiedades puede resultar crucial de cara a la elaboraci
on de software
fiable que necesitemos verificar que se encuentra libre de errores. Por desgracia, estos procedimientos de verificacion requieren tiempo y cierta habilidad, lo
que los hace bastante costosos. Por tanto, se suelen emplear exclusivamente en
sistemas software crticos, donde un mnimo fallo puede acarrear consecuencias
funestas.