private IEnumerable <IClause> TryFindClauses() { var possibleClauses = AdTree.GetAdTreesInAdTreeOrder().Where(x => AttributesModel.IsU(x.Morpheme.Attributes)); // If U grammar character is present then there can be multiple clauses. if (possibleClauses.Any()) { foreach (var possibleClause in possibleClauses) { var isClauseOnRight = Clause.IsClause(possibleClause.Right, AttributesModel); if (isClauseOnRight) { var clauseAdTree = possibleClause.Right.MakeDeepCopy(); var clause = Factory.CreateClause(clauseAdTree, 0); yield return(clause); } var isClauseOnLeft = Clause.IsClause(possibleClause.Left, AttributesModel); if (isClauseOnLeft) { var clauseAdTree = possibleClause.Left.MakeDeepCopy(); var clause = Factory.CreateClause(clauseAdTree, 0); yield return(clause); } } } else { if (Clause.IsClause(AdTree, AttributesModel)) { var clause = Factory.CreateClause(AdTree, StructureAttributes.Sentence.SimpleSentence); yield return(clause); } } }
private ITerm TryGetPredicate() { ITerm result = null; var verb = AdTree.GetRightSequence().FirstOrDefault(x => AttributesModel.IsVerb(x.Morpheme.Attributes)); if (verb != null) { IAdTree predicateAdTree; var verbValencies = AttributesModel.GetNumberOfValencies(verb.Morpheme.Attributes); if (verbValencies > 0) { predicateAdTree = verb.GetSequenceToRoot() .First(x => x.AdPosition == null || AttributesModel.IsU(x.AdPosition.Morpheme.Attributes)) .MakeDeepCopy(); // Remove the subject (i.e. remove the sub-adtree on the first valency) var firstValency = predicateAdTree.GetRightSequence().FirstOrDefault(x => x.Pattern.ValencyPosition == 1); if (firstValency != null) { firstValency.Left = null; } } else { predicateAdTree = verb.MakeDeepCopy(); result = Factory.CreateTerm(verb, StructureAttributes.Term.Predicate); } result = Factory.CreateTerm(predicateAdTree, StructureAttributes.Term.Predicate); } return(result); }