考虑以下发展:
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
。我发现这非常令人惊讶,因为范围内的唯一假设是n
和done n
- 并且done n
已经由顶级匹配的第一个分支发送。
如何在done n
不明确引用的情况下进行匹配n
,如第二个匹配的第一个分支?