Coq:定义白话语以避免重复

时间:2018-07-04 16:53:41

标签: macros dry coq coq-tactic ltac

我目前正在做证明,我发现自己一遍又一遍地写这样的代码:

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插件的唯一方法?

1 个答案:

答案 0 :(得分:2)

您是正确的,Ltac不适合此任务。目前,在Coq中尚无法自动执行此类任务,但是正在为此开发一些工具。例如,请参见Template CoqCoq-Elpi。这些工具大多数都处于预发布状态。

作为替代方案,我建议根据类型的更抽象描述生成自己的.v文件,并以您选择的语言编写文件生成器。