在Coq中展开证明项

在Coq中展开证明项,coq,Coq,我想知道是否有一种方法可以在当前上下文之外的某个级别(或者仅仅是原语)获得证明项(通过打印序列化或不序列化)。例如,执行以下命令 From mathcomp Require Import odd_order.PFsection14. Print Feit_Thompson. 导致 Feit_Thompson = fun (gT : fingroup.FinGroup.type) (G : fingroup.group_of (gT:=gT) (ssreflect.Pha

我想知道是否有一种方法可以在当前上下文之外的某个级别(或者仅仅是原语)获得证明项(通过
打印序列化或不序列化)。例如,执行以下命令

From mathcomp Require Import odd_order.PFsection14.
Print Feit_Thompson.
导致

Feit_Thompson = 
fun (gT : fingroup.FinGroup.type)
  (G : fingroup.group_of (gT:=gT)
         (ssreflect.Phant
            (fingroup.FinGroup.arg_sort
               (fingroup.FinGroup.base gT)))) =>
BGsection7.minSimpleOdd_ind no_minSimple_odd_group (gT:=gT)
  (G:=G)
     : forall (gT : fingroup.FinGroup.type)
         (G : fingroup.group_of (gT:=gT)
                (ssreflect.Phant
                   (fingroup.FinGroup.arg_sort
                      (fingroup.FinGroup.base gT)))),
       is_true
         (ssrnat.odd
            (fintype.CardDef.card
               (T:=fingroup.FinGroup.arg_finType
                     (fingroup.FinGroup.base gT))
               (ssrbool.mem
                  (finset.SetDef.pred_of_set
                     (fingroup.gval G))))) ->
       is_true (nilpotent.solvable (fingroup.gval G))
但我想将证明术语中使用的标识符(定理和定义)如
no_minSimple\u odd_group
展开到它们的证明术语中。我怀疑定理和引理的不透明性可能会对这一目标构成障碍


我能想到的最简单的解决方案是通过
Print
递归查询每个标识符。或者,通过程序提取,得到一个不那么幼稚(由于表示证明术语的语言发生了变化,因此也不太理想)的解决方案

我不确定是否有直接的方法可以做到这一点,但实现起来并不难,在这个级别上,不透明度只是一个标志,可以绕过它

然而,我想知道你想要实现什么


请注意,通过这种方式获得的大多数证明项都将是无法管理的,特别是展开将很快导致比指数级更糟糕的放大。

打印所有依赖项Feit_Thompson。
会有帮助吗?对递归打印(我的天真解决方案)肯定有帮助,但我认为这不会显示证明项(lambda术语)本身。你可能会发现coq club的线程很有用。他们提到了插件。@AntonTrunov这确实很有趣!感谢指针。是的,它们可能很大,这取决于展开停止的常量集,但我希望能够在不同的原语集(常量)下检查相同的证明术语.在快速浏览之后,我几乎可以肯定,如果您需要此功能,您将不得不编写一个插件来扩展
Eval red
策略,以展开更多功能。感谢您的指示。我对通过编程方式与Coq交互(作为OCaml库?)感到好奇。您能推荐一些参考资料吗?