| sentence  | ::= module : sentence
  | 
 | |  list  | { where list is a list of sentence }
  | 
 | |  clause
  | 
 | |  directive
  | 
 | |  query
  | 
 | |  grammar-rule
  | 
  | 
| clause  | ::= rule | unit-clause
  | 
  | 
| rule  | ::= head :- body
  | 
  | 
| unit-clause  | ::= head  | { where head is not otherwise a sentence }
  | 
  | 
| directive  | ::= :- body
  | 
  | 
| query  | ::= ?- body
  | 
  | 
| head  | ::= module : head
  | 
 | |  goal  | { where goal is not a variable }
  | 
  | 
| body  | ::= module : body
  | 
 | |  body -> body ; body
  | 
 | |  body -> body
  | 
 | |  \+ body
  | 
 | |  body ; body
  | 
 | |  body , body
  | 
 | |  goal
  | 
  | 
| goal  | ::= term  | { where term is not otherwise a body }
  | 
  | 
| grammar-rule  | ::= gr-head --> gr-body
  | 
  | 
| gr-head  | ::= module : gr-head
  | 
 | |  gr-head , terminals
  | 
 | |  non-terminal  | { where non-terminal is not a variable }
  | 
  | 
| gr-body  | ::= module : gr-body
  | 
 | |  gr-body -> gr-body ; gr-body
  | 
 | |  gr-body -> gr-body
  | 
 | |  \+ gr-body
  | 
 | |  gr-body ; gr-body
  | 
 | |  gr-body , gr-body
  | 
 | |  non-terminal
  | 
 | |  terminals
  | 
 | |  gr-condition
  | 
  | 
| non-terminal  | ::= term  | { where term is not otherwise a gr-body }
  | 
  | 
| terminals  | ::= list | string
  | 
  | 
| gr-condition  | ::= ! | {body}
  | 
  | 
| module  | ::= atom
   
  |