如何自动利用x <> y形式的假设?

时间:2019-04-07 17:04:32

标签: coq coq-tactic

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自动发生,而又没有提及它?

2 个答案:

答案 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.

另请参阅:

答案 1 :(得分:2)

我相信您正在寻找的结构是

Hint Rewrite false_eqb_string using solve [ trivial ].

此内容记录在the reference manual中。与rewrite ... by ...不同,Hint Rewrite ... using ...不会在策略不能完全解决附带条件的情况下撤消重写,因此必须将其包装在solve [ ... ]中才能获得效果。