如何比较两个LTL?

时间:2015-11-02 18:24:16

标签: automata formal-verification model-checking spin promela

如何比较两个LTL以确定是否可以相互矛盾?我问这个是因为我有一个分层状态机和LTL描述每个状态的行为。我需要知道本地LTL是否可以与全局LTL相抵触。我在文章'特征规范和自动冲突检测'中看到,如果L(f)交点L(g)为空,则两个LTL属性f和g不一致。这正是模型检查问题,f为程序,¬g为属性。谁能帮我这个?如何将LTL f转换为SPIN / Promela中的程序?

感谢。

1 个答案:

答案 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

显示了一个否定声明的模型(最终定期跟踪pq经常无效,但p && q永远不会。)

仔细检查:将声明中的结论更改为<> (p || q),然后没有反问题,证明其含义有效。

在您的情况下,声明为! (f && g)(它们不应同时为真。)

可能有一些聪明的方法可以使琐碎过程的代码更小。

此外,第三个命令实际上是./pan -a -i -n-i以查找最短的示例),但它会发出警告。它确实找到了一个更短的周期。