如何比较两个LTL以确定是否可以相互矛盾?我问这个是因为我有一个分层状态机和LTL描述每个状态的行为。我需要知道本地LTL是否可以与全局LTL相抵触。我在文章'特征规范和自动冲突检测'中看到,如果L(f)交点L(g)为空,则两个LTL属性f和g不一致。这正是模型检查问题,f为程序,¬g为属性。谁能帮我这个?如何将LTL f转换为SPIN / Promela中的程序?
感谢。
答案 0 :(得分:1)
以下适用于我。 (警告:我在官方文档中没有看到这一点。这可能意味着还有其他更好的方法可以做到这一点。或者说我看起来不够努力。)
我们想检查[] <> p && [] <> q
是否暗示<> (p && q)
。 (事实并非如此。)
编写一个可以执行所有转换的简单流程P
,并将声明写为LTL属性A
。
bool p; bool q;
active proctype P () {
do :: d_step { p = false; q = false }
:: d_step { p = false; q = true }
:: d_step { p = true; q = false }
:: d_step { p = true; q = true }
od
}
ltl A { (([] <> p) && ([] <> q)) -> <> (p && q) }
(编辑2016年11月1日:这可能不正确,因为我们可能会因为隐藏的初始状态而错过某些转换,请参阅how to make a non-initialised variable in Spin?)
然后将其放在文件check.pml
和
spin -a check.pml
cc pan.c -o pan
./pan -a -n
./pan -r check.pml.trail -v
显示了一个否定声明的模型(最终定期跟踪p
和q
经常无效,但p && q
永远不会。)
仔细检查:将声明中的结论更改为<> (p || q)
,然后没有反问题,证明其含义有效。
在您的情况下,声明为! (f && g)
(它们不应同时为真。)
可能有一些聪明的方法可以使琐碎过程的代码更小。
此外,第三个命令实际上是./pan -a -i -n
(-i
以查找最短的示例),但它会发出警告。它确实找到了一个更短的周期。