(* Test inductive types with local definitions (arity) *)
Inductive eq1 : forall A:Type, let B:=A in A -> Prop :=
refl1 : eq1 True I.
Check fun (P : forall A : Type, let B := A in A -> Type) (f : P True I) (A : Type) => let B := A in fun (a : A) (e : eq1 A a) => match e in (@eq1 A0 B0 a0) return (P A0 a0) with
| refl1 => f end.
Inductive eq2 (A:Type) (a:A)
: forall B C:Type, let D:=(A*B*C)%type in D -> Prop :=
refl2 : eq2 A a unit bool (a,tt,true).
(* Check inductive types with local definitions (parameters) *)
Inductive A (C D : Prop) (E:=C) (F:=D) (x y : E -> F) : E -> Set :=
I : forall z : E, A C D x y z.
Check
(fun C D : Prop => let E := C in let F := D in fun (x y : E -> F) (P : forall c : C, A C D x y c -> Type)
(f : forall z : C, P z (I C D x y z)) (y0 : C)
(a : A C D x y y0) => match a as a0 in (A _ _ _ _ y1) return (P y1 a0) with
| I _ _ _ _ x0 => f x0 end).
Record B (C D : Set) (E:=C) (F:=D) (x y : E -> F) : Set := {p : C; q : E}.
Check
(fun C D : Set => let E := C in let F := D in fun (x y : E -> F) (P : B C D x y -> Type)
(f : forall p0 q0 : C, P (Build_B C D x y p0 q0))
(b : B C D x y) => match b as b0 return (P b0) with
| Build_B _ _ _ _ x0 x1 => f x0 x1 end).
(* Check inductive types with local definitions (constructors) *)
Inductive I1 : Set := C1 (_:I1) (_:=0).
Check (fun x:I1 => match x with
| C1 i n => (i,n) end).
(* Check implicit parameters of inductive types (submitted by Pierre
Casteran and also implicit in BZ#338) *)
SetImplicitArguments. Unset Strict Implicit.
CoInductive LList (A : Set) : Set :=
| LNil : LList A
| LCons : A -> LList A -> LList A.
Arguments LNil {A}.
Inductive Finite (A : Set) : LList A -> Prop :=
| Finite_LNil : Finite LNil
| Finite_LCons : forall (a : A) (l : LList A), Finite l -> Finite (LCons a l).
(* An example with reduction removing an occurrence of the inductive type in one of its argument *)
Inductive IND1 (A:Type) := CONS1 : IND1 ((fun x => A) IND1).
(* These types were considered as ill-formed before March 2015, while they
could be accepted considering that the type IND1 above was accepted *)
Inductive IND2 (A:Type) (T:=fun _ : Type->Type => A) := CONS2 : IND2 A -> IND2 (T IND2).
Inductive IND3 (A:Type) (T:=fun _ : Type->Type => A) := CONS3 : IND3 (T IND3) -> IND3 A.
Inductive IND4 (A:Type) := CONS4 : IND4 ((fun x => A) IND4) -> IND4 A.
(* This type was ok before March 2015 *)
Inductive IND5 (A : Type) (T := A) : Type := CONS5 : IND5 ((fun _ => A) 0) -> IND5 A.
(* An example of nested positivity which was rejected by the kernel before 24 March 2015 (even with Unset Elimination Schemes to avoid the _rect bug) due to the wrong computation of non-recursively
uniform parameters in list' *)
Inductive list' (A:Type) (B:=A) :=
| nil' : list' A
| cons' : A -> list' B -> list' A.
Inductive tree := node : list' tree -> tree.
(* This type was raising an anomaly when building the _rect scheme, because of a bug in Inductiveops.get_arity in the presence of
let-ins and recursively non-uniform parameters. *)
Inductive L (A:Type) (T:=A) : Type := C : L nat -> L A.
(* This type was raising an anomaly when building the _rect scheme, because of a wrong computation of the number of non-recursively uniform parameters when conversion is needed, leading the example to
hit the Inductiveops.get_arity bug mentioned above (see #3491) *)
Inductive IND6 (A:Type) (T:=A) := CONS6 : IND6 T -> IND6 A.
Module TemplateProp.
(** Check lowering of a template universe polymorphic inductive to Prop *)
Inductive Foo (A : Type) : Type := foo : A -> Foo A.
Check Foo True : Prop.
End TemplateProp.
Module PolyNoLowerProp.
(** Check lowering of a general universe polymorphic inductive to Prop is _failing_ *)
Polymorphic Inductive Foo (A : Type) : Type := foo : A -> Foo A.
Fail Check Foo True : Prop.
End PolyNoLowerProp.
(* Test building of elimination scheme with noth let-ins and
non-recursively uniform parameters *)
Module NonRecLetIn.
UnsetImplicitArguments.
Inductive Ind (b:=2) (a:nat) (c:=1) : Type :=
| Base : Ind a
| Rec : Ind (S a) -> Ind a.
Check Ind_rect (fun n (b:Ind n) => b = b)
(fun n => eq_refl)
(fun n b c => f_equal (Rec n) eq_refl) 0 (Rec 0 (Base 1)).
End NonRecLetIn.
(* Test treatment of let-in in the definition of Records *) (* Should fail with "Sort expected" *)
Fail Inductive foo (T : Type) : let T := Type in T :=
{ r : forall x : T, x = x }.
Module Discharge. (* discharge test *) Section S. Let x := Prop. Inductive foo : x := bla : foo. End S. Check bla:foo.
Section S. Variables (A:Type). (* ensure params are scanned for needed section variables even with template arity *)
#[universes(template)] Inductive bar (d:A) := . End S. Check @bar nat 0. End Discharge.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.