Title: Subtipos
1Subtipos
2Subtipos
- Un tipo T1 es un subtipo de otro tipo T2 si
todos los valores contenidos en T1 se encuentran
también contenidos en T2. - Ejemplo
- Nat es un subtipo de Int.
3Expresiones de Subtipos
- Un tipo cualquiera pude ser restringido por un
predicado resultando en un subtipo del tipo
original. - Forma general
4Subtipos vs. axiomas
- type NoVacia l Text l ? lt gt
- value ultimo_elemento NoVacia ? Char
- axiom ? l NoVacia ultimo_elemento(l) ? l(len
l) - Podría haberse escrito también
- value ultimo_elemento Text Char
- axiom ? l Text ultimo_elemento(l) ? l(len l)
- pre l ? lt gt
5EjemploUna Cola acotada
- Los elementos pueden ser puestos y sacados de la
cola con una política FIFO. - La cola es acotada en el sentido de que existe un
número máximo de elementos que pueden encontrase
en ella.
6(No Transcript)
7Subtipos vacíos
- Qué sucede si la restricción del subtipo reduce
a false? p.e - type NoInt i Int false
- Esta declaración es inútil pero por si sola no
produce ningún daño. - El problema está cuando la usamos, p.e. ...
8Subtipos vacíos
- value no_constant NoInt
- sería equivalente a
- value no_constant Int
- axiom no_constant ? i i Int false
- El axioma reduce a false. Generamos una
contradicción.
9Variants
10Definiciones de Variants
- Abreviatura para
- una definición de un sort.
- algunas definiciones de values
- constructores para generar valores del sort.
- posiblemente, destructores para acceder a sus
partes. - posiblemente, reconstructores para modificarlas.
- algunos axiomas, que definen propiedades sobre
los values.
11Definiciones de Variants (1) Constructores de
constantes
- type
- Color negro blanco
- El tipo Color representa los valores constantes
negro y blanco, también referidos como los
constructores del tipo.
12Definiciones de Variants (1)Constructores de
constantes
- Ejemplo de uso del variant Color
- type
- Color negro blanco
- value
- invertir Color ? Color
- axiom
- invertir(blanco) ? negro,
- invertir(negro) ? blanco
13Definiciones de Variants (1)Constructores de
constantes
- Ejemplo de uso del variant Color
- type
- Color negro blanco
- value
- invertir Color ? Color
- invertir(c) ? case c of
- negro ? blanco,
- blanco ? negro
- end
14Definiciones de Variants (1)Constructores de
constantes
- El tipo variant Color es una abreviatura para
- type
- Color -- sort
- value
- negro Color, -- constructor
- blanco Color -- constructor
- axiom
- blanco ? negro, -- disyunción
- ? p Color ? Bool
- (p(blanco) ? p(negro)) ? (? c Color p(c))
-- inducción
15Definiciones de Variants (2)Constructores de
registros
- type
- Collection empty add(Element, Collection )
- El tipo variant Collection
- Está definido recursivamente. Los únicos tipos
recursivos aceptados son los variants. - Cuenta con dos valores (values) una constante
empty y una función add, que es un constructor de
registros.
16Definiciones de Variants (2)Constructores de
registros
- El tipo variant Collection es una abreviatura
para - type
- Collection -- sort
- value
- empty Collection , -- constructor
- add Element ? Collection ? Collection --
constructor
17Definiciones de Variants (2)Constructores de
registros
- axiom
- disyunción
- ? e Element, c Collection empty ? add(e,
c), - inducción
- ? p Collection ? Bool
- (p(empty) ?
- (? e Element, c Collection p(c) ?
p(add(e, c)))) ? - (? c Collection p(c))
18Definiciones de Variants (2)Destructores de
registros
- Sirven para extraer los componentes de un
registro. - type
- List empty add(head Element, tail List )
19Definiciones de Variants (2)Destructores de
registros
- El variant List es una abreviatura para
- un sort (List)
- cuatro definiciones de values (los dos
constructores más los dos destructores head y
tail). - cuatro axiomas (el de disjunción, el de inducción
y dos nuevos axiomas relacionando los
destructores con su correspondiente constructor).
20Definiciones de Variants (2)Destructores de
registros
- El tipo variant List es una abreviatura para
- type
- List -- sort
- value
- empty List , -- constructor
- add Element ? List ? List, -- constructor
- head List Element, -- destructor
- tail List List -- destructor
21Definiciones de Variants (2)Destructores de
registros
- axiom
- ? e Element, l List empty ? add(e, l),
- ? p List ? Bool
- (p(empty) ?
- (? e Element, l List p(l) ?
p(add(e, l)))) ? - (? l List p(l)),
- ?e Element, l List head(add(e, l)) ? e,
- ?e Element, l List tail(add(e, l)) ? l
22Definiciones de Variants (2)Reconstructores de
registros
- Sirven para modificar los componentes de un
registro. - type
- List empty add(head Element ?
replace_head, - tail List ? replace_tail )
23Definiciones de Variants (2)Reconstructores de
registros
- La ocurrencia de los reconstructores son una
abreviatura para las siguientes definiciones, a
ser agregadas a las anteriores - value
- replace_head Element ? List List,
- replace_tail List ? List List
-
24Definiciones de Variants (2)Reconstructores de
registros
- axiom
- ?e, e1 Element, l List
- replace_head(e, add(e1, l))) ? add(e, l)
- ?e Element, t,l List
- replace_tail(t, add(e, l))) ? add(e, t)
-
25Definiciones de Variants (3)Uniones disjuntas de
tipos
- type
- Figure box(length Real, width Real)
- circle(radius Real ? re_radius)
26Definiciones de Variants (3)Uniones disjuntas de
tipos
- type
- Figure
- value
- box Real ? Real ? Figure, -- constructor
- circle Real ? Figure, -- constructor
- length Figure Real, -- destructor
- width Figure Real, -- destructor
- radius Figure Real -- destructor
- re_radius Real ? Figure Figure --
reconstructor
27Definiciones de Variants (3)Uniones disjuntas de
tipos
- axiom
- ? l, w, r Real box(l,w) ? circle(r),
- ? p Figure ? Bool
- ((? l, w Real p(box(l,w))) ?
- (? r Real p(circle(r)))) ? (? f
Figure p(f)), - ? l, w Real lenght(box(l, w)) ? l,
- ? l, w Real width(box(l, w)) ? w,
- ? r Real radius(circle(r)) ? r,
- ? r, r1 Real re_radius(r, circle(r1))) ?
circle(r)
28Definiciones de Variants Wildcards
- type
- Color negro blanco _
- es una abreviatura para
- type
- Color -- sort
- value
- negro Color, -- constructor
- blanco Color -- constructor
- axiom
- blanco ? negro, -- disjunción. No hay axioma de
inducción.
29EjemploÁrboles binarios ordenados
- Un árbol binario puede
- ser un árbol vacío, o
- estar compuesto de un elemento y dos subárboles
un árbol izquierdo y un árbol derecho. - Que esté ordenado significa que cualquiera de los
elementos que se encuentran en un subárbol
izquierdo son menores que el elemento tope, el
cual debe ser menor que cualquiera de los que se
encuentran en su subárbol derecho.
30(No Transcript)
31(No Transcript)
32(No Transcript)
33Records
34Definiciones de Records
- Cuando en un variant contamos con una única
alternativa, la cual es una definición de un
constructor de registro, existe una forma
abreviada que nos permite omitir el constructor
en la definición y que resulta más natural.
35Definiciones de Records
- type
- Libro libro(tituloTitulo ? re_titula,
autor Autor, editorial Editorial,
año Año) - puede ser escrito
- type
- Libro
- titulo Titulo ? re_titula
- autor Autor
- editorial Editorial
- año Año
36Definiciones de Records
- un constructor de valores de tipo Libro
- mk_Libro Titulo ? Autor ? Editorial ? Año ?
Libro - destructores de Libro para acceder a sus partes
- titulo Libro ? Titulo
- autor Libro ? Autor
- editorial Libro ? Editorial
- año Libro ? Año
- reconstructores de Libro
- re_titula Titulo ? Libro ? Libro
37Definiciones de Records (cont.)
- axiomas
- inducción
- p Libro ? Bool
- (? t Titulo, a Autor, e Editorial, y Año
- p(mk_Libro(t, a, e, y))
- ) ? ? l Libro p(l)
-
38Definiciones de Records (cont.)
- ? t Titulo, a Autor, e Editorial, y Año
- (titulo(mk_Libro(t, a, e, y)) ? t,
- ? t Titulo, a Autor, e Editorial, y Año
- autor (mk_Libro(t, a, e, y)) ? a,
- ? t Titulo, a Autor, e Editorial, y Año
- editorial(mk_Libro(t, a, e, y)) ? e,
- ? t Titulo, a Autor, e Editorial, y Año
- año(mk_Libro(t, a, e, y)) ? y,
- ? t, new_t Titulo, a Autor, e Editorial, y
Año - (re_titula(new_t, mk_Libro(t, a, e, y)) ?
mk_Libro(new_t, a, e, y)
39Expresiones Case
40Expresiones Case
- Selección de una expresión entre varias
dependiendo del valor de otra expresión. - value
- error_message Nat ? Text
- error_message(error_code) ? case error_code of
- 1 ? buffer lleno,
- 2 ? buffer vacío,
- _ ? error
- end
41Case, forma general
- case value_expr of
- pattern1 ? value_expr1
-
-
-
- patternn ? value_exprn
- end
- con n?1
- El orden de los patrones es significativo.
- Si ninguno hace matching la expresión case queda
sub- especificada.
42Patrones Literales
- Un patrón literal es un valor de tipo Unit, Bool,
Int, Real, Text o Char. - Un valor hace matching con un literal si el valor
es igual al literal.
43Patrones comodines
- _ es patrón comodín (wildcard pattern).
- Cualquier valor hace matching con _.
- Deberían aparecer como último caso.
44Nombres de valuescomo patrones
- type
- Colour black white
- value
- invert Colour ? Colour
- axiom
- ? c Colour
- invert(c) ?
- case c of
- black ? white,
- white ? black
- end
45Patrones registros, ejemplo
- type
- List empty add(head Colour, tail List)
- value
- invert_list List ? List
- axiom
- ? l List
- invert_list(l) ?
- case l of
- empty ? empty,
- add(c, l1) ? add(invert(c), invert_list(l1))
- end
Record pattern
46Patrones listas, ejemplo
- value
- sum Int ? Int
- axiom
- ? l Int
- sum(l) ?
- case l of
- ?? ? 0,
- ?i? l1 ? i sum(l1)
- end
47Patrones productos, ejemplo
- value
- exclusive_or Bool ? Bool ? Bool
- axiom
- ? b1, b2 Bool
- exclusive_or(b1, b2) ?
- case (b1, b2) of
- (true, false) ? true,
- (false, true) ? true,
- _ ? false
- end
48Patrones productos, ejemplo
- type
- List Elem
- value
- elements_match Elem ? Elem ? Bool,
- list_match List ? List ? Bool
- axiom
- ? l1, l2 List
- list_match(l1, l2) ?
- case (l1, l2) of
- (lt gt, lt gt) ? true,
- (lte1gt t1, lte2gt t2) ? elements_match(e1,
e2) ? list_match(t1, t2), - _ ? false
- end
49Expresiones Let
50Expresiones Let
- Para definir nombres locales para valores
particulares. - Dos tipos de expresiones let
- Explícitas
- Implícitas
51Expresiones Let Explícitas, ejemplo 1
- let (x, y) (1, 2) in x y end
- Primero se evalúa la expresión que sigue al .
- Luego se asocia x a la primera parte e y a la
segunda. - Finalmente se evalúa la expresión que sigue a in.
52Expresiones Let Explícitas, ejemplo 2
- value
- square_head Int Int
- axiom
- ? l Int
- square_head(l) ?
- let h hd l in ?h ? h? tl l end
- pre l ? ? ?
53Expresiones Let Explícitas, ejemplo 3
- value
- square_head Int Int
- axiom
- ? l Int
- square_head(l) ?
- let (h, t) (hd l, tl l) in ?h ? h? t end
- pre l ? ? ?
54Expresiones Let Explícitas, ejemplo 4
- value
- square_head Int Int
- axiom
- ? l Int
- square_head(l) ?
- let lthgt t l in ?h ? h? t end
- pre l ? ? ?
55Expresiones Let Explícitas, formato
- let let_binding value_expr1
- in value_expr2
- end
- donde
- let_binding binding record_pattern
- list_pattern
56Expresiones Let Explícitas, propiedades
- NO recursiva identificadores definidos en
let_binding no pueden ser referidos en
value_expr1. - Ocurrencias de identificadores en value_expr1 se
refieren a definiciones externas al let.
57Expresiones Let Implícitas, ejemplo 1
- value
- choose Elem-set Elem
- choose(s) ? let e Elem e ? s
- in e
- end
- pre s ?
58Expresiones Let Implícitas, ejemplo 2
- value
- some_char Unit Char
- some_char() ? let c Char in c end
-
59Expresiones Let Implícitas Forma general
- Puede tomar dos formas
- let typing in expr end
- let binding type_expr value_expr1 in
value_expr2 end
60Expresiones Let anidadas, ejemplo
- type Queue Nat ? (Nat Elem), Elem
- value
- add Elem ? Queue ? Queue
- add(e, q) ? let (last, map) q in
- let new_last last 1 in
- let new_map map new_last ? e in
- (new_last, new_map)
- end
- end
- end
61Expresiones Let anidadas, ejemplo
- type Queue Nat ? (Nat Elem), Elem
- value
- add Elem ? Queue ? Queue
- add(e, q) ? let (last, map) q,
- new_last last 1,
- new_map map new_last ? e
- in
- (new_last, new_map)
- end
62Módulos en RSL
63Módulos
- Básicamente dos tipos de módulos en RSL
- scheme clases
- object instancias de clases
- Son las únicas entidades que pueden ser archivos.
64Class Expressions
- Una clase, técnicamente, denota una colección de
sus posibles implementaciones. - Las posibles implementaciones son denominadas
objetos.
65Class expressions, tipos
- basic
- extending
- renaming
- hiding
- with
- instantition
66Basic Class Expresions
- class
- declaración1
-
-
-
- declaraciónn
- end
- n ? 0
- Cada declaración puede ser de
- type
- value
- axiom
- object
- channel
- variable
67Extending Class Expressions
- Si C1 y C2 son expresiones de clase,
- extend C1 with C2
- es una extending class expression.
- Declaraciones de C2 son agregadas a las de C1.
- Declaraciones de C2 pueden referirse a entidades
de C1 pero no viceversa. - Declaraciones de C1 y C2 deben ser compatibles.
68Ejemplo de uso de extend
- scheme TYPE
- class
- type T1
- end
- scheme TYPES
- extend TYPE with
- class
- type
- T2 T1 ? Int,
- T3
- end
- expande en ...
69Ejemplo de uso de extend
- scheme TYPES
- class
- type
- T1,
- T2 T1 ? Int,
- T3
- end
70Hiding Class Expressions
- Si C es class expression,
- hide id1 , ..., idn in C
- Los identificadores id1 , ..., idn NO son
exportados, y por lo tanto no pueden ser
referenciados desde fuera del módulo.
71Ejemplo de hiding
- scheme LISTA
- hide aux in class
- type List
- value
- empty List,
- add Int ? List ? List
- head List List
- tail List List
- aux List ? Nat
- end
72Ejemplo de uso incorrecto de LISTA_2
-
- scheme USA_MAL_LISTA
- class
- object L LISTA
- value
- usa_aux L.List ? Nat
- usa_aux(l) ? L.aux(l)?2
- end
73With Class Expressions
- Si C es class expression,
- with O1 , ..., On in C
- O1 , ..., On son object expressions.
- with X in C, significa que una ocurrencia en C de
un nombre N definido en X puede referenciarse
como X.N o solamente N.
74Ejemplo de uso de with
object TYPES class type
Date, NameText,
AgeNat end
scheme PERSON with TYPES in class
type Person value
birth Person ? Date, name
Person ? Name, age Date ? Person
? Age end