我正在尝试编写一种用于柯里化函数的策略,包括普遍量化的函数。
Require Import Coq.Program.Tactics.
Definition curry1 := forall A B C, (A /\ B -> C) -> (A -> B -> C).
Definition curry2 := forall A B, (forall C, A /\ B -> C) -> (forall C, A -> B -> C).
Definition curry3 := forall A, (forall B C, A /\ B -> C) -> (forall B C, A -> B -> C).
(* etc. *)
Ltac curry H :=
let T := type of H in
match T with
| _ /\ _ -> _ =>
replace_hyp H (fun H1 => fun H2 => H (conj H1 H2))
| forall x, ?P x =>
fail 1 "not implemented"
| _ =>
fail 1 "not a curried function"
end.
Example ex1 : curry1.
Proof.
intros A B C H.
curry H.
assumption.
Qed.
Example ex2 : curry2.
Proof.
intros A B H.
Fail curry H. (* Tactic failure: not a curried function. *)
Fail replace_hyp H (fun H1 => let H2 := H H1 in ltac:(curry H2)). (* Cannot infer an existential variable of type "Type" in environment: [...] *)
Abort.
如何扩展我的curry
策略来处理普遍量化的函数?