用矛盾的定理将假设重写为假

rewriting hypothesis to false with a contradictory theorem

我想证明

[seq q x t | x <- iota 0 (t + 1)] != [::]

我决定破坏 iota 0 (t + 1) 因为我有一个引理说:

iota 0 (t + 1) != [::]

所以 destruct 的第一种情况应该有 iota 0 (t + 1) = [::] ,根据提到的定理,它是错误的,我可以区分。如何使用引理重写第一个破坏案例中的方程式?我想不通。

谢谢。

你不需要破坏。请注意,iota 是由其第二个变量的递归定义的。您当前的目标无法简化,因为 t + 1 不是以构造函数开始的。但是,你可以by rewrite addn1把它放在一个可以解决的形式中。

除了计算之外,正如 Arthur 所建议的,您有时可以使用对位法来处理 non-equalities(对变体版本执行 Search "contra")。

例如,在你的例子中,如果你添加一些内射性约束,你可以显示:

Lemma foo (q : nat -> nat -> nat) t (injq: injective (q^~ t)) :
  iota 0 (t + 1) != [::] -> [seq q x t | x <- iota 0 (t + 1)] != [::].
Proof.
apply: contra_neq.
rewrite [RHS]( _ : [::] = [seq q x t | x <- [::]]) //.
exact: inj_map. 
Qed.