考虑以下归纳定义,描述受保护命令语言的小步语义:
inductive small_step :: "com × state ⇒ com × state ⇒ bool" (infix "→" 55)
where
Assign: "(x ::= a, s) → (SKIP, s(x := aval a s))" |
Seq1: "(SKIP;;c2,s) → (c2,s)" |
Seq2: "(c1,s) → (c1',s') ⟹ (c1;;c2,s) → (c1';;c2,s')" |
IfBlock: "(b,c) ∈ set gcs ⟹ bval b s ⟹ (IF gcs FI,s) → (c,s)" |
DoTrue: "(b,c) ∈ set gcs ⟹ bval b s ⟹ (DO gcs OD,s) → (c;;DO gcs OD,s)" |
DoFalse: "(∀ b c. (b,c) ∈ set gcs ⟶ ¬ bval b s) ⟹ (DO gcs OD,s) → (SKIP,s)"
我想证明:
lemma "((c1 ;; c2) ;; c3) ~ (c1 ;; (c2 ;; c3))"
其中:
definition equiv_c :: "com ⇒ com ⇒ bool" (infix "~" 50) where
"c ~ c' ≡ ∀ s c0 s0. (c,s) → (c0,s0) = (c',s) → (c0,s0)"
令人惊讶的是,这样做变得异常困难。我发现的最接近的解决方案在Johan J. Lukkien的“警卫命令语言的操作语义”中给出。但是,在那篇文章中,程序被建模为状态序列,而在这里,我将其建模为命令配置以及状态。也许两者之间有关系,但到目前为止,我的尝试一直受挫。
您看到在Isabelle中证明这一引理的方法吗?
答案 0 :(得分:1)
所需的引理不成立。因此,您将无法证明这一点。我可以看到两个主要问题:
→
表示执行的一个步骤,但是等效应该讨论整个行为,而不仅仅是一个步骤。第一步之后,结果程序可能仍然不同。
某些程序(例如IF [] FI
)的语义可能会卡住。如果您想对其余程序c0
说些话,这种卡住的状态将很难说明等效性。例如,在引理中使用c1 = SKIP;; IF [] FI
并在c2 = c3 = SKIP
中输入。这样,从(c1 ;; c2) ;; c3
可以到达的部分评估的命令与从c1 ;; (c2 ;; c3)
可以到达的命令没有相同。
我建议您首先弄清楚程序的行为。在一段时间内,这通常是可到达的最终状态和可能不终止的集合。然后,您必须确定您对哪种等效性感兴趣。通常,人们会关注痕量等效性或双向模拟,这与非确定性程序并不相同。等价概念将决定如何证明这种引理。