Я думаю, вы смущены тем, как работает match
.Первая ветвь сопоставления сопоставляется с каждой гипотезой, и если она всегда терпит неудачу, проверяется вторая ветвь и так далее.В вашем примере первая ветвь соответствует гипотезе H
, но выполнение соответствующей тактики (fail
) завершается неудачей, поэтому пробуется вторая ветвь, которая также соответствует гипотезе H
.
На самом деле,первая ветвь внешнего match
, кажется, делает то, что вы хотите (то есть соответствует гипотезе вида done _
), поэтому я действительно не понимаю точку вашего внутреннего match
.
Длянапример,
match goal with
| [ H' : done _ |- _ ] => idtac H'
end.
печатает H
, показывая, что правильная гипотеза совпадает.
Обратите внимание, что вам не нужно выражение ltac:()
, чтобы использовать Fail
в тактике,Например, Fail fail.
работает.