过去一个月左右,我一直在阅读和使用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
引理的释放。应用vcg
和auto
战术后的结果是一个奇怪的子目标,我不知道如何解除:
goal (1 subgoal):
1. ⋀free X result x. sz + sz ≤ free ⟹ result ≠ Null ⟹ X result = 5 ⟹ sz ≤ x
有人愿意解决一些问题吗?
干杯, 乔治
答案 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
已被分配事件,虽然在这种情况下并非绝对必要,但可能是。