Coq:添加“强归纳”策略

Posted

技术标签:

【中文标题】Coq:添加“强归纳”策略【英文标题】:Coq: adding a "strong induction" tactic 【发布时间】:2014-01-02 13:15:49 【问题描述】:

对自然数的“强”(或“完全”)归纳意味着在证明 n 上的归纳步骤时,您可以假设该性质对于任何 k 都成立

Theorem strong_induction:
forall P : nat -> Prop,
(forall n : nat, (forall k : nat, (k < n -> P k)) -> P n) ->
forall n : nat, P n.

我已经成功地证明了这个定理,没有太多困难。现在我想在一个新的策略中使用它,strong_induction,它应该类似于自然数上的标准“induction n”技术。回想一下,当 n 是自然数且目标是 P(n) 时使用“归纳 n”时,我们会得到两个目标:一个是 P(0) 形式,第二个是 P(S(n)) 形式,对于第二个目标,我们得到 P(n) 作为假设。

所以我想,当当前目标是 P(n) 时,得到一个新目标,也是 P(n),但是新假设“forall k : nat, (k P(k)) )”。

问题是我不知道如何在技术上做到这一点。我的主要问题是:假设 P 是一个复杂的语句,即

exists q r : nat, a = b * q + r

在上下文中使用 a b : nat;我如何告诉 Coq 在 a 而不是 b 上做强归纳?简单地做“应用strong_induction”会导致

n : nat
H0 : forall k : nat, k < n -> exists q r : nat, a = b * q + r
______________________________________(1/2)
exists q r : nat, a = b * q + r
______________________________________(2/2)
nat

假设没有用(因为 n 与 a 无关),我不知道第二个目标是什么意思。

【问题讨论】:

【参考方案1】:

在这种情况下,apply strong_induction 需要 change 目标的结论,以便它更好地匹配定理的结论。

Goal forall a b, b <> 0 -> exists ! q r, a = q * b + r /\ r < b.
change (forall a, (fun c => forall b, b <> 0 -> exists ! q r, c = q * b + r /\ r < b) a).
eapply strong_induction.

您也可以更直接地使用refine 策略。这种策略类似于apply 策略。

Goal forall a b, b <> 0 -> exists ! q r, a = q * b + r /\ r < b.
refine (strong_induction _ _).

induction 策略已经处理任意归纳原则。

Goal forall a b, b <> 0 -> exists ! q r, a = q * b + r /\ r < b.
induction a using strong_induction.

更多关于这些策略here。您可能应该在intro-ing 和split-ing 之前使用induction

【讨论】:

"induction a using strong_induction" 效果很好!另一方面,“改变”策略因“错误:不可转换”而失败。 当更改过于复杂时,您可以尝试使用replace 策略,它会要求提供相等性证明。 change 只是 replace 当证明是微不足道的反身性时。

以上是关于Coq:添加“强归纳”策略的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Coq 中使用归纳类型处理案例

Coq:如何添加有意义的提示?

Coq 证明策略

反转在 Coq 中产生意外的存在

使用 Coq 证明存在量词

在Vim中使用merlin在ocaml中开发coq插件