我注意到,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 <-> B
是A -> 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.
apply A_iff_B
如何运作,auto using A_iff_B
没有?一世
以为auto n
正在对所有人进行详尽的搜索
使用假设的apply
长度&lt; = n的可能序列
以及给定数据库中的所有定理。
是否存在使用双向数据的标准技巧 这两个投影功能是通常的解决方案吗?
这些投影功能是否在标准库中的某处?一世 找不到他们。
答案 0 :(得分:3)
- 醇>
apply A_iff_B works
和auto using A_iff_B
怎么没有?
auto
通常使用simple apply
代替apply
而apply
的此受限版本不会处理双向内容。
- 是否有使用双向导的标准技巧,或者这两种投影功能是通常的解决方案吗?
醇>
您可以使用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 *)
- 这些投影功能是否在标准库的某处?
醇>
是的,他们被称为:proj1
和proj2
。您可以通过以下方式找到它们:
Search (?A /\ ?B -> ?A).
或者更容易打字,但发现的东西比我们需要的要多:
Search (_ /\ _ -> _).