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

我不知道该怎么回答我的问题,因为我是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.
  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中使用它,多么完美,这正是我所想象的