Coq:添加"强感应"策略

Gad*_*i A 4 coq

对自然数的"强"(或"完全")归纳意味着当在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.
Run Code Online (Sandbox Code Playgroud)

我设法证明这个定理没有太多困难.现在我想在一个新的策略strong_induction中使用它,它应该类似于自然数字上的标准"感应n"技术.回想当使用"感应n"时,当n是自然数并且目标是P(n)时,我们得到两个目标:形式P(0)之一和形式P(S(n))中的第二个,对于第二个目标,我们得到P(n)作为假设.

因此,当目前的目标是P(n)时,我希望得到一个新目标,也就是P(n),但新假设"forall k:nat,(k <n - > P(k)))".

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

exists q r : nat, a = b * q + r
Run Code Online (Sandbox Code Playgroud)

ab: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
Run Code Online (Sandbox Code Playgroud)

假设是无用的(因为n与a无关),我不知道第二个目标意味着什么.

小智 6

在这种情况下,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.
Run Code Online (Sandbox Code Playgroud)

你也可以直接使用refine战术.这种战术类似于apply战术.

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

但这种induction策略已经处理了任意的归纳原则.

Goal forall a b, b <> 0 -> exists ! q r, a = q * b + r /\ r < b.
induction a using strong_induction.
Run Code Online (Sandbox Code Playgroud)

更多关于这些策略的信息.您应该在使用induction之前使用intro-ing和split-ing.

  • 当更改过于复杂时,您可以尝试使用“替换”策略,该策略将要求提供相等性证明。当证明是简单的自反性时,“改变”只是“替换”。 (2认同)