如何在Promela中将LTL转换为Automato - SPIN?

时间:2016-08-05 02:48:35

标签: model-checking spin promela

如何在PROMELA中将LTL转换为自动机?我知道使用命令SPIN -f" ltl x"有可能将LTL转变为永不索赔,但我想要LTL的自动机而不是否定。这是正确的如果我之前否定LTL产生永不索赔。谁能帮我?

1 个答案:

答案 0 :(得分:1)

Spin 生成与 Buchi Automaton 相当的 Promela 代码,该代码与 LTL公式相匹配,并包围它进入从不块。

来自docs

  

NAME never - 宣布暂时声明。

     

语法从不{sequence}

     

描述永不声明可用于定义系统行为,   无论出于何种原因,都特别感兴趣。它是最常用的   指定永远不会发生的行为。该声明被定义为   系统状态上的一系列命题或布尔表达式   必须在为行为指定的序列中变为真   兴趣相匹配。

因此,如果您希望查看与给定 LTL公式匹配的代码,您只需输入:

~$ spin -f "LTL_FORMULA"

<强> e.g:

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

获取相同代码的另一种方法,以及 Buchi Automaton 的图形表示,是follow this link

查看你的评论this other你的问题,看来你想检查两个 LTL公式 p g 相互矛盾,也就是说满足 p 的模型是否必然会违反 g 反之亦然。

理论上 可以使用 spin 来完成。但是,此工具不会简化 Buchi Automaton 的代码,因此难以处理其输出。

我建议您下载 LTL2BA (在以下link)。要进行设置,只需解压缩 tar.gz 文件并在控制台中输入 make 即可。

让我们看一个用法示例:

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

由于[] q0<> ! q0相互矛盾,返回的 Buchi自动机 为空 [nb:by empty 我的意思是它没有接受执行]。在这种情况下,代码永远不会{false; Buchi Automaton 规范形式,没有任何接受执行。

免责声明:将输出与 never {false} 进行比较以确定 Buchi Automaton 是否为空,可能会导致简化步骤无法以规范形式转换所有自动机,则会产生结果。