Saltar al contenido

Ejemplo de especificación formal en Z: El videoclub

Autor: Anónimo | Fuente:Wikipedia | Licencia: CC BY-SA 3.0

Para los que están aprendiendo a realizar especificaciones completas de sistemas informáticos (o partes críticas de los mismos) valiéndose de lenguajes formales como Z, sabrán que es un tema que hay que coger con mucho tacto y dedicación. Y es que tanta simbología y matemática pueden dejarte en babia y atorarte cada dos por tres, pero esto cambia practicando mucho y, como no, inspirándose con ejemplos.
Como ya ha finalizado el primer cuatrimestre, voy a hacer pública mi solución de la práctica final de Métodos Formales, la cual no es la única solución ni la mejor, pero seguro que os servirá como ejemplo.
Si no deseas escribir la especificación en papel, visita http://czt.sourceforge.net/.

Enunciado

En el videoclub se alquilan copias de películas identificadas por una clave única, las cuales incluyen también el nombre de la película. Pueden existir varias copias de una misma película, por tanto todas ellas compartirían el título.
Los socios, se identificarán de forma única con una clave y además el sistema registrará el nombre de los mismos (puede haber dos socios que se llamen igual).
Deben definirse, al menos las siguientes operaciones:

  1. Introducción de una nueva película.
  2. Introducción de un socio nuevo.
  3. Retirada de una película por un socio.
  4. Devolución de la película.
  5. Aviso diario de los socios que deben entregar la película ese día.
  6. Eliminación de un socio.
  7. Eliminación de una película.

Solución

Declaración de tipos básicos. El IdentificadorPelícula podría ser un número y el IdentificadorSocio el DNI.
Como es requisito de la práctica un alto nivel de abstracción los he denominado así:
─ [IdentificadorPelícula, IdentificadorSocio, Título, Nombre, Fecha] └

Tipos de errores que puede haber mediante definición de tipos libres:
 ─
  Report ::= ok | Identificador_película_duplicado | Identificador_socio_duplicado |
Socio_inexistente | Película_inexistente | Película_ya_alquilada | Película_no_alquilada |
Socio_con_películas_sin_devolver

El esquema del videoclub incluye las películas, los socios y las películas alquiladas de forma que se ven como tres funciones totales (todos los elementos tienen imagen).
Se presupone que un mismo socio puede alquilar varias películas.
┌ Videoclub
  películas: IdentificadorPelícula → Título
  socios: IdentificadorSocio → Nombre
  películasAlquiladas: IdentificadorPelícula → (IdentificadorSocio × Fecha)
|
  dom (películasAlquiladas) ⊆ dom (películas)
  ∀s: IdentificadorSocio | s ∈ {r:IdentificadorSocio; f:Fecha | (r,f) ∈ ran
(películasAlquiladas) ⦁ r} ⦁ s ∈ dom (socios)

Esquema del videoclub decorado:
┌ Videoclub′
  películas′: IdentificadorPelícula → Título
  socios′: IdentificadorSocio → Nombre
  películasAlquiladas′: IdentificadorPelícula → (IdentificadorSocio × Fecha)
|
  dom (películasAlquiladas′) ⊆ dom (películas′)
  ∀s: IdentificadorSocio | s ∈ {r:IdentificadorSocio; f:Fecha | (r,f) ∈ ran
(películasAlquiladas′) ⦁ r} ⦁ s ∈ dom (socios′)

Inicialización del videoclub:
┌ VideoclubInit
  Videoclub′
|
  películas′ = ∅
  socios′ = ∅
  películasAlquiladas′ = ∅

Operación que permite introducir una nueva película en el videoclub:
┌ IntroducirNuevaPelícula
  ΔVideoclub
  título?: Título
  identificador?: IdentificadorPelícula
  reporte!: Report
|
  identificador? ∉ dom (películas)
  películas′ = películas ∪ {identificador? ↦ título?}
  socios′ = socios
  películasAlquiladas′ = películasAlquiladas
  reporte! = ok

┌ IdentificadorPelículaDuplicado
  ΞVideoclub
  identificador?: IdentificadorPelícula
  reporte!: Report
|
  identificador? ∈ dom (películas)
  reporte! = Identificador_película_duplicado

IntroducirNuevaPelículaCompleto ≙ IntroducirNuevaPelícula ∨ IdentificadorPelículaDuplicado

Operación para registrar un nuevo socio:
┌ IntroducirNuevoSocio
  ΔVideoclub
  nombre?: Nombre
  identificador?: IdentificadorSocio
  reporte!: Report
|
  identificador? ∉ dom (socios)
  películas′ = películas
  socios′ = socios ∪ {identificador? ↦ nombre?}
  películasAlquiladas′ = películasAlquiladas
  reporte! = ok

┌ IdentificadorSocioDuplicado
  ΞVideoclub
  identificador?: IdentificadorSocio
  reporte!: Report
|
  identificador? ∈ dom (socios)
  reporte! = Identificador_socio_duplicado

IntroducirNuevaSocioCompleto ≙ IntroducirNuevaSocio ∨ IdentificadorSocioDuplicado

Operación que especifica el comportamiento del sistema cuando un socio alquila una película (el socio debe estar registrado y la copia de la película con determinado id no puede estar ya alquilada). La fecha que se registra en la función películasAlquiladas es la de entrega.
┌ SocioRetiraPelícula
  ΔVideoclub
  idSocio?: IdentificadorSocio
  idPelícula?: IdentificadorPelícula
  fechaDeEntrega?: Fecha
  reporte!: Report
|
  idSocio? ∈ dom (socios)
  idPelícula? ∈ dom (películas) ∧ idPelícula? ∉ dom (películasAlquiladas)
  películas′ = películas
  socios′ = socios
  películasAlquiladas′ = películasAlquiladas ∪ {idPelícula? ↦ (idSocio?,
fechaDeEntrega?)}
  reporte! = ok

┌SocioInexistente
  ΞVideoclub
  identificador?: IdentificadorSocio
  reporte!: Report
|
  identificador? ∉ dom (socios)
  reporte! = Socio_inexistente

┌PelículaInexistente
  ΞVideoclub
  identificador?: IdentificadorPelícula
  reporte!: Report
|
  identificador? ∉ dom (películas)
  reporte! = Película_inexistente

┌PelículaYaAlquilada
  ΞVideoclub
  identificador?: IdentificadorPelícula
  reporte!: Report
|
  identificador? ∈ dom (películasAlquiladas)
  reporte! = Identificador_película_duplicado

SocioRetiraPelículaCompleto ≙ SocioRetiraPelícula ∨ SocioInexistente ∨ PelículaInexistente ∨ PelículaYaAlquilada

Operación que tiene lugar cuando un socio devuelve una película al videoclub:
┌ DevoluciónPelícula
  ΔVideoclub
  idPelícula?: IdentificadorPelícula
  reporte!: Report
|
  idPelícula? ∈ dom (películasAlquiladas)
  películas′ = películas
  socios′ = socios
  películasAlquiladas′ ={idPelícula?} ⩤ películasAlquiladas
  reporte! = ok

┌PelículaNoAlquilada
  ΞVideoclub
  identificador?: IdentificadorPelícula
  reporte!: Report
|
  identificador? ∉ dom (películasAlquiladas)
  reporte! = Película_no_alquilada

DevoluciónPelículaCompleto ≙ DevoluciónPelícula ∨ PelículaNoAlquilada

Operación que avisa de los socios con copias a devolver un día determinado:
┌ AvisoDiarioDevoluciones
  ΞVideoclub
  fechaDeHoy?: Fecha
  sociosQueEntreganHoy!: ℙ {s:IdentificadorSocio ⦁ s}
  reporte!: Report
|
  sociosQueEntreganHoy! = {s:IdentificadorSocio | (s, fechaDeHoy?) ∈ ran
(películasAlquiladas)}
  reporte! = ok

Operación para dar de baja un socio (sólo si ha devuelto todas sus películas alquiladas):
┌ EliminarSocio
  ΔVideoclub
  idSocio?: IdentificadorSocio
  reporte!: Report
|
  idSocio? ∈ dom (socios)
  ¬(∃f:Fecha ⦁ (idSocio?,f) ∈ ran (películasAlquiladas))
  películas′ = películas
  socios′ = {idSocio?} ⩤ socios
  películasAlquiladas′ = películasAlquiladas
  reporte! = ok

┌ SocioConPelículasSinDevolver
  ΞVideoclub
  idSocio?: IdentificadorSocio
  reporte!: Report
|
  ∃f:Fecha ⦁ (idSocio?,f) ∈ ran (películasAlquiladas)
  reporte! = Socio_con_películas_sin_devolver

EliminarSocioCompleto ≙ EliminarSocio ∨ SocioInexistente ∨SocioConPelículasSinDevolver

Esquema de la operación que permite dar de baja una copia del videoclub (para ello la copia no puede estar alquilada):
┌ EliminarPelícula
  ΔVideoclub
  idPelícula?: IdentificadorPelícula
  reporte!: Report
|
  idPelícula? ∈ dom (películas) ∧ idPelícula? ∉ dom (películasAlquiladas)
  películas′ = {idPelícula?} ⩤ películas
  socios′ = socios
  películasAlquiladas′ = películasAlquiladas
  reporte! = ok

EliminarPelículaCompleto ≙ EliminarPelícula ∨ PelículaYaAlquilada ∨ PelículaInexistente 


Publicado enApuntes