函数证明(Haskell)

函数证明(Haskell),haskell,functional-programming,proof,Haskell,Functional Programming,Proof,我读RWH不及格;为了不退出,我订购了Haskell:函数式编程技术。现在我对146页上的这些函数证明很好奇。具体来说,我试图证明8.5.1sum(反向xs)=sumxs。我可以做一些归纳证明,但后来我被卡住了 宣传短片: 基数: 归纳: 所以现在我只是想证明Leftsum(reverse xs++[x])等于Rightx+sum xs,但这离我开始的sum(reverse(x:xs))=sum(x:xs)并不远 我不太清楚为什么需要证明这一点,使用反向x:y:z=z:y:x(defn)的符号证

我读RWH不及格;为了不退出,我订购了Haskell:函数式编程技术。现在我对146页上的这些函数证明很好奇。具体来说,我试图证明8.5.1
sum(反向xs)=sumxs
。我可以做一些归纳证明,但后来我被卡住了

宣传短片: 基数: 归纳: 所以现在我只是想证明
Left
sum(reverse xs++[x])
等于
Right
x+sum xs
,但这离我开始的
sum(reverse(x:xs))=sum(x:xs)
并不远


我不太清楚为什么需要证明这一点,使用
反向x:y:z=z:y:x
(defn)的符号证明似乎是完全合理的,因为+是可交换的(arth),那么
反向1+2+3=3+2+1

使用和的定义将(和反向xs++[x])分解为x+和(反向(xs的),用你的归纳假设,你知道sum(逆(xs))=sum(xs)。但我同意,对于这样的问题,归纳法是一种过分的方法。

基本上你需要证明这一点

sum (reverse xs ++ [x]) = sum (reverse xs) + sum [x]
这很容易导致

                        = x + sum (reverse xs)
                        = x + sum xs  -- by inductive hyp.
问题在于显示
sum
分布在列表串联上

sum (reverse [])     = sum []                     -- def reverse
sum (reverse (x:xs)) = sum (reverse xs ++ [x])    -- def reverse
                     = sum (reverse xs) + sum [x] -- sum lemma below
                     = sum (reverse xs) + x       -- def sum
                     = x + sum (reverse xs)       -- commutativity assumption!
                     = x + sum xs                 -- inductive hypothesis
                     = sum (x:xs)                 -- definition of sum
然而,有一些关于结合性和交换性的基本假设并没有得到严格的保证,这对于一些数值类型(如
Float
Double
)来说是不正确的,因为这些假设被违反了

引理:
sum(xs++ys)=sumxs+sumys
给定
(+)

证明:

sum ([] ++ ys)     = sum ys           -- def (++)
                   = 0 + sum ys       -- identity of addition
                   = sum [] ++ sum ys -- def sum

sum ((x:xs) ++ ys) = sum (x : (xs ++ ys))  -- def (++)
                   = x + sum (xs ++ ys)    -- def sum 
                   = x + (sum xs + sum ys) -- inductive hypothesis
                   = (x + sum xs) + sum ys -- associativity assumption!
                   = sum (x:xs) + sum ys   -- def sum

我想你被困在这里了。你需要证明一个引理

sum (xs ++ ys) == sum xs + sum ys
为了证明这个定律,你必须假设加法是结合的,这只适用于整数和有理数

然后,您还需要假设加法是可交换的,这对于整数和有理数也是如此,对于浮点也是如此



题外话:我觉得你证据的风格很奇怪。我想,如果你在中使用这种风格,你将更容易写出这种证明。

我很困惑。。。对不起,我只是觉得你是菲亚特赢了。我不明白你是怎么得到这些的…你是怎么证明你想展示的
sum(反向xs++[x])=sum(反向xs)+sum[x]
我没有证明,但这是可能的。尝试在xs上使用归纳法,向所有Y显示
sum(xs++ys)=(sum xs)+(sum ys)
。有一首歌类似于“加法是可交换的,对吧!”这首歌适用于这种情况。@jrockway,谢谢你的否决票,请带着反对票和旁敲侧击的评论来看看。“使用x:y:z=z:y:x(defn)的符号证明似乎是完全合理的,因为+是可交换的(arth),所以反向1+2+3=3+2+1。“好吧,这给了你一个长度为3的列表的证明,但不给任何其他长度的列表的证明。@jrockway:New Math,作者汤姆·莱勒。“你知道为什么四加一加十等于十四减一吗?”原因加法是可交换的,对吧。”是的。我认为即使对这群人来说,这个参考也太模糊了:)加法对于所有复数(整数、有理数、无理数等)都是关联的。交换属性也是如此。但是,正如@Edward Kmett的帖子中提到的,属于Haskell中
Num
类的浮点数并非如此。
sum (reverse [])     = sum []                     -- def reverse
sum (reverse (x:xs)) = sum (reverse xs ++ [x])    -- def reverse
                     = sum (reverse xs) + sum [x] -- sum lemma below
                     = sum (reverse xs) + x       -- def sum
                     = x + sum (reverse xs)       -- commutativity assumption!
                     = x + sum xs                 -- inductive hypothesis
                     = sum (x:xs)                 -- definition of sum
sum ([] ++ ys)     = sum ys           -- def (++)
                   = 0 + sum ys       -- identity of addition
                   = sum [] ++ sum ys -- def sum

sum ((x:xs) ++ ys) = sum (x : (xs ++ ys))  -- def (++)
                   = x + sum (xs ++ ys)    -- def sum 
                   = x + (sum xs + sum ys) -- inductive hypothesis
                   = (x + sum xs) + sum ys -- associativity assumption!
                   = sum (x:xs) + sum ys   -- def sum
sum (xs ++ ys) == sum xs + sum ys