在Coq中使用'apply with',但不给出参数名称?

在Coq中使用'apply with',但不给出参数名称?,coq,coq-tactic,Coq,Coq Tactic,在使用Coq时应用。。。对于策略,我所看到的示例都涉及显式地给出要实例化的变量的名称。例如,给出了一个关于等式传递性的定理 Theorem trans_eq : forall (X:Type) (n m o : X), n = m -> m = o -> n = o. 要应用它: 请注意,在最后一行apply trans_eq with m:=1中,我必须记住要实例化的变量的名称是m,而不是o或n或其他一些名称y 对我来说,在定理的原始陈述中使用mno还是xyz并不重要,因为它

在使用Coq时应用。。。对于策略,我所看到的示例都涉及显式地给出要实例化的变量的名称。例如,给出了一个关于等式传递性的定理

Theorem trans_eq : forall (X:Type) (n m o : X),
  n = m -> m = o -> n = o.
要应用它:

请注意,在最后一行apply trans_eq with m:=1中,我必须记住要实例化的变量的名称是m,而不是o或n或其他一些名称y

对我来说,在定理的原始陈述中使用mno还是xyz并不重要,因为它们就像一个函数的伪变量或形式参数。有时我记不起我在定义定理时使用的具体名称或其他人在不同的文件中记下的名称

是否有一种方法可以引用变量(例如,通过它们的位置)并使用类似于:

apply trans_eq with (@1 := 1)
在上面的例子中

顺便说一句,我试着:用1:=1应用trans_eq。错误是:没有这样的活页夹


谢谢。

你可以用正确的引理专门化引理。_u用于我们不想专门化的所有参数,因为它们可以推断。需要@来专门化隐式参数

Example test: forall n m: nat,
  n = 1 -> 1 = m -> n = m.
Proof.
  intros n m. 
  apply (@trans_eq _ _ 1). 
Qed.

您可以在with之后省略活页夹名称,因此在您的情况下,请使用trans_eq和1


我对您原来的示例做了一些更改,以便apply请求缺少绑定。

谢谢。这适用于一个中间变量。但我也在两个中间变量上试过。。。其中x:=XX y:=YY。但是一旦我删除变量名x:=,y:=,apply。。。对于XX-YY,它不再工作。有什么想法吗?
Example test: forall n m: nat,
  n = 1 -> 1 = m -> n = m.
Proof.
  intros n m. 
  apply (@trans_eq _ _ 1). 
Qed.
Example test: forall n m: nat,
  n = 1 -> 1 = m -> n = m.
Proof.
  intros.
   apply trans_eq with (1);
   auto. Qed.