在 Haskell 中筛选

Filter in Haskell

我有以下问题。

证明对于某种类型的所有有限列表 xs 和该类型的谓词 p 和 q:

filter p (filter q xs) = filter q ( filter p xs)

我需要一些示例 xs 列表来解决这个问题吗?或者必须如何解决这个问题? 谢谢

不,提供一些 xs 个示例不是本练习所需要的。

此练习要求您证明 p,q,xs 的所有可能值,方程成立。请注意,p,q,xs 有无限多个可能的值,因此暴力破解所有可能的情况是不可行的:必须提供一般的数学证明,利用一些逻辑原理。

只是为了做个比较,假设你被要求在练习中证明 2*x+x = 3*x。预期的解决方案不是 "well, it holds on x=4 and x=10",忽略了 x 的所有其他(无限多)值。一个合理的解决方案可能是:“我有 x=1*x,所以根据分配律 2*x+x = 2*x + 1*x = (2+1)*x = 3*x",适用于 all x.

在这种练习中,往往需要对某些东西进行归纳。在这里,xs 看起来很适合归纳。所以,要证明等式对所有 xs 成立,需要证明

  1. 等式适用于 xs=[]
  2. 如果等式适用于 xs=ysys 是任意值),那么它必须适用于 xs=y:ysy 是任意值)

如果你证明了 1. 和 2. 那么你就完成了。

只是一个额外的提示:由于 y 是任意的,您不知道它是否满足谓词 p and/or q。但是,您可以在那里检查所有可能的四种情况:p,q 都成立,只有 p,只有 q,两者都没有。