将函数应用于Coq假设中的等式两边

时间:2018-06-21 09:33:43

标签: coq coq-tactic

我提出的问题与以下链接中提出的问题非常相似,只是假设是假设而非目标。

Apply a function to both sides of an equality in Coq?

说我有以下定义:

Definition make_couple (a:nat) (b:nat) := (a, b).

以及以下引理证明:

a, b : nat
H : (a, b) = make_couple a b
-------------------------------
(some goal to prove)

我想产生以下假设:

new_H : fst (a, b) = fst (make_couple a b)

一种方法是显式地编写一个断言,然后使用eapply f_equal:

assert (fst (a, b) = fst (make_couple a b)). eapply f_equal; eauto.

但是,如果可能的话,我想避免明确地写断言。我想有一些战术或类似的方法可以像这样工作:

apply_in_hypo fst H as new_H

Coq中有什么可以与之接近的吗?

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

您可以使用f_equal引理来做到这一点。

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

Arguments A, B, x, y are implicit
Argument scopes are [type_scope type_scope function_scope _ _ _]
f_equal is transparent
Expands to: Constant Coq.Init.Logic.f_equal

以下是将其应用于假设的方法:

Goal forall a b : nat, (a, b) = (a, b) -> True.
  intros a b H.
  apply (f_equal fst) in H.

可以使用intro-patterns以更简洁的方式重写以上代码段:

  Restart.
  intros a b H%(f_equal fst).
Abort.