GIML: Language Translation
Diversion Language translation
Write a program to translate English into Scots - for example
- scots("Do you know where Pat lives");
> "Do you ken where Pat bides"
Use the same functions to translate to politically correct speak
Help
You will need the function lex which turns a list of characters into a list of words. The functions firstWord and butFirstWord should help.
lex(explode "one fine day") = ["one", "fine", "day"]
A function to translate a single words is quite simple:
fun franglais "house" = "maison"
| franglais "dog" = "chien"
| franglais "beware" = "regarde"
| franglais "at" = "dans"
| franglais "the" = "le"
| franglais x = x;
The last line insures that if we have missed a word out it is unchanged:
franglais "table" = "table"
Given a words translator we now need to put back spaces and implode:
fun addSpace s = s^" ";
A generalized translator then takes a "word function" f:
fun trans f = implode o(map (addSpace o f))o lex o explode;
Now try
trans franglais "beware the dog at Hectors house";
The function lex could be improved so that instead of searching for a space it searches for a non-alpha character. If we also partition the list rather than remove spaces the punctuation may be retained and spaces need not be reintroduced.
fun alpha s = (s>="A" andalso s<="Z") orelse
(s>="a" andalso s<="z");
fun takewhile f nil = nil
| takewhile f (h::t) = if f h then h::(takewhile f t)
else nil;
fun dropwhile f nil = nil
| dropwhile f (h::t) = if f h then dropwhile f t else h::t;
fun lex nil = nil
| lex l = (takewhile alpha l)::
(takewhile (not o alpha) (dropwhile alpha l))::
(lex (dropwhile (not o alpha) (dropwhile alpha l)));
