模式匹配从目标模式匹配获得的假设

时间:2018-10-21 21:37:47

标签: coq ltac

请考虑以下开发:

Definition done {T : Type} (x : T) := True.

Goal Test.
  pose 1 as n.
  assert (done n) by constructor.
  Fail ltac:(
    match goal with 
    | [ H : done _ |- _ ] => fail
    | [ H : _ |- _ ] =>
      match goal with
      | [ _: done H |- _ ] => idtac "H == n"
      | [ _: done n |- _ ] => idtac "H != n"; fail 2
      end
    end
  ).
Abort.

这将打印H != n。我发现这非常令人惊讶,因为范围的唯一假设是ndone n-并且done n已经由顶级匹配的第一个分支调度。

在第二个匹配项的第一个分支中,如何在不显式引用done n的情况下匹配n

1 个答案:

答案 0 :(得分:1)

我认为您对match的工作方式感到困惑。匹配的第一个分支与每个假设都匹配,如果匹配始终失败,则测试第二个分支,依此类推。在您的示例中,第一个分支与假设H相匹配,但是相应策略(fail)的执行失败,因此尝试了第二个分支也与假设H相匹配。

实际上,外部match的第一个分支似乎可以满足您的要求(即,以done _形式的假设进行匹配),因此我并没有真正理解内部{ {1}}。

例如,

match

打印match goal with | [ H' : done _ |- _ ] => idtac H' end. ,表明正确的假设是匹配的。

请注意,您不需要H表达式就可以在战术上使用ltac:()。例如,Fail有效。