§19.7. The preamble of a rule
In general, a rule looks like this:
preamble : list of one or more phrases divided by semicolons
though in a few common cases (where the preamble begins with Before, After, Instead of, Every turn, or When, and there is only one phrase in the list) the colon can be replaced with a comma. Three kinds of declaration are special, and these we can tell apart by the first word:
To ... - a new phrase: see the chapter on Phrases
At ... - something due to happen at a given time: see Time
Definition: ... - a new adjective: see Descriptions
All other declarations (that is, starting with any other word) create rules fit for going into rulebooks. The preamble can either just be a name, which is required to end with the word "rule", or it can give circumstances and have no name, or it can do both:
This is the ...name of rule...
...circumstances...
...circumstances... (this is the ...name of rule...)
The circumstances should be a sequence of the following ingredients, each of which is optional except the name of the rulebook:
first or last
followed by ...rulebook name...
followed by about or for or of or on or rule
followed by ...what to apply to...
followed by while or when ...condition...
followed by during ...a scene...
The word "first" or "last", if present, is significant: it tells Inform exactly where the new rule should be placed into its rulebook, and so overrides the normal practice of placing the rule according to how specific it is.
On the other hand, the use of any of the following:
for
of
rule about
rule for
rule on
is purely to make the text easier to read: Inform does not make any direct use of these words (except perhaps that it may help to avoid ambiguities by separating the rulebook name from what is being applied to). Thus in the rule
Instead of kissing Clark: ...
the word "instead" is the rulebook's name, while "of" is technically optional. "Instead rule about kissing Clark: ..." would work just as well.
In this whole list of possible ingredients, only the rulebook name is compulsory. We could define a rule called simply "Instead: ..." if we wanted - though its universal applicability would make it pretty disruptive, with every action stopped in its tracks.
Backus-Naur form, or BNF, is a standard notation used by computer scientists to specify more or less precisely what the valid programs are for a given programming language. It tends to provide a good description for a language such as C or Pascal, where contextual rules are limited, but the authors of Inform are doubtful that it is such a good tool for a natural-language system. For those who are interested, though, the following gives a formal specification for Inform's rules.
<rule> ::=
Definition : A/an <kind> is <new adjectival name> if/unless <definition>
| <preamble> : <phrases>
| <preamble> , <phrase> (* only allowed for a few cases: see below)
<definition> ::=
<condition>
| its/his/her/their <value property name> is/are <value> or less/more
| : <phrases>
<preamble> ::=
To <phrase template>
| To decide if/whether <phrase template>
| To decide which/what <kind of value> is <phrase template>
| This is the <rule name>
| [[A] Rule for] <circumstances> [(this is the <rule name>)]
<circumstances> ::=
At <time>
| When <event name>
| [<placement>] <rulebook reference> [while/when <condition>] [during <scene name>]
<rulebook reference> ::=
<rulebook name> [about/for/of/on/rule] [<action pattern>]
| <object-based-rulebook name> [about/for/of/on/rule] [<description>]
<placement> ::=
a/an
| [the] first
| [the] last
<phrases> ::=
<phrase>
| <phrases> ; <phrase>
The following examples show how Inform breaks down some typical rules using the system above:
<rule> = At 2:09 PM: increase the score by 2; say "Progress!"
<preamble> = At 2:09 PM
<circumstances> = At 2:09 PM
At
<time> = 2:09 PM
:
<phrases> = increase the score by 2; say "Progress!"
<phrase> = increase the score by 2
;
<phrase> = say "Progress"
<rule> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule), say "It's greasy!"
<preamble> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule)
<circumstances> = Instead of eating the ostrich during Formal Dinner
<rulebook reference> = Instead of eating the ostrich
<rulebook name> = Instead
of
<action pattern> = eating the ostrich
during
<scene name> = Formal Dinner
(
this
is
the
<rule name> = cuisine rule
)
,
<phrases> = say "It's greasy!"
<phrase> = say "It's greasy!"
<rule> = After printing the name of a container: say "!"
<preamble> = After printing the name of a container
<circumstances> = After printing the name of a container
<rulebook reference> = After printing the name of a container
<object-based-rulebook name> = After printing the name
of
<description> = a container
:
<phrases> = say "!"
<phrase> = say "!"
(*) The colon dividing a rule preamble from its definition can be replaced by a comma only if the preamble begins with the words "Instead of", "Before", "After", "Every turn" or "When", and if the definition consists only of a single phrase.
|   ExampleBackus-Naur form for rules The full grammar Inform uses to parse rule definitions, in a standard computer-science notation.
|
Backus-Naur form, or BNF, is a standard notation used by computer scientists to specify more or less precisely what the valid programs are for a given programming language. It tends to provide a good description for a language such as C or Pascal, where contextual rules are limited, but the authors of Inform are doubtful that it is such a good tool for a natural-language system. For those who are interested, though, the following gives a formal specification for Inform's rules.
<rule> ::=
Definition : A/an <kind> is <new adjectival name> if/unless <definition>
| <preamble> : <phrases>
| <preamble> , <phrase> (* only allowed for a few cases: see below)
<definition> ::=
<condition>
| its/his/her/their <value property name> is/are <value> or less/more
| : <phrases>
<preamble> ::=
To <phrase template>
| To decide if/whether <phrase template>
| To decide which/what <kind of value> is <phrase template>
| This is the <rule name>
| [[A] Rule for] <circumstances> [(this is the <rule name>)]
<circumstances> ::=
At <time>
| When <event name>
| [<placement>] <rulebook reference> [while/when <condition>] [during <scene name>]
<rulebook reference> ::=
<rulebook name> [about/for/of/on/rule] [<action pattern>]
| <object-based-rulebook name> [about/for/of/on/rule] [<description>]
<placement> ::=
a/an
| [the] first
| [the] last
<phrases> ::=
<phrase>
| <phrases> ; <phrase>
The following examples show how Inform breaks down some typical rules using the system above:
<rule> = At 2:09 PM: increase the score by 2; say "Progress!"
<preamble> = At 2:09 PM
<circumstances> = At 2:09 PM
At
<time> = 2:09 PM
:
<phrases> = increase the score by 2; say "Progress!"
<phrase> = increase the score by 2
;
<phrase> = say "Progress"
<rule> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule), say "It's greasy!"
<preamble> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule)
<circumstances> = Instead of eating the ostrich during Formal Dinner
<rulebook reference> = Instead of eating the ostrich
<rulebook name> = Instead
of
<action pattern> = eating the ostrich
during
<scene name> = Formal Dinner
(
this
is
the
<rule name> = cuisine rule
)
,
<phrases> = say "It's greasy!"
<phrase> = say "It's greasy!"
<rule> = After printing the name of a container: say "!"
<preamble> = After printing the name of a container
<circumstances> = After printing the name of a container
<rulebook reference> = After printing the name of a container
<object-based-rulebook name> = After printing the name
of
<description> = a container
:
<phrases> = say "!"
<phrase> = say "!"
(*) The colon dividing a rule preamble from its definition can be replaced by a comma only if the preamble begins with the words "Instead of", "Before", "After", "Every turn" or "When", and if the definition consists only of a single phrase.
Backus-Naur form, or BNF, is a standard notation used by computer scientists to specify more or less precisely what the valid programs are for a given programming language. It tends to provide a good description for a language such as C or Pascal, where contextual rules are limited, but the authors of Inform are doubtful that it is such a good tool for a natural-language system. For those who are interested, though, the following gives a formal specification for Inform's rules.
<rule> ::=
Definition : A/an <kind> is <new adjectival name> if/unless <definition>
| <preamble> : <phrases>
| <preamble> , <phrase> (* only allowed for a few cases: see below)
<definition> ::=
<condition>
| its/his/her/their <value property name> is/are <value> or less/more
| : <phrases>
<preamble> ::=
To <phrase template>
| To decide if/whether <phrase template>
| To decide which/what <kind of value> is <phrase template>
| This is the <rule name>
| [[A] Rule for] <circumstances> [(this is the <rule name>)]
<circumstances> ::=
At <time>
| When <event name>
| [<placement>] <rulebook reference> [while/when <condition>] [during <scene name>]
<rulebook reference> ::=
<rulebook name> [about/for/of/on/rule] [<action pattern>]
| <object-based-rulebook name> [about/for/of/on/rule] [<description>]
<placement> ::=
a/an
| [the] first
| [the] last
<phrases> ::=
<phrase>
| <phrases> ; <phrase>
The following examples show how Inform breaks down some typical rules using the system above:
<rule> = At 2:09 PM: increase the score by 2; say "Progress!"
<preamble> = At 2:09 PM
<circumstances> = At 2:09 PM
At
<time> = 2:09 PM
:
<phrases> = increase the score by 2; say "Progress!"
<phrase> = increase the score by 2
;
<phrase> = say "Progress"
<rule> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule), say "It's greasy!"
<preamble> = Instead of eating the ostrich during Formal Dinner (this is the cuisine rule)
<circumstances> = Instead of eating the ostrich during Formal Dinner
<rulebook reference> = Instead of eating the ostrich
<rulebook name> = Instead
of
<action pattern> = eating the ostrich
during
<scene name> = Formal Dinner
(
this
is
the
<rule name> = cuisine rule
)
,
<phrases> = say "It's greasy!"
<phrase> = say "It's greasy!"
<rule> = After printing the name of a container: say "!"
<preamble> = After printing the name of a container
<circumstances> = After printing the name of a container
<rulebook reference> = After printing the name of a container
<object-based-rulebook name> = After printing the name
of
<description> = a container
:
<phrases> = say "!"
<phrase> = say "!"
(*) The colon dividing a rule preamble from its definition can be replaced by a comma only if the preamble begins with the words "Instead of", "Before", "After", "Every turn" or "When", and if the definition consists only of a single phrase.
|