Segundo a documentação em (CENTRE, [s.d.]):
{1, 2, 3}
ou {"p1", "p2", "p3"}
, podemos model values: {p1, p2, p3}
(sem aspas).
Um model value e um valor não especificado que o model checker considera diferente de qualquer outro valor que possa ser expressado:
p1 = p1
p1 # p2
p1 # 1
p1 # "p1"
Evitar erros:
p + 1
Mesmo no TLC, existe possibilidade de dar tipos para esses valores adicionando uma letra e _
no começo:
P_1
, P_2
, …a_1
, a_2
, …
Dessa forma, o TLC reporta um erro quando comparamos model values de tipos diferentes (como se estivéssemos comparando 1
e "a"
):
P_1 = P_2
resulta em FALSE
P_1 = a_1
resulta em erro em runtime
Explicação em (WAYNE, 2022)
Podemos dizer para o model checker que um conjunto é simétrico, fazendo com que ele precise considerar menos estados.
Suponha que nossa especificação constrói uma sequência a partir do conjunto de model values {s1, s2, s3, s4}
. Imagine alguns dos valores que podem ser construídos:
(1) <<s1, s2, s3>> (2) <<s2, s1, s3>> (3) <<s1, s2, s2>> (4) <<s2, s3, s3>>
s1
e s2
.s1
por s2
e os s2
por s3
.
Se essas diferenças não forem relevantes para nosso modelo, podemos definir que {s1, s2, s3, s4}
é um conjunto de simetria, e assim o model checker vai precisar verificar bem menos estados.
Exemplo no trabalho de RPG: dois monstros são simétricos
Exemplo no trabalho do banco: Usuários são simétricos
Vamos ver dois exemplos: