(* Test different printing paths for applied terms *)
Module InferredGivenImplicit. SetImplicitArguments. Set Maximal Implicit Insertion.
Axiom p : forall A (a1 a2:A) B (b:B), a1 = a2 /\ b = b.
Check p 0 0 true. (* p 0 0 true *) Check p 0 0. (* p 0 0 *) Check p 0. (* p 0 *) Check @p _ 0 0 bool. (* p 0 0 (B:=bool) *) Check p 0 0 (B:=bool). (* p 0 0 (B:=bool) *) Check @p nat. (* p (A:=nat) *) Check p (A:=nat). (* p (A:=nat) *) Check @p _ 0 0. (* @p nat 0 0 *) Check @p. (* @p *)
Unset Printing Implicit Defensive. Check @p _ 0 0 bool. (* p 0 0 *) Check @p nat. (* p *) Set Printing Implicit Defensive. End InferredGivenImplicit.
Module ManuallyGivenImplicit. Axiom p : forall {A} (a1 a2:A) {B} (b:B), a1 = a2 /\ b = b.
Check p 0 0 true. (* p 0 0 true *) Check p 0 0. (* p 0 0 *) Check p 0. (* p 0 *) Check @p _ 0 0 bool. (* p 0 0 *) Check p 0 0 (B:=bool). (* p 0 0 *) Check @p nat. (* p *) Check p (A:=nat). (* p *) Check @p _ 0 0. (* @p nat 0 0 *) Check @p. (* @p *)
End ManuallyGivenImplicit.
Module ProjectionWithImplicits. SetImplicitArguments. Set Maximal Implicit Insertion.
Record T {A} (a1 a2:A) := { f : forall B (b:B), a1 = a2 /\ b = b }. Parameter x : T 0 0. Check f x true. (* f x true *) Check @f _ _ _ x bool. (* f x (B:=bool) *) Check f x (B:=bool). (* f x (B:=bool) *) Check @f nat. (* @f nat *) Check @f _ 0 0. (* f (a1:=0) (a2:=0) *) Check f (a1:=0) (a2:=0). (* f (a1:=0) (a2:=0) *) Check @f. (* @f *)
Unset Printing Implicit Defensive. Check f (a1:=0) (a2:=0). (* f *) Set Printing Implicit Defensive.
Unset Printing Implicit Defensive. Check f (a1:=0) (a2:=0). (* f *)
End ProjectionWithImplicits.
Module AtAbbreviationForApplicationHead.
Axiom p : forall {A} (a1 a2:A) {B} (b:B), a1 = a2 /\ b = b.
Notation u := @p.
Check u _. (* u ?A *) Check p. (* u ?A *) Check @p. (* u *) Check u. (* u *) Check p 0 0. (* u nat 0 0 ?B *) Check u nat 0 0 bool. (* u nat 0 0 bool *) Check u nat 0 0. (* u nat 0 0 *) Check @p nat 0 0. (* u nat 0 0 *)
End AtAbbreviationForApplicationHead.
Module AbbreviationForApplicationHead.
SetImplicitArguments. Set Maximal Implicit Insertion.
Axiom p : forall A (a1 a2:A) B (b:B), a1 = a2 /\ b = b.
Notation u := p.
Check p. (* u *) Check @p. (* @u *) Check @u. (* @u *) Check u. (* u *) Check p 0 0. (* u 0 0 *) Check u 0 0. (* u 0 0 *) Check @p nat 0 0. (* @u nat 0 0 *) Check @u nat 0 0. (* @u nat 0 0 *) Check p 0 0 true. (* u 0 0 true *) Check u 0 0 true. (* u 0 0 true *)
End AbbreviationForApplicationHead.
Module AtAbbreviationForPartialApplication.
SetImplicitArguments. Set Maximal Implicit Insertion.
Axiom p : forall A (a1 a2:A) B (b:B), a1 = a2 /\ b = b.
Notation v := (@p _ 0).
Check v. (* v *) Check p 0 0. (* v 0 *) Check v 0. (* v 0 *) Check v 0 true. (* v 0 true *) Check @p nat 0. (* v *) Check @p nat 0 0. (* @v 0 *) Check @v 0. (* @v 0 *) Check @p nat 0 0 bool. (* v 0 *) Evalsimpl in (fun x => _:nat) (@p nat 0 0 bool). (* ?n@{x:=v 0 (B:=bool)} *)
End AtAbbreviationForPartialApplication.
Module AbbreviationForPartialApplication.
SetImplicitArguments. Set Maximal Implicit Insertion.
Axiom p : forall A (a1 a2:A) B (b:B), a1 = a2 /\ b = b.
Notation v := (p 0).
Check v. (* v *) Check p 0 0. (* v 0 *) Check v 0. (* v 0 *) Check v 0 true. (* v 0 true *) Check @p nat 0. (* v *) Check @p nat 0 0. (* @v 0 *) Check @v 0. (* @v 0 *) Check @p nat 0 0 bool. (* v 0 *) Evalsimpl in (fun x => _:nat) (@p nat 0 0 bool). (* ?n@{x:=v 0 (B:=bool)} *)
End AbbreviationForPartialApplication.
Module NotationForHeadApplication.
SetImplicitArguments. Set Maximal Implicit Insertion.
Axiom p : forall A (a1 a2:A) B (b:B), a1 = a2 /\ b = b.
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.