在SPIN ltl公式中使用(U)ntil运算符

时间:2017-08-17 08:10:48

标签: model-checking spin promela

我试图了解如何在ltl公式中正确使用Until运算符。我发现this定义(下面)很清楚:

  

û NTIL

     

U B:如果存在i,则为true:

     
      
  • B在[s i ,s i + 1 ,s i + 2 中为真,......   ]

  •   
  • 对于所有j,使得0≤j<1。 i,公式A在[s j ,s j + 1 ,s j + 2 中为真,   ......]

  •   
     

含义:

     
      
  • B在时间我是

  •   
  • 对于介于0和i-1之间的时间,公式A为真

  •   
     

仍在使用“在时间我真实”的形式化

示例代码包含示例ltl formula:

mtype = {Regular, Reverse, Quit}

mtype state = Regular;

init {
do ::
   if
   ::state == Regular -> state = Reverse
   ::state == Reverse -> state = Quit
   ::state == Quit -> break
   fi
od
}

ltl p0 { [] ((state == Reverse) U (state != Reverse))}

根据我给出的until运算符的定义,我不明白上面的ltl公式是如何产生任何错误的。在state == Reverse之前,state != Reverse不能一直都是真的吗?最初是state == Regular

运行测试后的下面是SPIN输出:

(Spin Version 6.4.6 -- 2 December 2016)
    + Partial Order Reduction

Full statespace search for:
    never claim             + (p0)
    assertion violations    + (if within scope of claim)
    acceptance   cycles     + (fairness disabled)
    invalid end states  - (disabled by never claim)

State-vector 28 byte, depth reached 13, errors: 0
        9 states, stored (11 visited)
        2 states, matched
       13 transitions (= visited+matched)
        0 atomic steps
hash conflicts:         0 (resolved)

Stats on memory usage (in Megabytes):
    0.000   equivalent memory usage for states (stored*(State-vector + overhead))
    0.288   actual memory usage for states
  128.000   memory used for hash table (-w24)
    0.534   memory used for DFS stack (-m10000)
  128.730   total actual memory usage


unreached in init
    (0 of 12 states)
unreached in claim p0
    _spin_nvr.tmp:14, state 20, "-end-"
    (1 of 20 states)

pan: elapsed time 0 seconds

1 个答案:

答案 0 :(得分:1)

STRONG UNTIL

正式定义是:

  

M,s k ⊨φUψ

     

&LT; - &GT;

     

∃j∈N。

     
      
  1. (j≥k)∧

  2.   
  3. ∀i∈N。 ((k≤i&lt; j)⇒(&lt; s i ,s i + 1 &gt;∈R t ))∧< / p>

  4.   
  5. (M,s j ⊨ψ)∧

  6.   
  7. ∀i∈N。 ((k≤i i ⊨φ))

  8.         

    ,其中

         
        
    • M是Kripke Structure

    •   
    • R t 是过渡关系

    •   

说明:

  • 条件(1) - (2)强制执行状态序列(s k ,s k + 1 ,. ..,s j ,...)是转换系统的有效执行路径,可以在其上评估 ltl 公式。

  • 条件(3)强制ψ保留在s j

  • 条件(4)强制ϕ保持任何状态s i 位于路径上s k (包括)直到s j (不包括)

由于false前提的含义始终为true,因此条件(4)中的逻辑含义非常符合 适用于i范围之外的任何[k, j)。每当选择j等于k时,就像在您的问题中一样,范围[k, j) = [k, k)为空,并且i的任何选择都位于所述间隔之外。在这种情况下,无论M, s ⊨ ϕ为某些s保留(或不是)这一事实,条件(4)对于任何选择都非常满意i并且它不再对执行路径施加任何约束(s k ,s k + 1 ,...,s j < / sub>,...)。换句话说,当j = k条件(4)不再对状态s k 上的属性ϕ U ψ的验证提供任何有意义的贡献时。

WEAK UNTIL

弱到之间的区别,特此用ϕ W ψ表示,而强到之间的区别是弱到也满足任何执行路径G (ϕ ∧ ¬ψ),而强,直到强制F ψ

示例分析

属性 p0

[] ((state == Reverse) U (state != Reverse))

需要 p1

((state == Reverse) U (state != Reverse))

保持系统的每个状态。为清晰起见,我将在两个组件中分解 p1 ,并将φ定义为等于state == Reverseψ等于{{ 1}}(注意:state != Reverse)。

为简化起见,我们假设您的系统由以下三种状态组成:

  • s_0 :常规状态,也恰好是初始状态
  • s_1 :反向状态
  • s_2 :最终状态

为了保持 p0 p1 必须适用于这些状态。

  • 状态 s_0 属性ψ成立,因此 p1 也适用ϕ <-> !ψ等于 0
  • 状态 s_1 属性ψj。但是,我们认为φ s_1 中保持,而ψ s_2 中保留,这是它的直接,并且仅接班人。因此 s_1 属性 p1
  • 状态 s_2 属性ψfalse,因此 p1 再次得到满足。