我从Coq开始并试图将Automated Amortised Analysis正式化。我在引理4.13:
Lemma preservation : forall (Sigma : prog_sig) (Gamma : context) (p : program)
(s : stack) (h h' : heap) (e : expr) (c : type0) (v : val),
(* 4.1 *) has_type Sigma Gamma e c ->
(* 4.2 *) eval p s h e v h' ->
(* 4.3 *) mem_consistant_stack h s Gamma ->
(* 4.a *) mem_consistant h' v c /\ (* 4.b *) mem_consistant_stack h' s Gamma.
Proof.
intros Sigma Gamma p s h h' e c v WELL_TYPED EVAL.
手动校样使用双重感应:
证明。请注意,权利要求(4.b)直接遵循引理4.8和引理 4.12。每个位置l∈dom(H)要么保持不变,要么被值Bad覆盖,因此不会使内存无效 一致性。
然而,第一项索赔(4.a)要求提供证明 对(4.2)和(4.1)的推导长度的归纳有序 按字典顺序推导评估 优先于打字派生。这是必需的,因为 仅仅打字输出的长度就会失败 函数应用程序的情况:为了允许递归 函数,应用程序的类型规则是依赖的终端规则 为程序签名中的函数指定的类型。然而, 证明这一案件需要在声明身上进行归纳 函数是良好类型的,这肯定是一种类型推导 更长的(即长于一步),禁止我们 使用归纳假设。注意在这种特殊情况下 评估语句的派生长度确实减少了。 仅对前提(4.2)的推导长度的归纳 同样失败。考虑推导前提的最后一步 (4.1)通过应用结构规则得出,然后是 (4.2)的推导长度保持完全相同,而 前提(4.1)的推导长度确实减少了一步。
在按字典顺序排列的长度类型上使用感应 和评估推导允许我们使用归纳假设 如果前提的推导长度(4.2)是 缩短或者前提(4.2)的推导长度是否仍然存在 在打字派生的长度减少的同时不变。我们 首先处理打字派生的最后一步的情况 通过应用结构规则获得,这是所有情况 这使得评估的推导长度保持不变。 然后我们继续考虑剩下的案例 604.3由于剩余的类型规则,最后应用于导出前提(4.2)的评估规则的操作语义 是所有语法指导,因此明确地确定 应用评估规则。
如何在Coq中进行这种“双重归纳”?
我尝试了induction EVAL; induction WELL_TYPED
,但获得了418个子目标,其中大部分是无法修复的。
我还尝试从induction EVAL
开始并稍后使用induction WELL_TYPED
,但在类似的情况下陷入困境。
答案 0 :(得分:0)
我同意@jbapple的最小例子更好。也就是说,你可能只是错过了推导长度的概念。请注意,通过对谓词的归纳证明的通常概念实际上实现了一些接近归纳的东西,但不完全。
我建议您展示两个新的谓词eval_n
和
has_type_n
表示与eval
相同的has_type
和eval a1 .. ak <-> exists n, eval_n a1 .. ak n
,但带有含义的额外参数&#34; ...并且派生的大小为&#34;。有几种方法可以定义 size ,但我怀疑身高对你来说已经足够了。
然后你可以证明
has_type a1 .. ak <-> exists n, has_type a1 .. ak n
和
forall p : nat * nat, forall a1 ... ak, eval_n a1 .. ak (fst p) ->
has_type_n a1 .. ak (snd p) -> YOUR GOAL
然后你应该能够证明
Wellfounded
通过对自然数对的有根据的归纳,使用库Lexicographic_Product.v
的词汇顺序构造(我建议库eval_n
,对于只有成对的自然数字来说,它有点过分,但是你只需要找到正确的实例化。)
这将是不实用的,因为归纳假设只会引用对
与词汇顺序相当的数字,你将不得不对有关has_type_n
和docker inspect ingress-endpoint
的假设进行反转,但这应该通过。
可能存在一个更简单的解决方案,但由于缺乏更多信息,我只能提出大枪。