Since Josh has already mentioned it, I had better give it a full account.
Back in 2003 when I just started my postdoc in PSD Lab in University of Tokyo, my colleagues there were discussing about the third homomorphism theorem. The theorem says that if a function
there exists some associative binary operator
Being a list homomorphism implies the potential of parallel computation.
The paper we studied was, of course, The Thrid Homomorphism Theorem by Jeremy. The aim then was to automatically, or semi-automatically, derive
f = sum , where⊚ can simply be+ .f = sort , where⊚ can be the functionmerge merging two sorted lists.f = scanr ⊛ e . Whilescanr appears to be an inherently sequential function, it is actually possible to computef “from the middle”, provided that⊛ is associative, if we takexs ⊚ (y : ys) = map (⊛y) xs ⧺ (y : ys) .
Can we come up with a method to derive
I myself was not particularly interested in automation. I was interested in the challenge for two reasons. Firstly, it appears that some kind of inverse function is needed. Secondly, when I looked at Jeremy’s proof, I felt there is a relational proof inside waiting to be discovered. So I tried.
Setting the Stage
For the ease of point-free calculation, we define alternatives of folds where the input is paired with the base-cases:
The advantage is that we can shift a suffix or a prefix of the input list to the base case. That is:
or, in point-free style:
where
The key property, however, is one that was shown in (possibly among other literature) Algebra of Programming: for a simple relation (i.e. a partial function)
where
Recall our aim: given
Proving the Theorem
The third homomorphism theorem is a direct corollary of the following lemma:
Lemma 1:
f = foldr (≪) e = f = foldl (≫) e implies thatf is prefix and postfix insensitive. That is:In point-free style:
f . cat . (f°. f × f°. f) = f . cat .
Once we have the lemma proved, the theorem follows by taking
The proof of Lemma 1 is simply some applications of (1), (2), and
The proof is still the same as that of Jeremy’s, but in a relational disguise.
Refining to Functions
To derive actual algorithms, we have yet to refine
For example, consider the special case
For
Some more Properties
Some more properties are needed to deal with
When simple approaches of refining
Symetrically,
Scanr “from the Middle”
Finally, consider
From
Prologue
Given the complexity of the proof above, I did not think there was a hope to automatically construct
Being just graduated from AoP, I was perhaps too arrogant and proud of all the clever derivation we did to care about automatic program construction. (Like Jeremy, in the end of my thesis I quoted “善數不用籌策 (Those who good at calculation need no mechanical aids)” from 老子 Lao Tzu. And didn’t Dijkstra say “I hardly used the computer they gave me. I was perfectly happy without it.”?) The relational method, which seemed to cover everything, gave me a false feeling that I knew the problem inside out.
Last year, however, my colleagues and I met again and I was told that they eventually published a paper on this subject:
Kazutaka Morita, Akimasa Morihata, Kiminori Matsuzaki, Zhenjiang Hu, Masato Takeichi. Automatic Inversion Generates Divide-and-Conquer Parallel Programs, PLDI 2007.
They focused on weak inverses that returns only lists with fixed lengths. The advantage is that calculations like the one above are no longer necessary — since the lists are of fixed-length,
Well, I think the moral is that we cannot just stop when it appears that is no elegant solution that suits our taste. It sometimes pays to get our hands dirty, through which we may eventually discover the beauty within.
One Trackback
[...] Constructing List Homomorphism from Left and Right Folds (Shin-Cheng Mu, Institute of Information Science, Taiwan) explora el problema de encontrar op a partir de () y e. [...]