考虑以下属性:
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"
对我来说,很明显,该属性通过归纳在大阶跃关系上成立。但是,我无法将其排除在外,因此无法有效地引入它。
我该怎么办?
答案 0 :(得分:3)
有限性是没有什么可以用归纳谓词的归纳规则直接证明的。问题在于,查看单个运行(归纳规则也是如此)并没有说明分支行为,对于分支语句,分支行为也必须是有限的。
我看到两种证明有限性的方法:
在Isabelle / HOL中将派生树明确建模为数据类型,并证明它足以表示归纳法后面的派生树。然后证明树上有有限的叶子(通过对树的归纳法)。如果您设计数据类型以使叶子中的状态成为类型参数,那么数据类型包所生成的相应set函数就是您要证明是有限的。 (请注意,您不能通过set函数的归纳规则证明有限性,因为那又将是一次运行。)
查看归纳定义的内部构造。它被定义为功能的最小固定点。通过将归纳定义放入声明[[inductive_internals]]
的上下文中,可以访问这些内部函数。然后,您可以证明该函数可以一步完成保留有限性,然后通过归纳将其提升。
两种方法中的证明论点是相似的。 #1中的显式数据类型仅简化了#2的fixpoint参数。因此,您可以将#1视为#2的深层嵌入。当然,您也可以仅从引入和归纳定理重新推导内部构造(以更合适的格式),然后按照方法2进行。
由于您的语义很小,我会尝试精确地做到这一点。对于大型现实世界语义,花一些精力使ML中的步骤2自动化可能是有意义的。