Coq正向推理:应用多个假设

Coq正向推理:应用多个假设,coq,ltac,Coq,Ltac,我有两个假设,我想用正向推理来应用一个定理,这两个定理都用到了 我的具体情况是我有假设 H0 : a + b = c + d H1 : e + f = g + h 我想应用标准库中的定理: f_equal2_mult : forall x1 y1 x2 y2 : nat, x1 = y1 -> x2 = y2 -> x1 * x2 = y1 * y2 现在我知道我可以手动给出x1、y1、x2、y2的值,但我希望Coq在与H0和H1统一时自动确定这些值。我发现我可以让它像

我有两个假设,我想用正向推理来应用一个定理,这两个定理都用到了

我的具体情况是我有假设

H0 : a + b = c + d
H1 : e + f = g + h
我想应用标准库中的定理:

f_equal2_mult
     : forall x1 y1 x2 y2 : nat, x1 = y1 -> x2 = y2 -> x1 * x2 = y1 * y2
现在我知道我可以手动给出x1、y1、x2、y2的值,但我希望Coq在与
H0
H1
统一时自动确定这些值。我发现我可以让它像这样工作:

eapply f_equal2_mult in H0; try exact H1.

但这感觉像是一个黑客,对称性被破坏,而且
尝试
。我真的希望能够说
在H0、H1中应用f_equals2_mult
或类似的清晰内容。有这样的方法吗?

你可以使用
姿势证明
在上下文中介绍引理,并将其应用于其他假设

Lemma f (a b c d : nat) : a = b -> c = d -> False.
intros H1 H2.
pose proof f_equal2_mult as pp.
specialize pp with (1 := H1).
specialize pp with (1 := H2).

(* or *)
specialize pp with (1 := H1) (2 := H2).

或者
专门化(f_equal2_mult uu h1h2)。
,或者
姿势证明(f_equal2_mult h1h2)。
如果它是iff关系(),情况如何?e、 g.将Nat.mul\u cancel\r应用于
H1:n0
H2:a*n=b*n
?如果您在上下文中有
H:pq
,您可以在H
中使用
apply proj1将其转换为
H:P->Q
。将proj1与后期校对相结合,我能够得到一行
姿势校对(proj1(Nat.mul\u cancel\u\uh1))H2
用于双向情况。