自然数上的“强”(或“完全”)归纳意味着当在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中使用它,它应该类似于自然数字上的标准“感应n”技术。回想当使用“感应n”时,当n是自然数并且目标是P(n)时,我们得到两个目标:形式P(0)之一和形式P(S(n))中的第二个,对于第二个目标,我们将P(n)作为假设。
所以我希望,当前目标是P(n)时,获得一个新目标,也是P(n),但新假设“forall k:nat,(k&lt; n - &gt; P(k) )))”。
问题是我不知道如何在技术上做到这一点。我的主要问题是:假设P是一个复杂的陈述,即
exists q r : nat, a = b * q + r
在上下文中使用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无关),我不知道第二个目标意味着什么。
答案 0 :(得分:5)
在这种情况下,要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。您应该在induction
和intro
之前使用split
。