通常在Coq我发现自己做了以下事情:我有证据目标,例如:
some_constructor a c d = some_constructor b c d
我真的只需要证明a = b
因为其他一切都是相同的,所以我这样做:
assert (a = b).
然后证明subgoal,然后
rewrite H.
reflexivity.
完成证明。
但是,在我的证据的底部悬挂那些似乎是不必要的混乱。
Coq中是否有一个通用策略来获取构造函数的相等性并将其拆分为构造函数参数的相等性,有点像split
但是对于等式而不是连词。
答案 0 :(得分:4)
您可以使用Coq的搜索功能:
Search (?X _ = ?X _).
Search (_ _ = _ _).
在一些噪音中它揭示了一个引理
f_equal: forall (A B : Type) (f : A -> B) (x y : A), x = y -> f x = f y
其多重论证平等的兄弟姐妹:f_equal2
... f_equal5
(截至Coq版本8.4)。
以下是一个例子:
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.
此时您需要证明的是x = y
。
答案 1 :(得分:3)
特别是,标准Coq提供f_equal
策略。
Inductive u : Type := U : nat -> nat -> nat -> u.
Lemma U1 x y z1 z2 : U x y z1 = U x y z2.
f_equal
此外,ssreflect提供了通用的同余策略congr
。