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

Pattern-matching a hypothesis obtained from a pattern-match on goal

考虑以下发展:

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 已经被顶级匹配的第一个分支调度。

如何在不明确引用 n 的情况下匹配 done n,就像在第二个匹配的第一个分支中一样?

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

实际上,外部 match 的第一个分支似乎做你想做的(即匹配 done _ 形式的假设)所以我真的不明白你的意思内部 match.

例如,

match goal with 
| [ H' : done _ |- _ ] => idtac H'
end.

打印H,表明匹配正确的假设。

请注意,在策略上使用 Fail 不需要 ltac:() 表达式。例如,Fail fail. 有效。