У меня есть вопрос, касающийся решения nuXmv. У меня есть простой график, где начальное состояние s1 и есть две дуги от s1, одна ведет к s2, другая к s3. Из s2 и s3 есть одна дуга, ведущая к s1. Это программа в nuXmv, которая описывает ситуацию.
MODULE main
VAR
s : {s1, s2, s3};
p : boolean;
q : boolean;
w : boolean;
ASSIGN
init(s) := {s1};
next(s) := case
s = s1 : {s2, s3};
s = s2 : s1;
s = s3 : s1;
esac;
p := case
s = s2 : TRUE;
TRUE : FALSE;
esac;
q := case
s = s1 : TRUE;
TRUE : FALSE;
esac;
w := case
s = s3 : TRUE;
TRUE : FALSE;
esac;
CTLSPEC (AF p) & (AF w);
CTLSPEC AG (AF p) & AG (AF w);
Я не понимаю, как nuXmv уже в исходном состоянии s1 знает, что формула неверна. Он не дает контрпример на основе цикла, просто сразу в s1 он говорит, что формула неверна на основе s1.
Моя идея объяснения состоит в том, что без допущений справедливости nuXmv немедленно предполагает, что один из путей никогда не может быть выполнен. Но не должно ли это привести цикл в качестве примера? Если бы я только оставил "CTLSPEC AF p;" nuXmv возвращает цикл как контрпример. Так почему же для «AF p & AF w» в качестве контрпримера показывается только состояние s1?
-- specification (AF p & AF w) is false
-- as demonstrated by the following execution sequence
Trace Description: CTL Counterexample
Trace Type: Counterexample
-> State: 1.1 <-
s = s1
p = FALSE
q = TRUE
w = FALSE