为什么我不能将 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.