Coq:添加“强感应”策略

时间:2014-01-02 13:15:49

标签: 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.

我设法证明这个定理没有太多困难。现在我想在一个新的策略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无关),我不知道第二个目标意味着什么。

1 个答案:

答案 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。您应该在inductionintro之前使用split