Проверка модели LTL с помощью SPIN

Я смотрю на программное обеспечение SPIN. Я хотел бы использовать его для поиска моделей теорий LTL. Во всех руководствах и туториалах говорится о проверке свойств алгоритмов, но меня это совершенно не интересует. Я просто хочу найти модели формул LTL (я полагаю, соответствующий автомат Бюхи), так же, как программы проверки моделей Mace4 или Paradox могут найти модели формул FOL. Я считаю, что SPIN должен это делать, но я не могу найти, как это сделать в документации. Может ли кто-нибудь указать на какие-либо полезные ресурсы?


person user1747134    schedule 02.08.2017    source источник
comment
Я не уверен, что понимаю ваш вопрос. Но если вы хотите сгенерировать автомат Бучи из формулы ltl, вы можете использовать эту   -  person Patrick Trentin    schedule 02.08.2017
comment
Спасибо, это очень то, что я искал.   -  person user1747134    schedule 02.08.2017
comment
Этот вопрос/ответ может быть связан с вашим тоже нуждается.   -  person Patrick Trentin    schedule 02.08.2017


Ответы (1)


Чтобы сгенерировать автомат Бючи из формулы LTL, вы можете использовать ltl2ba инструмент. Инструмент может предоставить графическое представление автомата Buchi или его кодовую версию Promela, как в следующем примере:

~$ ./ltl2ba -f "([] q0) && (<> ! q0)"
never {    /* ([] q0) && (<> ! q0) */
T0_init:
    false;
}

Вы также можете использовать Spin для создания Promela версии Buchi Automaton с помощью команды:

~$ spin -f "LTL_FORMULA"

например:

~$ spin -f "[] (q1 -> ! q0)" 
never  {    /* [] (q1 -> ! q0) */
accept_init:
T0_init:
    do
    :: (((! ((q0))) || (! ((q1))))) -> goto T0_init
    od;
}

Однако, в отличие от ltl2ba, Spin не упрощает автомат Бучи при создании исходного кода, что иногда затрудняет интерпретацию его вывода; например, попробуйте запустить spin -f "([] q0) && (<> ! q0)" и сравните автомат вывода с тем, который получен с помощью ltl2ba.


ИЗМЕНИТЬ

Теперь вы можете использовать gltl2ba в сочинении для ltl2ba веб-сайт, например:

~$ gltl2ba.py -f "([] p0) || (<> p1)" -g

never { /* ([] p0) || (<> p1) */
T0_init:
    if
    :: (1) -> goto T0_S1
    :: (p1) -> goto accept_all
    :: (p0) -> goto accept_S2
    fi;
T0_S1:
    if
    :: (1) -> goto T0_S1
    :: (p1) -> goto accept_all
    fi;
accept_S2:
    if
    :: (p0) -> goto accept_S2
    fi;
accept_all:
    skip
}

генерирует следующий график:

введите здесь описание изображения

person Patrick Trentin    schedule 02.08.2017
comment
Спасибо. Есть ли простой способ преобразовать вывод в график DOT/PNG, как в онлайн-инструменте? Можно ли как-то изменить вывод ltl2ba -d на DOT? - person user1747134; 03.08.2017
comment
@user1747134 user1747134 Самый простой и надежный способ сделать это, на мой взгляд, — написать простой синтаксический анализатор/скрипт для сгенерированного кода Promela. Вывод, полученный с помощью -d, не кажется полным, например. он явно не указывает, является ли состояние init приемлемым или нет. - person Patrick Trentin; 03.08.2017