函数证明(Haskell)
我读RWH不及格;为了不退出,我订购了Haskell:函数式编程技术。现在我对146页上的这些函数证明很好奇。具体来说,我试图证明8.5.1函数证明(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)的符号证
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