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
In polymorphic mode the domain Type gets separate universes for the different axioms, but all axioms have to declare all universes. 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 invented at the end of a definition/inductive) so no need to
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.0.9Bemerkung:
¤
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.