Recursion 在coq中递归反转假设

Recursion 在coq中递归反转假设,recursion,coq,Recursion,Coq,我很难定义一种在证明上下文中递归反转假设的策略。例如,假设我有一个包含如下假设的证明上下文: H1 : search_tree (node a (node b ll lr) (node c rl rr)) 并希望反复颠倒假设,以获得包含假设的证明上下文 H1 : search_tree (node a (node b ll lr) (node c rl rr)) H2 : search_tree (node b ll lr) H3 : search_tree (node c rl rr) H4

我很难定义一种在证明上下文中递归反转假设的策略。例如,假设我有一个包含如下假设的证明上下文:

H1 : search_tree (node a (node b ll lr) (node c rl rr))
并希望反复颠倒假设,以获得包含假设的证明上下文

H1 : search_tree (node a (node b ll lr) (node c rl rr))
H2 : search_tree (node b ll lr)
H3 : search_tree (node c rl rr)
H4 : lt_tree a (node b ll lr)
H5 : gt_tree a (node c rl rr)
H6 : lt_tree b ll
H7 : gt_tree b lr
H8 : lt_tree c rl
H9 : gt_tree c rr
当然,通过反复应用反转策略,很容易获得这种证明上下文。然而,有时反转一个假设会将不同的假设放入不同的子目标中,是否反转每个子目标取决于反转提供的信息的性质

显而易见的问题是,不加区别地对证明上下文进行模式匹配将导致非终止。例如,如果一个人希望在反转原始假设后保留它们,那么以下假设将不起作用:

Ltac invert_all :=
  match goal with
    | [ H1 : context [ node ?a ?l ?r ] |- ?goal ] => invert H1; invert_all
    | _ => idtac
  end.

有没有一个简单的方法可以做到这一点?显而易见的解决办法是保留一堆已经颠倒的假设。另一个解决方案是只将假设反转到特定深度,这将删除Ltac中的递归调用。

如果这真的是您想要做的,我怀疑您首先要证明一个helper
Fixpoint子卷轴列表(st:searchtree):list(…)
,它返回所有这些子树的列表,然后是一种调用
子卷轴列表
并递归地
销毁
列表的策略,直到你得到所有你想要的额外假设

祝你好运