Search                        Top                                  Index

-- Analysing sentences: the procedure setup ---------------------------

LIB GRAMMAR also provides a program called SETUP which enables you to
transform your grammar and lexicon into a program which will analyse
sentences to see if they are legal, according to the grammar.

Start by typing

    setup(mygram, mylex);

You could put that in your file, after defining mygram and mylex. When
you get the colon prompt, check that analysing procedures have been
created, corresponding to the rules in mygram. E.g. type:

    s =>
    vp =>
    np =>


-- Seeing if your grammar 'accepts' a sentence -------------------------

Here is how you check whether your grammar will accept a sentence: put
the sentence in a list, then apply the procedure S to it (remember, S
was created by SETUP). Here is an example:

    s([the girl kissed the man]) ==>
    s([the computer added each number]) ==>


Use words and phrases which fit your own grammar and lexicon. Notice how
the procedure S creates a list of lists showing how the sentence is
broken down into parts.


-- Try more sentences, using the macro "---" --------------------------

Try some different sentences.

It's a chore to keep on having to type:

    s([    ]) ==>

LIB GRAMMAR defines a 'macro' abbreviation of three hyphens. To use it
just type the words of the sentence after the three hyphens, that is you
can type:

    --- the computer kissed the girl

instead of:

    s([the computer kissed the girl]) ==>

Here are some more examples of the use of the three hyphens:

    --- the big number added the computer
    --- the number added every computer


It's important that you put a space after ---.

The response <false> means that the sentence was not acceptable to the
analysing procedures.


-- Some examples with preposition phrases ------------------------------

Try some examples with prepositional phrases, for example:

    --- the man in the car kissed the cup
    --- the computer hated every number in the room



-- Using 'donouns' -----------------------------------------------------

To extend the power of the system type:

    true -> donouns;


You can then use unknown nouns and they will be accepted by the program if
the context is suitable, e.g.

    --- the fozzle teased every grumpet



-- Use "trace" to find out more ---------------------------------------

You can see in more detail what is going on if you trace your
procedures. This will show you that in order to get an analysis, the
computer tries all sorts of guesses as to what should be coming next,
which fail (result is <FALSE>), before it gets the right one. So this is
not a very intelligent language analysing system. Try:

    trace s vp np snp pp verb noun prep det;
    --- the girl hated the man in the car


Beware, you'll get a lot of printing! If you need to interrupt you can
do so using CTRL-c (I.e. hold down the button marked "Control", and
while still holding it, tap the "C" key.

-- Tracing gives more information if the sentence is unacceptable ------

You can also see what happens when an unacceptable sentence is provided. The
program makes lots of attempts, but they don't lead anywhere:

    --- the big cup in the room hated the computer

    --- each number added the car in the green room


The trace printing will show how the process of trying to find a
suitable analysis of the sentence in accordance with the grammar is a
process of SEARCH, i.e. the computer has to search for suitable way of
dividing up the sentence and linking its components to the various
rules of the grammar. Later you will learn a lot more about programs
that search for the solution to a problem.

-- How to turn off tracing ----------------------------------------------

You can suppress the amount of printout by untracing the procedures

    untrace ;


-- Using "showtree" to get a picture of a parse tree ------------------

The Pop-11 library includes a rather clever procedure called showtree
that can be used to display a parsed sentence as a tree diagram. To
make it available do

    uses showtree


That may take a little while to compile. You can then use showtree to
print out the result of parsing a sentence thus, try these

    showtree(s([the cup in the room hated the computer]));

    showtree(s([each number added the car in the room]));


I.e. apply "s" to a list of words to get a list of lists showing the
sentence structure, and apply showtree to the result of "s". Compare
that with what was previously printed out to show the tree structure.


-- Exercise: extend the grammar to allow several adjectives -----------

Can you also extend the grammar so that it will accept several
adjectives in a row before a noun, e.g.

    the happy little man
    the old old old car
    the big clever old old blue tree


Hint:

    1. Introduce a grammatical category adjectival phrases ("adjphrase")
    and extend the definition of "snp" to include an adjphrase between
    "det" and "noun".

    2. Define a rule for adjphrase which allows an adjphrase to be
        Either  just an adjective
        OR      an adjphrase followed by an adjective

    That recursive definition should allow an adjphrase to have an
    arbitrary number of adjectives. Why?

Try that and use "generate" to produce examples of your extended
grammar. Also use "setup" to create a parser based on your new grammar
and use the "---" operator to test sentences with several adjectives in
a row. Use "showtree" to see what the parse tree looks like.


-- Try to stop the production or acceptance of "stupid" sentences -----

The grammar and lexicon given above allow some quite silly sentences to
be produced, using -generate-, or to be analysed after using -setup- to
create parsing programs. Try modifying the grammar and lexicon so as
to constrain the "grammatical" sentences to be more sensible.

-- Summary -------------------------------------------------------------

LIB GRAMMAR makes available the procedures SETUP and GENERATE.
LIB LEXICON defines the lexicon LEXICON, and LIB GRAMMAR1 defines the
grammar GRAMMAR1.

You can parse some more complex sentences if you do

    lib grammar2;
    lib lexicon;    ;;; unless done previously
    setup(grammar2, lexicon);


Print out GRAMMAR2 and LEXICON (using "==>" and then see if you can work
out what sorts of sentences will be accepted and parsed, e.g.

    true -> donouns;
    setup(grammar2, lexicon);
    --- he put a big dog into each car
    --- he smiled at every man who thought he liked her


Try more of your own.

Further TEACH files: WHYSYNTAX, ISASENT.

Note for advanced programmers:

There is an extension to LIB GRAMMAR called LIB FACETS which enables you
to associate semantic rules (i.e. meaning rules) with a grammar. For
details see HELP * FACETS.

There is another extension, called LIB * TPARSE, which uses the Poplog
"process" mechanism to overcome a serious limitation of lib grammar,
namely that parsers produced by setup can only find a single parse for
each sentence, whereas in fact a sentence may have several different
parses. Give an example.

[Modified by A.Sloman at Birmingham 1994]