Следующий алгоритм представляет собой грубый набросок проверки модели. с логикой вычислительного дерева (CTL):
Утверждается, что:
Задача проверки модели для CTL состоит в том, чтобы проверить для данной системы переходов TS и формулы CTL Φ, является ли TS |= Φ... Основная процедура проверки модели CTL довольно проста:
- множество Sat(Φ) всех состояний, удовлетворяющих Φ, вычисляется рекурсивно, и
- следует, что TS |= Φ тогда и только тогда, когда I ⊆ Sat(Φ), где I — множество начальных состояний TS...
Рекурсивное вычисление Sat(Φ) в основном сводится к восходящему обходу дерева синтаксического анализа формулы состояния CTL Φ.
Таким образом, вы, по сути, (насколько я понимаю), вы предоставляете системе формулу CTL Φ, которая представляет собой дерево синтаксического анализа, а затем она выполняет поиск по состояниям и по дереву синтаксического анализа CTL и проверяет, удовлетворяет ли какое-либо состояние Φ.
Вопрос в том:
Примерно то, что происходит в методе Sat(Φ) (символический материал). Они говорят (2) ниже, где S — состояния, а A — атомарные предложения. Интересно, как они на самом деле проверяют состояния, учитывая, что программа на самом деле не запущена. Это (по крайней мере, я так думаю) проверка символической модели. Интересно, можно ли примерно объяснить, как работает проверка состояния. Кажется, что должен произойти своего рода генерация входных данных, но в то же время я думаю, может быть, это не должно происходить.
Причина, по которой мне это трудно понять, заключается в следующем. Скажем, одно из утверждений относится к функции addTricky(x, y)
, которая реализована следующим образом:
function addTricky(x, y) {
if (y >= 1) return 3
return x + y
}
Тогда у меня было бы логическое выражение в некоторой логике, которое говорит: «до addTricky : z = 0. после z = addTricky(x, y) : y >= 1 -> z = 3 ; y ‹ 1 ; г = х + у".
По сути, пытаюсь ответить на вопрос о шаблонах. Если Sat(Φ) делает в основном то, что я только что сделал в этом логическом выражении, мне интересно, вызывает ли он когда-либо функцию addTricky
или он может делать все это как-то символически. Я еще не понимаю, как это работает, и мне интересно, можно ли немного объяснить основы того, как работает символическое выполнение. Я продолжаю представлять, как он выполняет какое-то модульное тестирование, например, подключает addTricky(1, 1)
и проверяет все возможности. Может быть, это «эксплицитное исследование состояния» по сравнению с символическим исследованием, не уверен.
Большое спасибо за помощь!
(1) Для каждого узла дерева разбора, т. е. для каждой подформулы Ψ формулы Φ, вычисляется множество Sat(Ψ) состояний, для которых выполняется Ψ.
(2) Sat(a) = {s ∈ S | a ∈ L(s)}, for any a ∈ A