Logic 用SPIN进行LTL模型检验

Logic 用SPIN进行LTL模型检验,logic,formal-verification,model-checking,spin,promela,Logic,Formal Verification,Model Checking,Spin,Promela,我正在看SPIN软件。我想用它来寻找LTL理论的模型。所有的手册和教程都谈到了验证算法的属性,但我对此一点都不感兴趣。我只是想找到LTL公式的模型(我想是一个对应的Büchi自动机),就像mace4或paradox模型检查器可以找到FOL公式的模型一样。我相信SPIN应该能够做到这一点,但我无法在文档中找到如何做到这一点。有人能指出一些有用的资源吗?为了从LTL公式生成Buchi自动机,您可以使用该工具。该工具可以提供Buchi自动机的图形表示或Promela代码版本,如下例所示: ~$ ./l

我正在看SPIN软件。我想用它来寻找LTL理论的模型。所有的手册和教程都谈到了验证算法的属性,但我对此一点都不感兴趣。我只是想找到LTL公式的模型(我想是一个对应的Büchi自动机),就像mace4或paradox模型检查器可以找到FOL公式的模型一样。我相信SPIN应该能够做到这一点,但我无法在文档中找到如何做到这一点。有人能指出一些有用的资源吗?

为了从LTL公式生成Buchi自动机,您可以使用该工具。该工具可以提供Buchi自动机的图形表示或Promela代码版本,如下例所示:

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

~$ spin -f "[] (q1 -> ! q0)" 
never  {    /* [] (q1 -> ! q0) */
accept_init:
T0_init:
    do
    :: (((! ((q0))) || (! ((q1))))) -> goto T0_init
    od;
}
然而,与ltl2ba相比,Spin在生成源代码时似乎并没有简化Buchi自动机,使得有时难以解释其输出例如尝试运行
spin-f“([]q0)和&(!q0)”
并将输出自动机与使用ltl2ba获得的自动机进行比较


编辑

您现在可以在SoInstitution forltl2ba的网站中使用,例如:

~$ 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
}
~$gltl2ba.py-f“([]p0)| |(p1)”-g
从不{/*([]p0)| |(p1)*/
T0_init:
如果
::(1)->转到T0_S1
::(p1)->转到全部接受
:(p0)->转到接受
fi;
T0_S1:
如果
::(1)->转到T0_S1
::(p1)->转到全部接受
fi;
接受_S2:
如果
:(p0)->转到接受
fi;
全部接受:
跳过
}
生成以下图形:


我不确定我是否理解你的问题。但是如果你想从ltl公式生成一个Buchi自动机,你可以使用谢谢,这正是我想要的。这可能也与你的需求有关。谢谢。是否有一种简单的方法可以像在线工具一样将输出转换为点/PNG图形?
ltl2ba-d
的输出能否以某种方式更改为点?@user1747134在我看来,最简单、最可靠的方法是为生成的Promela代码编写一个简单的解析器/脚本。使用
-d
获得的输出似乎不完整,例如,它没有明确说明init状态是否接受。
~$ 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
}