在Isabelle中证明语义函数的可到达状态集是有限的

时间:2019-01-10 21:56:29

标签: isabelle

考虑以下属性:

lemma "finite {t. (c,s) ⇒ t}"

其中提到了以下大步骤语义:

inductive gbig_step :: "com × state ⇒ state ⇒ bool" (infix "⇒" 55) 
where
  Skip: "(SKIP, s) ⇒ s"
| Assign: "(x ::= a, s) ⇒ s(x := aval a s)"
| Seq: "⟦(c1, s1) ⇒ s2;  (c2, s2) ⇒ s3⟧ ⟹ (c1;;c2, s1) ⇒ s3" 
| IfBlock: "⟦(b,c) ∈ set gcs; bval b s; (c,s) ⇒ s'⟧ ⟹ (IF gcs FI, s) ⇒ s'"
| DoTrue: "⟦(b,c) ∈ set gcs; bval b s1; (c,s1) ⇒ s2;(DO gcs OD,s2) ⇒ s3⟧ 
            ⟹ (DO gcs OD, s1) ⇒ s3"
| DoFalse: "⟦(∀ (b,c) ∈ set gcs. ¬ bval b s)⟧ ⟹ (DO gcs OD, s) ⇒ s" 

对我来说,很明显,该属性通过归纳在大阶跃关系上成立。但是,我无法将其排除在外,因此无法有效地引入它。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

有限性是没有什么可以用归纳谓词的归纳规则直接证明的。问题在于,查看单个运行(归纳规则也是如此)并没有说明分支行为,对于分支语句,分支行为也必须是有限的。

我看到两种证明有限性的方法:

  1. 在Isabelle / HOL中将派生树明确建模为数据类型,并证明它足以表示归纳法后面的派生树。然后证明树上有有限的叶子(通过对树的归纳法)。如果您设计数据类型以使叶子中的状态成为类型参数,那么数据类型包所生成的相应set函数就是您要证明是有限的。 (请注意,您不能通过set函数的归纳规则证明有限性,因为那又将是一次运行。)

  2. 查看归纳定义的内部构造。它被定义为功能的最小固定点。通过将归纳定义放入声明[[inductive_internals]]的上下文中,可以访问这些内部函数。然后,您可以证明该函数可以一步完成保留有限性,然后通过归纳将其提升。

两种方法中的证明论点是相似的。 #1中的显式数据类型仅简化了#2的fixpoint参数。因此,您可以将#1视为#2的深层嵌入。当然,您也可以仅从引入和归纳定理重新推导内部构造(以更合适的格式),然后按照方法2进行。

由于您的语义很小,我会尝试精确地做到这一点。对于大型现实世界语义,花一些精力使ML中的步骤2自动化可能是有意义的。