证明功能的平等

时间:2017-01-30 13:29:00

标签: haskell equality induction

考虑到两个功能:

sumOne 0 = 0                                     --   I.a
sumOne m | m > 0 = sumOne (m-1) + m              --  II.a

endSum m = helpSum 0 m                           --   I.b
 where helpSum x 0 = x                           --  II.b
       helpSum x m | m > 0 = helpSum (x+m) (m-1) -- III.b

我们必须通过归纳来证明sumOne = endSum。

所以我试过了:

n=0

sumOne 0=0 == endSum 0 = helpSum 0 0 = 0   True

假设:

sumOne m + k = helpSumm k m

归纳步骤:

-> m=m+1
helpSum k (m+1)
III.b = helpSum (k+m+1) m 

并使用假设

= sumOne m + (m+k+1)
II.a = sumOne (m+1) + k  -> True

可以吗?还是完全错了?

1 个答案:

答案 0 :(得分:7)

我认为这在道德上是可以的,但你应该更准确。因为它很难遵循 - 例如你在哪里使用归纳假设?

您应首先明确说明您想要通过归纳证明的财产,并明确说明您的归纳。

在你的情况下,我建议证明

p(m): forall k. sumOne m + k = helpSum k m

通过对自然m的归纳。请注意k(通用量化)和mp的参数)之间的差异。这一步非常重要。

然后,通过m上的归纳,我们可以照常证明p(0)p(m)=>p(m+1)

为所有p(m)证明m后,免费获得

sumOne m = helpSum 0 m = endSum m