等同于 `remember (f x) as y eqn:H;清除 H;清除 x`?
Equivalent of `remember (f x) as y eqn:H; clear H; clear x`?
有时我有一个证明最好通过投影到不同的 space 来完成。目前我执行以下操作:
remember (f x) as y eqn:H; clear H; clear x.
我尝试用 Ltac 自动执行此操作:
Ltac project x y :=
let z := fresh in
remember x as y eqn:z; clear z; clear x.
但我收到以下错误:
Error: Ltac variable x is bound to f x which cannot be coerced to a variable.
这里有什么问题?
我假设您正在尝试这样称呼您的策略:
project (f x) y.
如果你展开你给出的定义,你会看到这个调用以
结束
clear (f x).
这个调用是罪魁祸首:只能清除变量,不能清除任意表达式。这是一个可能的修复方法。
Ltac project x y :=
match x with
| ?f ?x' =>
let z := fresh in
remember x as y eqn:z; clear z; clear x'
end.
由于您正在生成一个您从未使用过的方程式,因此最好将 remember
替换为 generalize
:
Ltac project x y :=
match x with
| ?f ?x' => generalize x; clear x'; intros y
end.
您也可以考虑使用 ssreflect 证明语言,它大大简化了这种上下文操作。我们可以使用
而不是调用 project (f x) y
move: (f x)=> {x} y.
这样就灵活多了。例如,如果您想对具有两个自由变量的表达式执行类似的操作,您只需编写
move: (f x1 x2)=> {x1 x2} y.
有时我有一个证明最好通过投影到不同的 space 来完成。目前我执行以下操作:
remember (f x) as y eqn:H; clear H; clear x.
我尝试用 Ltac 自动执行此操作:
Ltac project x y :=
let z := fresh in
remember x as y eqn:z; clear z; clear x.
但我收到以下错误:
Error: Ltac variable x is bound to f x which cannot be coerced to a variable.
这里有什么问题?
我假设您正在尝试这样称呼您的策略:
project (f x) y.
如果你展开你给出的定义,你会看到这个调用以
结束clear (f x).
这个调用是罪魁祸首:只能清除变量,不能清除任意表达式。这是一个可能的修复方法。
Ltac project x y :=
match x with
| ?f ?x' =>
let z := fresh in
remember x as y eqn:z; clear z; clear x'
end.
由于您正在生成一个您从未使用过的方程式,因此最好将 remember
替换为 generalize
:
Ltac project x y :=
match x with
| ?f ?x' => generalize x; clear x'; intros y
end.
您也可以考虑使用 ssreflect 证明语言,它大大简化了这种上下文操作。我们可以使用
而不是调用project (f x) y
move: (f x)=> {x} y.
这样就灵活多了。例如,如果您想对具有两个自由变量的表达式执行类似的操作,您只需编写
move: (f x1 x2)=> {x1 x2} y.