来自Software Foundations的练习所需的帮助。这是定理:
Theorem plus_n_n_injective : ∀n m,
n + n = m + m →
n = m.
Proof.
我最终以n = 0
为目标,n + n = 0
为假设。如何继续前进?
答案 0 :(得分:2)
n + n
无法进一步简化,因为n
是变量,而不是类型构造函数。
正如Ptival所说,你可以通过n
公开destruct
的所有构造案例。但是在这种情况下使用inversion
在我看来有点极端,而不是这个Sf练习的内容。
当被O
构造函数替换时,O + O
将减少(例如使用simpl
)到O
,而reflexivity
应该可以做到这一点。
当被S
构造函数替换时,S foo + bar
将始终缩小为S something
形状,该形状不能等于O
(断言的最简单方法)是使用discriminate
),因为它们是两个相同类型的构造函数。
最佳, 诉
答案 1 :(得分:0)
如果您检查n
(destruct
它),那么它将是0
,在这种情况下,目标可以通过反身性证明,或S n'
在这种情况下假设与congruence
/ inversion
相矛盾。
答案 2 :(得分:0)
解决这个问题的诀窍可以从length_snoc'的定理中获得。以前在同一章节中显示过。
由于这是本书迄今为止第一次在对n进行归纳后引入一些变量/假设,这对于新手(像我一样)来说可能并不常见。这样,您可以在证明基本情况后,在您的上下文中获得更一般的假设。
如前所述,您将能够通过反身性证明某些目标。其中一些可以通过对您的上下文中的错误假设进行反演来证明(一旦发现它们就会变得简单明了,2 + 2 = 5 -> anything
为真的想法会有很长的路要走。)
最后,您将不得不使用先前定义的引理plus_n_Sm和eq_add_S以及对称性来重写您的一个假设,以便能够应用我们之前讨论过的更一般的假设。