Método Formal B
Alunos:
Eduardo Akira Yonekura
Rogério Esteves Salustiano
1
Tópicos abordados
Histórico
Introdução
Notação
Aplicação ao Estudo de Caso
B-Toolkit
Conclusões
Desvantagens
Vantagens
Referências Bibliográficas
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Histórico
 Desenvolvido por J.R. Abrial em 1985.
 Uma “extensão” com melhorias de VDM e Z.
 Aceitação na indústria a partir de 1992, a partir
de estudos de casos bem sucedidos.
 O método B foi utilizado no projeto do controle
dos trens do metrô de Paris (1998)
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Introdução
 B utiliza o conceito de Máquinas Abstratas (Abstract Machines),
que encapsulam:
estados: que consistem de variáveis restringidas por
invariantes (tipos das variáveis).
operações: que modificam o estado das variáveis, porém sem
alterar os invariantes.
 As MACHINEs podem ser vistas como Classes, porém com um
nível de detalhamento muito mais rigoroso.
 As MACHINEs trabalham com o conceito de substituição: a única
maneira de fazer a máquina ter progresso é alterar (substituir) o
valor do seu estado.
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Notação – cláusulas de uma máquina
MACHINE
EXTENDS
SEES
SETS
CONSTANTS
PROPERTIES
VARIABLES
DEFINITIONS
INVARIANT
INITIALIZATION
OPERATIONS











END

define o nome da máquina abstrata
permite importar instâncias de outras máquinas
outras máquinas que serão utilizadas dentro desta
especifica os conjuntos que são manipulados
define todas as constantes que são manipuladas
expressões lógicas que são satisfeitas pelas constantes
define as variáveis utilizadas na máquina
uma série de definições utilizadas na máquina
propriedade dos atributos definidos nas VARIABLES
atribuição de valores iniciais às VARIABLES
define todas as operações (procedimentos e funções) da
máquina; deve ser a última cláusula a ser declarada
fim da máquina abstrata
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Notação – exemplo
MACHINE machine_name
VARIABLES var1, var2 ...
SEES machine1, machine2, ...
INVARIANT var1  tipo1, var2  tipo2, ...
INITIALIZATION var1 := val1, var2 := var2 ...
OPERATIONS
operação_1(var_aux1, var_aux2, ...)
PRE var_aux1  tipo1, var_aux2  tipo2, ...
THEN <executa substituição de var1, var2, ...>
END;
ret_value  operação_2
BEGIN <atribui valor ao ret_value>
END;
...
END
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Diagrama de Classes do Sistema de Elevadores
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Notação
MACHINE
Ex: MACHINE Elevador
SETS
Ex: DIREC = {sobe,desce};
P_STATUS = {aberta,fechada};
BOTAO_ESTADO = {botao_on,botao_off};
ELEV_ESTADO = {pronto,em_mov,em_visita}
PROPERTIES
Ex: terreo : NAT &
ultimo : NAT
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Notação
VARIABLES
Ex: elev, dir, andar_dest, por_stat, est_elev
INVARIANT
Ex: elev <: ELEVADOR &
botao <: BOTAO
ultimo > terreo
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Notação
OPERATIONS
chama_elevador(ll,fl) =
PRE
ll : elev &
fl : ANDAR
THEN
...
WHEN
est_elev(ll) = pronto & fl > andar_dest(ll) THEN
andar_dest(ll):= fl ||
dir(ll) := sobe ||
est_elev(ll) := em_mov
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Ferramenta B-Toolkit
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Ferramenta B-Toolkit
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Especificação B para o sistema de elevadores
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Vantagens e Desvantagens
 Desvantagens
Alto grau de complexidade.
Não é trivial encontrar bons invariantes.
Poucas ferramentas disponíveis (Atelier-B e B-Toolkit).
 Vantagens
Métodos de prova “exatos” (gerados automaticamente ou pelo
usuário).
As especificações são geradas utilizando uma abordagem
incremental, o que facilita a especificação de um sistema
complexo.
Boa interação com UML e Statecharts.
Extensa bibliografia com estudos de casos complexos.
Boa aceitação na indústria.
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Referências Bibliográficas
 Using the B formal approach for incremental
specification design of interactive systems. Yamine AitAmeur, et. al.
 Supplementing a UML development process with B.
Helen Treharne. FME 2002.
 Using B formal specifications for analysis and verification
of UML/OCL models. R. Marcano. UML 2002, Model
Engineering, Concepts and Tools. Workshop on
Consistency Problems in UML-based Software
Development.
 B Toolkit - User´s manual
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Sistema de elevadores  MACHINE Types
MACHINE Types
SETS
OBJECTS;
DIREC = {sobe,desce};
P_STATUS = {aberta,fechada};
BOTAO_ESTADO = {botao_on,botao_off};
ELEV_ESTADO = {pronto,em_mov,em_visita}
CONSTANTS
terreo, ultimo, ELEVADOR, BOTAO
PROPERTIES
terreo : NAT &
ultimo : NAT &
terreo < ultimo &
ELEVADOR <: OBJECTS &
BOTAO <: OBJECTS
END
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Sistema de elevadores  MACHINE Elevador
MACHINE Elevador
SEES
Types
VARIABLES elev, dir, andar_dest, por_stat, est_elev
INVARIANT
OPERATIONS
elevador_desce(ll) =
PRE
ll : elev
THEN
dir(ll) := desce
END;
elev <: ELEVADOR &
dir : elev-->DIREC &
andar_dest : elev-->ANDAR &
por_stat : elev-->P_STATUS &
est_elev : elev-->ELEV_ESTADO
INITIALISATION
ANY ll WHERE
ll <: ELEVADOR &
ll /= {}
THEN
elev := ll /* || */
/* dir := ll * {dir_sobe} /* || */
/* andar_dest := ll * {terreo} || */
/* por_stat := ll * {p_fechado} || */
/* est_elev := ll * {pronto} */
END
DEFINITIONS
ANDAR == {terreo,ultimo}
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
elevador_sobe(ll) =
PRE
ll : elev
THEN
dir(ll) := sobe
END;
elevador_setdestino(ll,fl) =
PRE
ll : elev &
fl : ANDAR
THEN
andar_dest(ll) := fl
END;
fl <-- elevador_getDestino(ll) =
PRE
ll : elev
THEN
fl := andar_dest(ll)
END;
MO409
Sistema de elevadores  MACHINE Elevador
(cont.)
elevador_fechport(ll) =
PRE
ll : elev
THEN
por_stat(ll) := p_fechado
END;
elevador_abrport(ll) =
PRE
ll : elev
THEN
por_stat(ll) := p_aberta
END
END
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Sistema de elevadores  MACHINE Botão
MACHINE Botao
SEES
Types
USES
Elevador
THEN
botao := bb ||
botao_andar := ff ||
botao_estado := bb * {botao_off} ||
elev_botao := lb
END
VARIABLES botao, botao_andar, botao_estado, elev_botao
DEFINITIONS
ANDAR == (terreo...ultimo)
INVARIANT
botao <: BOTAO &
botao_andar : botao --> ANDAR &
ran(botao_andar) = ANDAR &
botao_estado : botao --> BOTAO_ESTADO &
elev_botao : botao --> elev &
ran(botao_elev) = elev &
!(ll,fl).(ll:elev & fl : ANDAR =>
card(botao_elev~[{ll}]/\botao_andar~[{fl}] ) =
OPERATIONS
fl <-- botao_getAndar(bt) =
PRE
bt : botao
THEN
fl := botao_andar(bt)
END;
2)
INITIALISATION
ANY bb, ff, lb WHERE
bb <: BOTAO &
ff : bb --> ANDAR &
ran(ff) = ANDAR &
lb : bb -->elev &
!(ll,fl).(ll:elev & fl : ANDAR =>
card(lb~[{ll}]/\ff~[{fl}] ) = 2 )
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
botao_mudaOffOn(bt) =
PRE
bt : botao &
botao_estado(bt) = botao_off
THEN
botao_estado(bt) := botao_on
END;
MO409
Sistema de elevadores  MACHINE Botão
(cont.)
botao_mudaOnOff(bt) =
PRE
bt: botao &
botao_estado(bt) = botao_on
THEN
botao_estado(bt) := botao_off
END;
bt1,bt2 <-- getBotao(ll,fl) =
PRE
ll : elev &
fl : ANDAR
THEN
ANY b1,b2 WHERE
b1 : botao &
b2 : botao &
(b1,b2) = botao_elev~[{ll}] /\ botao_andar~[{fl}]
THEN
bt1 := b1 ||
bt2 := b2
END
END;
ll <-- getElevador(bt) =
PRE
bt : botao
THEN
ll := elev_botao(bt)
END
END
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Sistema de Elevadores  MACHINE Controle
MACHINE Controle
SEES
Types
VARIABLES elev, dir, andar_dest, por_stat, est_elev, botao,
botao_andar, botao_estado, elev_botao
INVARIANT
elev <: ELEVADOR &
dir : elev --> DIREC &
andar_dest : elev--> ANDAR &
por_stat : P_STATUS &
est_elev : elev --> ELEV_ESTADO &
botao <: BOTAO &
botao_andar : botao --> ANDAR &
/* ran(botao_andar) : botao --> ANDAR & */
botao_estado : botao --> BOTAO_ESTADO
elev_botao : botao --> elev /* & */
/* ran(elev_botao) = elev /* & */
/* !(ll,fl).(ll:elev & fl : ANDAR =>
card(botao_elev~[{ll}]/\botao_andar~[{fl}] ) = 2 ) */
INITIALISATION
ANY ll,bb,ff,lb WHERE
ll <: ELEVADOR &
ll /= {} &
bb <: BOTAO &
ff : bb --> ANDAR &
ran(ff) = ANDAR &
lb : bb --> ll &
/* ran(lb) = ll & */
/* !(li,fl).(li:elev & fl : ANDAR =>
card(lb~[{li}]/\ff~[{fl}] ) = 2 ) */
THEN
elev := ll ||
dir := ll * {sobe} ||
andar_dest := ll * {terreo} ||
por_stat := ll * {} ||
est_elev := ll * {pronto} ||
botao := bb ||
botao_andar := ff ||
botao_estado := bb * {botao_off} ||
elev_botao := lb
END
DEFINITIONS
ANDAR == {terreo..ultimo}
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Sistema de Elevadores  MACHINE Controle
(cont.)
OPERATIONS
elevador_ocupado(ll) =
PRE
ll : elev
THEN
SELECT
est_elev(ll) = em_visita THEN
por_stat(ll) := fechada ||
est_elev(ll) := pronto
ELSE
skip
END
END;
chama_elevador(ll,fl) =
PRE
ll : elev &
fl : ANDAR
THEN
SELECT
est_elev(ll) = em_visita & fl = andar_dest(ll) THEN
por_stat(ll) := aberta ||
est_elev(ll) := em_visita
WHEN
est_elev(ll) = pronto & fl > andar_dest(ll) THEN
andar_dest(ll):= fl ||
dir(ll) := sobe ||
est_elev(ll) := em_mov
ELSE
skip
END
END;
elevador_chega(ll,fl) =
PRE
ll : elev &
fl : ANDAR
THEN
SELECT est_elev(ll) = em_mov & fl = andar_dest(ll) THEN
ANY b1,b2 WHERE
b1 : botao &
b2 : botao &
(b1,b2) = elev_botao~[{ll}] /\ botao_andar~[{fl}]
THEN
botao_estado := botao_estado<+{b1|->botao_off,b2|>botao_off}
END ||
est_elev(ll) := em_visita ||
por_stat(ll) := aberta
ELSE skip
END
END;
aperta_botao(bt) =
PRE
bt : botao
THEN
SELECT botao_estado(bt) = botao_off THEN
botao_estado(bt) := botao_on
ELSE
skip
END
END
END
Eduardo Akira Yonekura (025989) - Rogério Esteves Salustiano(982094)
MO409
Download

Document