我如何证明使用列表归纳?

时间:2013-03-13 12:26:23

标签: haskell discrete-mathematics

我必须通过xs列表归纳显示: reverse(xs ++ ys)=(reverse ys)++(反向xs) 对于所有列表xs和ys。

1 个答案:

答案 0 :(得分:7)

首先,

reverse (xs ++ ys) ≡ reverse ys ++ reverse xs
如果xs是无限或部分(1)列表且ys是有限非空列表,则

不成立。因为在这种情况下xs ++ ys也是无限的或部分的,在这两种情况下,

reverse (xs ++ ys) ≡ ⊥

reverse ys ++ reverse xs ≡ reverse ys ++ ⊥

reverse ys是一个有限的非空列表,因此reverse ys ++ ⊥不是,而是一个非初始部分的部分列表。

因此,我们假设xs是一个有限列表,即xs ≡ []xs ≡ x : zs,其中zs是一个有限列表。

对于基本情况,我们有

reverse ([] ++ ys)
≡ reverse ys         -- by 1.

reverse ys ++ reverse []
≡ reverse ys ++ []   -- by 3.

所以它仍然是显示

zs ++ [] ≡ zs

所有列表zs(即使ys ≡ ⊥ys无限或部分也是如此),以完成基本案例的证明。

你通过zs的归纳证明了这一点(很简单)。

然后你去感应步骤。前两步是:

reverse ((x:xs) ++ ys)
≡ reverse (x:(xs ++ ys))            -- by 2.
≡ reverse (xs ++ ys) ++ [x]         -- by 4.

然后你需要

  • 归纳假设
  • (++)的相关性[完整证明,需要证明]
  • 一些给定的规则。

(1)部分列表是表单

的列表
zs ++ ⊥

其中zs是一个有限列表,即它是通过将有限数量(可能为0)的元素“收缩”到而不是[]来获得的。