Set Universe Polymorphism. Set Printing Universes. (* Unset Strict Universe Declaration. *)
(* universe binders on inductive types and record projections *) Inductive Empty@{uu} : Type@{uu} := . Print Empty.
Set Primitive Projections.
Record PWrap@{uu} (A:Type@{uu}) := pwrap { punwrap : A }. Print PWrap. Print punwrap.
Unset Primitive Projections.
Record RWrap@{uu} (A:Type@{uu}) := rwrap { runwrap : A }. Print RWrap. Print runwrap.
(* universe binders also go on the constants for operational typeclasses. *) Class Wrap@{uu} (A:Type@{uu}) := wrap : A. Print Wrap. Print wrap.
(* Instance in lemma mode used to ignore the binders. *)
#[global] Instance bar@{uu} : Wrap@{uu} Set. Proof. exact nat. Qed. Print bar.
Unset Strict Universe Declaration. (* The universes in the binder come first, then the extra universes in
order of appearance. *) Definition foo@{uu +} := Type -> Type@{v} -> Type@{uu}. Print foo.
CheckType@{i} -> Type@{j}.
Eval cbv in Type@{i} -> Type@{j}.
Set Strict Universe Declaration.
(* Binders even work with monomorphic definitions! *)
Monomorphic Definition mono@{uu} := Type@{uu}. Print mono. Check mono. CheckType@{mono.uu}.
Unset Strict Universe Declaration. (* the names used disappear, and fresh names are generated instead of exposing raw ints *) Let tt : Type@{uu} := Type@{v}.
#[clearbody] Let ff : Type@{uu}. Proof. exactType@{v}. Defined. Definition bobmorane := tt -> ff. End fooS. Print bobmorane. End SecLet.
(* fun x x => foo is nonsense with local binders *)
Fail Definition fo@{uu uu} := Type@{uu}.
(* Using local binders for printing. *) Print foo@{E M N}. (* Underscores discard the name if there's one. *) Print foo@{_ _ _}. (* Can use a name for multiple universes *) Print foo@{u u IMPORTANT}.
(* Also works for inductives and records. *) Print Empty@{E}. Print PWrap@{E}.
ModuleType SomeTyp. Definition inmod := Type. End SomeTyp. Module SomeFunct (In : SomeTyp). Definition infunct@{uu v} := In.inmod@{uu} -> Type@{v}. End SomeFunct. Module Applied := SomeFunct(SomeMod). Print Applied.infunct.
(* Multi-axiom declaration
InpolymorphicmodethedomainTypegetsseparateuniversesforthe differentaxioms,butallaxiomshavetodeclarealluniverses.In
monomorphic mode they also get separate universes. *) Axiom axfoo@{i+} axbar : Type -> Type@{i}.
Monomorphic Axiom axfoo'@{i+} axbar' : Type -> Type@{i}.
About axfoo. About axbar. About axfoo'. About axbar'.
(* Notation interaction *) Module Notas. Unset Universe Polymorphism. ModuleImport M. Universe i. End M.
Polymorphic Definition foo@{i} := Type@{M.i} -> Type@{i}. Print foo. (* must not print Type@{i} -> Type@{i} *)
End Notas.
Module NoAutoNames.
Monomorphic Universe u0.
(* The anonymous universe doesn't get a name (names are only inventedattheendofadefinition/inductive)sononeedto
qualify u0. *) Check (Type@{u0} -> Type).
End NoAutoNames.
(* Universe binders survive through compilation, sections and modules. *) Require TestSuite.bind_univs. Print bind_univs.mono. Print bind_univs.poly.
Module MutualTypes.
Inductive MutualR1 (A:Type) := { p1 : MutualR2 A } with MutualR2 (A:Type) := { p2 : MutualR1 A }. Print MutualR1.
Inductive MutualI1 (A:Type) := C1 (p1 : MutualI2 A) with MutualI2 (A:Type) := C2 (p2 : MutualI1 A). Print MutualI1.
CoInductive MutualR1' (A:Type) := { p1' : MutualR2' A } with MutualR2' (A:Type) := { p2' : MutualR1' A }. Print MutualR1'.
CoInductive MutualI1' (A:Type) := C1' (p1 : MutualI2' A) with MutualI2' (A:Type) := C2' (p2 : MutualI1' A). Print MutualI2'.
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 und die Messung sind noch experimentell.