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 = p1p1 # p2p1 # 1p1 # "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 FALSEP_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: