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