content: package aima.core.nlp.data.grammars;
  
  import java.util.ArrayList;
  
  import aima.core.nlp.data.lexicons.LexiconExamples;
  import aima.core.nlp.parsing.Lexicon;
  import aima.core.nlp.parsing.grammars.ProbContextFreeGrammar;
  import aima.core.nlp.parsing.grammars.Rule;
  
  public class ProbContextFreeExamples {
  
  	public static ProbContextFreeGrammar buildWumpusGrammar() {
  		ProbContextFreeGrammar g = new ProbContextFreeGrammar();
  		ArrayList<Rule> rules = new ArrayList<Rule>();
  		// Start Rules
  		rules.add( new Rule( "S", "NP,VP", (float)0.90));
  		rules.add( new Rule( "S", "CONJ,S", (float)0.10));
  		// Noun Phrase Rules
  		rules.add( new Rule( "NP", "PRONOUN", (float)0.30));
  		rules.add( new Rule( "NP", "NAME" , (float)0.10));
  		rules.add( new Rule( "NP", "NOUN" , (float)0.10));
  		rules.add( new Rule( "NP", "ARTICLE,NOUN", (float)0.25));
  		rules.add( new Rule( "NP", "AP,NOUN", (float)0.05));
  		rules.add( new Rule( "NP", "DIGIT,DIGIT", (float)0.05));
  		rules.add( new Rule( "NP", "NP,PP", (float)0.10));
  		rules.add( new Rule( "NP", "NP,RELCLAUSE", (float)0.05));
  		// add verb phrase rules
  		rules.add( new Rule( "VP", "VERB", (float)0.40));
  		rules.add( new Rule( "VP", "VP,NP", (float)0.35));
  		rules.add( new Rule( "VP", "VP,ADJS", (float)0.05));
  		rules.add( new Rule( "VP", "VP,PP", (float)0.10));
  		rules.add( new Rule( "VP", "VP,ADVERB", (float)0.10));
  		// add adjective rules
  		rules.add( new Rule( "AJD", "AJDS", (float)0.80));
  		rules.add( new Rule( "AJD", "AJD,AJDS", (float)0.20));
  		// add Article Phrase
  		// This deviates from the text because the text provides the rule:
  		// NP -> Article Adjs Noun, which is NOT in Chomsky Normal Form
  		//
  		// We instead define AP (Article Phrase) AP -> Article Adjs, to get around this
  		rules.add( new Rule( "AP", "ARTICLE,ADJS", (float)1.0));
  		// add preposition phrase
  		rules.add( new Rule( "PP", "PREP,NP", (float)1.00));
  		// add relative clause
  		rules.add( new Rule( "RELCLAUSE", "RELPRO,VP", (float)1.00));
  		
  		// Now we can add all rules that derive terminal symbols, which are in 
  		// this case words.
  		Lexicon wumpusLex = LexiconExamples.buildWumpusLex();
  		ArrayList<Rule> terminalRules = new ArrayList<Rule>(wumpusLex.getAllTerminalRules());
  		rules.addAll( terminalRules );
  		// Add all these rules into the grammar
  		if(!g.addRules(rules)) {
  			return null;
  		}
  		return g; 
  	}
  }
  