请考虑以下开发:
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
?
答案 0 :(得分:1)
我认为您对match
的工作方式感到困惑。匹配的第一个分支与每个假设都匹配,如果匹配始终失败,则测试第二个分支,依此类推。在您的示例中,第一个分支与假设H
相匹配,但是相应策略(fail
)的执行失败,因此尝试了第二个分支也与假设H
相匹配。
实际上,外部match
的第一个分支似乎可以满足您的要求(即,以done _
形式的假设进行匹配),因此我并没有真正理解内部{ {1}}。
例如,
match
打印match goal with
| [ H' : done _ |- _ ] => idtac H'
end.
,表明正确的假设是匹配的。
请注意,您不需要H
表达式就可以在战术上使用ltac:()
。例如,Fail
有效。