BMF学习笔记
前言:这应该是下半学期(甚至可以说整个学期,因为上半期haskell感觉在铺垫)计算概论课主要想讲的内容了
Bird Meertens Formalism (BMF)
应该是一种计算理论?
是建立在半群(幺半群)上的理论
沿袭FP的思想,把算法描述成函数组合的形式(在这里可以看出FP的高妙之处,就是用函数组合的方式,使得我们的算法可以利用等式进行推导)
而怎么推导呢,就需要利用一些理论
引入了同态概念之后,又多了很多推导的等式
同态(Homomorphism):简单来说,就是在两个群之间映射,满足如果第一个群里有a\(\oplus\)b=c,那么第二个群里有f(a)\(\otimes\)f(b) = f(c)
而我们熟知的List,就是一个幺半群,对它可以衍生出很多同态函数
一些记号和约定:
f*表示map,对List里所有元素施加f
⊕/表示reduce,把List里的元素按顺序从左向右用⊕连起来计算
⊕→/e or ⊕←/e 表示foldl/foldr,把List里的元素从e开始复合从左向右/从右向左运算,e可以不给出直接算
⊕→//e or ⊕←//e表示accumulation,就是把foldl/foldr计算的每一个值都记下来,按原顺序顺塞到一个List里
一些Tips
无疑map和reduce是两个Homomorphism
而所有homo都可以表示成reduce和map的复合,证明很有意思
即:h = ⊕/ · f∗
显然
(⊕→/) · ([a]++) = ⊕→/a
(⊕←/) · (++[a]) = ⊕←/a
一些法则
map distributivity
(f · g)∗ = (f∗) · (g∗)
promotion
h是同态等价于
h · ⊕/ = ⊗/ · h∗
于是我们有下面的promotion
map && reduce promotion
f∗ · ++/ = ++/ · (f∗)∗
⊕/ · ++/ = ⊕/ · (⊕/)∗
Accumulation Lemma
(⊕→//e) = (⊕→/e) ∗ ·inits
(⊕→//) = (⊕→/) ∗ ·inits+
Horner's rule
如果两个同态 ⊗ 对 ⊕ 满足右结合律:
(a ⊕ b) ⊗ c = (a ⊗ c) ⊕ (b ⊗ c)
那么
⊕/ · ⊗/∗ ·tails = ⊙→/e
where
e = id⊗
a ⊙ b = (a ⊗ b) ⊕ e
Segment Decomposition
如果
S = ⊕/ · f ∗ ·segs
T = ⊕/ · f ∗ ·tails
并且T = h · ⊙→/e
那么S = ⊕/ · h∗ ·⊙→//e
Existence Lemma
h是同态等价于
对于任意v,w,x,y有
h v = h x ∧ h w = h y ⇒ h (v ++ w) = h (x ++ y)
必要性显然,充分性则是利用h的弱反函数(h.g.h=h)来构造出我们要的运算⊗
一些经典推导和证明
The Maximum Segment Sum (mss) Problem
inits,所有前缀的集合,inits = (++→//[]) · [·]∗
tails,所有后缀的集合,tails = (++←//[]) · [·]∗
segs = ++ / · tails ∗ ·inits
即所有非空子串
mss
= { definition of mss }
↑ / · +/ ∗ ·segs
= { definition of segs }
↑ / · +/ ∗ · ++ / · tails ∗ ·inits
= { map and reduce promotion }
↑ / · (↑ / · +/ ∗ ·tails) ∗ ·inits
= { Horner’s rule with a ⊙ b = (a + b) ↑ 0 }
↑ / · ⊙→/ 0 ∗ ·inits
= { accumulation lemma }
↑ / · ⊙→// 0
The Third Homomorphism Theorem
(就不翻译了
A function f can be described as a foldl and a foldr
h = ⊕←/ e
h = ⊗→/ e
that is,
h ([a] ++ x) = a ⊕ h x
h (x ++ [a]) = h x ⊗ a
iff there exists an associative operator ⊙ such that
h(x ++ y) = h x ⊙ h y
Proof. Let h v = h x and h w = h y. Then:
h (v ++ w)
= { h = ⊕←/ e }
⊕←/ e(v ++ w)
= { property of right-to-left reduction }
⊕←/ ⊕←/ ewv
= { h w = h y }
⊕←/ ⊕←/ eyv
= { property of right-to-left reduction }
⊕←/ e(v ++ y)
= { h = ⊕←/ e }
h (v ++ y)
= { symmetrically, since h = ⊗→/ e }
h (x ++ y)
By the Existence Lemma, h is a homomorphism.
还有一些定义和结论,就不一一列举,都可以用上面的rules推知
Fusion && Tupling
Fusion:
就是下面这个式子
f(a ⊕ r) = a ⊗ f r
f · foldr (⊕) e = foldr (⊗) (f e)
如果我们能找到⊗,让f(a ⊕ r) = a ⊗ f r,那么我们就可以直接把f施加到e上,然后用⊗串起来
Tupling:
这个有点像在递归时维护一些辅助参数
记
fi [] = ei
fi (a : x) = a ⊕i (f1 x, f2 x, . . . , fn x)
f = [[(e1, . . . , en),(⊕1, . . . , ⊕n)]]
那么我们有
Mutu-Tupling Lemma
[[(e1, e2, . . . , en),(⊕1, ⊕2, . . . , ⊕n)]]
= foldr (⊕) (e1, e2, . . . , en)
where a ⊕ r = (a ⊕1 r, a ⊕2 r, . . . , a ⊕n r)
Foldr-Tupling Lemma
(foldr (⊕1) e1 x, foldr (⊕2) e2 x) = foldr (⊕) (e1, e2) x
where a ⊕ (r1,r2) = (a ⊕1 r1, a ⊕2 r2)
理解起来挺容易的