From: | Pablo Barenbaum <pablob@...> |
---|---|

Date: | Friday, October 1, 2004, 16:02 |

I've been thinking that relative clauses are just like functions in lambda calculus, and that abstraction could be eliminated using the S, K and I combinators. I thought about this when reading about the obfuscated programming language Unlambda: http://www.eleves.ens.fr:8080/home/madore/programs/unlambda/unlambda.html Let me explain: Suppose we have a language where roots are isolated and the only thing one can do is "applying" a root to another root. The functor would be the modifier and the arguments modified. Syntax would be quite simple (in a kind of BNF): construct ::= root | ` construct construct Where ` is the apply operator. ` A B reads "apply A to B". And every other construction would be delegated on semantics. Let's work with English words as roots for some examples (I'll also assume English semantics, but it is not the point): Intransitive verbs are just applied to nouns: ` write man the man writes Adjectives are simply intransitive verbs (just like in many natural languages): ` white book the book is white = white book Of course, application is recursive: ` write ` tall ` red man the tall red man writes Adverbs could be applied to adjectives or verbs: ` ` quickly write ` ` amazingly tall man the amazingly tall man writes quickly Transitive verbs are (in currying fashion) verbs that when applied to a nominal construction (the object, maybe?) yields an intransitive verb that, when applied to a second nominal construction (the subject), yields the expected result: ` ` write* book man the man writes a book Where: ` write* book Corresponds to the verb "to write-a-book". Notice that in the language, intransitive write and transitive write* should be different words (probably regularly related). Oblique constructions should be applied to the verb, too: ` ` ` in sky fly plane the plane flies in the sky Many ambiguities dissapear: ` ` see ` ` with telescope man I I see [a man with a telescope] ` ` ` ` with telescope see man I I see [a man] with a telescope ` ` hate ` ` and dance ` eat cheese I I hate [dancing and eating cheese] ` ` ` and ` hate dance ` eat cheese I I hate dancing and I eat cheese -- Now let's analyse relative clauses: Just like adjectives can be interpreted like intransitive verbs or adjectives, when translated: ` red book the book is red ` ` write ` red book man the man writes a red book We could do the same with verbs: ` ` eat cheese man the man eats cheese ` write ` ` eat cheese man the man [who eats cheese] writes When the order is the expected, there are no problems. But what if we want to express, say: the book [the man writes] is red We cannot say: ` red ` ` write man book the book [that writes a man] is red (The book is the writer). And neither: ` red ` ` write book man the man [that writes a book] is red (The sense of the relative clause is ok, but "red" should modify "book", not man). We need more expressive constructions. Adopting lambda notation for functions (where \ pretends to be the ASCII version of a greek lowercase lambda): (\ x : ` ` write x man) Is a construction that, when applied to an argument x, means "the man writes x". For instance: ` (\ x : ` ` write x man) book the man writes a book ` (\ x : ` ` write x man) novel the man writes a novel Therefore: the book [the man writes] is red Can be expressed as: ` red ` (\ x : ` ` write x man) book Notice that if we reduce it: ` red ` ` write book man It yields the previously discarded construction. Expressions with lambdas are not necessarily equivalent when reduced. Here, lambdas are precisely used to show that the modified root is "book" and not "man". -- We could invent a way of directly translating lambda expressions into our conlang. But there is an ugly problem: the name x. In math, its said of x that it is a mute variable, as changing its name does not change the meaning of the expression. Fortunately, this problem has already been solved with the S, K and I combinators. Definition: I is the identity function: I = (\ x : x) For all x: ` I x = x K is the constant function generator: K = (\ x : (\ y : x)) For all x, y: ` ` K x y = x And S is the substituted application function: S = (\ x : (\ y : (\ z : ` ` x z ` y z))) For all x, y, z: ` ` ` S x y z = ` ` x z ` y z -- By induction, it's not hard to prove that any lambda expression can be reduced to an expression using these combinators, and without any mute variable. A lambda expression (\ x : e) falls into one of these three cases: 1) e is x In this case, (\ x : e) = (\ x : x) , which is precisely I!! 2) e is a constant, or another variable not being x In this case, (\ x : e) = (\ x : a) , which is ` K a Note that: ` (\ x : a) b = a = ` ` K a b 3) e is the application ` f g: (\ x : e) = (\ x : ` f g) , which is ` ` S (\ x : f) (\ x : g) (and then the we eliminate the lambda in the inner expressions f and g which, by induction, are simpler and we already know how to reduce. Note that: ` (\ x : ` f g) b = ` ` (\ x : f) b ` (\x : g) b = = ` ` ` S (\x : f) (\x : g) b -- A rule for mechanically eliminating abstraction in a lambda expressions (\ x : e): Reading e from left to right, replace: ` with ` ` S x with I any constant or variable a other than x with ` K a If more than one lambda need to be eliminated, start with the innermost ones first. -- Examples: (\ x : ` red x) => ` ` S ` K red I We should expect: ` (\ x : ` red x) book To yield the same result as: ` red book Let's reduce the expression: ` ` ` S ` K red I book = = ` ` ` K red book ` I book = = ` red ` I book = ` red book -- Let's eliminate the abstraction from: (\ x : ` ` write x man) => ` ` S ` ` S ` K write I ` K man And let's now express the original problematic sentence: the book [the man writes] is red ` red ` (\ x : ` ` write x man) book Reducing: ` red ` ` ` S ` ` S ` K write I ` K man book = = ` red ` ` ` ` S ` K write I book ` ` K man book = = ` red ` ` ` ` K write book ` I book ` ` K man book = = ` red ` ` write ` I book ` ` K man book = = ` red ` ` write book ` ` K man book = = ` red ` ` write book man (Which yields, as shown before, the correct expansion but they are not equivalent in the language). -- The power of lambda expressions guarantees that every possible relative clause is expressable in this language, and that no ambiguities can appear in nested clauses. An example of a relative clause impossible in English from the Language Construction Kit: This is the man [my girlfriend's father is a friend of John and him] First, let's define f (with definition as abbreviation only): f = (\ x : ` ` be ` ` of ` ` and John x friend ` ` <POSS> ` ` <POSS> i girlfriend father) ` f x = my girlfriend's father is a friend of John and x (Note: I write the first person pronoun as "i" to avoid confusion with "I", the identity function! <POSS> is a root for possessive, where ` ` <POSS> X Y = X's Y). The sentence using f: ` ` be ` f man this Let's eliminate the abstraction of f: (\ x : ` ` be ` ` of ` ` and John x friend ` ` <POSS> ` ` <POSS> i girlfriend father) becomes: ` ` S ` ` S ` K be ` ` S ` ` S ` K of ` ` S ` ` S ` K and ` K John I ` K friend ` ` S ` ` S ` K <POSS> ` ` S ` ` S ` K <POSS> ` K i ` K girlfriend ` K father Then, the whole sentence: ` ` be ` ` ` S ` ` S ` K be ` ` S ` ` S ` K of ` ` S ` ` S ` K and ` K John I ` K friend ` ` S ` ` S ` K <POSS> ` ` S ` ` S ` K <POSS> ` K i ` K girlfriend ` K father man this Which is a bit quite long. Some tricks could be used to make it shorter. There's much more about it in the Unlambda reference. These kilometric expressions make me believe this is probably violating a language universal, in the sense that it is counter-intuitive. Anyway, at least for me, it is an interesting theoretical exercise. To create a real conlang, the apply operator should be grammaticalized somehow (as an inflection, syntactically, etc.). I leave the rest as an exercise to the conlang world. -- Pablo Barenbaum _____________________________________________________________ Create tu cuenta webmail en http://www.starlinux.net