Análisis y Diseño de Sistemas
Dpto. Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
RAISE Specificacion Language
1er. CUATRIMESTRE 2011 Telma Delladio
Agenda
Especificaciones formales: ideas generales
RAISE
RSL: RAISE Specificacion Language
Especificaciones Formales
Las propuestas de especificaciones formales utilizan distintos tipos de
lenguajes de especificación (SL: specification language)
métodos y herramientas que soportan la tarea
Hay distintas clasificaciones o tipos de lenguajes
de especificación como también distintos tipos de
métodos y herramientas de especificación
Lenguajes de Especificación
Distintos lenguajes de especificación pueden diferir en algunos aspectos, como por ejemplo
en la forma de “decir” las cosas
en la forma de definir su semántica
en el uso de la noción de variable: especificaciones aplicativas vs imperativas
en la forma de expresar los cambios del sistema:
state-based o action-based
SL: la forma de “decir” las cosas
Se dividen tradicionalmente en
Orientados a modelos: son más concretos se basan en dominios matemáticos (nros, fcs, cjtos, listas, etc)
Orientados a propiedades: son más
abstractos, se basan en definiciones
axiomáticas
SL: la forma de definir su semántica
Hay distintos estilos de definir la semántica de un lenguaje:
Semánticas operacionales
Semánticas denotacionales
Semánticas axiomáticas
SL: la noción de variable
Especificaciones aplicativas
prohiben el uso de variables haciendo las
especificaciones más abstractas y más fáciles de validar y verificar.
Especificaciones imperativas:
se centran en el uso de variables y son más cercanas a las implementaciones
Algunos lenguajes soportan ambas
SL: la forma de expresar los cambios
State-based
En cada momento el sistema está en un
determinado estado y existen operaciones para inspeccionar y modificar ese estado.
Action-based
Se ve el sistema como un conjunto de
componentes independientes que interactúan
entre sí, y con el entorno. En lugar de especificar
el “estado” del sistema, se explicitan los “cambios
de estado” (a través de acciones) capturando el
El Lenguaje de especificación solo, no es suficiente
Un lenguaje de especificación nos dice:
cuáles son las clases de expresiones que pueden
escribirse (sintaxis) y cuál es su significado (semántica)
Un lenguaje de especificaión NO nos dice:
cómo construir y validar las especificaciones para cubrir los requerimientos de los usuarios
cómo refinar correctamente una especificaión abstracta en una más concreta (eventualmente en implementación)
cómo verificar si las propiedades de la especificación se mantienen en el desarrollo
Es reponsabilidad del Método de Desarrollo
Métodos de Desarrollo
Definen la relación de refinamiento
Especificación i Especificación i+1 refinamiento
¿es correcta ?
+ abstracto + concreto
Lo ideal diferentes componentes del
sistema sean especificados y refinados por
separado, manteniendo las propiedades del
RAISE
Rigorous Approach to Industrial
Software Engineering
RAISE
Consiste de :
Un lenguaje de especificación formal
- Raise Specification Language (RSL)
Un método para desarrollo de software
Rigorous Approach to Industrial
Software Engineering
Método RAISE
Requerimientos de Usuario Especificación 0
Especificación 0 ... ...
... ...
... ...
Especificación n Especificación n
Programa
Pasos de
Pasos de
Desarrollo
Desarrollo
Especificaciones en RAISE
Las especificaciones especificaciones en RAISE se hacen usando RSL RSL:
el lenguaje de especificación de RAISE
Hoy veremos la definición del lenguaje, sus expresiones, constructores, etc,
Hoy NO hablaremos del método RAISE
Especificaciones en RSL
Una especificación en RSL consiste de colecciones de definiciones de módulos definiciones de módulos.
Los módulos son el medio para descomponer una especificación en partes manejables, partes manejables,
comprensibles y reusables comprensibles y reusables.
Un módulo puede ser usado para definir otro módulo.
Existen dos clases de módulos
Esquemas (expresiones de clases)
Objetos (instancias de los esquemas)
Módulos
Hay dos tipos de módulos
Esquemas (SCHEME): expresiones de clases
Objetos (OBJECT): instancias de esquemas
Una declaracióndeclaración comienza con una palabra reservada (keyword) que indica el tipo de declaración, seguida por una o más definicionesdefiniciones de ese tipo de declaración
Un módulo es una colección de módulo
declaraciones con nombre
Módulos
Expresiones de clases
Declaraciones
. . .
end class
<keyword>
Definiciones
Módulos
Declaraciones
Declaración
(keyword) Definen...
Object
Object Módulos embebidos Type
Type Tipos
Value
Value Valores: constantes y funciones Variable
Variable Variables que pueden almacenar valores Channel
Channel Canales de entrada y salida Axiom
Axiom Propiedades lógicas que deben verificarse
Módulos scheme
scheme móduloNombre = classclass
object object
......
......
typetype
...
value value
...
......
endend
Expresión Expresión de clase de clase Declaración
Declaración de objetos de objetos
Declaración Declaración de tipos de tipos Declaración Declaración de valores de valores Otras
Otras declaraciones declaraciones
Declaraciones
Veremos ahora como declarar:
Tipos (type)
Valores (value)
Axiomas (axiom)
Variables (variable)
Objetos (object)
Hoy no hablaremos de:
Canales (canales) –
asociado a concurrencia
Casos de Test (test case)
Declaración de tipos
scheme móduloNombre = classclass
object object
......
typetype
...
...
value value
...
......
endend
Declaración Declaración de objetos de objetos Declaración Declaración de tipos de tipos
Declaración Declaración de valores de valores Otras
Otras declaraciones declaraciones
Declaración y definición de tipos
Como en todo lenguaje, un tipotipo determina el conjunto de posibles valores que puede tomar un identificador de valor, de variable, etc.
Veremos :
Tipos predefinidosTipos predefinidos (built-in)
Contructores de tipo: para construir un tipo a partir Contructores de otro
Definiciones de tiposDefiniciones
Tipos predefinidos
Tipo Valores de Ejemplo Operadores
Bool true, false ∧, ∨, ⇒, ~
Int .., -1, 0, 1, … +, -, *, /, \ , ↑, ≥, ≤, >, <, abs, real
Nat 0, 1, … Idem Int
Real …, -4.3, …, 0.0, … +, -, *, / , ↑, ≥, ≤, >, <, abs, real Char ...'a', …
Text "", "Juan", … Los de listas de caracteres
Unit ()
Ver definici
Ver definición de operadores en la bibliografíaón de operadores en la bibliografía
Constructores de tipos
Permiten construir expresiones de tipo a partir de tipos ya existentes
Constructor Simbolo Para formar o definir...
Producto ><
TuplasConjuntos -set
Cjtos, listas y mapeos finitos.(existen versiones infinitas)
Listas *
Mapeos -m->
Fcs totales ->
Expresiones de tipos
Una expresión de tipo expresión de tipo toma alguna de las siguientes formas:
un tipo Built-in
un tipo definido por el usuario
un tipo formado por un constructor de tipo aplicado a otras expresiones de tipo
subtipos
Ejemplo de
Expresiones de Tipos
Int >< Nat >< Int >< Nat %4-upla
(Int >< Nat)><(Int >< Na) %par de pares
Int* %lista de enteros
Text %string
Text->Int %función
Persona –m-> Int %mapeo
Real-set %cjto de reales
Libro-set %cjto de Libros
Persona* %lista de Personas
Persona >< Libro %2-upla
{|n: Int • n > 100|} %subtipo. Enteros
%mayores a 100
Definiciones de Tipos de Usuario
Los usuarios pueden definir sus propios tipos y hay dos clases de definiciones:
abreviaciones abreviaciones
<identificador> = <expresión_de_tipo>
ejemplos: NroRegistro = Nat
Inscriptos = Persona*
tipos nuevos: que se definen por medio de tipos nuevos:
Sorts (o tipos abstractos)
Registros
Variantes
Uniones
Definición Nuevos Tipos
Sorts (tipos abstractos) Sorts (tipos abstractos)
Registros Registros
Variantes Variantes
Uniones Uniones
Sorts (tipos abstractos )
Son simplemente identificadores
type
Persona, Libro
Sirven para mencionar tipos cuya definición final
no se ha decidido aún
Definición Nuevos Tipos
Sorts (tipos abstractos) Sorts (tipos abstractos)
Registros Registros
Variantes Variantes
Uniones Uniones
Registros
Similar a los registros de muchos lenguajes de programación
type
Libro ::
titulo : Text autor : Text
precio : Real <-> new_precio<-> new_precio
Definimos un nuevo tipo nuevo tipo Libro como un
registro de tres componentes (titulo,
autor, precio)
Componentes de Registros
Cada componente tiene
un identificador, llamado destructor,destructor, y una expresión de tipo
titulo : Text
opcionalmente tiene un reconstructor
reconstructorprecio : Real <-> new_precio <-> new_precio
Destructors
El identificador de un componente define una función función de acceso
de acceso
En el ejemplo: autor puede verse como una función con el siguiente signature
Libro -> Text
Así, para un valor de libro b, escribimos autor(b)
para denotar valor (de tipo Text) del componente “autor” del libro b
Obs: NO se denota como b.autor
Reconstructors
Un reconstructor es una función total que toma la
reconstructorexpresión de tipo del componente
tipo del componente junto con unregistro
registro
, para generar un nuevo registro
nuevo registro
En el ejemplo el componente precio tiene un reconstructor new_precio
new_precioprecio : Real <-> new_precio<-> new_precio
El tipo de (la función) new_precio
new_precioes
Real >< Libro -> Libro
La expresión new_precio
new_precio(20.5, b) es un nuevonuevoConstructores
La definición de un tipo registro provee
implícitamente una función de construcción función de construcción
(constructor) para crear nuevos registros a partir de los valores de sus componentes.
El identificador de la función implícita de
construcción se obtiene de anteponer el prefijo mk_
al identificador del tipo del registro
En el ejemplo tenemos entonces una función de construcción mk_Libro cuyo tipo es
Text >< Text >< Real -> Libro
Entonces… en el ejemplo
titulo(b): es el titulo del libro b
new_price(15,b): es un libro con titulo y autor de b, y precio igual a 15
mk_Libro(“Nubes”,“Ana Lopez”,10): es un libro
type
Libro ::
titulo : Text autor : Text
precio : Real <-> new_precio<-> new_precio
destructors
reconstructor
Definición Nuevos Tipos
Sorts (tipos abstractos) Sorts (tipos abstractos)
Registros (::) Registros (::)
Variantes Variantes
Uniones Uniones
Variantes
Permiten definir tipos como una opción de distintos valores
Por ejemplo:
Color == rojo | verde | amarillo
Se define un nuevo tipo denominado Color y tres constantes (diferentes) rojo, verde y
amarillo, de tipo Color
Variantes (2)
Los tipos variantes permiten la utilización de estructuras más complejas, no solo
constantes (como el ejemplo anterior) Por ejemplo:
Tree == nil|
node(hl:Tree,val:Elem,hr:Tree)
Ejemplo: Tree (1)
Se define un nuevo tipo Tree como:
- una constante nil tipo Tree o - un constructor constructor node de tipo
Tree >< Elem >< Tree -> Tree
Tree ==
nil|
node(hl:Tree, val:Elem, hr:Tree)
Ejemplo: Tree (2)
Tree ==
nil|
node(hl:Tree, val:Elem, hr:Tree)
Aquí, hl,val, y hr son destructores destructores (funciones de acceso) de tipo
hl: Tree -~-> Tree Val: Tree -~-> Elem
hr: Tree -~-> Tree
Son funciones que no están definidas para todo el
dominio de Tree, (no están definidas para nil). Esto es:
son funciones parciales (-~->)
Registros como variantes
Los registros pueden definirse como tipos variantes con una única opción
Libro == mk_Libro(titulo:Text, autor:Text,
precio:Real<->new_precio)
Ejercicio: chequear que los tipos del constructor
constructor y destructores destructores son idénticas al
Definición Nuevos Tipos
Sorts (tipos abstractos) Sorts (tipos abstractos)
Registros (::) Registros (::)
Variantes (==) Variantes (==)
Uniones Uniones
Uniones (1)
La definición A = B|C es un un atajo para que, a partir del identificador A y las definiciones de B y C, se generen los identificadores de los constructoresconstructores y destructoresdestructores
correspondientes. Esto es:
type
Permite definir nuevos tipos como variantes de tipos definidos existentes.
Por ejemplo:
Empleado = Docente | NoDocente
Uniones (2)
Se permite la coerción implícita desde los componentes de la unión al tipo unión.
Si tenemos una función f con un parámetro que es de tipo A
f: A -> X
La aplicación de f a un valor c1 de tipo C, se escribe simplemente como
f(c1)
Lo cual, es un atajo para la expresión
f(A_from_C(c1))
Declaración de valores
scheme móduloNombre = classclass
object object
......
typetype
...
value value
...
...
Declaración Declaración de objetos de objetos Declaración Declaración de tipos de tipos
Declaración Declaración de valores de valores
Definición de Valores
Cuando hablamos de valores hablamos de
constantes
funciones
Obs: una constante puede verse como una
función 0-aria.
Definición de Valores
Hay tres formas de definir un valor (constante o función)
Definiendo solo su tipo ( typing )
Definiendo implícitamente el valor
Definiendo explícitamente su valor
Valores: definiendo solo su tipo (typing)
Estas definiciones tienen la siguiente forma:
<identificador>: <expresión_de_tipo>
Por ejemplo:
value
cant_pisos: Nat
nombre: Persona -> Text
Son ejemplos de la definición del tipo de un valor constante cant_pisos y del tipo
(signature) de una función nombre
Valores: definiendo
implícitamente un valor
Ejemplo para constantes
value
cant_pisos: Nat • cant_pisos > 2
Ejemplo de definición implícita de funciones utilizando postcondiciones postcondiciones
value
raiz_cuadrada: Real -~-> Real raiz_cuadrada(x) as r
post (r >=0.0)∧(r*r = x)
Valores: Definiendo
explícitamente un valor
Ejemplo para constantes
value
cant_pisos: Nat = 11
Ejemplo de definición implícita de funciones
value
factorial: Int -~-> Int factorial(n) ≡
if n=1 then 1 else n*factorial(n-1) end pre (n>0)
Expresiones de valor
Expresiones de Conjuntos
Expresiones de Listas
Expresiones de Mapeos
Expresiones Let
Expresiones Case
Expresiones de Conjuntos
Pueden estar dadas por :
Enumeraciones:
{ }, {1,2,3}
Rangos (solo para Int):
{1,...,5}
Comprensión:
{i*3|i:Int • i∈∈{5,10,7}}
Expresiones de Listas
Pueden estar dadas por:
Enumeraciones:
〈〉,
〈4,3,2,3,5,6〉, etc
Rangos (solo para Int):
〈1,...,5〉
Comprensión:
〈i/2|i in 〈1,...,15〉• i > 8〉
Expresiones de Mapeos
Pueden estar dadas por:
Enumeración:
[],
[1|-> true, 3|->false, 2|->true ]
Comprensión:
[ i|-> es_par(i)|i:Int • i > 0 ∧ i < 4 ]
Expresiones Let
Pueden usarse de dos formas:
para destruir (desarmar) un producto let (x,y) = (1,2) in x+y end
Para organizar una evaluación en pasos value
suma: Int* -> Int
suma(s) ≡ if s =
〈〉then 0 else
let h=hd s, t=tl s, x=suma(t) in h+x
Expresiones Case
Usadas sobre listas y estructuras variantes
value
suma: Int* -> Int suma(s) ≡
case s of 〈 〉 -> 0,
〈h〉^t -> h + suma(t) end
value
InOrden: Tree -> Elem*
InOrden(t) ≡ case t of nil -> 〈 〉,
node(l,e,r)-> InOrden(l) ^ 〈e〉 ^ InOrden(r) end
Tree == nil|
node(hl:Tree, val:Elem, hr:Tree)
Declaración de axiomas
scheme móduloNombre = classclass
......
value value
...
axiom axiom
...
...
Declaración Declaración de valores de valores
Declaración Declaración de axiomas de axiomas
Axiomas
Cada definición de axioma es un predicado predicado, opcionalmente precedido por un identificador identificador entre corchetes
Por ejemplo
value
cant_pisos: Nat axiom
[restriccionPisos] cant_pisos >=2
Ejemplos varios
scheme M_Ejemplar = class
type
TClase == revista | tesis | libro, TReserva,
TEjemplar ::
titulo: Text clase: TClase
reservas: TReserva*, value
tieneReservas: TEjemplar -> Bool
primeraReserva: TEjemplar -~-> TReserva estaAntes: TReserva><TReserva -> Bool ...
typing typing registro
registro
variante variante
lista lista sortsort
61
scheme M_Ejemplar = class
type
...
value
tieneReservastieneReservas: TEjemplar -> Bool
tieneReservas(e)tieneReservas(e) ≡ ~(reservas(e)= 〈〉 ) primeraReservaprimeraReserva: TEjemplar -~-> TReserva axiom
[ax_1raReserva]
∀e: TEjemplar, p:TReserva • p ∈ reservas(e) ∧
~(∃ o: TReserva• o ∈ reservas(e)∧ estaAntes(o,p)) ⇒ primeraReserva(e)
primeraReserva(e)= p pre tieneReservas(e)
...
end
Ejemplos varios (sigue)
Estilo imperativo
Para soportar un estilo de especificación imperativo, RSL permite:
la declaración de variables
expresiones de asignación (
:=)
expresiones de secuencia (
;)
expresiones condicionales (
if)
expresiones iterativas (
while, until, for)
expresiones locales (
local)
Declaración de variables
scheme móduloNombre = classclass
object object
......
typetype
...
variable variable ...
...
......
endend
Declaración Declaración de objetos de objetos Declaración Declaración de tipos de tipos
Declaración Declaración de variables de variables Otras
Otras declaraciones declaraciones
Declaración de variables
Consiste de un identificador, una expresión de tipo y, opcionalmente, un valor inicial.
〈identificador〉 : 〈expresión_de_tipo〉 [:= 〈valor〉]
variable variable
counter: Nat := 0,
i: Int
Expresiones de asignación (:=) y secuencia (;)
Asignación y secuencia son expresiones, no sentencias, por son expresiones lo tanto son evaluables. El tipo de una asignación es Unit variable
counter: Nat := 0, result: Real
value
increment: Unit -> write write counter Nat
increment() ≡ counter := counter + 1 ; counter sum: Nat -~-> writewrite counter, result Real
Cláusula de acceso Cláusula de acceso
Cláusulas de acceso: write, read, any …
Expresiones condicionales (1)
Expresiones if (son expresiones, no sentencias)
type
Tcomp == mayor|igual|menor value
comparar: Int >< Int -> Tcomp
comparar(x,y) ≡ if x > y then mayor elsif x = y then igual else menor end
El tipo de la expresión if del ejemplo es TComp
variable
counter: Nat := 0 value
decrement: Unit -> write counter Unit decrement() ≡ if counter > 0 then
counter := counter – 1 end
El tipo de la expresión if del ejemplo es Unit.Para expresiones if de tipo Unit la cláusula else puede ser omitida ( es equivalente a “ else skip” )
Expresiones condicionales (2)
Expresiones if (son expresiones, no sentencias)
Expresiones Iterativas
while <condition>
do
...
end
do
...
until <condition>
for counter in
〈1..n〉do
...
69
Expresiones locales
Para restringir el alcance de los identificadores
value
sumatoria: Nat -> Nat sumatoria(n) ≡
local
variable counter:Nat:=n, result:Nat:=0 in
while counter > 0 do
result:= result + counter;
counter:= counter – 1 end;
result end
pre n > 0
Expresiones de Módulos
Los módulos scheme son básicamente clases
Las expresiones de clases pueden tomar una de las siguientes (seis) formas
Básica (class...end)
De extensión (extend C1 with C2)
De renombre (use id1 for idx in C1)
De ocultamiento ( hide id in C)
With (with o1, o2, ... in C)
De instanciacion de esquema (scheme S=C)
Declaración de objetos
scheme móduloNombre = classclass
object object
......
......
typetype
...
value value
...
......
endend
Declaración Declaración de objetos de objetos Declaración Declaración de tipos de tipos
Declaración Declaración de valores de valores Otras
Otras declaraciones declaraciones
Clases (esquemas) vs Objetos
Técnicamente una expresión de clase expresión de clase es una colección de posibles implementaciones posibles implementaciones de
Esas posibles implementaciones se denominan objetos
objetos
object
Obj: C
En esa declaración,
Objdenota algún objeto en la
clase
C. Si
xes una entidad (tipo,variable, etc) en
CParametrización de esquemas
scheme ELEM = class
type
TElem, end
scheme TREE(E:ELEM)= /* E es un objeto de la clase ELEM*/
class type
Tval = E.TElem /* toma el tipo definido en la clase ELEM*/
TTree == nil|
node(hl:TTree, val:Tval, hr:TTree) end
Lógica del lenguaje
La lógica del lenguaje define
Qué sucede con expresiones que no terminan (i.e expresiones que no evaluan: chaos)
Qué significa igualdad (=) y equivalencia ( ≡ ).
Cuándo es lo mismo y cuándo no.
Para más referencia ver bibliografía
Resumen… hablamos de :
Lenguajes de especificación
RSL: modulos
Declaraciones de
tipos
predefinidos, constructores,
de usuario (sorts, registros, variantes, uniones)
valores(constantes/funciones)
typing- def. implicita – def. explicita
expr. de valor (de cjtos, listas, mapeos, let, case)
…
axiomas
variables
Expresiones de estilo imperativo
:=, ;, if, while, until, for, local
objetos
expresiones de módulos, objetos, parametrización de esquemas
Lógica del lenguaje
Resumen… hablamos de :
Bibliografía
Specification Case Studies in RAISE
Hung Dang Van,
Chris George,
Tomasz Janowski, and