模式匹配从目标模式匹配中获得的假设
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
。我发现这非常令人惊讶,因为范围内的唯一假设是 n
和 done 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.
有效。
考虑以下发展:
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
已经被顶级匹配的第一个分支调度。
如何在不明确引用 n
的情况下匹配 done n
,就像在第二个匹配的第一个分支中一样?
我认为您对 match
的工作方式感到困惑。匹配的第一个分支与每个假设匹配,如果总是失败,则测试第二个分支,依此类推。在您的示例中,第一个分支匹配假设 H
,但相应策略 (fail
) 的执行失败,因此尝试第二个分支也匹配假设 H
.
实际上,外部 match
的第一个分支似乎做你想做的(即匹配 done _
形式的假设)所以我真的不明白你的意思内部 match
.
例如,
match goal with
| [ H' : done _ |- _ ] => idtac H'
end.
打印H
,表明匹配正确的假设。
请注意,在策略上使用 Fail
不需要 ltac:()
表达式。例如,Fail fail.
有效。