看完这个问题之后:Functional proofs (Haskell)Haskell:函数应用程序是否分布在列表级联上?
在看过Haskell音乐学院的forall xs ys. length (xs ++ ys) = length xs + length ys
的归纳证明后(第164页)。
这在我看来,功能应用分布在连接列表。
因此,更一般的规律可能是forall f xs ys. f (xs ++ ys) = f xs ++ f ys
。
但是,如何将一个证明/反驳这样的断言?
- 编辑 -
我做了一个错字,它的意思是:forall f xs ys. f (xs ++ ys) = f xs + f ys
,它匹配什么前面的问题和Haskell的SOM系统使用。这就是说,由于这个错字,它不再是“分配”属性。但是,@leftaroundabout为我最初的打字问题做出了正确的答案。至于我的预期问题,法律仍然不正确,因为职能不需要保留结构性价值。根据所应用列表的长度,f
可能会给出完全不同的答案。
“但是,如何将一个证明/反驳这样的断言?”通过归纳,我假设。如果你是一个真正的天才,你可以通过检查来做到这一点,但对于我们其他人来说,归纳一直是几个世纪以来的方式。它实际上并不是真的 - 你可能想要的是较弱的陈述 - “foldr f x xs \'''foldr f x ys = foldr f x(xs ++ ys)'。 – user2407038
但是这个证明和'forall xs ys'的证明是一样的。长度(xs ++ ys)=长度xs +长度ys'?如何通过归纳来证明函数?从功能的角度来说,“n”和“n + 1”是什么? – CMCDragonkai
你甚至是如何到达这个更一般的法律?它没有使用特定的类型(突然'f'需要返回一个列表),甚至连接级联通过将'tail'替换为'f':tail([1] ++ [2])而被证明是不成立的== [2]'而'tail [1] ++ tail [2] == []'。 –