La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Aristides Dasso, Ana Funes {arisdas, Universidad Nacional de San Luis

Presentaciones similares


Presentación del tema: "Aristides Dasso, Ana Funes {arisdas, Universidad Nacional de San Luis"— Transcripción de la presentación:

1 Métodos Formales y Análisis de Herramientas para la Producción de Software
Aristides Dasso, Ana Funes {arisdas, Universidad Nacional de San Luis 2006

2 Aspectos Sintácticos de RSL A. Dasso, A. Funes Métodos Formales ...

3 Funciones A. Dasso, A. Funes Métodos Formales ...

4 Funciones Una función es una transformación de valores de un tipo a valores de otro tipo. Pueden ser: Totales Parciales A. Dasso, A. Funes Métodos Formales ...

5 Funciones Totales Una función f, que transforma valores de un tipo T1 en un tipo T2 es total si para todo valor en T1 devuelve un único valor en T2. La denotamos en RSL: f: T1  T2 y satisface la propiedad: x: T1  ! y: T2  f(x)  y A. Dasso, A. Funes Métodos Formales ...

6 Funciones Totales Ejemplos
value check: Person  Database  Bool check(p, db)  p  db distance: Position  Position  Real distance ((x1, y1), (x2, y2))  ((x2 - x1)2.0 + (y2 - y1)  2.0)  0.5 A. Dasso, A. Funes Métodos Formales ...

7 Funciones Parciales (1)
Una función f, que transforma valores de un tipo T1 en un tipo T2 es parcial si existe un valor en T1 para el cual f no puede retornar un valor (es decir, es no terminante), o el resultado es no determinísitico. La denotamos en RSL f: T T2 A. Dasso, A. Funes Métodos Formales ...

8 Funciones Parciales (2)
Las funciones parciales son usualmente definidas con precondiciones, p.e.: factorial: Int Int factorial(x)  if x = 0 then 1 else x  factorial(x – 1) end pre x  0 Esto dice que cuando la precondición es true, la aplicación de la función es equivalente a la expresión que la define. La precondición nos dice que usemos factorial sólo cuando x  0. No nos dice qué sucede en otro caso. A. Dasso, A. Funes Métodos Formales ...

9 Funciones Parciales, ejemplos
factorial: Int Int factorial(x)  if x = 0 then 1 else x  factorial(x – 1) end pre x  0 ________________es equivalente a:_______________ axiom  x:Int • x  0  (factorial(x)  if x = 0 then 1 else x  factorial(x – 1) end) __________________y también a:________________  x:Int •factorial(x)  if x = 0 then 1 else x  factorial(x – 1) end A. Dasso, A. Funes Métodos Formales ...

10 Expresiones de Aplicación de Funciones
Ejemplos: factorial(10) sqrt(4) Forma típica: expr_función(expr1, ..., exprn) Condiciones de contexto: expr1, ..., exprn debe ser del tipo argumento de expr_función A. Dasso, A. Funes Métodos Formales ...

11 Definición de funciones
Elegir el nombre Decidir signatura: tipo argumento Ta tipo resultado Tr Total () o Parcial ( ) total: si podemos definirla para todos los valores en Ta parcial: si se necesita una precondición. Decidir el estilo A. Dasso, A. Funes Métodos Formales ...

12 Estilo de definición de funciones: explícito
Si es posible establecer una fórmula. f(x)  expr[x] Ejemplo: value f: Int  Int f(x)  x + 1 A. Dasso, A. Funes Métodos Formales ...

13 Estilo de definición de funciones: implícito
Si es posible establecer una relación entre los datos de entrada y los de salida: p[x, r] Ejemplo value f: Int  Int f(x) as r post r > x A. Dasso, A. Funes Métodos Formales ...

14 Estilo de definición de funciones: axiomático
Siempre es posible Típicamente usado en conexión con los sorts. Signatura + axioma(s) value value f: Int  Int f: Int  Int axiom axiom  x: Int • f(x) > x  x: Int • f(x)  x + 1 A. Dasso, A. Funes Métodos Formales ...

15 Composición de Funciones
º : (T2 T3)  (T1 T2)  (T1 T3) (f º g) (x) = f(g(x)) scheme PRB = class value f : Int  Nat f(x)  x  2, g : Int  Int g(x)  2 * x , h : Int  Nat h(x) (f º g)(x) end A. Dasso, A. Funes Métodos Formales ...

16 Composición de Funciones
scheme PRB = class value f : Int  Nat f(x)  x  2, g : Int  Int g(x)  2 * x, h : ((Int  Nat)  (Int  Int)  Int)  Nat) h(x, y, z)  (x ºy) (z), uso_h: Int  Nat uso_h(x)  h(f, g, x) end A. Dasso, A. Funes Métodos Formales ...

17 Definiciones algebraicas de Funciones Ejemplo 1: Una lista de enteros
Una lista es una secuencia ordenada de elementos. Se puede construir una nueva lista agregando un elemento a una lista dada. Se puede recuperar la cabeza de la lista (head) que corresponde al último elemento agregado, así como recuperar su cola (tail) que corresponde al resto de la lista, sin la cabeza. A. Dasso, A. Funes Métodos Formales ...

18 i : Int, l : List • tail(add(i, l))  l,
scheme LIST = class type List value empty : List, add : Int  List  List, tail : List List, head : List Int axiom i : Int, l : List • tail(add(i, l))  l,  i : Int, l : List • head(add(i, l))  i end A. Dasso, A. Funes Métodos Formales ...

19 Ejemplo 2: Una Base de Datos Requerimientos (1)
La base de datos asocia claves únicas con los datos. Es decir, una clave se encuentra asociada con a lo sumo un elemento de datos en la base de datos. Además, la base de datos deberá proveer las siguientes funciones: A. Dasso, A. Funes Métodos Formales ...

20 Ejemplo: Una Base de Datos Requerimientos (2)
insert asocia una clave con un dato en la base de datos. Si la clave ya se encuentra asociada a otro elemento de datos, la nueva asociación borra la anterior. remove remueve una asociación entre una clave y un dato. defined verifica si una clave está asociada a algún dato. lookup retorna el dato asociado con una clave particular. A. Dasso, A. Funes Métodos Formales ...

21 insert : Key  Data  Database  Database,
scheme DATABASE = class type Database, Key, Data value empty : Database, insert : Key  Data  Database  Database, remove : Key  Database  Database, defined : Key  Database  Bool, lookup : Key  Database Data A. Dasso, A. Funes Métodos Formales ...

22 Técnica para identificar axiomas
Identificar los constructores del tipo de interés. Definir las restantes funciones en términos de los constructores. A. Dasso, A. Funes Métodos Formales ...

23 Técnica para identificar axiomas, aplicado al ejemplo de la base de datos
Los constructores son la constante empty y la función insert. Cualquier base de datos puede ser representada por una expresión de la forma: insert(k1, d1, insert(k2, d2, ... insert(kn, dn, empty)...)) remove, defined y lookup definidos en términos de los constructores empty e insert. A. Dasso, A. Funes Métodos Formales ...

24 axiom [remove_empty]  k : Key • remove(k, empty)  empty,
[remove_insert]  k, k1 : Key, d1 : Data, db : Database • remove(k, insert(k1, d1, db))  if k = k1 then remove(k, db) else insert(k1, d1, remove(k, db)) end, A. Dasso, A. Funes Métodos Formales ...

25  k : Key • defined(k, empty)  false, [defined_insert]
[defined_empty]  k : Key • defined(k, empty)  false, [defined_insert]  k, k1 : Key, d1 : Data, db : Database • defined(k, insert(k1, d1, db))  k = k1  defined(k, db), [lookup_insert] lookup(k, insert(k1, d1, db))  if k = k1 then d1 else lookup(k, db) end pre defined(k, db) end A. Dasso, A. Funes Métodos Formales ...

26 Ejemplo 3: Los axiomas de Peano para los números Naturales
Informalmente, los axiomas de Peano pueden ser establecidos como sigue: 0 es un número natural. Todos número natural a tiene un sucesor. Ningún número natural tiene a 0 como su sucesor. Distintos números naturales tienen distintos sucesores. Si una propiedad se mantiene para 0, y se mantiene para el sucesor de todo número natural para el cual también se mantiene, entonces la propiedad se mantiene para todos los números naturales. A. Dasso, A. Funes Métodos Formales ...

27 [cero_es_el_primero]  n : N • ~ (succ(n)  zero), [orden_lineal]
scheme PEANO = class type N value zero : N, succ : N  N axiom [cero_es_el_primero]  n : N • ~ (succ(n)  zero), [orden_lineal]  n1, n2 : N • (succ(n1)  succ(n2))  (n1  n2), [inducción]  p : N  Bool • (p(zero)  ( n : N • p(n) => p(succ(n)))) => ( n : N • p(n)) end A. Dasso, A. Funes Métodos Formales ...

28 Ejemplo 3: Los axiomas de Peano para los números Naturales (cont.)
Queremos ahora extender los axiomas de Peano con las operaciones de suma y multiplicación. A. Dasso, A. Funes Métodos Formales ...

29 scheme NATURAL_NUMBERS = extend PEANO with class value
plus : N  N  N, mult : N  N  N axiom [plus_zero]  n : N • plus(n, zero)  n, [plus_succ]  n1, n2 : N • plus(n1, succ(n2))  succ(plus(n1, n2)), [mult_zero]  n : N • mult(n, zero)  zero, [mult_insert] mult(n1, succ(n2))  plus(mult(n1, n2), n1) end A. Dasso, A. Funes Métodos Formales ...

30 La conmutatividad y asociatividad pueden probarse a partir de los axiomas anteriores.
Usando la técnica explicada, toda expresión que involucre un no-constructor puede demostrarse que es equivalente a una expresión que sólo use constructores. Pedimos además que los axiomas sobre los no-constructores “hagan algún progreso” para lo cual necesitamos una de dos condiciones: El lado derecho no involucre un no-constructor. El lado derecho aplica no-constructores sólo a términos con menor cantidad de constructores. A. Dasso, A. Funes Métodos Formales ...

31 Funciones, ejercicios (1)
1. Suggest types for the operators (a) + (addition) (b) * (multiplication) (c) \ (remainder) (d)  (exponentiation) Remember that they may have both integer and real versions. A. Dasso, A. Funes Métodos Formales ...

32 Funciones, ejercicios (2)
2. Define a function, ‘max’, that returns the maximum of two integers in each of the following styles: (a) explicit function (b) implicit function (c) signature/axiom A. Dasso, A. Funes Métodos Formales ...

33 Funciones, ejercicios (3)
3. Define a function, ‘approx_sqrt’, that for a given tolerance (positive real number) finds an approximation to the square root of non-negative real numbers. The approximation, approx_sqrt(x,eps), must be such that the mathematical square root, square_root(x), lies in the half open interval [approx_sqrt(x,eps),approx_sqrt(x,eps) + eps) A. Dasso, A. Funes Métodos Formales ...

34 Conjuntos A. Dasso, A. Funes Métodos Formales ...

35 {“Juan”, “Pedro”, “María”}
Conjuntos Un conjunto es una colección, no ordenada, de valores distintos, del mismo tipo. Ejemplos: {1,4,8} {} {“Juan”, “Pedro”, “María”} A. Dasso, A. Funes Métodos Formales ...

36 Expresión de tipo conjunto
La expresión de tipo expr_de_tipo-set representa el tipo que contiene todos los conjuntos finitos de elementos de tipo expr_de_tipo A. Dasso, A. Funes Métodos Formales ...

37 Conjuntos, ejemplos Bool-set representa todos los conjuntos finitos de Bool. Es decir: {}, {true}, {false}, {true, false} Nat-set representa todos los subconjuntos finitos del conjunto de los naturales. Es decir: {}, {0}, {1}, ...,{0,1},...,{1,2},... A. Dasso, A. Funes Métodos Formales ...

38 Conjuntos infinitos La expresión de tipo expr_de_tipo-infset
representa el tipo que contiene todos los conjuntos finitos así como los infinitos de elementos de tipo expr_de_tipo A. Dasso, A. Funes Métodos Formales ...

39 Conjuntos infinitos, ejemplos
Bool-infset representa los mismos conjuntos que Bool-set. Nat-infset contiene no sólo los conjuntos finitos sino también los infinitos: {}, {0}, {1}, ...,{0,1},...,{1,2},... {0,1,2,3...}, {1,2,3...}, {1,3,5,7,9,...},... A. Dasso, A. Funes Métodos Formales ...

40 Conjuntos, propiedades
No existe un orden de sus elementos, p.e.: {1,2,3} = {3,2,1} No contiene valores repetidos: {1,2,3,3} = {1,2,3} Para cualquier tipo T, T-set es un subtipo de T-infset. A. Dasso, A. Funes Métodos Formales ...

41 Conjuntos definición explícita
Un conjunto puede ser definido explícitamente: {expr1,...,exprn} donde expri tienen un tipo maximal común y n  0. Ejemplo : {1, 2, 3} {} {“Juan”, “Pedro”} A. Dasso, A. Funes Métodos Formales ...

42 Conjuntos, definición implícita
Un conjunto puede ser definido implícitamente: {expr1  typing1,..., typingn • expr2} donde n  1 y expr2 es booleana. A. Dasso, A. Funes Métodos Formales ...

43 Conjuntos, definición implícita, ejemplo
{2n n: Nat • n  3 } Se lee “el conjunto de valores 2n donde n es un número natural tal que n es menor o igual a tres”. Es decir que es igual a {0, 2, 4, 6} A. Dasso, A. Funes Métodos Formales ...

44 Conjuntos, ejemplos {n n: Nat • es_primo(n)}
donde es_primo: Nat  Bool Es igual al conjunto {2, 3, 5, 7, ...} {(x, y)x, y: Nat • y = x+1} es igual al conjunto {(0, 1), (1, 2), (2, 3),...} A. Dasso, A. Funes Métodos Formales ...

45 Expresiones de conjuntos con rangos
{expr1 .. expr2 } donde expr1 y expr2 son expresiones enteras Si expr1 > expr2 el conjunto resultante es vacío. A. Dasso, A. Funes Métodos Formales ...

46 Expresiones de conjuntos con rangos, ejemplos
{3 .. 7} = {3, 4, 5, 6, 7} {3 .. 3} = {3} {3 .. 2} = {} A. Dasso, A. Funes Métodos Formales ...

47 Operadores de conjuntos Pertenencia
: T  T-infset  Bool : T  T-infset  Bool e  s es true sii e es un elemento de s. e  s = (e  s) Ejemplos: 1  {1, 2} = true 1  {1, 2} = false 2  {n | n: Nat • true} = true A. Dasso, A. Funes Métodos Formales ...

48 Operadores de conjuntos: Unión
: T-infset  T-infset  T-infset Ejemplo: {1, 2, 3}  {2, 3, 4} = {1, 2, 3, 4} A. Dasso, A. Funes Métodos Formales ...

49 Operadores de conjuntos: Intersección
: T-infset  T-infset  T-infset Ejemplo: {1, 2, 3}  {2, 3, 4} = {2, 3} A. Dasso, A. Funes Métodos Formales ...

50 Operadores de conjuntos: Unión e Intersección
Unión e intersección pueden ser definidos en términos de pertenencia: s1  s2  {e  e: T • es1  es2} s1  s2  {e  e: T • es1  es2} A. Dasso, A. Funes Métodos Formales ...

51 Operadores de conjuntos: Diferencia de conjuntos
s1 \ s2 : T-infset  T-infset  T-infset s1 \ s2  {e  e: T • e s1  e s2} A. Dasso, A. Funes Métodos Formales ...

52 Operadores de conjuntos: Diferencia de conjuntos Ejemplos
{1, 3, 4} \ {3, 4} = {1} {1, 3, 4} \ {2} = {1, 3, 4} {1, 3, 4} \ {n n: Nat • es_primo(n)} = {1, 4} A. Dasso, A. Funes Métodos Formales ...

53 Operadores de conjuntos: Subconjunto
: T-infset  T-infset  Bool s1  s2   e: T • e s1  e s2 Operador reverso: : T-infset  T-infset  Bool s1  s2   e: T • e s2  e s1 A. Dasso, A. Funes Métodos Formales ...

54 Operadores de conjuntos: Subconjunto propio
: T-infset  T-infset  Bool s1  s2  s1  s2  s1  s2 Operador reverso : T-infset  T-infset  Bool s1  s2  s1  s2  s1  s2 A. Dasso, A. Funes Métodos Formales ...

55 Operadores de conjuntos: Subconjunto, ejemplos
{1, 2, 3}  {1, 2, 3} = true {1, 2}  {1, 2, 3} = true {1, 2, 3}  {1, 2, 3} = false {1, 4}  {1, 2, 3} = false A. Dasso, A. Funes Métodos Formales ...

56 Operadores de conjuntos: Cardinalidad
Retorna la cardinalidad de un conjunto finito. La aplicación a un conjunto infinito retorna chaos. card: T-infset Nat Ejemplos: card {} = 0 card {1, 15, 23} = 3 card {n | n: Nat}  chaos A. Dasso, A. Funes Métodos Formales ...

57 Conjuntos, ejercicios 1. Write value expressions representing the set of odd numbers between 0 and 10, as an enumerated set and as a comprehended set. 2. Do the following identities hold for sets A, B and C? (a) (A  B) \ C = (A \ C)  (B \ C) (b) (A  C) \ B = (A  B) \ C 3. Define a function, ‘dunion’, that takes a set, ss, of sets of elements as argument and returns the set of all those elements which are elements of some set in ss. Example: dunion({ {1,2}, {7,1}, {5} }) = {1,2,7,5} A. Dasso, A. Funes Métodos Formales ...

58 Ejemplo: Un administrador de recursos
Un número de recursos deben ser compartidos entre un número de usuarios. Un administrador de recursos controla los recursos manteniendo un pool (conjunto) de recursos libres. Cuando un usuario quiere un recurso, el administrador obtiene uno cualquiera del pool. Cuando el usuario no lo necesita más, el administrador lo libera devolviéndolo al pool. A. Dasso, A. Funes Métodos Formales ...

59 p A. Dasso, A. Funes Métodos Formales ...

60 Ejemplo: Una Base de datos
Consideremos los requerimientos para la base de datos del ejemplo anterior. A. Dasso, A. Funes Métodos Formales ...

61 Ejemplo: Una Base de Datos (1)
Requerimientos: La base de datos asocia claves únicas con los datos. Es decir, una clave se encuentra asociada con a lo sumo un elemento de datos en la base de datos. Además, la base de datos deberá proveer las siguientes funciones: A. Dasso, A. Funes Métodos Formales ...

62 Ejemplo: Una Base de Datos (2)
insert asocia una clave con un dato en la base de datos. Si la clave ya se encuentra asociada a otro elemento de datos, la nueva asociación borra la anterior. remove remueve una asociación entre una clave y un dato. defined verifica si una clave está asociada a algún dato. lookup retorna el dato asociado con una clave particular. A. Dasso, A. Funes Métodos Formales ...

63 insert : Key  Data  Database  Database,
scheme DATABASE = class type Database, Key, Data value empty : Database, insert : Key  Data  Database  Database, remove : Key  Database  Database, defined : Key  Database  Bool, lookup : Key  Database Data A. Dasso, A. Funes Métodos Formales ...

64 axiom [remove_empty]  k : Key • remove(k, empty)  empty,
[remove_insert]  k, k1 : Key, d1 : Data, db : Database • remove(k, insert(k1, d1, db))  if k = k1 then remove(k, db) else insert(k1, d1, remove(k, db)) end, A. Dasso, A. Funes Métodos Formales ...

65  k : Key • defined(k, empty)  false, [defined_insert]
[defined_empty]  k : Key • defined(k, empty)  false, [defined_insert]  k, k1 : Key, d1 : Data, db : Database • defined(k, insert(k1, d1, db))  k = k1  defined(k, db), [lookup_insert] lookup(k, insert(k1, d1, db))  if k = k1 then d1 else lookup(k, db) end pre defined(k, db) end A. Dasso, A. Funes Métodos Formales ...

66 A. Dasso, A. Funes Métodos Formales ...

67 A. Dasso, A. Funes Métodos Formales ...

68 A. Dasso, A. Funes Métodos Formales ...

69 Un paso de desarrollo A. Dasso, A. Funes Métodos Formales ...

70 Relación de Refinamiento, condiciones
El nuevo modelo (A1) debe incluir TODAS las entidades del viejo (A0 ) types, values, objects, variables y channels con los mismos nombres y tipos maximales. A1 puede tener más entidades que A0. Implementación estática, garantiza monotonicidad. Puede ser chequeada estáticamente. Para satisfacer la relación de refinamiento, dos propiedades deben ser satisfechas: la propiedad de implementación estática y la preservación de propiedades. La primera pide que la signatura de A1 debe incluir a la signatura de A0. Es decir, A1 debe contener todas las entidades (tipos, values, variables, channels, y objects) con los mismos nombres y los mismos tipos maximales, o para los objetos con clases que estén en la misma relación de implementación. La relación es de inclusión ya que A1 puede tener más entidades que A0. Esta condición puede ser chequeada estáticamente, y las herramientas de RAISE lo hacen como parte del type checking. A. Dasso, A. Funes Métodos Formales ...

71 Relación de Refinamiento, condiciones
Todas las propiedades de A0 se mantienen en A1. axiomas, defs. de funciones, constantes, restricciones en subtipos. No puede ser chequeada estáticamente, necesita demostración. La segunda condición pide que todas las propiedades de A0 deben ser válidas en A1. Las propiedades pueden ser expresadas por medio de axiomas, pero también incluye las definiciones de funciones y constantes, los valores iniciales de variables, y las restricciones en los subtipos. Esta condición no puede ser chequeada estáticamente, y en general requiere de una demostración para su verificación. Pero recordemos que la “R” de RAISE es por Riguroso: el método permite que las condiciones sean chequeadas informalmente, a mano. La cantidad de pruebas que hagamos dependerá de cuán crítico sea el sistema y de cuanto presupuesto tengamos. Las pruebas son costosas porque requieren mucho tiempo y gente entrenada y con experiencia. Lamentablemente el tipo de pruebas que surgen en el desarrollo de software son las que exceden la capacidad de los probadores automáticos. A. Dasso, A. Funes Métodos Formales ...

72 SET_DATABASE implementa a DATABASE
SET_DATABASE define todos los tipos que define DATABASE, el único cambio es que el sort Database ha sido reemplazado por una definición concreta. SET_DATABASE define, con las misma signaturas, todas las constantes y funciones que son definidas por DATABASE. Todos los axiomas de DATABASE son verdaderos en SET_DATABASE. A. Dasso, A. Funes Métodos Formales ...

73 Condiciones de Refinamiento
A. Dasso, A. Funes Métodos Formales ...

74 Condiciones de Refinamiento (cont.)
A. Dasso, A. Funes Métodos Formales ...

75 Condiciones de Refinamiento (cont.)
A. Dasso, A. Funes Métodos Formales ...

76 Verificación de una cond. de refinamiento
A. Dasso, A. Funes Métodos Formales ...

77 Ejemplo: Relaciones de Equivalencia
Un conjunto que consiste de conjuntos disjuntos de elementos define una relación de equivalencia. Llamamos a los conjuntos miembros “clases de equivalencia”. Todos los miembros de una clase son considerados equivalentes. A. Dasso, A. Funes Métodos Formales ...

78 Una relación de equivalencia debe cumplir con 3 condiciones para ser bien formada:
No debe contener la clase vacía. Cada elemento se encuentra representado en alguna clase. La intersección de las clases de equivalencia es vacía. La función make_equivalent es requerida para hacer dos elementos equivalentes, juntando las clases de equivalencias de los elementos en una. La función are-equivalent controla si dos elementos son equivalentes, es decir, si pertenecen a la misma clase de equivalencia. A. Dasso, A. Funes Métodos Formales ...

79 scheme EQUIVALENCE_RELATION = class type Relation = Class-infset,
Class = Element-infset, Element value well_formed : Relation  Bool, initial : Relation, make_equivalent : Element  Element  Relation  Relation, are_equivalent : Element  Element  Relation  Bool A. Dasso, A. Funes Métodos Formales ...

80  r : Relation • well_formed(r)  {}  r 
axiom  r : Relation • well_formed(r)  {}  r  ( e : Element •  c : Class • e  c  c  r)  ( c1, c2 : Class • c1  c2  c1  c2 = {}), initial  {{e} | e : Element}, A. Dasso, A. Funes Métodos Formales ...

81  e1, e2 : Element, r : Relation • make_equivalent(e1, e2, r) 
(r \ {c | c : Class • c  r  (e1  c  e2  c)})  {c1 union c2 | c1, c2 : Class • c1  r  c2  r  e1  c1  e2  c2}, e1, e2 : Element, r : Relation • are_equivalent(e1, e2, r)  ( c : Class • c  r  e1  c  e2  c) end A. Dasso, A. Funes Métodos Formales ...


Descargar ppt "Aristides Dasso, Ana Funes {arisdas, Universidad Nacional de San Luis"

Presentaciones similares


Anuncios Google