ejemplo del ascensor

Anuncio
Working Hypothesis
Programación Concurrente y distribuida
Paso de Mensajes: ejemplo del ascensor
Camilo Rueda 1
1 Universidad
Javeriana-Cali, Colombia
PUJ 2010
Working Hypothesis
Bio and
Sistemas de objetos puerto
Sistemas de transición por eventos
Cuando llega un mensaje:
el objeto realiza acciones (i.e. envı́a mensajes) y
cambia de estado
Cada mensaje es un tipo de evento
Working Hypothesis
Sistemas de objetos puerto
Bio and
Working Hypothesis
Bio and
Sistemas de objetos puerto: controlador
Un controlador de un Sistema de transición por eventos:
Envı́a (y recibe) mensajes a los objetos puerto
Observa el comportamiento global del sistema
Working Hypothesis
Bio and
Sistemas de objetos puerto: niveles
Un Sistema de transición por eventos puede observarse a
diferentes niveles de detalle
Cada nivel define diferentes observaciones ( e.g.
mensajes)
Los niveles están relacionados: observaciones en uno se
reinterpretan en otro
El último nivel de detalle es un programa completo
Working Hypothesis
Bio and
Niveles: ejemplo de ascensores en edificio
Nivel 1: se observan puertas en cada piso
las puertas se abren y se cierran
Nivel 2: se observan los ascensores
cada ascensor da servicio a ciertas puertas
se observa en qué piso está cada ascensor
una puerta está abierta solo si el ascensor está allı́
los ascensores se mueven de una puerta a otra
Nivel 4: se observan botones en pisos
un solo botón por piso
el botón está prendido o apagado
solo está prendido si no hay ascensor en el piso
Working Hypothesis
Bio and
Ejemplo de ascensores: nivel 1
context ctx
constants n // el número de puertas
sets P // Puertas
axioms
finite(P)
P 6= ∅
n∈N
card(P) = n
end
Working Hypothesis
Bio and
Ejemplo de ascensores: nivel 1, comportamiento
machine ascensores nivel1 sees ctx
variables ab // las puertas abiertas
invariant
ab ⊆ P
events
INITIALISATION then ab := ∅ end
abrir =
any pt // una puerta cualquiera
where pt ∈ P ∧ pt 6∈ ab // que no esté abierta
then ab := ab ∪ {pt} end // abrirla
cerrar =
any pt // cualquier puerta
where pt ∈ ab // que esté abierta
then ab := ab\{pt} end // cerrarla
Working Hypothesis
Nivel1, refinamiento 1
Bio and
Working Hypothesis
Bio and
Canales de comunicación
Del controlador a puertas: mcp a, mcp c (abrir y cerrar)
De puertas a controlador: mpc a, mpc c (abierta, cerrada)
variables mcp, mpc // los canales de mensajes
invariant
mcp a ⊆ P
mcp c ⊆ ab
mpc a ⊆ P
mpc c ⊆ P
mcp a ∩ (mcp c ∪ mpc a ∪ mpc c) = ∅
mcp c ∩ (mpc a ∪ mpc c) = ∅
mpc a ∩ mpc c = ∅
ab ⊆ mpc a
Working Hypothesis
Bio and
Eventos nivel1, refinamiento
inicio =
mpc a := ∅ . . . mcp c := ∅
abrir =
any pt
where pt ∈ mpc a
then ab := ab ∪ {pt}
k mpc a := mpc a\{pt}
end
cerrar =
any pt
where pt ∈ mpc c
then ab := ab\{pt}
k mpc c := mpc c\{pt}
end
← recibir msg
← cambiar estado
← recibir msg
← cambiar estado
Working Hypothesis
Bio and
Nivel1: eventos nuevos del controlador
abra puerta =
any pt
where pt ∈ P
∧ pt 6∈ (mcp a ∪ mpc a)
then mcp a := mcp a ∪ {pt} ← enviar msg
end
cierre puerta =
any pt
where pt ∈ ab
∧ pt 6∈ (mcp c ∪ mpc c)
then mcp c := mcp c ∪ {pt} ← enviar msg
end
Working Hypothesis
Bio and
Nivel1: eventos nuevos de las puertas
ABRA PUERTA =
any pt
where pt ∈ mcp a
← recibir msg
then mcp a := mcp a\{pt}
← cambiar estado
k mpc a := mpc a ∪ {pt} ← enviar msg
end
CIERRE PUERTA =
any pt
where pt ∈ mcp c
← recibir msg
then mcp c := mcp c\{pt}
← cambiar estado
k mpc c := mpc c ∪ {pt} ← enviar msg
end
Working Hypothesis
Bio and
Nivel1: el programa de puertas
Canales de comunicación: puertos
Eventos: mensajes
Información local (ej. “abierta”): estado
ABRA PUERTA =
any pt
where pt ∈ mcp a
then mcp a := mcp a\{pt}
mpc a := mpc a ∪ {pt}
end
case Msg of abra puerta(C)
then
if Est == cerrada
then
{Send C abrir (Yo)}
abierta
else Est
end
Working Hypothesis
Bio and
Nivel1: el programa de puertas (2)
ABRA PUERTA =
any pt
where pt ∈ mcp a
then
mcp a := mcp a\{pt}
mpc a := mpc a ∪ {pt}
end
CIERRE PUERTA =
any pt
where pt ∈ mcp c
then
mcp c := mcp c\{pt}
mpc c := mpc c ∪ {pt}
end
case Msg of
abra puerta(C)
then if Est == cerrada
then
{Send C abrir (Yo)}
abierta
else Est
end
[] cierre puerta(C)
then if Est == abierta
then
{Send C cerrar (Yo)}
cerrada
else Est
end
Working Hypothesis
Bio and
Nivel1: programa del controlador
abra puerta =
case Msg of opere
any pt
then
where pt ∈ P
if Est.libres 6= nil
∧ pt 6∈ (mcp a ∪ mpc a)
then Est.libres = Pt | Ptas in
then
{Send Pt abra puerta(Yo)}
mcp a := mcp a ∪ {pt}
{AdjoinAt Est libres Ptas}
end
else Est
end
cierre puerta =
if Est.abiertas 6= nil
any pt
then Est.abiertas = Pt | Ptas in
where pt ∈ ab
{Send Pt cierre puerta(Yo)}
∧ pt 6∈ (mcp c ∪ mpc c)
{AdjoinAt Est abiertas Ptas}
then
else Est
mcp c := mcp c ∪ {pt}
end
end
Working Hypothesis
Bio and
Nivel1: programa del controlador (2)
abrir =
any pt
where pt ∈ mpc a
then
mpc a := mpc a\{pt}
ab := ab ∪ {pt}
end
cerrar =
any pt
where pt ∈ mpc c
then
mpc c := mpc c\{pt}
abrir := abrir \{pt}
end
[] abrir (Pt) then
Abs = Pt | Est.abiertas in
{AdjoinAt Est abiertas Abs}
[] cerrar (Pt) then
Est1
Abs = {FilterEst.abiertas
fun {$ X } X 6= Pt end }
in
Est1 = {AdjoinAt Est abiertas Abs}
{AdjoinAt Est1 libres Pt | Est.libres}
end
Working Hypothesis
Bio and
Nivel1: modelo completo del controlador
abrir =
cerrar =
any pt
any pt
where pt ∈ mpc a
where pt ∈ mpc c
then
then
mpc a := mpc a\{pt}
mpc c := mpc c\{pt}
ab := ab ∪ {pt}
abrir := abrir \{pt}
end
end
abra puerta =
cierre puerta =
any pt
any pt
where pt ∈ P
where pt ∈ ab
∧ pt 6∈ (mcp a ∪ mpc a)
∧ pt 6∈ (mcp c ∪ mpc c)
then
then
mcp a := mcp a ∪ {pt}
mcp c := mcp c ∪ {pt}
end
end
Working Hypothesis
Bio and
Nivel1: programa del controlador
case Msg of opere then
if Est.libres 6= nil then Est.libres = Pt | Ptas in
{Send Pt abra puerta(Yo)} {AdjoinAt Est libres Ptas}
else Est end
if Est.abiertas 6= nil then Est.abiertas = Pt | Ptas in
{Send Pt cierre puerta(Yo)}
{AdjoinAt Est abiertas Ptas}
else Est end
[] abrir (Pt) then Abs = Pt | Est.abiertas in
{AdjoinAt Est abiertas Abs}
[] cerrar (Pt) then
Abs = {FilterEst.abiertas fun {$ X } X 6= Pt end }
Est1 = {AdjoinAt Est abiertas Abs} in
{AdjoinAt Est1 libres Pt | Est.libres}
end
Working Hypothesis
Bio and
Nivel1: el programa de puertas (2)
case Msg of abra puerta(C)
then if Est == cerrada
then
{Send C abrir (Yo)}
abierta
else Est end
[] cierre puerta(C)
then if Est == abierta
then
{Send C cerrar (Yo)}
cerrada
else Est end
Working Hypothesis
Bio and
Refinamiento: ascensores
Se ven los ascensores:
Conjunto adicional (tipo): A (los ascensores)
Constantes:
pas ∈ P A
Variables:
qué ascensor da servicio a qué puertas
La puerta en la que se encuentra cada ascensor
asp ∈ A 7 P
el destino de cada ascensor
das ∈ A →
7 P
Working Hypothesis
Bio and
Propiedades
Un ascensor solo está en una puerta a la que da servicio
asp−1 ⊆ pas
Una puerta solo está abierta si hay un ascensor allı́
pab ∈ ran(pab)
El destino de un ascensor es una de sus puertas
das−1 ⊆ pas
Canales de comunicación, de controlador a ascensor:
mca v : ir a una puerta
mca p : detenerse
de ascensor a controlador
mac p : llegar a una puerta
mac d : haberse detenido (abrir puerta)
Working Hypothesis
Mensajes en Nivel 2
Bio and
Working Hypothesis
Bio and
Nivel2: eventos nuevos de los ascensores
VAYA =
any a, pt
where a 7→ pt ∈ mca v
← recibir msg
then mca v := mca v \{a 7→ pt}
← cambiar estado
k mac p := mac p ∪ {a 7→ pt} ← enviar msg
end
PARE =
any a
where a ∈ mca p
then mca p := mca p\{a}
k mac d := mac d ∪ {a}
end
← recibir msg
← cambiar estado
← enviar msg
Working Hypothesis
Bio and
Nivel2: eventos nuevos del controlador
enPiso1 = any a, pt, pt2
where a 7→ pt ∈ mac p
∧ pt 6= das(a) ∧ pt2 ∈ pas−1 [{a}]
∧ pt2 6= pt
then mac p := mac p\{a 7→ pt}
k mca v := mca v ∪ {a 7→ pt2}
k asp(a) := pt
end
enPiso2 = any a, pt
where a 7→ pt ∈ mac p
∧ pt = das(a)
then mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k asp(a) := pt
end
← recibir msg
← enviar msg
← cambiar estado
← recibir msg
← enviar msg
← cambiar estado
Working Hypothesis
Bio and
Nivel2: eventos anteriores del controlador
abrir =
cerrar =
any pt
any pt
where pt ∈ mpc a
where pt ∈ mpc c
then
then
mpc a := mpc a\{pt}
mpc c := mpc c\{pt}
ab := ab ∪ {pt}
ab := ab\{pt}
end
end
abra puerta =
cierre puerta =
any a
any pt
where a ∈ mac d
where pt ∈ ab
∧ pt = pas(p)
∧ pt 6∈ (mcp c ∪ mpc c)
then
then
mcp a := mcp a ∪ {pt}
mcp c := mcp c ∪ {pt}
mac d := mac d\{a}
end
end
Working Hypothesis
Bio and
Nivel2: programa de los ascensores
VAYA =
any a, pt
where a 7→ pt ∈ mca v
case Msg of vaya(C P)
then
then
mca v := mca v \{a 7→ pt}
{Send C enPiso(Yo P)}
k mac p := mac p ∪ {a 7→ pt}
[] pare(C)
end
then
PARE =
{Send C abra puerta(Yo)}
any a where a ∈ mca p
end
then
mca p := mca p\{a}
end
Working Hypothesis
Bio and
Nivel2: programa de eventos nuevos del controlador
enPiso1 = any a, pt, pt2
where a 7→ pt ∈ mac p
∧ pt 6= das(a) ∧ pt2 6= pt
case Msg of enPiso(A P)
−1
∧ pt2 ∈ pas [{a}]
then Pt2 in
then
if P 6= {Das A Est}
mac p := mac p\{a 7→ pt}
then
k mca v := mca v ∪ {a 7→ pt2}
Pt2 = {Pas A P Est}
k asp(a) := pt end
{Send A vaya(Yo Pt2)}
{Asp A P Est}
enPiso2 = any a, pt
else
where a 7→ pt ∈ mac p
{Send A pare(Yo)}
∧ pt = das(a)
{Asp A P Est}
then
end
mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k asp(a) := pt end
Working Hypothesis
Bio and
Nivel2: programa del controlador
case Msg of nuevoDestino(A) then
E1 = {NuevoDestino A Est} in
{Send A vaya(Yo {ProxPiso A E1})}
E1
[] abra puerta(A) then Pt = {Das A Est} in
{Send Pt abra puerta(Yo)}
[] abrir (Pt) then
{Send Yo cierre puerta(P)}
Est
[] cerrar (Pt) then A = {Pas Pt} in
{Send Yo nuevoDestino(A)}
Est
[] cierre puerta(P) then
{Send P cierre puerta(Yo)} Est
...
Working Hypothesis
Bio and
Nivel2: programa del controlador (cont)
...
[] enPiso(A P)
then Pt2 in
if P 6= {Das A Est}
then
Pt2 = {Pas A P Est}
{Send A vaya(Yo Pt2)}
{Asp A P Est}
else
{Send A pare(Yo)}
{Asp A P Est}
end
Working Hypothesis
Bio and
Nivel2: programa del controlador
Note que
la variable “ab” (puertas abiertas) no es necesaria. Se
podrı́a calcular ası́:
ab = mcp c ∪ mpc a
El programa en Oz usa las variables del modelo:
asp : piso en el que está un ascensor
das : destino actual de un ascensor
pas : puertas que corresponden al ascensor (sacar la
próxima)
Funciones nuevas en el programa Oz:
“NuevoDestino”: actualiza el estado con un nuevo destino
para un ascensor
“ProxPiso”: dado un estado y un ascensor, calcula el
siguiente piso(puerta) al que hay que ir
Working Hypothesis
Bio and
Nivel 3: botones de llamado en cada piso
Hay un botón y una luz en cada piso
El botón está asociado con un conjunto de puertas: las
puertas del piso del botón
Cuando el botón se oprime
se envı́a mensaje al controlador
el controlador prende la luz (si no estaba ya prendida)
y selecciona un ascensor para ir a ese piso
Cuando un ascensor llega al piso
el controlador apaga la luz
Working Hypothesis
Mensajes en Nivel 3
Bio and
Working Hypothesis
Bio and
Refinamiento: botones y luces
Conjuntos: B, L (los botones y las luces)
Constantes:
pb ∈ P B qué botón da servicio a qué puertas
bl ∈ B L qué luz está asociada a qué botón
Variables, son los canales de comunicación:
Los botones ya oprimidos: bop ⊆ B
Las luces prendidas: lup ⊆ L
Mensajes
“oprimido”
“prenda” del controlador a la luz
“apague” del controlador a la luz
“prendida” de la luz al controlador
“apagada” de la luz al controlador
Variables
mbc ⊆ B
mcl p ⊆ L
mcl a ⊆ L
mlc p ⊆ L
mlc a ⊆ L
Working Hypothesis
Bio and
Propiedades
luces prendidas son de botones oprimidos
lup ⊆ bl[bop]
luces prendidas se apagan al final
(mcl a ∪ mlc a) ⊆ lup
“oprimir” va antes que mensajes de luces
(mcl p ∪ mlc p ∪ mcl a ∪ mlc a) ⊆ bl[bop]
Mensajes de luces son mutuamente excluyentes
(mcl p ∪ mcl a ∪ mlc p) ∩ mlc a) = ∅
(mcl p ∪ mcl a) ∩ mlc p = ∅
mcl p ∩ mcl a = ∅
Luces que se apagan son cuando llega ascensor
∀l.l ∈ mcl a ⇒ (∃a.a ∈ A ∧ asp(a) ∈ pb[{bol −1 (l)}])
Working Hypothesis
Bio and
Nivel 3: eventos nuevos de botones y luces
OPRIMIR =
any b where b ∈ B
then mbc := mbc ∪ {b} ← enviar msg
end
PRENDA =
APAGUE =
any l where l ∈ mcl p
any l where l ∈ mcl a
then mlc p := mlc p ∪ {l}
then mlc a = mlc a ∪ {l}
mcl p := mcl p\{l}
mcl a := mcl a\{l}
end
end
Working Hypothesis
Bio and
Nivel 3: eventos nuevos del controlador
oprimido1 =
any b
where b ∈ mbc
∧ b 6∈ bop
then mbc := mbc\{b}
k bop := bop ∪ {b}
k mcl p := mcl p ∪ {bl(b)}
end
oprimido2 =
any b
where b ∈ mbc
∧ b ∈ bop
then mbc := mbc\{b}
end
← recibir msg
← cambiar estado
← enviar msg
← recibir msg
mensaje superfluo
Working Hypothesis
Bio and
Nivel 3: eventos nuevos del controlador (cont)
prendida =
any l
where l ∈ mlc p
then mlc p := mlc p\{l}
k lup := lup ∪ {l}
end
apagada =
any l
where l ∈ mlc a
then mlc a := mlc a\{l}
k lup := lup\{l}
k bop := bop\{bl −1 (l)}
end
← recibir msg
← cambiar estado
← recibir msg
← cambiar estado
← cambiar estado
Working Hypothesis
Bio and
Nivel 3: eventos del controlador que no cambian
abrir =
cerrar =
any pt
any pt
where pt ∈ mpc a
where pt ∈ mpc c
then
then
mpc a := mpc a\{pt}
mpc c := mpc c\{pt}
ab := ab ∪ {pt}
ab := ab\{pt}
end
end
abra puerta =
cierre puerta =
any a
any pt
where a ∈ mac d
where pt ∈ ab
∧ pt = pas(p)
∧ pt 6∈ (mcp c ∪ mpc c)
then
then
mcp a := mcp a ∪ {pt}
mcp c := mcp c ∪ {pt}
mac d := mac d\{a}
end
end
Working Hypothesis
Bio and
Nivel 3: eventos del controlador que no cambian (cont)
enPiso1 = any a, pt, pt2
where a 7→ pt ∈ mac p
← recibir msg
−1
∧ pt 6= das(a) ∧ pt2 ∈ pas [{a}]
∧ pt2 6= pt
then mac p := mac p\{a 7→ pt}
k mca v := mca v ∪ {a 7→ pt2}
← enviar msg
k asp(a) := pt end
← cambiar estado
Working Hypothesis
Bio and
Nivel 3: otros eventos del controlador
enPiso2 1 = any a, pt
where a 7→ pt ∈ mac p
∧ pt = das(a)
∧ pb(bl(pt)) ∈ lup
then mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k mcl a := mcl a ∪ {pb(bl(pt))}
k asp(a) := pt end
enPiso2 2 = any a, pt
where a 7→ pt ∈ mac p
∧ pt = das(a)
∧ pb(bl(pt)) 6∈ lup
then mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k asp(a) := pt end
← recibir msg
la luz está prendida
← enviar msg
← enviar msg
← cambiar estado
← recibir msg
la luz no está prendida
← enviar msg
← cambiar estado
Working Hypothesis
Bio and
Nivel 3: modelo del controlador (1)
oprimido1 =
any b
oprimido2 =
where b ∈ mbc
any b
∧ b 6∈ bop
where b ∈ mbc
then mbc := mbc\{b}
∧ b ∈ bop
k bop := bop ∪ {b}
then mbc := mbc\{b}
k mcl p := mcl p ∪ {bl(b)} end
end
Working Hypothesis
Bio and
Nivel 3: modelo del controlador (2)
prendida =
any l
where l ∈ mlc p
then mlc p := mlc p\{l}
k lup := lup ∪ {l}
end
apagada =
any l
where l ∈ mlc a
then mlc a := mlc a\{l}
k lup := lup\{l}
k bop := bop\{bl −1 (l)}
end
Working Hypothesis
Bio and
Nivel 3: modelo del controlador (3)
abrir =
cerrar =
any pt
any pt
where pt ∈ mpc a
where pt ∈ mpc c
then
then
mpc a := mpc a\{pt}
mpc c := mpc c\{pt}
ab := ab ∪ {pt}
ab := ab\{pt}
end
end
abra puerta =
cierre puerta =
any a
any pt
where a ∈ mac d
where pt ∈ ab
∧ pt = pas(p)
∧ pt 6∈ (mcp c ∪ mpc c)
then
then
mcp a := mcp a ∪ {pt}
mcp c := mcp c ∪ {pt}
mac d := mac d\{a}
end
end
Working Hypothesis
Bio and
Nivel 3: modelo del controlador (4)
enPiso1 = any a, pt, pt2
where a 7→ pt ∈ mac p ∧ pt 6= das(a)
∧ pt2 ∈ pas−1 [{a}] ∧ pt2 6= pt
then mac p := mac p\{a 7→ pt}
k mca v := mca v ∪ {a 7→ pt2}
k asp(a) := pt end
enPiso2 1 = any a, pt
where a 7→ pt ∈ mac p
∧ pt = das(a)
∧ pb(bl(pt)) ∈ lup
then
mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k mcl a := mcl a ∪ {pb(bl(pt))}
k asp(a) := pt end
enPiso2 2 = any a, pt
where a 7→ pt ∈ mac p
∧ pt = das(a)
∧ pb(bl(pt)) 6∈ lup
then
mac p := mac p\{a 7→ pt}
k mca p := mca p ∪ {a}
k asp(a) := pt end
Working Hypothesis
Bio and
Nivel 3: programa del controlador
case Msg of nuevoDestino(A) then
E1 = {NuevoDestino A Est} in
{Send A vaya(Yo {ProxPiso A E1})}
E1
[] abra puerta(A) then Pt = {Das A Est} in
{Send Pt abra puerta(Yo)}
[] abrir (Pt) then
{Send Yo cierre puerta(Pt)}
Est
[] cerrar (Pt) then A = {Pas Pt} in
{Send Yo nuevoDestino(A)}
Est
[] cierre puerta(P) then
{Send P cierre puerta(Yo)} Est
...
Working Hypothesis
Bio and
Nivel 3: programa del controlador (cont)
...
[] enPiso(A P)
then Pt2 L = {BL {PB P}} in
if P 6= {Das A Est}
then
Pt2 = {Pas A P Est}
{Send A vaya(Yo Pt2)}
{Asp A P Est}
else
{Send A pare(Yo)}
if {InLup L Est}
then {Send L apague(Yo)}
end
{Asp A P Est}
end
Working Hypothesis
Bio and
Nivel 3: programa del controlador, eventos nuevos
...
[] prendida(L)
then
{AgregueLup L Est} end
[] apagada(L)
then Est1 = {BorreLup L Est} in
{BorreBop {BLInv L} Est1}
[] oprimido(B) then Est1 in
if {InBop B Est} then Est
else
Est1 = {AgregueBop B Est}
{AgregueDestino {PBInv B} Est1}
end
end
Working Hypothesis
Bio and
Nivel 3: programa de las puertas
case Msg of
abra puerta(C)
then if Est == cerrada
then
{Send C abrir (Yo)}
abierta
else Est
end
[] cierre puerta(C)
then if Est == abierta
then
{Send C cerrar (Yo)}
cerrada
else Est
end
Working Hypothesis
Bio and
Nivel 3: programa de los ascensores
case Msg of vaya(C P)
then
{Send C enPiso(Yo P)}
[] pare(C)
then
{Send C abra puerta(Yo)}
end
Working Hypothesis
Bio and
Nivel 3: programa de los botones
case Msg of oprimir
then
{Send Controlador oprimido(Yo)}
end
Working Hypothesis
Bio and
Nivel 3: programa de las luces
case Msg of
prenda(C) then
{Send C prendida(Yo)}
[] apague(C) then
{Send C apagada(Yo)}
end
Working Hypothesis
Bio and
Nivel 3: el estado del controlador
El estado corresponde a las variables del modelo:
Variable
bop
lup
asp
das
—
Estado
Est.bop
Est.lup
Est.asp
Est.das
Est.destinos
qué contiene
lista de botones oprimidos
lista de luces encendidas
piso en que está cada ascensor
destino actual de cada ascensor
destinos registrados para cada ascensor
Estructuras independientes del estado:
Bl
Pb
Pas
para cada botón, su luz asociada
para cada puerta, el botón asociado
puertas para cada ascensor
Working Hypothesis
Bio and
Nivel 3: funciones auxiliares en el programa
Función
Est1 = {AgregueBop B Est}
Est1 = {BorreBop B Est}
Est1 = {AgregueBop B Est}
P = {InBop B Est}
Est1 = {AgregueLup L Es}t
Est1 = {BorreLup L Est}
B = {BLInv L}
Est1 = {Asp A P Est}
P = {Das A Est}
P = {InLup L Est}
L = {BL B}
B = {PB P}
Ps = {PBInv B}
qué hace
agrega B a botones en Est.bop
devuelve el nuevo estado Est1
elimina B de Est.bop
agrega B a botones en Est.bop
P verdadero si B está en Est.bop
agrega L a luces en Est.lup
borra L de luces en Est.lup
B= el botón asociado con la luz L
P es nuevo destino del ascensor A
P= puerta destino del ascensor A
P verdadero si L está en Est.lup
L = luz asociada con el botón B
B = botón asociado con puerta P
Ps = puertas asociadas a botón B
Working Hypothesis
Bio and
Nivel 4: el reloj
Simular la demora de los eventos (ej. abrir puerta)
case Msg of
start(C#X T ) then
reloj =
thread {Delay T } {Send C listo(X )} end
end
Working Hypothesis
Bio and
Nivel 4: programa de las puertas
case Msg of
abra puerta(C) then
if Est == cerrada then
{Send Reloj start(Yo#abrir (C) 1000)}
Est
else Est end
[] listo(abrir (C)) then {Send C abrir (Yo)} abierta
[] listo(cerrar (C)) then {Send C cerrar (Yo)} cerrada
[] cierre puerta(C) then
if Est == abierta then
{Send Reloj start(Yo#cerrar (C) 1000)}
Est
else Est end
Working Hypothesis
Bio and
Nivel4: programa de los ascensores
case Msg of vaya(C P) then
{Send Reloj start(Yo#piso(C P) 2000)}
Est
[] listo(piso(C P)) then {Send C enPiso(Yo P)}
[] pare(C)
then
{Send C abra puerta(Yo)}
end
Descargar