在您第一次nat_ind
调用之后,如果您查看您的目标,您会发现 Coq 根本没有做正确的事情!
______________________________________(1/3)
forall a b c : nat, a * b * c = a * (b * c)
______________________________________(2/3)
nat ->
(forall a b c : nat, a * b * c = a * (b * c)) ->
forall a b c : nat, a * b * c = a * (b * c)
______________________________________(3/3)
nat
这里发生的事情是它猜测了你的动机p
,并决定将它与 统一起来fun (_ : nat) => <YOUR_WHOLE_GOAL>
,一个给定 any 的函数nat
会给你的目标......是的,这很愚蠢!
推动它进行归纳的一种方法a
是明确强制它这样做,其中:
apply nat_ind with (n := a)
(其中n
匹配您的定义中使用的名称nat_ind
)
在此之后,您将获得更合理的目标:
______________________________________(1/2)
forall b c : nat, 0 * b * c = 0 * (b * c)
______________________________________(2/2)
forall n : nat,
(forall b c : nat, n * b * c = n * (b * c)) ->
forall b c : nat, S n * b * c = S n * (b * c)
其中确实a
已分别被0
和取代S n
。
[编辑:我想这并不能完全回答你的问题,因为你已经通过第二次感应电话达到了相同的点......]
为了解决您的目标,拥有一个关于乘法对加法的分布的属性将有很大帮助:
forall n m p, (n + m) * p = n * p + m * p
所有这些,以及你想要证明的东西,都已经存在于 Coq 中了。这是作业吗?你只是在训练吗?