Isabelle / Simpl:两次调用程序

时间:2014-03-31 20:00:00

标签: isabelle

过去一个月左右,我一直在阅读和使用Isabelle / Simpl。我写过并证明了一些理论。我还写了以下Isabelle / Simpl理论,说明了我目前的问题。

theory MemTest imports HeapList Vcg begin

hoarestate globals_memory =
  alloc :: "ref list"
  free :: nat

hoarestate globals_x = globals_memory +
  X :: "ref ⇒ int"

definition sz where "sz == 1::nat"

procedures (imports globals_x)
  testerX(x :: int | result :: ref) 
  "
    ´result :== NEW sz [ ´X :== 0 ];;
    ´result→´X :== ´x
  "
lemma (in testerX_impl) testerX_spec:
"
  ∀x. Γ ⊢⇩t ⦃´x = x ∧ sz ≤ ´free ⦄
             ´result :== PROC testerX(´x)
           ⦃´result ≠ Null ∧ ´result→´X = x⦄
"
  apply(vcg)
  apply(auto)
done    

procedures (imports globals_x)
  testerXcaller(Y::ref, Z::ref)
  "
    ´Y :== CALL testerX(5);;
    ´Z :== CALL testerX(2)
  "
lemma (in testerXcaller_impl) testerXcaller_spec:
  "
    ∀y z. Γ ⊢⇩t 
     ⦃ ´Y = y ∧ ´Z = z ∧ (sz + sz) ≤ ´free ⦄
     PROC testerXcaller(´Y, ´Z)
     ⦃ ´Y ≠ Null ∧ ´Z ≠ Null  ⦄
  "
  apply(vcg)
  apply(auto)
oops

end

在程序testerX内两次调用程序testerXcaller似乎阻碍了testerXcaller_spec引理的释放。应用vcgauto战术后的结果是一个奇怪的子目标,我不知道如何解除:

goal (1 subgoal):
  1. ⋀free X result x. sz + sz ≤ free ⟹ result ≠ Null ⟹ X result = 5 ⟹ sz ≤ x

有人愿意解决一些问题吗?

干杯, 乔治

1 个答案:

答案 0 :(得分:0)

testerX_spec的规范不足以传播可用空间的大小。实际上,如果你对其进行评论,那么testerXcaller_spec的证明就会讽刺地通过。

我从未使用过Simpl,但是通过阅读大纲文件,我在这个问题上一无所获。 free上的内容很少,所以我提出了自己的解决方案:

lemma (in testerX_impl) testerX_spec:
"
∀σ x.
 Γ ⊢⇩t ⦃σ. ´x = x ∧ sz ≤ ´free ⦄
         ´result :== PROC testerX(´x)
       ⦃´result ≠ Null ∧ ´result→´X = x ∧ ´result ∈ set ´alloc ∧ ´free =  ⇗σ⇖free - sz⦄
"
  apply(vcg)
  apply(auto)
done    

我说可用空间的大小减少了sz。我遇到的困难 - 因为我不熟悉Simpl--是在程序之前访问状态。这是通过σ完成的,需要进行普遍量化并在前提条件下引入。

我还补充说result已被分配事件,虽然在这种情况下并非绝对必要,但可能是。