2011-12-31 63 views
9

我在定义证明上下文中递归颠倒假设的策略时遇到了困难。举例来说,假设我有包含类似的假设证明背景:递归地逆转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 : 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中的递归调用。

回答

5

如果这真的是你想要做什么,我怀疑你首先要证明一个辅助Fixpoint subtreelist (st : searchtree): list (...)返回所有这些子树的列表,然后调用subtreelist战术和递归destruct是清单,直到你拥有一切你想要的额外假设。

祝你好运!