Está en la página 1de 35

Menú

Ejemplo de TAD en imperativo


Ejercicio: Carrito de compras
Para tener en cuenta

Algoritmos y Estructuras de Datos I


Tads en imperativo

19 de mayo de 2014

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Menú del día

Demostraciones con TADs


TAD TConjunto / Clase Conjunto

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Menú del día

Demostraciones con TADs


TAD TConjunto / Clase Conjunto
Repaso de conceptos

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Menú del día

Demostraciones con TADs


TAD TConjunto / Clase Conjunto
Repaso de conceptos
Carrito de Compras

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Menú del día

Demostraciones con TADs


TAD TConjunto / Clase Conjunto
Repaso de conceptos
Carrito de Compras
Detalles de las demostraciones

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

TAD TConjunto

tipo TConjunto {
observador elementos (c : TConjunto) : [Nat] ;
invariante sinRepetidos(elementos(c)) ;
}

problema insertar (c : TConjunto, e : Nat) {


modifica c ;
asegura (∀x ← elementos(pre(c)))x ∈ elementos(c) ;
asegura (∀x ← elementos(c), x 6= e)x ∈ elementos(pre(c)) ;
asegura e ∈ elementos(c) ;
}

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Clase Conjunto

c l a s s Conjunto {
public :
void i n s e r t a r ( int e ) {
i n s e r c i o n e s . push_back ( e ) ;
}
private :
s t d : : l i s t <i n t > i n s e r c i o n e s ;
// i n v R e p : True
// a b s ( t h i s : Conjunto , c : TConjunto ) :
// mismos (
// sacarRepetidos ( this . inserciones1) ,
// elementos ( c ))
};
1
La clase std::list<int> es una implementación correcta de secuencias.
Algoritmos y Estructuras de Datos I
Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 1) (invRep@E1) True (tautología)
// 2) implica (∀ x ←elementos(pre(c))) x ∈ this.inserciones@E0
// Por abs(this@E0, pre(c)) (vale invRep, por ser método público)
y mismos (mismos(a,b) y x ∈ a implica x ∈ b)

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 1) (invRep@E1) True (tautología)
// 2) implica (∀ x ←elementos(pre(c))) x ∈ this.inserciones@E0
// Por abs(this@E0, pre(c)) (vale invRep, por ser método público)
y mismos (mismos(a,b) y x ∈ a implica x ∈ b)
// implica (∀ x ←elementos(pre(c))) x ∈ this.inserciones@E1
// Por vale E1 (ins == ins@E0 ++ [e]) y anterior implica.

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 1) (invRep@E1) True (tautología)
// 2) implica (∀ x ←elementos(pre(c))) x ∈ this.inserciones@E0
// Por abs(this@E0, pre(c)) (vale invRep, por ser método público)
y mismos (mismos(a,b) y x ∈ a implica x ∈ b)
// implica (∀ x ←elementos(pre(c))) x ∈ this.inserciones@E1
// Por vale E1 (ins == ins@E0 ++ [e]) y anterior implica.
// implica (∀ x ←elementos(pre(c))) x ∈ elementos(c)
// Por abs(this@E1, c), mismos y anterior implica.

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 3)

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 3) implica (∀ x ←elementos(c)) x ∈ this.inserciones@E1)
// Por abs(this@E1, c)) y mismos

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 3) implica (∀ x ←elementos(c)) x ∈ this.inserciones@E1)
// Por abs(this@E1, c)) y mismos
// implica (∀ x ←elementos(c), x 6= e) x ∈ this.inserciones@E1)
// Porque es un subconjunto de elementos(c) y por anterior implica

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 3) implica (∀ x ←elementos(c)) x ∈ this.inserciones@E1)
// Por abs(this@E1, c)) y mismos
// implica (∀ x ←elementos(c), x 6= e) x ∈ this.inserciones@E1)
// Porque es un subconjunto de elementos(c) y por anterior implica
// implica (∀ x ←elementos(c), x 6= e) x ∈ this.inserciones@E0)
// Por vale E1 (ins == ins@E0 ++ [e]) y anterior implica

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

// abs(this : Conjunto, c : TConjunto) :


// mismos(sacarRepetidos(this.inserciones),elementos(c))
// 3) implica (∀ x ←elementos(c)) x ∈ this.inserciones@E1)
// Por abs(this@E1, c)) y mismos
// implica (∀ x ←elementos(c), x 6= e) x ∈ this.inserciones@E1)
// Porque es un subconjunto de elementos(c) y por anterior implica
// implica (∀ x ←elementos(c), x 6= e) x ∈ this.inserciones@E0)
// Por vale E1 (ins == ins@E0 ++ [e]) y anterior implica
// implica (∀ x ←elementos(c), x 6= e) x ∈ elementos(pre(c)))
// Por abs(this@E0, pre(c)) y anterior implica
// 4) implica e ∈ elementos(c)
// Por abs(this@E1, c), mismos y vale E1 (ins == ins@E0 ++ [e])

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Observadores e invariantes

¿Implementamos los observadores?


¿Por qué invRep era True si había invariante del TAD?
¿Tengo que demostrar que abs() es verdadero?
¿Y el invariante de tipo?

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Carrito de compras

tipo TCarroDeCompras2 {
observador productos (c : TCarroDeCompras) : [String] ;
observador cantidadVentas (s : String, c :
TCarroDeCompras) : Int ;
requiere s ∈ productos(c) ;
invariante (∀s ← productos(c)) 0 ≤ cantidadVentas(s, c) ;
invariante sinRepetidos(productos(c)) ;
invariante |productos(c)| == 40 ;
}

2
Vamos a subir a la página una solución posible.
Algoritmos y Estructuras de Datos I
Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

problema comprar (c : TCarroDeCompras, producto : String) {


requiere producto ∈ productos(c) ;
modifica c ;
asegura mismos(productos(c), productos(pre(c))) ;
asegura (∀s ← productos(c), s 6=
producto) cantidadVentas(s, pre(c)) ==
cantidadVentas(s, c) ;
asegura cantidadVentas(producto, pre(c)) + 1 ==
cantidadVentas(producto, c) ;
}

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro {
public :
ClaseCarro ( s t r i n g catalogo [ 4 0 ] ) ;
v o i d comprar ( s t r i n g p r o d u c t o ) ;

private :
s t r i n g productos [ 4 0 ] ;
int cantidadVentas [ 4 0 ] ;
s t r i n g masComprado ;
int ventasBestSeller ;
[...]
}

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro {
[...]
// a b s ( imp : C l a s e C a r r o , e s p : TCarroDeCompras ) :

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro {
[...]
// a b s ( imp : C l a s e C a r r o , e s p : TCarroDeCompras ) :
// mismos ( imp . p r o d u c t o s , p r o d u c t o s ( e s p ) )

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro {
[...]
// a b s ( imp : C l a s e C a r r o , e s p : TCarroDeCompras ) :
// mismos ( imp . p r o d u c t o s , p r o d u c t o s ( e s p ) ) &&
// ( p a r a t o d o i <− [ 0 . . 4 0 ) )
// c a n t i d a d V e n t a s ( imp . p r o d u c t o s [ i ] , e s p ) ==
// imp . c a n t i d a d V e n t a s [ i ] ;
[...]
};

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40 &&
// en ( imp . masComprado , imp . p r o d u c t o s )

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40 &&
// en ( imp . masComprado , imp . p r o d u c t o s ) &&
// ( p a r a t o d o x <− imp . c a n t i d a d V e n t a s ) x >= 0

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40 &&
// en ( imp . masComprado , imp . p r o d u c t o s ) &&
// ( p a r a t o d o x <− imp . c a n t i d a d V e n t a s ) x >= 0 &&
// s i n R e p e t i d o s ( imp . p r o d u c t o s )

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40 &&
// en ( imp . masComprado , imp . p r o d u c t o s ) &&
// ( p a r a t o d o x <− imp . c a n t i d a d V e n t a s ) x >= 0 &&
// s i n R e p e t i d o s ( imp . p r o d u c t o s ) &&
// ( p a r a t o d o c , m <− [ 0 . . 4 0 ) )
// ( imp . p r o d u c t o s [m] == masComprado &&
// c != m) => imp . c a n t i d a d V e n t a s [m] >=
// imp . c a n t i d a d V e n t a s [ c ]

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

class ClaseCarro { [ . . . ]
// I n v R e p ( imp : C l a s e C a r r o ) :
// | imp . p r o d u c t o s | == 40 &&
// | imp . c a n t i d a d V e n t a s | == 40 &&
// en ( imp . masComprado , imp . p r o d u c t o s ) &&
// ( p a r a t o d o x <− imp . c a n t i d a d V e n t a s ) x >= 0 &&
// s i n R e p e t i d o s ( imp . p r o d u c t o s ) &&
// ( p a r a t o d o c , m <− [ 0 . . 4 0 ) )
// ( imp . p r o d u c t o s [m] == masComprado &&
// c != m) => imp . c a n t i d a d V e n t a s [m] >=
// imp . c a n t i d a d V e n t a s [ c ] &&
// ( p a r a t o d o m <− [ 0 . . 4 0 ) ,
// imp . p r o d u c t o s [m] == imp . masComprado )
// imp . c a n t i d a d V e n t a s [m] ==
// imp . v e n t a s B e s t S e l l e r ;
};
Algoritmos y Estructuras de Datos I
Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

problema aumentarVentasProducto (productos : [String],


cantidadVentas : [Z], producto : String) {
requiere producto ∈ productos ;
requiere sinRepetidos(productos) ;
requiere |cantidadVentas| == |productos| ;
modifica cantidadVentas ;
asegura |cantidadVentas| == |pre(cantidadVentas)| ;
asegura (∀ic ← [0..|productos|), productos[ic ] 6=
producto) cantidadVentas[ic ] ==
pre(cantidadVentas)[ic ] ;
asegura (∀ic ← [0..|productos|), productos[ic ] ==
producto) cantidadVentas[ic ] ==
pre(cantidadVentas)[ic ] + 1 ;
}

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

problema obtenerMasComprado (productos : [String],


cantidadVentas : [Z], ventasBestSeller : Z) = result : String {
requiere |cantidadVentas| == |productos| ;
modifica ventasBestSeller ;
asegura result ∈ productos ;
asegura
(∀ic , im ← [0..|productos|), productos[im ] == result ∧ ic 6=
im ) cantidadVentas[im ] ≥ cantidadVentas[ic ] ;
asegura (∀im ← [0..|productos|), productos[im ] ==
result) ventasBestSeller == cantidadVentas[im ] ;
}

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

¿Y qué pasa si hay...

Helpers?

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

¿Y qué pasa si hay...

Helpers?
Varios TADs en los parámetros?

Algoritmos y Estructuras de Datos I


Menú
Ejemplo de TAD en imperativo
Ejercicio: Carrito de compras
Para tener en cuenta

Buen finde!

¿Preguntas?

Algoritmos y Estructuras de Datos I

También podría gustarte