Um estado descreve as informações de um sistema em um momento específico.
Uma transição descreve como um sistema pode mudar de um estado para outro.
Um sistema de transições é definido pela tripla \((S, \to, I)\) onde
Um comportamento ou execução \(\rho\) de um sistema de transições é uma sequência de estados tal que
\[\rho = s_0, s_1, \dots\ tal\ que\ s_i \to s_{i+1}\ para\ todo\ i \geq 0\]
Um sistema de transições é dito finito se e somente se \(S\) é finito.
Pergunta: Comportamentos de sistemas de transições finitos são sempre finitos?
O conjunto de sucessores de um estado \(s\) é definido por \(Post(s) = \{ s' \in S\ |\ s \to s' \}\).
Um sistema de transições é dito determinístico se e somente se \(|I| \leq 1 \land \forall s \in S : |Post(s)| \leq 1\). Ou seja:
Não-Determinismo acontece quando há múltiplos estados iniciais \(|I| > 1\) ou múltiplos sucessores para o mesmo estado (\(|Post(s)| > 1\)).
Estruturas de Kripke são um tipo de sistema de transições com uma restrição adicional:
A relação \(\to\) deve ser total
ou seja
\(\forall s \in S, \exists s' \in S : s \to s'\)
Um semáforo pode ser representado por uma estrutura de Kripke \((S, \to, I)\) onde
Um sistema com dois semáforos pode ser representado por uma estrutura de Kripke \((S, \to, I)\) onde …
Especificação completa no GitHub.
module semaforos { type Cor = Vermelho | Verde | Amarelo type Semaforo = int var cores: Semaforo -> Cor var proximo: Semaforo const SEMAFOROS: Set[Semaforo] action fica_verde(s: Semaforo): bool = all { proximo == s, SEMAFOROS.forall(s2 => cores.get(s2) == Vermelho), cores' = cores.set(s, Verde), proximo' = (s + 1) % SEMAFOROS.size(), } ... }
Todos os exemplos de semáforos (1, 2, 3 e N) são sistemas de transições. Quais deles são Estruturas de Kripke?
Os sistemas de semáforos são finitos?
Nossas definições de semáforo são determinísticas?
Como seriam semáforos com não determinismo?
Qualquer estado pode ser um estado inicial. Se definirmos isso (\(I = S\)), temos não determinismo
Caso o primeiro semáforo a abrir não esteja definido
Caso a definição de próximo seja removida
Onde podemos encontrar não determinismo em sistemas de software?
Ao especificar um sistema, especialmente quando há não determinismo, é preciso definir uma fronteira.
Vamos considerar duas fronteiras diferentes:
O professor coloca uma nota no SIGA. Se a nota for \(\geq 7\), o aluno passa.
No caso (2) estamos detalhando mais o mundo externo fora do SIGA, enquanto no (1) a fronteira é na interface do SIGA.
O caso (1) é uma especificação do SIGA, enquanto o (2) fala mais sobre um sistema universitário.
Versão 1:
Joinville → São Paulo → Paris
Versão 2:
Check-in em Joinville → Despacho de Bagagem em Joinville → Check de Segurança em Joinville → Embarque em Joinville → Pouso em São Paulo → Check de Segurança em São Paulo → Embarque em São Paulo → Pouso em Paris → Retirada de bagagem em Paris
Onde poderia ter não determinismo?
Podemos ter não determinismo em cada estado. Nos casos listados, podemos ou não determinar o que acontece. Cabe ao nível de detalhe, ou a fronteira da nossa modelagem.