Download Introducción al Modelado de Sistemas Proyecto 1: hospital
Document related concepts
no text concepts found
Transcript
Introducción al Modelado de Sistemas Proyecto 1: hospital profesor: Camilo Rueda 27 de septiembre de 2012 En este proyecto debe modelar un sistema de múltiples agentes para un hospital. El sistema consiste de dos clases de agentes, pacientes y personal médico (doctores). La condición de cada paciente se monitorea por el correspondiente equipos médico (un agente que representa al paciente). Los agentes doctores corren en asistentes personales (por ejemplo, iPad’s). El hospital tiene conexión inalámbrica para estos “doctores”. Cada doctor está asociado con un agente. El equipo médico actualiza continuamente el registro del paciente. En caso de emergencia, el agente paciente genera una llamada de emergencia que se comunica al doctor que trata al paciente. Una condición de seguridad importante es que “todas las emergencias deben tratarse con prontitud por los doctores”. Como este requisito es difcil de cumplir siempre, el sistema garantiza al menos que cada llamada de emergencia eventualmente ser tratada por algún doctor. Además, diferentes doctores pueden asociarse al mismo paciente, debido a rotaciones del personal médico. Se debe asegurar entonces que al final de la jornada de un doctor, todos sus pacientes se transfieran a otro doctor. Otro requisito importante es que un doctor siempre accede al registro más reciente de datos del paciente y que este siempre esta al dı́a. Asumimos que el registro de cada paciente se guarda en el dispositivo del médico que lo atiende. Cada tratamiento o droga prescrita se introduce en los datos del paciente por el doctor, mediante su iPad (o dispositivo similar). Todas las modificaciones se sincronizan con los datos que guarda el equipo del paciente. Cuando el doctor termina de examinar al paciente o de prescribir una droga, la conexión con los datos del paciente se pierden. Esto nos asegura que solamente el doctor que esté en proximidad con el paciente pueda modificar los datos del paciente. A continuación se presenta un modelo abstracto y un refinamiento de este sistema. Usted debe construir el resto de los refinamientos e incluir el modelo completo en Rodin y correrlo en ProB. 1 context ctx sets M EDICOS axioms f inite(M EDICOS) end machine hospital sees ctx variables agentesM edicos invariants agentesM edicos ⊆ M EDICOS EVENTS initialisation begin agentesM edicos := ∅ end event Activar any am where am ∈ M EDICOS am 6∈ agentesM edicos then agentesM edicos := agentesM edicos ∪ {am} end event Actividad then skip end event Desactivar any am where am ∈ agentesM edicos then agentesM edicos := agentesM edicos\{am} end El primer refinamiento representa los pacientes. Al lllegar al hospital cada paciente se asocia con un médico. La variable doctorAsignado modela esto. Dos eventos nuevos 2 representan la llegada y salida de un paciente del hospital. context ctx2 extends ctx sets P ACIEN T ES axioms f inite(P ACIEN T ES) end 3 machine Hospital1 refines Hospital sees ctx2 variables agentesM edicos pacientes, doctorAsignado, ultimaV isita, visitados invariants inv1 : pacientes ⊆ P ACIEN T ES inv2 : doctorAsignado ∈ pacientes → agentesM edicos inv3 : ultimaV isita ∈ pacientes → 7 M EDICOS inv4 : visitados ⊆ pacientes inv5 : ultimaV isita[visitados] ⊆ agentesM edicos inv6 : visitados ⊆ dom(ultimaV isita) EVENTS initialisation extended then agentesM edicos := ∅ pacientes := ∅ doctorAsignado := ∅ultimaV isita := ∅ visitados := ∅ end event ActivarAgente extends Activar end event LlegaP aciente = any am pa where pa ∈ P ACIEN T ES ∧ pa 6∈ pacientes ∧ am ∈ agentesM edicos then pacientes := pacientes ∪ {pa} doctorAsignado(pa) := am end event DescargueP aciente any pa where pa ∈ pacientes pa 6∈ visitados then pacientes := pacientes\{pa} doctorAsignado := {pa} C − doctorAsignado ultimaV isita := {pa} C − ultimaV isita end ... 4 event EmpiezaV isita refines Actividad any am, pa where am ∈ agentesM edicos ∧ pa ∈ pacientse ∧ pa 6∈ visitados ∧ am 6∈ ultimaV isita[visitados] then ultimaV isita(pa) := am visitados := visitados ∪ {pa} end event f inalV isita extends Actividad any pa where pa ∈ visitados then visitados := visitados\{pa} end event saleAgente refines desactivar any am where am ∈ agentesM edicos ∧ am 6∈ ran(doctorAsinado) ∧ am 6∈ ultimaV isita[visitados] then agentesM edicos := agentesM edicos\{ma} end event ReasigneDoctor refines desactivar any am nuevo am where am ∈ ran(doctorAsignado) ∧ am 6∈ ultimaV isita[visitados]∧ nuevo am ∈ agentesM edicos ∧ nuevo am 6= am then agentesM edicos := agentesM edicos\{am} doctorAsignado := doctorAsignado C − (dom(doctorAsignado B {am}) × {nuevo am}) end El evento Actividad modela el examen del paciente a la formulación de medicinas. La variable visitados representa un subconjunto de los pacientes que están siendo examinados. La variable ultimaV isita guarda para cada paciente el último doctor que lo visitó. Los eventos empiezaV isita y f inalV isita, refinan el evento actividad y modelan el proceso de visita. El evento abstracto Desactivar se descompone en dos, saleAgente y ReasigneDoctor. El evento saleAgente modela a un doctor que sale del hospital. En la especificación de Hospital1, al definir los eventos saleAgente y ReasigneDoctor, se hizo abstracción (es decir, no se modeló) de las razones para la salida del doctor y para 5 la reasignación de doctor a un paciente. Un doctor sale del hospital porque su jornada terminó o porque el agente ha tenido una falla irrecuperable (recuerde que los agentes son dispositivos) y debe ser desconectado.En un nuevo refinamiento debe distinguir entre la salida normal de un agente y la desconexión. En un sistema de múltiples agentes, los agentes pierden su conexión solamente por un corto perı́odo. Después de que la conexión se restablece, el agente debe poder continuar su operación. Por esto, después de detectar pérdida de conexión, no se debe inmediatamente descartar el agente, sino más bien establecer un lı́mite para restablecer la conexión. Si el agente restablece su conexión antes del lı́mite, puede entonces continuar su actividad. Sin embargo, si no lo hace, se debe descartar permanentemente el agente. Para modelar este comportamiento, debe en su refinamiento introducir una variable nueva desconectados que representa los agentes activos que se ha detectado que han perdido conexión. Para modelar el tiempo lı́mite, debe usar una variable reloj, para cada agente.. Inicialmente, para todo agente activo, su reloj está en el estado inactivo. Tan pronto como el agente pierde conexión, se agrega a los desconectados y su reloj se pone en activo. Debe haber un evento que modela este caso. Debe tambier modelar dos eventos, uno para el caso en que el agente logra reconectarse y otro para el que no lo logra. Si el agente se reconecta antes de que su reloj esté en enLimite, el valor de reloj se reasigna a inactivo y el agente continua su actividad. De lo contrario, el agente se elimina de los agentes activos. Note que no hay realmente paso de tiempo. Simplemente uno de sus eventos supone que el reloj del agente debe pasar a enLimite y el otro que debe pasar a inactivo. Note también que debe refinar sus eventos reasigneDoctor y saleAgente para tener en cuenta el caso de que el agente que se va o que se reasigna sea fallido (su reloj está en enLimite). Es decir, tendrá dos eventos refinados para cada uno de estos. Uno para el caso normal y otro para agentes fallidos. Recuerde qe el invariante debe contener las propiedades de sus observaciones. Por ejemplo, una propiedad que dice que si el reloj de un agente no está en inactivo es porque ese agente está desconectado. Concretamente, su refinamiento debe: 1. Escribir un nuevo contexto, si hace falta 2. Escribir el nuevo invariante, incluyendo la propiedad: “si el reloj de un agente no está en inactivo es porque ese agente está desconectado” 3. Modelar el reloj de cada agente 4. Refinar los eventos: ActivarAgente llegaP aciente DescargueP aciente 6 EmpiezaV isita f inalV isita 5. Refinar el evento saleAgente con dos eventos, uno para salida normal y otra para el que detecta que quien sale es agente fallido 6. Refinar el evento ReasigneDoctor con dos eventos, como para el anterior. 7. Escribir un nuevo evento para desconectar un agente (pero no eliminarlo) 8. Escribir un nuevo evento para modelar que la reconexión falló. 9. Escribir un nuevo evento para modelar que la reconexión fue exitosa. Debe considerar ahora un refinamiento adicional. En este se modelan llamadas de emergencia. Cada llamada de emergencia corresponde a un cierto tipo de alarma. Para cada paciente que hace una llamada, se desea observar el paciente junto con el tipo de alarma que se naló. Cada llamada la atiende un médico, aunque en un momento dado es posible que haya llamadas que no hayan sido atendidas todavı́a. Se observa también el tipo de alarma, junto con el doctor que la atiende. No puede haber dos médicos que atiendan la misma llamada. Obviamente, no puede ser que un médico esté atendiendo una llamada que ningn paciente haya hecho. No se puede descargar a un paciente que tenga una llamada de emergencia pendiente. Tampoco puede resignares o salir un agente que tenga a su cargo una llamada de emergencia. Además de refinar los eventos que se tenı́an, hay dos eventos nuevos, uno que corresponde a hacer una llamada de emergencia y otro para asignar un médico a alguna llamada. Debe escribir este nuevo refinamiento, junto con un nuevo contexto, si hace falta. Una vez escrito todo el modelo en Rodin, debe correrlo con proB. 7