Coq使用双蕴涵精炼
我不知道该怎么回答我的问题,因为我是coq的新手。我想用一个包含双蕴涵的定理来精炼。示例代码:Coq使用双蕴涵精炼,coq,coq-tactic,Coq,Coq Tactic,我不知道该怎么回答我的问题,因为我是coq的新手。我想用一个包含双蕴涵的定理来精炼。示例代码: Parameters A B C : Prop. Theorem t1: A -> B -> C. Admitted. Theorem t2: A -> B <-> C. Admitted. Theorem test1: A -> B -> C. Proof. intros. refine (t1 _ _). assumption
Parameters A B C : Prop.
Theorem t1:
A -> B -> C.
Admitted.
Theorem t2:
A -> B <-> C.
Admitted.
Theorem test1:
A -> B -> C.
Proof.
intros.
refine (t1 _ _).
assumption.
assumption.
Qed.
Theorem test2:
A -> B -> C.
Proof.
intros A B.
refine (t2 _ _).
参数A B C:Prop。
定理t1:
A->B->C。
承认。
定理t2:
A->B C。
承认。
定理1:
A->B->C。
证据
介绍。
细化(t1 u)。
假定
假定
Qed。
定理2:
A->B->C。
证据
介绍A B。
细化(t2 u)。
t1和t2是我想在refine中使用的定理。t1按照我期望的方式工作(如测试1所示)。但我对t2有个问题。我得到的错误是:
Ltac call to "refine (uconstr)" failed.
Error: Illegal application (Non-functional construction):
The expression "t2 ?a" of type "Top.B <-> C"
cannot be applied to the term
"?y" : "?T"
Not in proof mode.
Ltac调用“优化(uconstr)”失败。
错误:非法应用程序(非功能性构造):
“Top.B C”类型的“t2?a”表达式
不能应用于该术语
“y”:“T”
不在验证模式下。
我试过的是这样的:
Theorem test3:
A -> B -> C.
Proof.
intros.
cut (B <-> C).
firstorder.
refine (t2 _).
assumption.
Qed.
定理测试3:
A->B->C。
证据
介绍。
切(B C)。
一等货。
细化(t2)。
假定
Qed。
但随着道具和校样的加长,它变得有点凌乱。(我还必须自己证明bi含义)。我可以使用t2并以更简单的方式获取其子目标吗
谢谢ab
定义为(A->B)/\(B->A)
,因此您可以使用项目j1
,项目j2
:
Theorem test2:
A -> B -> C.
Proof.
intros A B.
refine (proj1 (t2 _) _).
在这种情况下,你可以应用t2。是的,但我试图使用一个更复杂的定理,只是想发布一个简单的例子。如果你做了
destruct(t2a)。
你会在上下文中得到H:B->C
和H1:C->B
。然后您可以使用H
来解决您的目标。你不能使用refine(t2\uuu)
的原因是t2
属于A->(BC)
,注意括号。是的,这对meI起到了作用,我希望能有一些聪明的策略,能够用BC证明B->C,并在refine中使用它,多么完美,这正是我所想象的