Decomposing equality of constructors coq

大兔子大兔子 提交于 2019-12-04 03:20:56

问题


Often in Coq I find myself doing the following: I have the proof goal, for example:

some_constructor a c d = some_constructor b c d

And I really only need to prove a = b because everything else is identical anyway, so I do:

assert (a = b).

Then prove that subgoal, then

rewrite H.
reflexivity.

finishes the proof.

But it seems to just be unnecessary clutter to have those hanging around at the bottom of my proof.

Is there a general strategy in Coq for taking an equality of constructors and splitting it up into an equality of constructor parameters, kinda like a split but for equalities rather than conjunctions.


回答1:


In particular, standard Coq provides the f_equal tactic.

Inductive u : Type := U : nat -> nat -> nat -> u.

Lemma U1 x y z1 z2 : U x y z1 = U x y z2.
f_equal

Also, ssreflect provides a general-purpose congruence tactic congr.




回答2:


You can use Coq's searching capabilities:

  Search (?X _ = ?X _).
  Search (_ _ = _ _).

Among some noise it reveals a lemma

f_equal: forall (A B : Type) (f : A -> B) (x y : A), x = y -> f x = f y

And its siblings for multi-argument equalities: f_equal2 ... f_equal5 (as of Coq version 8.4).

Here is an example:

Inductive silly : Set :=
  | some_constructor : nat -> nat -> nat -> silly
  | another_constructor : nat -> nat -> silly.

Goal forall x y,
    x = 42 ->
    y = 6 * 7 ->
    some_constructor x 0 1 = some_constructor y 0 1.
  intros x y Hx Hy.
  apply f_equal3; try reflexivity.

At this point all you need to prove is x = y.



来源:https://stackoverflow.com/questions/37490891/decomposing-equality-of-constructors-coq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!