le的归纳原理

时间:2019-03-16 12:32:56

标签: coq agda induction parametric-polymorphism

对于归纳类型nat,生成的归纳原理在其语句中使用构造函数OS

Inductive nat : Set :=  O : nat | S : nat -> nat

nat_ind
 : forall P : nat -> Prop,
   P 0 ->
   (forall n : nat, P n -> P (S n)) -> forall n : nat, P n

但是对于le,生成的语句不使用构造函数le_nle_S

Inductive le (n : nat) : nat -> Prop :=
le_n : n <= n | le_S : forall m : nat, n <= m -> n <= S m

le_ind
 : forall (n : nat) (P : nat -> Prop),
   P n ->
   (forall m : nat, n <= m -> P m -> P (S m)) ->
   forall n0 : nat, n <= n0 -> P n0

但是可以陈述和证明归纳原理遵循与nat相同的形状:

Lemma le_ind' : forall n (P : forall m, le n m -> Prop),
P n (le_n n) ->
(forall m (p : le n m), P m p -> P (S m) (le_S n m p)) ->
forall m (p : le n m), P m p.
Proof.
fix H 6; intros; destruct p.
apply H0.
apply H1, H.
apply H0.
apply H1.
Qed.

我猜生成的一个更方便。但是,Coq如何为其生成的感应原理选择形状?如果有任何规则,我无法在参考手册中找到它们。像Agda这样的其他证明助手呢?

2 个答案:

答案 0 :(得分:1)

您可以使用命令Scheme(请参阅documentation)来手动为归纳类型生成归纳原理。

命令有两种形式:

  • Scheme scheme := Induction for Sort Prop生成标准的归纳方案。
  • Scheme scheme := Minimality for Sort Prop生成简化的归纳方案,更适合归纳谓词。

如果在Type中定义归纳类型,则生成的归纳原理是第一类。如果您在Prop中定义归纳类型(即归纳谓词),则生成的归纳原理是第二种。

要获得在le情况下所需的归纳原理,可以在Type中对其进行定义:

Inductive le (n : nat) : nat -> Type :=
| le_n : le n n
| le_S : forall m : nat, le n m -> le n (S m).

Check le_ind.
(* forall (n : nat) (P : forall n0 : nat, le n n0 -> Prop),
   P n (le_n n) ->
   (forall (m : nat) (l : le n m), P m l -> P (S m) (le_S n m l)) ->
   forall (n0 : nat) (l : le n n0), P n0 l
*)

或者您可以手动要求Coq生成预期的归纳原理:

Inductive le (n : nat) : nat -> Prop :=
| le_n : le n n
| le_S : forall m : nat, le n m -> le n (S m).

Check le_ind.
(* forall (n : nat) (P : nat -> Prop),
   P n ->
   (forall m : nat, le n m -> P m -> P (S m)) ->
   forall n0 : nat, le n n0 -> P n0
*)

Scheme le_ind2 := Induction for le Sort Prop.
Check le_ind2.
(* forall (n : nat) (P : forall n0 : nat, le n n0 -> Prop),
   P n (le_n n) ->
   (forall (m : nat) (l : le n m), P m l -> P (S m) (le_S n m l)) ->
   forall (n0 : nat) (l : le n n0), P n0 l
*)

答案 1 :(得分:-1)

这是因为le_Sle_n被扩展了。

le_ind
 : forall (n : nat) (P : nat -> Prop),
   P n ->                                         1) le_n case
   (forall m : nat, n <= m -> P m -> P (S m)) ->  2) le_S case
   forall n0 : nat, n <= n0 -> P n0

n <= n0可以通过两种方式构造:

  1. 通过le_n,您有n <= n。您必须显示P n。由于您在构造函数中没有任何含义,因此您没有任何前提。
  2. 通过le_S。因此,您拥有n <= m -> n <= S m。您要显示P (S m)。由于您拥有n <= m,因此可以假设n <= m和(归纳假设)P m是正确的。