TEACH HAIKU-DEMO.TXT This teach file is based on TEACH HAIKU-EXAMPLES.TXT The latter gives code examples to be run by the learner. This file shows the results of the examples running, but without the sound generator. Online video tutorial: A Demo Using 'recordmydesktop' on 15 Nov 2011 is available on Youtube, here: http://www.youtube.com/watch?v=j0oaK59SSM0 (The recording unfortunately had 'grammatical' mis-spellt as 'gramattical'!) Aaron Sloman School of Computer Science University of Birmingham, UK http://www.cs.bham.ac.uk/~axs This is a sequel to the demo of linux, espeak and pop11 on 13th Nov 2011 http://www.cs.bham.ac.uk/research/projects/cogaff/tutorials/pop-espeak1.ogv also on youtube. We shall use pop11's grammar package, described in the TEACH GRAMMAR file in the poplog system. Declare a variable 'mygram' and initialise it with alist or lists of lists, specifying a simple context-free grammar: vars mygram = [ ;;; start a list of grammatical rules ;;; a sentence is a NP then a VP [s [np vp]] ;;; a noun phrase is a determiner followed by a noun ;;; or a determiner + adjective + noun [np [det noun] [det adj noun]] ;;; verb phrase = verb followed by NP [vp [verb np]] ] ; In principle the grammar could allow alternative forms of sentence, noun phrase, verb phrase, etc. But not in this toy grammar. However, the lexicon defined below gives words of different types, and does allow alternatives for each type, e.g. "noun", "verb", etc: vars mylex = [ ;;; start a list of lexical categories ;;; nouns [noun man girl number computer cup battle room car garage] ;;; verbs [verb hated stroked kissed teased married taught added] ;;; adjectives [adj big blue lonely clever excellent angry] ;;; determiners [det the a every each one some] ]; ;;; Print out the two lists: mygram ==> ** [[s [np vp]] [np [det noun] [det adj noun]] [vp [verb np]]] mylex ==> ** [[noun man girl number computer cup battle room car garage] [verb hated stroked kissed teased married taught added] [adj big blue lonely clever excellent angry] [det the a every each one some]] Load the pop11 grammar library: uses grammar Use one of its procedures to generate three sentences: generate(mygram, mylex) ==> ** [the lonely garage married each car] generate(mygram, mylex) ==> ** [the battle married some lonely girl] generate(mygram, mylex) ==> ** [some car teased each lonely cup] We can also ask the program to parse these sentences. But first we must set up a parser based on the grammar (mygram) and lexicon (mylex): setup(mygram,mylex); That creates parsing procedures, s, np, vp, etc. s([the lonely garage married each car]) ==> That prints out (in a narrow text window): ** [s [np [det the] [adj lonely] [noun garage]] [vp [verb married] [np [det each] [noun car]]]] s([the battle married some lonely girl]) ==> ** [s [np [det the] [noun battle]] [vp [verb married] [np [det some] [adj lonely] [noun girl]]]] s([some car teased each lonely cup]) ==> ** [s [np [det some] [noun car]] [vp [verb teased] [np [det each] [adj lonely] [noun cup]]]] That shows the grammatical structures of the generated sentences. Let's generate some simple Haikus to be printed out. -- Generating Haikus -------------------------------------------------- A haiku (A Japanese literary form) is a three line poem of a highly constrained form. Examples (from Margaret Boden's book on creativity) are All green in the leaves I smell dark pools in the trees Crash moon has fled Eons deep in the ice I paint all time in a whorl Bang the sludge has cracked These are of the form All [1] in the [2] I [3] [4] [5] in the [6] [7] the [8] has [9] We specify a grammar, which is a set of templates, to generate haikus as follows vars haiku_gram = [ ;;; a haiku has three parts separated by newlines [haiku [part1 . ^newline part2 . ^newline part3 . ]] ;;; We now define the permitted forms for each part [ part1 [start_word adj in np]] ;;; Example: All green in the leaves [ part2 [I verb1 adj noun in np]] ;;; Example: I smell dark pools in the trees ;;; part3 has two forms, one with a singular noun phrase ;;; followed by "has" and the other with a plural noun ;;; phrase followed by "have" [ part3 [exclaim , sing_np has verb2] [exclaim , plural_np have verb2]] ;;; Example: Crash moon has fled ;;; different types of noun phrases, singular and plural [np [sing_np][plural_np]] [sing_np [sing_det sing_noun]] [plural_np [plural_det plural_noun]] ;;; Nouns can be singular or plural, defined in the ;;; lexicon [noun [sing_noun] [plural_noun]] ]; ;;; An example lexicon, for use with the above grammar vars haiku_lex = [ ;;; adjectives [adj abrupt acrid crass crazy dark deep flossy ghostly goulish greenish magenta poetic purest rapt smelly tinkling tiny vicious welling white zany zealous ] ;;; Words to start part 1 [start_word All Many Most So What How Days But] ;;; Singular and plural determiners [sing_det the some one every each my her your our their this] [plural_det the some all most many my your our his their these those two three four] ;;; Singular and plural nouns. [sing_noun acorn age anchor angel anguish bridge canopy cosmos dawn daylight death dew foal grass hatching laughter moon night ocean power heart spring sunset tiger winter zoo] [plural_noun ancestors autumns births collisions dancers devils echoes evenings forms galaxies ghosts heavens hosts poets raindrops rivers seas spirits storms summers tangles tempests torments sheep trees verses vessels waves watchers winters ] [verb1 abandon burn compose dangle detach engage expect fetch grasp greet hug mourn praise press sip slice spy stroke taste tear twist urge watch wipe ] [verb2 aged arisen bloomed blinked burst chimed come cracked drowned drooped eaten ended faded fallen fetched floundered frozen gone gripped gushed held hated loomed lost missed nursed oiled opened oozed riddled ripped rode sang slept smouldered swirled swarmed thawed unzipped ] ;;; words for an exclamation [exclaim Aha Alas Bang Crash Forever Ha Huh Joy Nay No Ouch Oh See So Ugh Woe Yea Yes Yippee] ]; These two commands will print out the grammar and the lexicon without the comments: haiku_gram ==> haiku_lex ==> We make the grammar library available using this command uses grammar and compile an extension to allow us to generate other things than just individual sentences (the default): uses generate_category ;;; set the maximum recursion level for the generator 20 -> maxlevel; ;;; Generate 3 haikus, using the above grammar and lexicon repeat 3 times generate_category("haiku", haiku_gram, haiku_lex) ==> pr(newline); endrepeat; Sample output generated by that command: ** [Days crazy in this dawn . I sip white anchor in our seas . Bang , one spring has eaten .] ** [Days rapt in my foal . I slice crass angel in the sunset . Alas , your winter has hated .] ** [So crass in their heavens . I urge white heavens in your heavens . Bang , every winter has lost .] =================================================================== Here are more examples of what the program can print out ** [But crazy in your night . I watch poetic laughter in four waves . Aha , four heavens have riddled .] ** [So flossy in their spring . I engage crazy autumns in many heavens . So , his verses have gone .] ** [How magenta in his dancers . I hug crazy age in those collisions . Alas , one daylight has loomed .] If you run this program live you can turn the output list into a string of words to give to pop11 to speak out loud, using 'espeak'. -- The procedure that makes haikus Now let's create a procedure to generate, then print out, a number of haikus, using a given grammar, lexicon, and the number of haikus desired. define make_haikus(gram, lex, num); lvars output, string; repeat num times generate_category("haiku", gram, lex) -> output; ;;; print out the output, including newlines output ==> ;;; add a gap pr(newline) endrepeat; enddefine; make_haikus => ** make_haikus(haiku_gram, haiku_lex, 1); ** [How welling in our seas . I twist ghostly verses in her dawn . Yes , this bridge has held .] ;;; When a list is printed out in pop11, the elements are ;;; separated by spaces. This applies also to elements that are ;;; single-character words like "." and ",". It would be possible ;;; use a slightly different mode of printing that omitted the ;;; space just before one of those. ;;; So now let's generate and print out five more haikus make_haikus(haiku_gram, haiku_lex, 5); ** [But flossy in the torments . I mourn tinkling autumns in every power . Bang , some anguish has cracked .] ** [Many crazy in the spirits . I spy poetic grass in his waves . So , two poets have fallen .] ** [But crazy in their watchers . I taste dark collisions in the death . Oh , my trees have bloomed .] ** [So magenta in their power . I wipe goulish winter in your forms . Yippee , these dancers have hated .] ** [What white in many rivers . I fetch goulish ocean in this bridge . Nay , my dancers have come .] That's all absolute rubbish, but by a careful choice of contents of the grammar and lexicon it would be possible to improve some of the grammar and continuity. For more on this see these Pop11 teach files: TEACH GRAMMAR TEACH STORYGRAMMAR --- $usepop/pop/teach/haiku-demo.txt