“auto”如何与biconditional(iff)相互作用

时间:2017-11-22 12:52:41

标签: coq

我注意到,auto忽略了双向性。这是一个简化的例子:

Parameter A B : Prop.
Parameter A_iff_B : A <-> B.

Theorem foo1: A -> B.
Proof.
  intros H. apply A_iff_B. assumption.
Qed.

Theorem bar1: B -> A.
Proof.
  intros H. apply A_iff_B. assumption.
Qed.

Theorem foo2_failing: A -> B.
Proof.
  intros H. auto using A_iff_B.
Abort.

Theorem bar2_failing: B -> A.
Proof.
  intros H. auto using A_iff_B.
Abort.

现在,我知道A <-> BA -> B /\ B -> A的语法糖,所以我写了两个定理来提取一个或另一个:

Theorem iff_forward : forall {P Q : Prop},
  (P <-> Q) -> P -> Q.
Proof.
  intros P Q H. apply H.
Qed.

Theorem iff_backward : forall {P Q : Prop},
  (P <-> Q) -> Q -> P.
Proof.
  intros P Q H. apply H.
Qed.

Theorem foo3: A -> B.
Proof.
  intros H.
  auto using (iff_forward A_iff_B).
Qed.

Theorem bar3: B -> A.
Proof.
  intros H.
  auto using (iff_backward A_iff_B).
Qed.
  1. apply A_iff_B如何运作,auto using A_iff_B没有?一世 以为auto n正在对所有人进行详尽的搜索 使用假设的apply长度&lt; = n的可能序列 以及给定数据库中的所有定理。

  2. 是否存在使用双向数据的标准技巧 这两个投影功能是通常的解决方案吗?

  3. 这些投影功能是否在标准库中的某处?一世 找不到他们。

1 个答案:

答案 0 :(得分:3)

  
      
  1. apply A_iff_B worksauto using A_iff_B怎么没有?
  2.   

auto通常使用simple apply代替applyapply的此受限版本不会处理双向内容。

  
      
  1. 是否有使用双向导的标准技巧,或者这两种投影功能是通常的解决方案吗?
  2.   

您可以使用Hint Resolve -> (<-)功能:

Hint Resolve -> A_iff_B.
Hint Resolve <- A_iff_B. (* if you remove this one, then `auto` won't be able to prove the `bar3` theorem *)

Theorem foo3: A -> B.
Proof. info_auto. Qed. (* look at the output *)
  
      
  1. 这些投影功能是否在标准库的某处?
  2.   

是的,他们被称为:proj1proj2。您可以通过以下方式找到它们:

Search (?A /\ ?B -> ?A).

或者更容易打字,但发现的东西比我们需要的要多:

Search (_ /\ _ -> _).