I was looking at the definition of sum
at https://coq.inria.fr/library/Coq.Init.Datatypes.html
Inductive sum (A B:Type) : Type :=
| inl : A -> sum A B
| inr : B -> sum A B.
(* Why the comma here? *)
Arguments inl {A B} _ , [A] B _.
Arguments inr {A B} _ , A [B] _.
What does the comma in the Argument
commands mean?
Arguments inl {A B} _
means that A
and B
are maximally inserted implicit arguments (right?), but what does the [A] B _
coming after mean? Is it making some sort of 'correction' (I guess not) saying that A
is now non-maximally inserted implicit and that B
is no longer implicit?
I also couldn't figure out why the _
that comes at the end was needed. Why is that needed?
I had a glance at https://coq.inria.fr/refman/language/extensions/implicit-arguments.html but couldn't find if what I was looking for is mentioned there.
It adds a second possible way of interpreting arguments. Maybe an example is best:
Check (inl nat true).
Check (inl true).
Arguments inl {A B} _.
Fail Check (inl nat true).
also
Print Implicit inl.
(*
inl : forall {A B : Type}, A -> A + B
When applied to no more than 1 argument:
Arguments A, B are implicit and maximally inserted
When applied to 2 arguments:
Argument A is implicit
*)
TIL! And it’s even documented! https://coq.inria.fr/refman/language/extensions/arguments-command.html#coq:cmd.Arguments.
Thanks! So it's like
Check inl nat true. (* [A] B _ *)
Check inl true. (* {A B} _ *)
Also found the need for the underscore at the end. It's for the value itself (right?). Like
Check (@inl nat bool 3).
(* inl 3 : nat + bool *)
Check (@inr nat bool true).
(* inr true : nat + bool *)
Ju-sh has marked this topic as resolved.
Last updated: Sep 30 2023 at 07:01 UTC