A few days ago, a friend of mine sent me a fascinating problem. The problem goes like this:

The homophony group (of English) is the group with 26 generators a , b , c , and so on until z and one relation for every pair of English words which sound the same. Prove that the group is trivial!

For example, consider the group elements knight and night. By the cancellation laws, this implies that k must be the identity element. Recall that a trivial group is one which consists solely of its identity element, so our task is to show that each letter of the English alphabet is the identity element.

Skipping all of the algebraic jargon, we want to show that if we set all homophones "equal" to one another, and do left cancellation, right cancellation, and substitution, we can show that all the English letters equal one.

This is a fun exercise to do by hand, but I'd like to do it in Haskell.

Note: This work was done in IHaskell, and what you're reading is the IHaskell notebook exported to HTML for viewing in the browser. You can download the original notebook here.

I've started by compiling a list of homophones in American English, starting with this list and removing all single letters (such as j being a homophone with jay ) and all words with apostrophes and periods, as well as some less commonly used words. You can download my list, or make your own.

The contents of the file look like this:

ad add add ad arc ark ark arc ...

Each line is a space-delimited list of words. The first word in the list sounds identical to all the remaining words in the list. This is why you see repeats - ad sounds like add but also add sounds like ad . This repetition isn't necessary, as we could do it programmatically, but is convenient.

Let's go ahead and load this list: