Uploaded by itrejos

Trejos Caso tienda de vídeos con la biblioteca ER+Z

advertisement
Caso tienda de vídeos con la biblioteca ER+Z
Aplicación de la Biblioteca de esquemas genéricos Z para especificación basada en diagramas Entidad-Relación
Ignacio Trejos Zelaya, Escuela de Computación, Instituto Tecnológico de Costa Rica
Notas:



La biblioteca ER+Z está ahora en un archivo separado.
No puede usar diacríticos (vocales tildadas, diéresis, eñe) en los nombres de variables y esquemas en el texto formal en Z.
No debe usar diacríticos en los nombres de los archivos.
Contenido
Caso de la tienda de vídeos ........................................................................................................................................................................... 2
Definición de entidades y asociaciones ................................................................................................................................................... 2
Vídeos ................................................................................................................................................................................................ 2
Copias ................................................................................................................................................................................................ 2
Catálogo ............................................................................................................................................................................................. 3
Usuarios ............................................................................................................................................................................................. 3
Alquiler .............................................................................................................................................................................................. 4
Bandas................................................................................................................................................................................................ 5
Video-Banda ...................................................................................................................................................................................... 5
Precio (relación derivada price) ......................................................................................................................................................... 6
Variables globales ................................................................................................................................................................................... 6
Fecha actual ....................................................................................................................................................................................... 6
Restricciones ........................................................................................................................................................................................... 6
Usuario puede alquilar video (edad, calificación de censura) ............................................................................................................. 6
Estado (de información) del Sistema ....................................................................................................................................................... 7
Operaciones ............................................................................................................................................................................................. 7
Mensajes para reportar error o éxito en operaciones .......................................................................................................................... 7
Reporte de operaciones exitosas......................................................................................................................................................... 8
Operaciones sobre fechas ................................................................................................................................................................... 8
Marco de operaciones que afectan vídeos .......................................................................................................................................... 9
Operación AddVideo .......................................................................................................................................................................... 9
Operación RemoveVideo .................................................................................................................................................................. 10
Operación ChangeVideoBand .......................................................................................................................................................... 11
Marco de operaciones que afectan copias......................................................................................................................................... 11
Operación AddCopy ......................................................................................................................................................................... 12
Operación RemoveCopy ................................................................................................................................................................... 12
Marco de operaciones que afectan alquileres ................................................................................................................................... 14
Operación Hire................................................................................................................................................................................. 14
Operación Return ............................................................................................................................................................................. 16
Transcripción de operaciones de consulta en caso original .................................................................................................................... 17
1
Caso de la tienda de vídeos
Para facilitar la comprensión de la biblioteca ER+Z, ilustramos el uso de la biblioteca con referencia al caso Structuring a Video Shop de
Barden et al., estudiado en clase. No incluimos los gráficos ni la motivación, sino principalmente el modelo en Z. Hemos procurado
mantener los nombres lo más cerca posible de los que aparecen en el original. Además, hemos definido varias operaciones que no están
en el original y algunas licencias artísticas (cambios en los requerimientos), para ilustrar aplicaciones posibles de la biblioteca ER+Z.
Definición de entidades y asociaciones
Vídeos
Definimos el tipo Video1.
[SUBJECT, TITLE]
CERT ::= exempt | uCert | pg | twelve | fifteen | eighteen
Video
title : TITLE
subject : SUBJECT
cert : CERT
Cada video tiene su propia identidad.
[Id_Video]
Definimos su conjunto de instancias así:
E_Video ≙ Insta_Entidad[Id_Video, Video] [id_video / ident, info_video / info]
Copias
Definimos el tipo Id_Copy de los identificadores de copias.
1
Procuramos mantener algunos nombres del caso original. Por ejemplo, el esquema se llamará Video, no Info_Video.
2
[Id_Copy]
Las copias (ejemplares) no tienen atributos descriptivos, por lo que usamos el esquema Info_Nula.
E_Copy ≙ Insta_Entidad[Id_Copy, Info_Nula] [id_copy / ident, info_copy / info]
Catálogo
Definimos la asociación Catalogue. En esta asociación, cada copia participa obligatoriamente una vez, pero los vídeos participan
opcionalmente (0) o varias veces2.
A_Catalogue ≙ AP_11_0N[Id_Copy, Id_Video] [id_copy / ident1, id_video / ident2, catalogue / asoc]
Usuarios
Pasamos a definir los usuarios. Cada usuario tiene una identidad.
[Id_User]
Definimos los atributos de cada usuario.
[NAME, ADDRESS, DATE]
User
name : NAME
dob : DATE
address : ADDRESS
Consultar fecha de nacimiento de un usuario. Esta es solo una interfaz de tipos.
2
Esta cardinalidad difiere de la especificada en el original de Barden et al.
3
dobUser : User → DATE
Esta especifica la ‘lógica’ de la función:
dobUserAlt : User → DATE
dobUserAlt = (λ u:User ⦁ u.dob)
Tratamos las fechas igual que en el caso original.
age == ℕ
ageToday : DATE × DATE → age
Tenemos dos tipos de usuario, staff y member.
User_type
::= staff | member
Gender
::= female | male | undeclared
Con todos los elementos, definimos la entidad User.
E_User ≙ Insta_Etiquetada[Id_User, User, User_type] [id_user / ident, info_user / info, user_type / etiq]
∧
Insta_Etiquetada[Id_User, User, Gender] [id_user / ident, info_user / info, user_gender / etiq]
Usamos el color para resaltar. Note que estamos haciendo dos instanciaciones del esquema genérico Insta_Etiquetada. En la primera
línea se crea una partición etiquetando las instancias con valores de tipo User_type. En la segunda línea, como parte de la conjunción de
esquemas, se etiqueta con base en Gender. Nótese que el esquema resultante tendrá cuatro variables: id_user, info_user, user_type,
user_gender.
Alquiler
Para ilustrar las asociaciones con atributos, supongamos que, al alquilar una copia de un video, requerimos registrar la fecha máxima en
que esta debe ser devuelta. Añadimos a la asociación de alquiler, hired, un atributo de fecha de vencimiento, due_date.
Info_Hired
due_date : DATE
4
En la asociación de alquiler la copia participa a lo sumo una vez (01), mientras que el usuario participa 0 o muchas veces (0N).
A_Hired ≙
∧
AP_01_0N[Id_Copy, Id_User] [id_copy / ident1, id_user / ident2, hired / asoc]
AP_atributos[Id_Copy, Id_User, Info_Hired] [id_copy / ident1, id_user / ident2, hired / asoc, due / info]
Observe que por un lado describimos la cardinalidad (AP_01_0N) y por otro estamos diciendo que la asociación tiene atributos
descriptivos (AP_atributos). Esto es, a cada par (id_copia, id_usuario) se asocia información del alquiler (la fecha de vencimiento, que
está encerrada en el esquema Info_Hired). Las asociaciones con atributos se comportan a la vez como asociaciones (relaciones binarias
entre conjuntos de identificadores) y como entidades con atributos (cada par de identificadores vinculados en la asociación identifica
unívocamente a datos que les corresponden por el hecho de estar asociados).
Bandas
Definimos un conjunto dado de bandas, por sus identificadores.
[Id_Band]
Especificaremos los precios como un número natural (esto difiere del original):
PRICE == ℕ
Cambiamos el caso original: en lugar de tener otra entidad para los precios, más bien ponemos el precio como atributo (descriptivo) de la
banda.
Info_Band
theprice : PRICE
Definimos su conjunto de instancias así:
E_Band ≙ Insta_Entidad[Id_Band, Info_Band] [id_band / ident, info_band / info]
Video-Banda
En una asociación entre un vídeo y una banda, el vídeo participa necesariamente en una (y solo una) banda, mientras que la banda tiene 0
o más vídeos asociados.
5
A_Video_Band ≙ AP_11_0N[Id_Video, Id_Band] [id_video / ident1, id_band / ident2, video_band / asoc]
Precio (relación derivada price)
En esta especificación, al poner theprice como atributo de Band, ya no es necesario mantener la asociación bandPrice. De ahí que
procedamos a definir directamente la función price3.
VideoPrice
E_Video
E_Band
A_Video_Band
price : Id_Video ⇸ PRICE
price = ( λ v : id_video ⦁ (info_band (video_band (v))).theprice )
Observe que los invariantes aseguran que si v ∈ id_video (lo declaramos v : id_video en la expresión λ), este participa obligatoriamente en
video_band, por lo que se garantiza su imagen (una banda) y, a su vez, el acceso a la tupla que contiene al campo theprice.
Variables globales
Fecha actual
Mantendremos en un esquema las variables globales. Solo hay una en el caso original: la fecha actual.
Current_date
today : DATE
Restricciones
Usuario puede alquilar video (edad, calificación de censura)
En esta restricción están involucrados usuarios, copias, vídeos y la relación de alquiler. Hacemos los ajustes necesarios para el modelo
revisado.
3
En el original price era la composición de dos funciones.
6
MayHire
E_Copy
E_Video
A_Catalogue
E_User
A_Hired
Current_date
_ mayHire _ : Id_User ↔ Id_Video
( _ mayHire _) = { u: id_user; v : ran catalogue; a : age |
a = ageToday (today, (info_user u).dob)
∧ ( a ≥ 18
∨ (info_video v).cert ∈ {exempt, uCert, pg }
∨ (a ≥ 12 ∧ (info_video v).cert = twelve)
∨ (a ≥ 15 ∧ (info_video v).cert = fifteen) )
⦁u↦v}
( ∀ c: dom hired ⦁ (hired c) mayHire (catalogue c) )
Estado (de información) del Sistema
Casi todas las variables de interés ya estaban mencionadas en el esquema MayHire que aparece arriba. Solo falta lo referente a bandas de
precio, incluimos esos esquemas junto con MayHire.
VideoShop
E_Band
A_Video_Band
VideoPrice
MayHire
Operaciones
Mensajes para reportar error o éxito en operaciones
7
REPORT ::=
ok
| notStaff
| notUser
| alreadyHired
| notInStock
| tooYoung
| knownVideo
| unknownBand
| unknownVideo
| videoHasCopies
| knownCopy
| unknownCopy
| copyIsHired
| notHired
Reporte de operaciones exitosas4
Success ≙ [ report! : REPORT | report! = ok ]
Operaciones sobre fechas
ΔVideoShopToday ≙ ΞVideoShop ⧹ (today, today′) ∧ ΔVideoShop
TodayUpdateOK
ΔVideoShopToday
d? : DATE
d? = today′
Esta operación no falla.
TodayUpdate ≙ TodayUpdateOK ∧ Success
4
Esto no está así en el original. Seguimos una buena práctica de los especificadores en Z.
8
Marco de operaciones que afectan vídeos
Las operaciones que añaden o eliminan vídeos, o que los cambian de banda, no afectan a los usuarios, ni al alquiler, ni a las bandas ni a la
fecha actual.
ΔVideoShopVideo ≙ [ ΔVideoShop; ΞE_User; ΞE_Copy; ΞA_Hired; ΞE_Band; ΞCurrent_date; ΞA_Catalogue ]
Operación AddVideo
A diferencia del caso del libro, en esta especificación podremos ingresar vídeos sin que tenga copias asociadas. Para un nuevo vídeo es
necesario asociarle una banda pre-existente.
AddVideoOK
ΔVideoShopVideo
v? : Id_Video
iv? : Video
b? : Id_Band
v? ∉ id_video
b? ∈ id_band
id_video′ = id_video ∪ { v? }
info_video′ = info_video ∪ { v? ↦ iv? }
video_band′ = video_band ∪ { v? ↦ b? }
Casos de error de AddVideo
Un caso de error es que el vídeo ya esté en la tienda.
KnownVideo
ΞVideoShop
v? : Id_Video
report! : REPORT
v? ∈ id_video
report! = knownVideo
Otro error es que la banda sea desconocida.
9
UnknownBand
ΞVideoShop
b? : Id_Band
report! : REPORT
b? ∉ id_band
report! = unknownBand
Operación AddVideo total
AddVideo ≙ ( AddVideoOK ∧ Success ) ∨ KnownVideo ∨ UnknownBand
Operación RemoveVideo
Para eliminar un vídeo, supondremos que no tiene copias asociadas.
RemoveVideoOK
ΔVideoShopVideo
v? : Id_Video
v? ∈ id_video
catalogue ▷ { v? } = ∅
id_video′ = id_video ∖ { v? }
info_video′ = { v? } ⩤ info_video
video_band′ = { v? } ⩤ video_band
Casos de error de RemoveVideo
Un caso de error es que el vídeo no sea conocido.
UnknownVideo
ΞVideoShop
v? : Id_Video
report! : REPORT
v? ∉ id_video
report! = unknownVideo
Otro error es que el vídeo tenga copias asociadas.
10
VideoHasCopies
ΞVideoShop
v? : Id_Video
report! : REPORT
v? ∈ id_video
catalogue ▷ { v? } ≠ ∅
report! = videoHasCopies
Operación RemoveVideo total
RemoveVideo ≙ ( RemoveVideoOK ∧ Success ) ∨ UnknownVideo ∨ VideoHasCopies
Operación ChangeVideoBand
Para cambiar un vídeo de una banda a otra solo es necesario que la nueva banda exista y establecer la nueva asociación.
ChangeVideoBandOK
ΔVideoShopVideo
v? : Id_Video
b? : Id_Band
v? ∈ id_video
b? ∈ id_band
video_band′ = video_band ⊕ { v? ↦ b? }
Casos de error de ChangeVideoBand
Un caso de error es que el vídeo no sea conocido. Este ya fue especificado arriba en UnknownVideo.
Otro error es que la banda sea desconocida. Esto ya fue especificado en UnknownBand.
Operación ChangeVideoBand total
ChangeVideoBand ≙ (ChangeVideoBandOK ∧ Success ) ∨ UnknownVideo ∨ UnknownBand
Marco de operaciones que afectan copias
El marco de las operaciones de agregar y eliminar copias difiere un poco del caso original.
11
ΔVideoShopCopy ≙ ΞVideoShop ⧹ (id_copy, id_copy′, info_copy, info_copy′, catalogue, catalogue′)
∧ ΔVideoShop
Operación AddCopy
Para agregar una copia, es necesario que exista el vídeo con el que se la asociará.
AddCopyOK
ΔVideoShopCopy
c? : Id_Copy
v? : Id_Video
c? ∉ id_copy
v? ∈ id_video
id_copy′ = id_copy ∪ { c? }
info_copy′ = info_copy ∪ { c? ↦ info_nula }
catalogue′ = catalogue ∪ { c? ↦ v? }
Casos de error de AddCopy
Un caso de error es que la copia ya esté en la tienda.
KnownCopy
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∈ id_copy
report! = knownCopy
Otro error es que el vídeo sea desconocido, que es el esquema UnknownVideo descrito arriba.
Operación AddCopy total
AddCopy ≙ ( AddCopyOK ∧ Success ) ∨ KnownCopy ∨ UnknownVideo
Operación RemoveCopy
12
Para eliminar una copia, supondremos que no está alquilada.
RemoveCopyOK
ΔVideoShopCopy
c? : Id_Copy
c? ∈ id_copy
hired ⦇{ c? }⦈ = ∅
id_copy′ = id_copy ∖ { c? }
info_copy′ = { c? } ⩤ info_copy
catalogue′ = { c? } ⩤ catalogue
Casos de error de RemoveCopy
Un caso de error es que la copia no sea conocida por el sistema.
UnknownCopy
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∉ id_copy
report! = unknownCopy
Otro error es que esté alquilada.
CopyIsHired
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∈ id_copy
hired ⦇{ c? }⦈ ≠ ∅
report! = copyIsHired
Operación RemoveCopy total
RemoveCopy ≙ ( RemoveCopyOK ∧ Success ) ∨ UnknownVideo ∨ VideoHasCopies
13
Marco de operaciones que afectan alquileres
El marco de las operaciones de préstamo y devolución de copias es como en el caso original.
ΔVideoShopHire ≙ ΞVideoShop ⧹ (hired, hired′, due, due′) ∧ ΔVideoShop
Operación Hire
A la operación de alquiler le añadimos una fecha de vencimiento (devolución).
HireOK
ΔVideoShopHire
s?, u? : Id_User
c? : Id_Copy
d? : DATE
price! : PRICE
s? ∈ id_user
user_type (s?) = staff
u? ∈ id_user
c? ∈ id_copy
c? ∉ dom hired
u? mayHire catalogue c?
hired′ = hired ∪ { c? ↦ u? }
due′ = due ∪ { (c? , u?) ↦ ( μ Info_Hired | due_date = d? ) }
price! = price (catalogue c?)
Casos de error
NotStaff
ΞVideoShop
s? : Id_User
report! : REPORT
s? ∈ id_user
user_type (s?) ≠ staff
report! = notStaff
14
NotUser
ΞVideoShop
u? : Id_User
report! : REPORT
u? ∉ id_user
report! = notUser
AlreadyHired
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∈ dom hired
report! = alreadyHired
NotInStock
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∉ id_copy
report! = notInStock
TooYoung
ΞVideoShop
u? : Id_User
c? : Id_Copy
report! : REPORT
¬ (u? mayHire catalogue c?)
report! = tooYoung
Operación Hire total
15
Hire ≙ ( HireOK ∧ Success )
∨ NotStaff
∨ NotUser
∨ AlreadyHired
∨ NotInStock
∨ TooYoung
Operación Return
ReturnOK
ΔVideoShopHire
c? : Id_Copy
c? ∈ id_copy
c? ∈ dom hired
hired′ = { c? } ⩤ hired
due′ = { (c?, (hired c?) ) } ⩤ due
Observe que en esta operación nos hemos valido de la asociación hired para determinar el usuario con el cual está relacionada la copia c?
que se está devolviendo. Es por esto que podemos quitar el par (c?, (hired c?) ) de la asociación due.
Casos de error
El caso NotInStock ya fue especificado arriba y lo reutilizamos abajo.
NotHired
ΞVideoShop
c? : Id_Copy
report! : REPORT
c? ∉ dom hired
report! = notHired
Operación Return total
Return ≙ ( ReturnOK ∧ Success )
∨ NotInStock
∨ NotHired
16
Transcripción de operaciones de consulta del caso original
A continuación transcribimos cuatro operaciones de consulta que aparecen al final del capítulo 11 de Barden et al.
listByCertificate == ( λ VideoShop; c : CERT ⦁
{ iv : id_video; Video | θVideo = info_video(iv) ∧ c = cert ⦁ title } )
Esta operación puede hacerse como un esquema. Primero hay una transcripción directa. Luego otra más parecida a la que aparece en
nuestro listByCertificate de arriba.
ListByCertificate0
ΞVideoShop
c? : CERT
list! : ℙ TITLE
list! = { iv : id_video | c? = (info_video iv).cert ⦁ (info_video iv).title }
En esta segunda versión usamos θVideo para ‘atrapar’ la tupla de tipo-esquema Video que está asociada a iv (un identificador de vídeo) y
que contiene los atributos descriptivos. Note que los atributos definidos en Video están disponibles en el alcance de la comprensión de
conjunto.
ListByCertificate1
ΞVideoShop
c? : CERT
list! : ℙ TITLE
list! = { iv : id_video; Video | θVideo = info_video(iv) ∧ c? = cert ⦁ title }
Acá están las demás operaciones, transcritas a nuestra nueva representación.
listByCategory == ( λ VideoShop; s : SUBJECT ⦁
{ iv : id_video; Video | θVideo = info_video(iv) ∧ s = subject ⦁ title } )
howManyCopies == ( λ VideoShop; iv : Id_Video ⦁ #(catalogue ▷ {iv}) )
17
whatCopies == ( λ VideoShop; iv : Id_Video ⦁ dom(catalogue ▷ {iv}) )
Queda como ejercicio para el lector hacer operaciones equivalentes a estas tres anteriores, pero en versión de esquema.
18
Download