在使用Coq apply ... with
策略时,我看到的所有示例都涉及明确给出变量的名称来实例化。例如,给出关于平等传递性的定理。
Theorem trans_eq : forall (X:Type) (n m o : X),
n = m -> m = o -> n = o.
致apply
:
Example test: forall n m: nat,
n = 1 -> 1 = m -> n = m.
Proof.
intros n m.
apply trans_eq with (m := 1). Qed.
请注意,在最后一行apply trans_eq with (m := 1).
中,我必须记住要实例化的变量的名称是m
,而不是o
或n
或其他一些姓名y
。
对我来说,在定理的原始陈述中使用m n o
或x y z
应该无关紧要,因为它们就像虚函数或函数的形式参数。有时我不记得我在定义定理时使用的特定名称或其他人在不同文件中放下的名称。
有没有办法可以参考变量,例如通过他们的位置和使用类似的东西:
apply trans_eq with (@1 := 1)
在上面的例子中?
顺便说一下,我尝试了apply trans_eq with (1 := 1).
并获得了Error: No such binder.
感谢。
答案 0 :(得分:3)
您可以使用正确的参数来专门化引理。 _
用于我们不想专门化的所有参数(因为可以推断它们)。需要@
来专门化隐式参数。
Example test: forall n m: nat,
n = 1 -> 1 = m -> n = m.
Proof.
intros n m.
apply (@trans_eq _ _ 1).
Qed.
答案 1 :(得分:2)
您可以在with
之后省略活页夹名称,因此在您的情况下请apply trans_eq with (1)
。
Example test: forall n m: nat,
n = 1 -> 1 = m -> n = m.
Proof.
intros.
apply trans_eq with (1);
auto. Qed.
我已经稍微更改了您的原始示例,因此apply会请求缺少绑定。