Вы можете вручную создать принцип индукции для индуктивного типа, используя команду Scheme
(см. Документацию ).
Команда поставляется в двух вариантах:
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
*)