用矛盾的定理将假设重写为假
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.
我想证明
[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.