证明Isabelle中顺序组成的关联性

时间:2019-01-04 22:49:28

标签: semantics isabelle

考虑以下归纳定义,描述受保护命令语言的小步语义:

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中证明这一引理的方法吗?

1 个答案:

答案 0 :(得分:1)

所需的引理不成立。因此,您将无法证明这一点。我可以看到两个主要问题:

  1. 表示执行的一个步骤,但是等效应该讨论整个行为,而不仅仅是一个步骤。第一步之后,结果程序可能仍然不同。

  2. 某些程序(例如IF [] FI)的语义可能会卡住。如果您想对其余程序c0说些话,这种卡住的状态将很难说明等效性。例如,在引理中使用c1 = SKIP;; IF [] FI并在c2 = c3 = SKIP中输入。这样,从(c1 ;; c2) ;; c3可以到达的部分评估的命令与从c1 ;; (c2 ;; c3)可以到达的命令没有相同。

我建议您首先弄清楚程序的行为。在一段时间内,这通常是可到达的最终状态和可能不终止的集合。然后,您必须确定您对哪种等效性感兴趣。通常,人们会关注痕量等效性或双向模拟,这与非确定性程序并不相同。等价概念将决定如何证明这种引理。