using System.Collections.Generic;
public static void Main()
Random rand = new Random();
List<Verb> verbList = BuildVerbList();
List<Case> caseList = BuildCaseList();
Verb vb_be = new Verb("be");
vb_be.AddFormFromHash(Case.StaticCaseHash(tense: "present"), "is");
vb_be.AddFormFromHash(Case.StaticCaseHash(tense: "past"), "had");
vb_be.AddFormFromHash(Case.StaticCaseHash(tense: "past", form:"perfect"), "was");
vb_be.AddFormFromHash(Case.StaticCaseHash(tense: "future"), "will");
foreach (Case sCase in caseList)
Verb vb_action = verbList[rand.Next(verbList.Count)];
Subject sj_gary = new Subject("Gary");
Statement st_hungry = new Statement("hungry");
Predicate pd_beHungry = new Predicate(vb_be, vb_action);
Clause garyIsHungry = new Clause(sj_gary, pd_beHungry, sCase);
Console.WriteLine(Sentence.BuildSimple(garyIsHungry));
public static List<Verb> BuildVerbList()
List<Verb> verbList = new List<Verb>();
Verb climb = new Verb("climb");
climb.AddFormFromHash(Case.StaticCaseHash(tense: "present"), "climbing");
climb.AddFormFromHash(Case.StaticCaseHash(tense: "past"), "climbed");
climb.AddFormFromHash(Case.StaticCaseHash(tense: "future"), "climb");
public static List<Case> BuildCaseList()
List<Case> caseList = new List<Case>();
caseList.Add(new Case(tense: "past"));
caseList.Add(new Case(tense: "present"));
caseList.Add(new Case(tense: "future"));
caseList.Add(new Case(tense: "past", form: "perfect"));
public Case(string tense = "present", string number = "singular", string gender = "neuter", string person = "third", string form = "simple")
Console.WriteLine("Tense: " + Tense);
Console.WriteLine("Number: " + Number);
Console.WriteLine("Gender: " + Gender);
Console.WriteLine("Person: " + Person);
Console.WriteLine("Form: " + Form);
return (Tense + Number + Gender + Person + Form).GetHashCode();
public static int StaticCaseHash(string tense = "present", string number = "singular", string gender = "neuter", string person = "third", string form = "simple")
return (tense + number + gender + person + form).GetHashCode();
public static string BuildSimple(Clause clause)
outputText += clause.ClauseSubject.Name;
outputText += clause.ClausePredicate.MainVerb.WithCase(clause.ClauseCase);
outputText += clause.ClausePredicate.StatementVerb.WithCase(clause.ClauseCase);
public Subject ClauseSubject;
public Predicate ClausePredicate;
public Clause(Subject clauseSubject, Predicate clausePredicate, Case clauseCase)
ClauseSubject = clauseSubject;
ClausePredicate = clausePredicate;
public Subject(string name)
public Verb StatementVerb;
public Predicate(Verb mainVerb, Verb statementVerb)
StatementVerb = statementVerb;
public Dictionary<int, string> Forms = new Dictionary<int, string>();
public void AddForm(Case vCase, string word)
Forms.Add(vCase.CaseHash(), word);
public void AddFormFromHash(int hash, string word)
public string WithCase(Case verbCase)
if (Forms.ContainsKey(verbCase.CaseHash()))
if (Forms[verbCase.CaseHash()] != null)
return Forms[verbCase.CaseHash()];
return Forms[new Case().CaseHash()];
return Forms[new Case().CaseHash()];
public Statement(string name)