为什么我不能将 f_equal 应用于假设?
Why can I not apply f_equal to a hypothesis?
在我的假设列表中,我有:
X : Type
l' : list X
n' : nat
H : S (length l') = S n'
我的目标是length l' = n'
。
所以我尝试了 f_equal in H
。但是我收到以下错误:
Syntax error: [tactic:ltac_use_default] expected after [tactic:tactic] (in [vernac:tactic_command]).
我认为我应该能够将 f_equal
应用于 H
以删除两侧的 S
是不是错了?
f_equal
告诉你如果 x = y
,那么 f x = f y
。也就是说,当你有x = y
而需要f x = f y
时,你可以使用f_equal
.
你的情况正好相反。你有f x = f y
而你需要x = y
,所以你不能使用f_equal
.
仔细想想你的结论,只有在S
是注射的情况下才成立。你需要一个不同的策略。
f_equal
是关于平等的同余。它可以用来从x = y
证明f x = f y
。但是,它不能用于从 f x = f y
推导出 x = y
因为这通常不是真的,只有当 f
是内射的时候。
这里是一个特例,因为S
是一个归纳类型的构造函数,而且构造函数确实是单射的。例如,您可以使用 inversion H
之类的策略来获得所需的平等。
另一种涉及 f_equal
的解决方案是应用一个函数来删除 S
like
Definition removeS n :=
match n with
| S m => m
| 0 => 0
end.
然后使用
apply (f_equal removeS) in H.
在我的假设列表中,我有:
X : Type
l' : list X
n' : nat
H : S (length l') = S n'
我的目标是length l' = n'
。
所以我尝试了 f_equal in H
。但是我收到以下错误:
Syntax error: [tactic:ltac_use_default] expected after [tactic:tactic] (in [vernac:tactic_command]).
我认为我应该能够将 f_equal
应用于 H
以删除两侧的 S
是不是错了?
f_equal
告诉你如果 x = y
,那么 f x = f y
。也就是说,当你有x = y
而需要f x = f y
时,你可以使用f_equal
.
你的情况正好相反。你有f x = f y
而你需要x = y
,所以你不能使用f_equal
.
仔细想想你的结论,只有在S
是注射的情况下才成立。你需要一个不同的策略。
f_equal
是关于平等的同余。它可以用来从x = y
证明f x = f y
。但是,它不能用于从 f x = f y
推导出 x = y
因为这通常不是真的,只有当 f
是内射的时候。
这里是一个特例,因为S
是一个归纳类型的构造函数,而且构造函数确实是单射的。例如,您可以使用 inversion H
之类的策略来获得所需的平等。
另一种涉及 f_equal
的解决方案是应用一个函数来删除 S
like
Definition removeS n :=
match n with
| S m => m
| 0 => 0
end.
然后使用
apply (f_equal removeS) in H.