我目前正在做证明,我发现自己一遍又一遍地写这样的代码:
Lemma eq_T: forall (x y : T), {x = y} + {x <> y}
with eq_trait: forall (x y : trait), {x = y} + {x <> y}
with eq_pi: forall (x y : pi), {x = y} + {x <> y}.
Proof.
decide equality; auto with ott_coq_equality arith.
decide equality; auto with ott_coq_equality arith.
decide equality; auto with ott_coq_equality arith.
Defined
Hint Resolve eq_T : ott_coq_equality.
Hint Resolve eq_trait : ott_coq_equality.
Hint Resolve eq_pi : ott_coq_equality.
也就是说,我有一些互归类型,并且我同时为所有这些派生了相等性。
我想做的是拥有某种可以在其中编写的宏
MutualDeriveEquality T, pi, trait
它将自动生成上述命令,以便我可以将其用于各种互归类型的组。
我对LTac不太了解,但是我不确定它在这里是否适用,因为我不仅使证明词的生成自动化,而且还使白话中的值定义自动化。 (不过我可能完全错了。)
我想知道的是,有没有一种方法可以定义一个可以自动执行的“本地宏”?还是使用LTac可以做到这一点?还是在OCaml中编写Coq插件的唯一方法?
答案 0 :(得分:2)
您是正确的,Ltac不适合此任务。目前,在Coq中尚无法自动执行此类任务,但是正在为此开发一些工具。例如,请参见Template Coq或Coq-Elpi。这些工具大多数都处于预发布状态。
作为替代方案,我建议根据类型的更抽象描述生成自己的.v文件,并以您选择的语言编写文件生成器。