Goal forall (w x y z: string), w <> x -> (if (eqb_string w x) then y else z) = z.
Proof.
intros.
rewrite false_eqb_string by trivial.
reflexivity.
Qed.
false_eqb_string
是一个相当琐碎的证明原则。我想通过autorewrite
或类似的方法隐式使用它。不幸的是,如果我添加Hint Rewrite false_eqb_string
,则eqb_string _ _
形式的任何子项都会被重写,并且假设_ <> _
也添加到目标中,即使这不是明智的选择。
我如何使rewrite false_eqb_string by trivial
自动发生,而又没有提及它?
答案 0 :(得分:2)
match goal with
是一个相当通用的构造,它使您可以根据自己的目标进行模式匹配。因此,您可以在目标中进行布尔比较,从而在假设中查找不等式(或者根据需要进行其他假设)(context _ [ _ ]
是一种特殊的模式,可以将任何子项与方括号中的模式进行匹配),然后重写使用正确的引理。然后,您可以为这个match
策略指定一个名称,因此您无需记住实际调用引理的方式。如您所料,match
还支持许多子句(需要注意的怪异回溯行为),因此您可以将此策略扩展到您自己的穷人重写数据库中。
From Coq Require Import Arith.
Ltac rewrite_eqb :=
match goal with
| [ H : ?u <> ?v |- context E [ ?u =? ?v ] ] =>
rewrite (proj2 (Nat.eqb_neq u v) H)
end.
Goal forall (w x y z: nat), w <> x -> (if (Nat.eqb w x) then y else z) = z.
Proof.
intros.
rewrite_eqb.
reflexivity.
Qed.
另请参阅:
CPDT中的某些章节(可能)。
答案 1 :(得分:2)
我相信您正在寻找的结构是
Hint Rewrite false_eqb_string using solve [ trivial ].
此内容记录在the reference manual中。与rewrite ... by ...
不同,Hint Rewrite ... using ...
不会在策略不能完全解决附带条件的情况下撤消重写,因此必须将其包装在solve [ ... ]
中才能获得效果。