Пример #1
0
        private IEnumerable <NestedQuestion> GetNestedQuestions(IQuestionProcessingContext <ComparisonQuestion> context)
        {
            foreach (var statement in context.SemanticNetwork.Statements.Enumerate <ComparisonStatement>(context.ActiveContexts))
            {
                IConcept newLeftValue = null;
                if (statement.LeftValue == LeftValue)
                {
                    newLeftValue = statement.RightValue;
                }
                else if (statement.RightValue == LeftValue)
                {
                    newLeftValue = statement.LeftValue;
                }

                if (newLeftValue != null)
                {
                    var involvedValues = new HashSet <IConcept>(context.ActiveContexts
                                                                .OfType <IQuestionProcessingContext <ComparisonQuestion> >()
                                                                .Select(c => c.Question.LeftValue));

                    if (!involvedValues.Contains(newLeftValue))
                    {
                        yield return(new NestedQuestion(new ComparisonQuestion(newLeftValue, RightValue), new IStatement[] { statement }));
                    }
                }
            }
        }
Пример #2
0
        private IAnswer ProcessChildAnswers(IQuestionProcessingContext <ComparisonQuestion> context, ICollection <ChildAnswer> childAnswers)
        {
            foreach (var answer in childAnswers)
            {
                var childStatement = (answer.Answer as StatementAnswer)?.Result as ComparisonStatement;
                if (childStatement != null)
                {
                    var transitiveStatement = (ComparisonStatement)answer.TransitiveStatements.Single();
                    var intermediateValue = new[] { childStatement.LeftValue, childStatement.RightValue }.Intersect(new[] { transitiveStatement.LeftValue, transitiveStatement.RightValue }).Single();
                    if ((childStatement.LeftValue == intermediateValue) == (transitiveStatement.LeftValue == intermediateValue))
                    {
                        transitiveStatement = transitiveStatement.SwapOperands();
                    }

                    var resultSign = ComparisonSigns.CompareThreeValues(childStatement.ComparisonSign, transitiveStatement.ComparisonSign);
                    if (resultSign != null)
                    {
                        var transitiveStatements = new List <IStatement>(answer.TransitiveStatements);
                        transitiveStatements.AddRange(answer.Answer.Explanation.Statements);

                        return(createAnswer(
                                   new ComparisonStatement(null, LeftValue, RightValue, resultSign),
                                   context,
                                   transitiveStatements));
                    }
                }
            }

            return(Answer.CreateUnknown());
        }
Пример #3
0
        public override IAnswer Process(IQuestionProcessingContext context)
        {
            var allStatements = context.SemanticNetwork.Statements.Enumerate(context.ActiveContexts).ToList();

            var isStatements = allStatements.Enumerate <IsStatement>(context.ActiveContexts).Where(c => c.Descendant == Concept).ToList();

            if (isStatements.Any())
            {
                var result      = new Semantics.Text.Containers.UnstructuredContainer();
                var explanation = new List <SignValueStatement>();
                foreach (var statement in isStatements)
                {
                    var difference = getDifferenceBetweenAncestorAndDescendant(allStatements, statement);
                    explanation.AddRange(difference);

                    if (difference.Count > 0)
                    {
                        writeClassificationWithDifference(result, statement, difference);
                    }
                    else
                    {
                        writeJustClassification(result, statement);
                    }

                    result.AppendLineBreak();
                }
                return(new Answer(result, new Explanation(explanation), false));
            }
            else
            {
                return(Answer.CreateUnknown());
            }
        }
Пример #4
0
        public override IAnswer Process(IQuestionProcessingContext context)
        {
            var allStatements = context.SemanticNetwork.Statements.Enumerate(context.ActiveContexts);

            IEnumerable <IStatement> statements;
            var parentChild = Statement as IParentChild <IConcept>;

            if (parentChild != null)
            {
                statements = allStatements.FindPath(Statement.GetType(), parentChild.Parent, parentChild.Child);
            }
            else
            {
                var statement = allStatements.FirstOrDefault(p => p.Equals(Statement));
                statements = statement != null ? new[] { statement } : Array.Empty <IStatement>();
            }

            var result = new UnstructuredContainer();

            System.Boolean isTrue = statements.Any();
            result.Append(
                language => Strings.ParamAnswer,
                new Dictionary <String, IKnowledge> {
                { Strings.ParamAnswer, isTrue.ToLogicalValue() }
            });
            result.Append(isTrue ? Statement.DescribeTrue() : Statement.DescribeFalse());
            return(new BooleanAnswer(
                       isTrue,
                       result,
                       new Explanation(statements)));
        }
Пример #5
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <ProcessesQuestion, ProcessesStatement>()
            .WithTransitives(s => s.Count == 0, GetNestedQuestions)
            .Where(s => (s.ProcessA == ProcessA && s.ProcessB == ProcessB) || (s.ProcessB == ProcessA && s.ProcessA == ProcessB))
            .SelectCustom(CreateAnswer));
 }
Пример #6
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <ComparisonQuestion, ComparisonStatement>()
            .WithTransitives(s => s.Count == 0, GetNestedQuestions)
            .Where(s => (s.LeftValue == LeftValue && s.RightValue == RightValue) || (s.RightValue == LeftValue && s.LeftValue == RightValue))
            .SelectCustom(CreateAnswer));
 }
Пример #7
0
            public override IAnswer Process(IQuestionProcessingContext context)
            {
                if (_createNestedContext)
                {
                    new QuestionProcessingContext <TestQuestionCreateNestedContext>(context, new TestQuestionCreateNestedContext(false));
                }

                return(null);
            }
Пример #8
0
 public StatementQuestionProcessor(IQuestionProcessingContext context)
 {
     Context                  = (IQuestionProcessingContext <QuestionT>)context;
     Statements               = Array.Empty <StatementT>();
     ChildAnswers             = Array.Empty <ChildAnswer>();
     AdditionalTransitives    = Array.Empty <IStatement>();
     NeedToProcessTransitives = statements => false;
     GetTransitiveQuestions   = c => Array.Empty <NestedQuestion>();
     NeedToAggregateTransitivesToStatements = false;
 }
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <EnumerateDescendantsQuestion, IsStatement>()
            .Where(s => s.Ancestor == Concept)
            .SelectAllConcepts(
                statement => statement.Descendant,
                question => question.Concept,
                Strings.ParamParent,
                language => language.GetExtension <ILanguageClassificationModule>().Questions.Answers.EnumerateDescendants));
 }
Пример #10
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <FindSubjectAreaQuestion, GroupStatement>()
            .Where(s => s.Concept == Concept)
            .SelectAllConcepts(
                statement => statement.Area,
                question => question.Concept,
                Semantics.Localization.Strings.ParamConcept,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.SubjectArea));
 }
Пример #11
0
        public override IAnswer Process(IQuestionProcessingContext context)
        {
            var random        = new Random(DateTime.Now.Millisecond);
            var allConcepts   = context.SemanticNetwork.Concepts.ToList();
            var resultConcept = allConcepts[random.Next(allConcepts.Count)];

            return(new ConceptAnswer(
                       resultConcept,
                       new FormattedText(language => resultConcept.Name.GetValue(language)),
                       new Explanation(Array.Empty <IStatement>())));
        }
Пример #12
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <DescribeSubjectAreaQuestion, GroupStatement>()
            .Where(s => s.Area == Concept)
            .SelectAllConcepts(
                statement => statement.Concept,
                question => question.Concept,
                Strings.ParamArea,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.SubjectAreaConcepts));
 }
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <EnumerateContainersQuestion, HasPartStatement>()
            .Where(s => s.Part == Concept)
            .SelectAllConcepts(
                statement => statement.Whole,
                question => question.Concept,
                Semantics.Localization.Strings.ParamChild,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.EnumerateContainers));
 }
Пример #14
0
            public override IAnswer Process(IQuestionProcessingContext context)
            {
                IStatement testStatement;

                context.SemanticNetwork.Statements.Add(testStatement = new TestStatement());
                testStatement.Context = context;
                context.Scope.Add(testStatement);

                Assert.IsTrue(context.SemanticNetwork.Statements.Enumerate <TestStatement>(context).Any());

                return(null);
            }
Пример #15
0
        private static StatementAnswer createAnswer(ComparisonStatement statement, IQuestionProcessingContext <ComparisonQuestion> context, ICollection <IStatement> transitiveStatements = null)
        {
            var resultStatement = statement.SwapOperandsToMatchOrder(context.Question);

            var text = new UnstructuredContainer();

            text.Append(resultStatement.DescribeTrue());

            var explanation = transitiveStatements == null
                                ? new Explanation(statement)
                                : new Explanation(transitiveStatements);

            return(new StatementAnswer(resultStatement, text, explanation));
        }
Пример #16
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <IsValueQuestion, SignValueStatement>()
            .Where(s => s.Value == Concept)
            .SelectBoolean(
                statements => Concept.HasAttribute <IsValueAttribute>(),
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.ValueTrue,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.ValueFalse,
                new Dictionary <String, IKnowledge>
     {
         { Semantics.Localization.Strings.ParamConcept, Concept },
     }));
 }
Пример #17
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <IsPartOfQuestion, HasPartStatement>()
            .Where(s => s.Whole == Parent && s.Part == Child)
            .SelectBoolean(
                statements => statements.Any(),
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.IsPartOfTrue,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.IsPartOfFalse,
                new Dictionary <String, IKnowledge>
     {
         { Semantics.Localization.Strings.ParamParent, Parent },
         { Semantics.Localization.Strings.ParamChild, Child },
     }));
 }
Пример #18
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <IsSubjectAreaQuestion, GroupStatement>()
            .Where(s => s.Area == Area && s.Concept == Concept)
            .SelectBoolean(
                statements => statements.Any(),
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.IsSubjectAreaTrue,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.IsSubjectAreaFalse,
                new Dictionary <String, IKnowledge>
     {
         { Strings.ParamArea, Area },
         { Semantics.Localization.Strings.ParamConcept, Concept },
     }));
 }
Пример #19
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <CustomQuestion, CustomStatement>()
            .Where(s => s.Concept1 == Concept1 && s.Concept2 == Concept2)
            .SelectBoolean(
                statements => statements.Count > 0,
                language => language.GetExtension <ILanguageCustomModule>().Questions.Answers.CustomTrue,
                language => language.GetExtension <ILanguageCustomModule>().Questions.Answers.CustomFalse,
                new Dictionary <String, IKnowledge>
     {
         { CustomStatement.ParamConcept1, Concept1 },
         { CustomStatement.ParamConcept2, Concept2 },
     }));
 }
Пример #20
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <EnumerateSignsQuestion, HasSignStatement>()
            .WithTransitives(
                statements => Recursive,
                question => question.Concept,
                newSubject => new EnumerateSignsQuestion(newSubject, true),
                needToAggregateTransitivesToStatements: true)
            .Where(s => s.Concept == Concept)
            .SelectAllConcepts(
                statement => statement.Sign,
                question => question.Concept,
                Semantics.Localization.Strings.ParamConcept,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.ConceptSigns + (Recursive ? language.Questions.Answers.RecursiveTrue : language.Questions.Answers.RecursiveFalse) + ": "));
 }
Пример #21
0
 private static void addStatementConsequences(
     HashSet <ProcessesStatement> statements,
     ProcessesStatement newStatement,
     IQuestionProcessingContext <ProcessesQuestion> context)
 {
     foreach (var consequentSign in newStatement.SequenceSign.Consequently())
     {
         if (statements.All(s => s.SequenceSign != consequentSign))
         {
             statements.Add(new ProcessesStatement(null, context.Question.ProcessA, context.Question.ProcessB, consequentSign)
             {
                 Context = context
             });
         }
     }
 }
Пример #22
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <HasSignsQuestion, HasSignStatement>()
            .WithTransitives(
                statements => Recursive,
                question => question.Concept,
                newSubject => new HasSignsQuestion(newSubject, true))
            .Where(s => s.Concept == Concept)
            .SelectBooleanIncludingChildren(
                statements => statements.Count > 0,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.HasSignsTrue + (Recursive ? language.Questions.Answers.RecursiveTrue : language.Questions.Answers.RecursiveFalse) + ".",
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.HasSignsFalse + (Recursive ? language.Questions.Answers.RecursiveTrue : language.Questions.Answers.RecursiveFalse) + ".",
                new Dictionary <String, IKnowledge>
     {
         { Semantics.Localization.Strings.ParamConcept, Concept },
     }));
 }
Пример #23
0
        private IAnswer ProcessChildAnswers(IQuestionProcessingContext <ProcessesQuestion> context, ICollection <ChildAnswer> childAnswers)
        {
            foreach (var answer in childAnswers)
            {
                var childStatements  = (answer.Answer as StatementsAnswer <ProcessesStatement>)?.Result ?? Array.Empty <ProcessesStatement>();
                var resultStatements = new List <ProcessesStatement>();

                var transitiveStatements = answer.TransitiveStatements.OfType <ProcessesStatement>().ToList();
                var firstChild = childStatements.First();
                var firstTransitive = transitiveStatements.First();
                var intermediateValue = new[] { firstChild.ProcessA, firstChild.ProcessB }.Intersect(new[] { firstTransitive.ProcessA, firstTransitive.ProcessB }).Single();
                for (int i = 0; i < transitiveStatements.Count; i++)
                {
                    if ((firstChild.ProcessA == intermediateValue) == (transitiveStatements[i].ProcessA == intermediateValue))
                    {
                        transitiveStatements[i] = transitiveStatements[i].SwapOperands();
                    }
                }

                foreach (var childStatement in childStatements)
                {
                    foreach (var transitiveStatement in transitiveStatements)
                    {
                        var sign = SequenceSigns.TryToCombineMutualSequences(transitiveStatement.SequenceSign, childStatement.SequenceSign);
                        if (sign != null)
                        {
                            resultStatements.Add(new ProcessesStatement(null, ProcessA,
                                                                        ProcessB,
                                                                        sign));
                        }
                    }
                }

                if (resultStatements.Count > 0)
                {
                    var resultTransitiveStatements = new List <IStatement>(answer.TransitiveStatements);
                    resultTransitiveStatements.AddRange(answer.Answer.Explanation.Statements);

                    return(createAnswer(resultStatements, context, resultTransitiveStatements));
                }
            }

            return(Answer.CreateUnknown());
        }
Пример #24
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <IsQuestion, IsStatement>()
            .WithTransitives(
                statements => statements.Count == 0,
                question => question.Child,
                newSubject => new IsQuestion(newSubject, Parent))
            .Where(s => s.Parent == Parent && s.Child == Child)
            .SelectBooleanIncludingChildren(
                statements => statements.Count > 0,
                language => language.GetExtension <ILanguageClassificationModule>().Questions.Answers.IsTrue,
                language => language.GetExtension <ILanguageClassificationModule>().Questions.Answers.IsFalse,
                new Dictionary <String, IKnowledge>
     {
         { Strings.ParamParent, Parent },
         { Strings.ParamChild, Child },
     }));
 }
Пример #25
0
        private IEnumerable <NestedQuestion> GetNestedQuestions(IQuestionProcessingContext <ProcessesQuestion> context)
        {
            var involvedValues = new HashSet <IConcept>(context.ActiveContexts
                                                        .OfType <IQuestionProcessingContext <ProcessesQuestion> >()
                                                        .Select(c => c.Question.ProcessA));

            var transitiveProcesses = new Dictionary <IConcept, ICollection <IStatement> >();

            foreach (var statement in context.SemanticNetwork.Statements.Enumerate <ProcessesStatement>(context.ActiveContexts))
            {
                IConcept newProcessA = null;
                if (statement.ProcessA == ProcessA)
                {
                    newProcessA = statement.ProcessB;
                }
                else if (statement.ProcessB == ProcessA)
                {
                    newProcessA = statement.ProcessA;
                }

                if (newProcessA != null && !involvedValues.Contains(newProcessA))
                {
                    ICollection <IStatement> transitiveStatements;
                    if (!transitiveProcesses.TryGetValue(newProcessA, out transitiveStatements))
                    {
                        transitiveProcesses[newProcessA] = transitiveStatements = new List <IStatement>();
                    }

                    transitiveStatements.Add(statement);
                }
            }

            foreach (var transitiveProcess in transitiveProcesses)
            {
                var consequentStatements = new HashSet <ProcessesStatement>();
                foreach (var transitive in transitiveProcess.Value.OfType <ProcessesStatement>())
                {
                    addStatementConsequences(consequentStatements, transitive, context);
                }

                yield return(new NestedQuestion(new ProcessesQuestion(transitiveProcess.Key, ProcessB, consequentStatements), transitiveProcess.Value));
            }
        }
Пример #26
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <SignValueQuestion, SignValueStatement>()
            .WithTransitives(
                statements => statements.Count == 0,
                question => question.Concept,
                newSubject => new SignValueQuestion(newSubject, Sign))
            .Where(s => s.Concept == Concept && s.Sign == Sign)
            .SelectFirstConcept(
                statement => statement.Value,
                language => language.GetExtension <ILanguageSetModule>().Questions.Answers.SignValue,
                statement => new Dictionary <String, IKnowledge>
     {
         { Semantics.Localization.Strings.ParamConcept, Concept },
         { Strings.ParamSign, statement.Sign },
         { Strings.ParamValue, statement.Value },
         { Strings.ParamDefined, statement.Concept },
     }));
 }
Пример #27
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <GetShorterQuestion, IsTallerThanStatement>()
            .WithTransitives(
                statements => true,
                c => c.SemanticNetwork.Statements
                .OfType <IsTallerThanStatement>()
                .Where(s => s.TallerPerson == c.Question.Person)
                .Select(s => new NestedQuestion(
                            new GetShorterQuestion(s.ShorterPerson),
                            new IStatement[] { s })),
                true)
            .Where(s => s.TallerPerson == Person)
            .SelectAllConcepts(
                statement => statement.ShorterPerson,
                question => question.Person,
                "#TALLER#",
                language => $"#TALLER# is taller than",
                concepts => concepts.Distinct()));
 }
Пример #28
0
 public override IAnswer Process(IQuestionProcessingContext context)
 {
     return(context
            .From <IsTallerQuestion, IsTallerThanStatement>()
            .WithTransitives(
                statements => true,
                c => c.SemanticNetwork.Statements
                .OfType <IsTallerThanStatement>()
                .Where(s => s.TallerPerson == c.Question.TallerPerson)
                .Select(s => new NestedQuestion(
                            new IsTallerQuestion(s.ShorterPerson, c.Question.ShorterPerson),
                            new IStatement[] { s })))
            .Where(s => s.TallerPerson == TallerPerson && s.ShorterPerson == ShorterPerson)
            .SelectBooleanIncludingChildren(
                statements => statements.Count > 0,
                language => "Yes, #TALLER# is taller than #SHORTER#.",
                language => "No, #SHORTER# is taller than #TALLER#.",
                new Dictionary <String, IKnowledge>
     {
         { "#TALLER#", TallerPerson },
         { "#SHORTER#", ShorterPerson },
     }));
 }
Пример #29
0
        private static StatementsAnswer <ProcessesStatement> createAnswer(ICollection <ProcessesStatement> statements, IQuestionProcessingContext <ProcessesQuestion> context, ICollection <IStatement> transitiveStatements = null)
        {
            var resultStatements = new HashSet <ProcessesStatement>();
            var text             = new UnstructuredContainer();

            foreach (var statement in statements)
            {
                var resultStatement = statement.SwapOperandsToMatchOrder(context.Question);
                if (resultStatements.All(s => s.SequenceSign != resultStatement.SequenceSign))
                {
                    resultStatements.Add(resultStatement);
                    text.Append(resultStatement.DescribeTrue());
                }
                addStatementConsequences(resultStatements, resultStatement, context);
            }

            var explanation = transitiveStatements == null
                                ? new Explanation(statements)
                                : new Explanation(transitiveStatements);

            return(new StatementsAnswer <ProcessesStatement>(resultStatements, text, explanation));
        }
Пример #30
0
 private IAnswer CreateAnswer(IQuestionProcessingContext <ComparisonQuestion> context, ICollection <ComparisonStatement> statements, ICollection <ChildAnswer> childAnswers)
 {
     return(statements.Count > 0
                         ? createAnswer(statements.First(), context)
                         : ProcessChildAnswers(context, childAnswers));
 }