public void SubjectAndPredicate_with_circumstantial() { var adTree = new AdTree(new Morpheme(myAttributesModel, ".", EnglishAttributes.U.NonLexeme.PunctuationMark.Period), EnglishPattern.MorphematicAdPosition("I-U-I", "", EnglishAttributes.U.NonLexeme.PunctuationMark, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "in", EnglishAttributes.E.Lexeme.Preposition), EnglishPattern.MorphematicAdPosition("O-E-I", "", EnglishAttributes.E.Lexeme, EnglishAttributes.O.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O2_I) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O).SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A)) } }, Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O).SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "room", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)) } } }; var factory = new LinguisticStructureFactory(myAttributesModel); var clause = factory.CreateClause(adTree, 0); Assert.AreEqual("I", clause.Subject.Value); Assert.AreEqual("read the book in the room", clause.Predicate.Value); }
public void CanAttachToRight_ValencyPosition() { // The phrase: I read AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.Epsilon), EnglishPattern.O1_I) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }; // Try to connect the second valency position. AdTree valency2 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O2_I); Assert.IsTrue(valency2.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the first valency position. AdTree valency1 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I); Assert.IsFalse(valency1.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the third valency position. AdTree valency3 = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O3_I); Assert.IsFalse(valency3.CanAttachToRight(adTree, myAttributesModel)); // Try to connect the verb directly to the second valency. adTree = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme.Verb.Valency.Bivalent)); Assert.IsFalse(valency2.CanAttachToRight(adTree, myAttributesModel)); }
public void CanAttachToLeft_Substitution_Morphemic() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("O-A", "", EnglishAttributes.O.Lexeme, EnglishAttributes.A.Lexeme).SetLeftFirst()) }; IAdTree adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.Left.CanAttachToLeft(adTreeElement, myAttributesModel)); // The morpheme is not attached to the right yet - so only rules are evaluated. adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.Left.CanAttachToLeft(adTreeElement, myAttributesModel)); // Attach to the left on the root. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme).SetLeftFirst()); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Attach to the left on the root - incorrect morpheme. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void Clauses_ComplexSentence() { var adTree = new AdTree(new Morpheme(myAttributesModel, ".", EnglishAttributes.U.NonLexeme.PunctuationMark), EnglishPattern.MorphematicAdPosition(".", "", EnglishAttributes.U.NonLexeme.PunctuationMark, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "and", EnglishAttributes.U.Lexeme.Conjunction.Coordinating), EnglishPattern.MorphematicAdPosition("I-U-I", "", EnglishAttributes.U.Lexeme.Conjunction.Coordinating, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I.Lexeme.Verb), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I.SetLeftFirst()) { Right = new AdTree(new Morpheme(myAttributesModel, "learn", EnglishAttributes.I.Lexeme.Verb), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) } } }; var factory = new LinguisticStructureFactory(myAttributesModel); var sentence = factory.CreateSentence(adTree, 0); var clauses = sentence.Clauses.ToList(); Assert.AreEqual(2, clauses.Count); Assert.AreEqual("I read", clauses[0].Value); Assert.AreEqual("I learn", clauses[1].Value); }
public void IsComplete() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, "book", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsTrue(adTree.IsComplete()); // Missing morph. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.IsComplete()); // Missing attributes. adTree = new AdTree(new Morpheme(myAttributesModel, "book", 0), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)); Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = null, Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsTrue(adTree.IsComplete()); // Right is missing. adTree = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Left = null, Right = null, }; Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsTrue(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = null, Right = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), }; Assert.IsFalse(adTree.IsComplete()); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A, EnglishAttributes.O)) { Left = new AdTree(new Morpheme(myAttributesModel, "", 0), new Pattern()), Right = null, }; Assert.IsFalse(adTree.IsComplete()); }
public void CanAttachToLeft() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); IAdTree adTreeElement = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }); Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Primitive transference. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.A_Lexeme, } ); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.O_Lexeme }) }; Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); adTreeElement = new AdTree(new Morpheme(myAttributesModel, "green", EnglishAttributes.A.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.A_Lexeme }); Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void GetNonconformities_MonoTransference() { AdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "race", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = null, }, }; List <IAdTree> nonconformities = adTree.GetNonconformities(myAttributesModel).ToList(); Assert.AreEqual(0, nonconformities.Count); }
public void CanAttachToLeft_Substitution() { IAdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, } ); IAdTree adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { UpRule = MorphemeRule.Epsilon, LeftRule = EnglishMorphemeRule.A_Lexeme, RightRule = EnglishMorphemeRule.O_Lexeme }) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.Is(MorphRules.Something, EnglishAttributes.O.Lexeme) }), }; Assert.IsTrue(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); // Substitution is not allowed. adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { LeftRule = EnglishMorphemeRule.O_Lexeme, }.SetSubstitutionForLeft(SubstitutionRules.Nothing) ); adTreeElement = new AdTree(Morpheme.Epsilon(myAttributesModel), new Pattern() { UpRule = MorphemeRule.Epsilon, LeftRule = EnglishMorphemeRule.A_Lexeme, RightRule = EnglishMorphemeRule.O_Lexeme }) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), new Pattern() { UpRule = EnglishMorphemeRule.Is(MorphRules.Something, EnglishAttributes.O.Lexeme) }), }; Assert.IsFalse(adTree.CanAttachToLeft(adTreeElement, myAttributesModel)); }
public void RulingGrammarCharacter_E() { AdTree adTree = new AdTree(new Morpheme(myAttributesModel, ".", EnglishAttributes.U), EnglishPattern.MorphematicAdPosition("I-U-I", "", EnglishAttributes.U.NonLexeme.PunctuationMark, EnglishAttributes.I.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "in", EnglishAttributes.E), EnglishPattern.MorphematicAdPosition("O-E-I", "", EnglishAttributes.E.Lexeme, EnglishAttributes.O.Lexeme, EnglishAttributes.I.Lexeme)) { Right = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.O1_I) { Right = new AdTree(new Morpheme(myAttributesModel, "read", EnglishAttributes.I), EnglishPattern.Morpheme(EnglishAttributes.I.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "I", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)) }, Left = new AdTree(new Morpheme(myAttributesModel, "in", EnglishAttributes.E), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "room", EnglishAttributes.O), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = new AdTree(new Morpheme(myAttributesModel, "the", EnglishAttributes.A), EnglishPattern.Morpheme(EnglishAttributes.A.Lexeme)) } } }; // Although there is E in between but the ruling grammar character is I. Assert.AreEqual(GrammarCharacter.I, adTree.RulingGrammarCharacter); }
public void TryGetTransferenceMorpheme_MonoTransference() { AdTree adTree = new AdTree(Morpheme.Epsilon(myAttributesModel), EnglishPattern.EpsilonAdPosition("A-O", "", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "car", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), // Mono-transference. Left = new AdTree(new Morpheme(myAttributesModel, "", EnglishAttributes.A.Lexeme), EnglishPattern.MonoTransference("O>A", EnglishAttributes.A.Lexeme, EnglishAttributes.O.Lexeme)) { Right = new AdTree(new Morpheme(myAttributesModel, "race", EnglishAttributes.O.Lexeme), EnglishPattern.Morpheme(EnglishAttributes.O.Lexeme)), Left = null, }, }; Assert.IsTrue(adTree.Left.Pattern.IsMonoTransference); var result = adTree.Left.TryGetTransferenceMorpheme(); // Attributes shall be taken from the parent. Assert.AreEqual(adTree.Left.Morpheme.Attributes, result.Attributes); // Morph shall be taken from the child. Assert.AreEqual(adTree.Left.Right.Morpheme.Morph, result.Morph); }