2011/05/07

Term algebra

Jeremy 在昨天的 AoP meeting 重講 maximum segment sum,最後提出一個 datatype-generic version。(他寫在他最新的 blog post Horner's Rule。)中間我們拐到 T-algebras:令 T 是 monad,那麼我們稱 f : T a → aT-algebra 的意思是它滿足 f . μ = f . T ff . η = id。(μ : TT → Tη : Id → T 是伴隨 monad T 來的兩個 natural transformations,在 Haskell 裡面是 joinreturn 這兩個 polymorphic functions。)這時 Nick 問道:他一直看不出這裡說的 algebra 和我們一般講的 algebra(monoids, groups, rings, fields, ...)有什麼關係。Well asked! Jeremy 於是給了下面這一段 monad 循循善誘版介紹。

我們知道一個 monoid 是某個集合上面定義一個 associative binary operator 並且有一個 unit。比方說,List A 是一個 monoid,用的 associative binary operator 是 concatenation "++",unit 則是 empty list []。它們的 type 是

[]   : List A
(++) : List A × List A → List A
稍微複雜一點的例子像是架在某個 field K 上的 vector space V,這時我們有 vector addition、unit、和 scalar product:
0   : V
(+) : V × V → V
(·) : K × V → V
這些 operators 必須滿足某些額外的條件。但無論那些 operators 的 signature 有多複雜,我們發現它們的 result type 都是那個底層的集合。Category theorists 於是用 sum types 把這些 operators 收集起來,list monoid 的話是
1 + List A × List A  →  List A
vector space 則是
1 + V × V + K × V  →  V
最後我們把箭號左邊的東西抽象成某個 "signature" functor F,上述兩個 type 就都能寫成 F X → X 的型式,其中 X 是底層的集合(List AV)。(對於 list monoid 我們讓 F X := 1 + X × X,vector space 則是 F X := 1 + X × X + K × X。)於是 F X → X 這種型式的 arrows 我們就叫它做 F-algebra,只要適當定義 F 就能表現各式各樣的 operators,至於這些 operators 應該滿足的條件就還要另外陳述。以 monoids 為例,令 f : 1 + X × X → X,裡面藏的那個 binary operator (++) = f . inr 的 associativity 是
(x ++ y) ++ z = x ++ (y ++ z)
這可以繼續改寫成 point-free 型式:
(x ++ y) ++ z = x ++ (y ++ z)
≡ ((++) . ((++) × id)) ((x, y), z) = ((++) . (id × (++))) (x, (y, z))
≡   { 令 assoc ((x, y), z) := (x, (y, z)) }
  ((++) . ((++) × id)) ((x, y), z) = ((++) . (id × (++)) . assoc) ((x, y), z)
≡   { extensionality }
  (++) . ((++) × id) = (++) . (id × (++)) . assoc
願意的話可以繼續畫成 commutative diagrams 之類的。如果描述的性質足夠泛化,甚至可以寫成「不須依賴 F 實際定義」的型式。

所以給一個 F-algebra f : F A → A,小學生可以用它列出算式然後求算 normal form。但國中生開始處理未知數的時候,事情就變得複雜一些,因為「列算式」和「求值」這兩個階段更明確地分開了。假設我們考慮整數加法和乘法,小學生看到的算式都是立刻可以求算出值的,在 Haskell 裡面就相當於用 +* 直接列式,比方說 3 + 2 * 5,那直接是個 Int,小學生做的事情只是把它化簡成 normal form 而已。但國中生看到的式子含有未知數,那些式子沒辦法求算得一個整數值,所以更精確的說法是他們先定義一個 datatype

data Expr X = Var X | Add (Expr X) (Expr X) | Mult (Expr X) (Expr X)
其中 X 是未知數 x, y, z, ... 這些符號的集合(請忽略 Haskell 的 naming conventions XD),然後用 Var, Add, Mult 這些 constructors 列式,如 Var 'x' `Add` (Var 'y' `Mult` Var 'z'),另外再有一個求值函式把 X 上的賦值擴充到 Expr X 上:
eval : (X → Int) → Expr X → Int
eval σ (Var x)    = σ x
eval σ (Add a b)  = eval σ a + eval σ b
eval σ (Mult a b) = eval σ a * eval σ b
如果我們要把加法和乘法這兩個 operators 表示成 F-algebra,那麼我們會定義 F Y := Y × Y + Y × Y。顯然 Expr XF 是有關聯的 — 前者乃導自後者,Expr X 其實是 μY. X + F Y!一個算式 Expr X 可能是個未知數,或是一個 F (Expr X),也就是某一個 operator 下繼續裝更多算式。現在有兩件事情應該滿容易能接受:首先,給一個未知數 x : X,我們可以把它變成一個算式 Var x : Expr X。再來,Expr XX 可以是任意的集合,也就是說我們所謂的未知數其實可以是各種奇怪的東西,就像高年級小學生可以寫 "□ + ▵ * ◯" 一樣。而其中一種我們可以當作未知數的東西就是 Expr X,像 "[x + y] + [y * z] * [z + x]",方括號的意思是說括起來的部份其實我們看作是一個「未知數」,這個算式的 type 是 Expr (Expr X)。但絕大部份人看到這個算式都會覺得我們只是寫一個單純的算式,裡面有未知數 x, y, z,也就是說,他們看到的算式型別是 Expr X。因此給一個 Expr (Expr X),我們可以把中括號抹去,讓它變成一個 Expr X。這兩件事情正是 monad 附帶的那兩個 natural transformations return : X → T Xjoin : T (T X) → T X,它們互動的時候會滿足某些看起來很自然的條件,比方說把一個算式看作是未知數(加上中括號)再把中括號抹掉會得到原來的算式(join . return = id)之類的。所以我們剛得知 Expr 是個 monad。再想一想,「抹括號」這件事情其實和 substitution 息息相關。如果我們有一個 Expr Xx + y * z,然後對於每個未知數我們都指定一個要取代它的 Expr Y,也就是說我們有一個 function X → Expr Y,那麼代換後我們會得到 [u + v] + [v * w] * [w + u] 這種東西,其中 u, v, wY 裡的未知數,算式型別是 Expr (Expr Y),抹去括號後我們就得到一個 Expr Y。整個過程的型別是 Expr X → (X → Expr Y) → Expr Y,也就是 bind operator。

List monad 用算式觀點來看應該十分自然(因為正好只是 free monoid),比方說 concat : List (List A) → List A 確實是把第二層的中括號抹掉。IO monad 我相信一樣可以用算式來看,只是它的 operators 複雜一點。想法大概是 IO a 只是一段程式碼(syntax tree — 所以也是某種算式),我們寫 Haskell 程式去產生那些程式碼。至於程式碼的執行是高一層的事情,就好像外界有個 eval 在跑一樣。Expreval 只是把 Add 翻譯成 +,但 IO 的 eval 翻譯出來的東西比較複雜,得把某個 operand 的結果餵給別的 operand 讓那個 operand 算出更多程式碼,所以情況會像是跑一段程式碼把結果丟給 Haskell 程式產出更多程式碼再繼續跑一樣。Haskell 程式負責的永遠只是產出程式碼,那當然都是 pure data/computations 嘍。

--
先還個債,以後想到再寫清楚一點⋯ XD

Labels: ,

2009/02/27

超 High

XOO 寄來的影片。沒想到 category theory 也可以講得這麼 high XD。

--
這應該是英國腔吧?XD

Labels:

2008/05/22

Simple Identity Proved

I've been puzzled by a naïve-looking identity ΛR . C = Λ(R . C) . C (where C is a coreflexive) for a few days. Since its truth is evident when one examines it in the pointwise way, I believed that it can be proven using tabulations, and luckily I was right. The key is to tabulate C as f . fº, which can be easily justified:

  f . gº ⊆ id
≡   { shunting of functions }
  f ⊆ g
≡   { inclusion of functions is equality }
  f = g
Now we reason:
  Λ(R . C) . C
=   { tabulate C as f . fº }
  Λ(R . f . fº) . f . fº
=   { fusion }
  Λ(R . f . fº . f) . fº
=   { f is simple }
  Λ(R . f) . fº
=   { fusion (backwards) }
  ΛR . f . fº
=   { tabulation of C }
  ΛR . C
And the puzzle is solved.

--
Is it possible to prove the identity without using tabulations?

Labels:

2008/04/25

卡塔.莫斐生

今天 MFN meeting 由蔡老師講 Natural Deduction in Coq。有 Agda 的經驗,聽今天的東西就滿輕鬆的。讓我印象深刻的一點是 Coq 可以把證明寫成直直的一串,不過和 Agda 對照的話就不太令人驚訝了,其實應該就是對 interaction points 做 "leftmost derivation"。另外 Coq 拿到一個 inductive definition 就會自動產出一個 elimination rule,那其實就是 catamorphism。例如(用 Agda 的語法)

data _∧_ (A B : Set) : Set where
  conj : A -> B -> A ∧ B
它的 base functor 就是 F(X) = A × B,initial F-algebra 就是 F(A ∧ B) → A ∧ B = A × B → A ∧ B,做個 currying 就是 conj 的型別,引出的 catamorphism (fold) 則是 (A → B → C) → A × B → C。比較有趣的是 ⊤ 和 ⊥,它們的 base functor 分別是 X ↦ 1 和 X ↦ 0。要詳細講恐怕必須把關於邏輯命題的 category 都定義好,所以先算了 XD。

其實我真正想說的重點是「把 initial algebra 那一套學起來很值得」啦 XD。

--
這篇好像應該用英文寫喔 XD。

Labels: ,

2008/04/12

Left-Division in Rel

I got up earlier than expected and had a little bit of time to do a small exercise. Below is a proof of the universal property of left-division in Rel:

The power of classical logic is essential to this proof. But there is a constructive proof in AoPA (for right-division).

--
I have to think more thoroughly about what happens in the proof...

Labels:

2008/03/26

不小心

因為臨時和 Agda 玩了一下,不小心就漏了一天沒寫,不過其實也沒什麼好寫 XD。真的要寫的話也只有發一頓牢騷:allegories 好難!又是方桌的(tabular),又是單元的(unitary),奇怪的模化律(modular law)超複雜,左除和右除(left-division/right-division)也很難懂。難怪 Richard Bird 要回去做 functional derivation 啦 XD。

--
卡在第四章動彈不得 ─ AoP 一共十章,其中一到六章只是 "basic theory" XD。

Labels: ,

2008/02/27

Simple Fact

Allegories 在 arrows 上面除了 categories 原有的 source、target、composition 三個操作,又定義兩個型別相同的 arrows 之間的 inclusion relation 以及 meet operation。用以定義 meet 的性質(universal property)是

從 "and" connective 的 commutativity、idempotence、…等性質(搭配下面提到的 "indirect proof")可得到 meet 是 commutative、idempotent、…等等。我想證明的一個簡單事實是

這個事實顯然到 AoP 沒寫出來就直接使用。可是這式子的包含順序剛好和 universal property 相反,看來不是直接從 universal property 弄得到。書的前面一點點有提到如何使用 "indirect proof" 證明兩個 arrows 相同,而不直接用 antisymmetry of inclusion("ping-pong" argument):

我現在需要的是一個比較弱的版本:

如果這個性質可以用,我要證明的東西就很簡單了,只是一個單純的 and-elimination。但我們現在是在玩代數,不是基本假設或從基本假設導出的東西是不能用的。看起來我好像卡住了,走投無路只好寄信給 scm 老師求救 XD。晚一點再看看,原來 inclusion 已經說是 partial order!那麼那個比較弱的 equivalence 就好證啦:從左邊到右邊是 transitivity,從右邊到左邊是 reflexivity。要強一點的 R = S 就再加個 antisymmetry。一切問題的肇因都是因為我沒看清楚 inclusion 是 partial order 的關係,一看到 partial order 就全部解掉了。只好趕快再寫一封信給 scm 老師取消提問 XD。

--
寓意:書要看仔細 XD。


scm 老師還是寫信來了,因為其實真的很簡單:取 X = R meet S,那麼 meet 的 universal property 左邊根據 reflexivity of inclusion 是對的,右邊就是我要的結果。

--
這種事情好像發生很多次了,例如這次 XD。

Labels:

2008/01/28

Phase I

照片照好了,下午旅行社會把證件收走,後天中午就有新護照。同時 scm 老師會並行地(concurrently)買機票,家裡也會準備財力證明。有護照就可以預約辦簽證的時間(吧?)和處理役男出境(好像線上辦就可以了),所有緒程(threads)會合(join)後就真的可以去辦簽證了。之後再處理比較細瑣的雜務,例如英國現在應該是 freezing cold 吧 XD。

等照片的時候到 Einstein 書店翻機率課本,最後選鍾開萊的《A Course in Probability Theory》3/e。這本是從測度論開始談的,顯然至少要有高等微積分的基礎。其實我在翻的時候滿猶豫,因為看起來很難 XD。可是後來一想,如果要看簡單的機率,跟 Weijin 借電機系的課本就行了,額外買一本的用意就是想要讀深入一點。所以就買啦 XD。

這個情況剛好和《Algebra of Programming》一樣:要學 probability/program derivation 以前先來一段抽象的 measure/category theory。現在 category theory 的情況是:先在我們一般習慣的 sets & functions (relations) 上面架一層 categories,然後再架一層 functors,往上又架一層 transformations,而且 transformations 還可以是自然的(natural)!XD 我想等簽證辦好以後,我就會改口說「要是簽證辦好就會 category theory 該有多好」XD。

--
慢慢看嘍 XD。


根據 Wikipedia,上述「一層架一層」的說法是可以正式寫下來的(formalise)!一個 category 是由一堆 objects 和一堆 objects 之間的 arrows(morphisms)(以及一些 operations)組成,例如 Fun category 的 objects 是 sets,arrows 是 total functions。往上架一層,category 的 objects 可以是所有的 "small categories",arrows 就是 functors。(特別指定 "small" categories 當然是為了避免 Russell's paradox。)(可惜的是,Fun 是個 large category,原因仍是 Russell's paradox。真的是被 Russell's paradox 和它的同夥整得有點慘 XD。)再往上一層,category 的 objects 可以是固定兩個 categories 之間的所有 functors,arrows 就是 natural transformations。看來 category theory 真的是抽象到足夠抽象了 XD。

以上是 category theory 比較科普的部分 XD。

--
開始用 British spelling!XD

Labels: ,

2008/01/26

Category Theory

正式碰 category theory!"Abstract nonsense" 的稱號果然名不虛傳,真是抽象到一種境界 XD。努力做習題中 XD。

--
誤上賊船?XD

Labels: