Как создать простую модель Крипке в NuSMV?
В настоящее время я занимаюсь теоретическими исследованиями в LTL (линейная временная логика) и CTL (логика дерева вычислений). Я новичок в NuSMV, и мне сложно создать простую структуру Крипке.
Моя структура - M = (S, R, L), где S = {s0, s1, s2} - множество возможных состояний, R - отношение перехода, такое что: s0 -> s1, s0 -> s2, s1 -> s0, s1 -> s2 и s2 -> s2, а L - это функция маркировки для каждого состояния, определенного как: L(s0) = {p, q}, L(s1) = {q, r} и L(s2) = {r}. Я использую обозначения, описанные в логике в учебнике информатики Хутом и Райаном. Я пробовал два следующих кода:
Первый код:
MODULE main
VAR
p : boolean;
q : boolean;
r : boolean;
state : {s0, s1, s2};
ASSIGN
init(state) := s0;
next(state) :=
case
state = s0 : {s1, s2};
state = s1 : {s2};
state = s2 : {s2};
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) :=
case
state = s1 | state = s2 : FALSE;
esac;
next(q) :=
case
state = s1 : TRUE;
state = s2 : FALSE;
esac;
next(r) :=
case
state = s1 : FALSE;
state = s2 : TRUE;
esac;
SPEC
p & q
Второй код:
MODULE main
VAR
p : boolean;
q : boolean;
r : boolean;
state : {s0, s1, s2};
ASSIGN
init(state) := s0;
next(state) :=
case
state = s0 : {s1, s2};
state = s1 : {s2};
state = s2 : {s2};
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
esac;
LTLSPEC
p & q
Что-то не так, и я получил это сообщение: "условия дела не являются исчерпывающими". Что это значит? Как мне исправить мою проблему?
1 ответ
Потому что вы должны ввести для каждого случая также его "по умолчанию". Первый код:
MODULE main
VAR
p : boolean;
q : boolean;
r : boolean;
state : {s0, s1, s2};
ASSIGN
init(state) := s0;
next(state) :=
case
state = s0 : {s1, s2};
state = s1 : {s2};
state = s2 : {s2};
TRUE : state;
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) :=
case
state = s1 | state = s2 : FALSE;
esac;
next(q) :=
case
state = s1 : TRUE;
state = s2 : FALSE;
TRUE : q;
esac;
next(r) :=
case
state = s1 : FALSE;
state = s2 : TRUE;
TRUE : r;
esac;
SPEC
p & q
и второй код:
MODULE main
VAR
p : boolean;
q : boolean;
r : boolean;
state : {s0, s1, s2};
ASSIGN
init(state) := s0;
next(state) :=
case
state = s0 : {s1, s2};
state = s1 : {s2};
state = s2 : {s2};
TRUE : state;
esac;
init(p) := TRUE;
init(q) := TRUE;
init(r) := FALSE;
next(p) := !p;
next(q) :=
case
state = s0 & next(state) = s1 : q;
state = s0 & next(state) = s2 : !q;
state = s1 & next(state) = s0 : q;
state = s1 & next(state) = s2 : !q;
TRUE : q;
esac;
next(r) :=
case
state = s0 & next(state) = s1 : r;
state = s0 & next(state) = s2 : r;
state = s1 & next(state) = s0 : !r;
state = s1 & next(state) = s2 : r;
TRUE : r;
esac;
LTLSPEC
p & q