(* I have a section with many variables and definitions. *)
Section SectionWithDefs.
Context {A B C: Type}.
Variable arg1: A -> B.
Variable arg2: B -> C.
(* Functions that uses these variables. *)
Definition f a := arg2 (arg1 a).
...
End SectionWithDefs.
(* Now I want to use some of these functions. *)
Section AnotherSection.
Context {A B C: Type}.
(* Here are the arguments. *)
Variable arg1: A -> B.
Variable arg2: B -> C.
Variable a: A.
Section CallFunctionWithArgiments.
(* We can directly pass the arguments to the function...*)
Eval compute in (f arg1 arg2 a).
End CallFunctionWithArgiments.
Section LetBlock.
(* ... or we can create a sequence of let expression. *)
Let f := f arg1 arg2.
...
Eval compute in (f a).
End LetBlock.
End AnotherSection.
Действительно трудно использовать первый подход, поскольку очень трудно поддерживать такой код. Написание становится действительно болезненным, когда имеется более пяти различных функций с 4-5 аргументами в каждой.
Второй случай удобнее. Но у меня все еще есть много лишних строк с объявлениями let:
Let f1 := ...
Let f2 := ...
...
Let fn := ...
Есть ли способ избежать этого лишнего шаблона? В идеале я хочу, чтобы Coq просто «угадывал» правильные аргументы, используя типы или даже имена терминов в контексте.