protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var subject             = generator.GetValue(instance, Concept2.Subject);
            var property            = generator.GetValue(instance, Concept2.Property);
            var inheritedProperties = generator.GetPropertyValues(subject, includeInstanceProps: false);

            var value = generator.GetValue(subject, property.Concept);

            if (value == null)
            {
                var refutation  = new ConceptInstance(Concept2.KnowledgeRefutation);
                var refutedInfo = new ConceptInstance(subject.Concept);
                generator.SetValue(refutedInfo, property.Concept, new ConceptInstance(Concept2.Something));
                generator.SetValue(refutation, Concept2.Subject, refutedInfo);
                generator.SetValue(refutation, Concept2.Property, property);
                generator.Push(new InstanceOutputEvent(refutation));
            }
            else
            {
                var confirmation  = new ConceptInstance(Concept2.KnowledgeConfirmed);
                var confirmedInfo = new ConceptInstance(subject.Concept);

                generator.SetValue(confirmedInfo, property.Concept, value);
                generator.SetValue(confirmation, Concept2.Subject, confirmedInfo);
                generator.Push(new InstanceOutputEvent(confirmation));
            }
        }
Exemple #2
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var property = generator.GetValue(instance, _propertyParameter);
            var subject  = generator.GetValue(instance, _subjectParameter);

            var answer = getAnswer(subject, property.Concept, generator);

            if (answer.Count == 0)
            {
                //generator.Push(new StaticScoreEvent(-0.20));
                generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.NotFound)));
            }
            else if (answer.Count == 1)
            {
                generator.Push(new StaticScoreEvent(0.20));
                generator.Push(new InstanceOutputEvent(answer.First()));
            }
            else
            {
                var needRefinementInstance = new ConceptInstance(Concept2.NeedsRefinement);
                generator.SetValue(needRefinementInstance, Concept2.Subject, subject);
                generator.SetValue(subject, Concept2.OnSetListener, instance);
                generator.Push(new InstanceOutputEvent(needRefinementInstance));
            }
        }
Exemple #3
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var parameterValue    = generator.GetValue(instance, _parameter);
            var relevantInstances = getRelevantInstances(instance, parameterValue.Concept, generator).ToArray();

            foreach (var relevantInstance in relevantInstances)
            {
                //avoid reference circles
                if (relevantInstance.Concept == instance.Concept)
                {
                    continue;
                }

                if (!generator.IsDefined(relevantInstance.Concept))
                {
                    continue;
                }

                //try tunnel instances between turns
                generator.Push(new StaticScoreEvent(0.05));
                generator.Push(new InstanceReferencedEvent(relevantInstance));
                generator.Pop();
                generator.Pop();
            }
        }
Exemple #4
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var activations = generator.GetInstanceActivations();

            foreach (var relevantInstanceActivation in activations)
            {
                if (!relevantInstanceActivation.CanBeReferenced)
                {
                    continue;
                }

                var relevantInstance = relevantInstanceActivation.Instance;
                if (relevantInstance == instance)
                {
                    //dont reference self
                    continue;
                }

                //try tunnel instances between turns
                generator.Push(new StaticScoreEvent(0.05));
                generator.Push(new InstanceReferencedEvent(relevantInstance));
                generator.Pop();
                generator.Pop();
            }
        }
Exemple #5
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var subject = generator.GetValue(instance, Concept2.Subject);
            var target  = generator.GetValue(instance, Concept2.Target);

            var relevantProperties = getRelevantProperties(target, generator);

            if (!relevantProperties.Any())
            {
                generator.Push(new StaticScoreEvent(-0.5));
                return;
            }

            var disambiguation = new ConceptInstance(Concept2.PropertyValueDisambiguation);

            generator.SetValue(disambiguation, Concept2.Unknown, subject);
            generator.SetValue(disambiguation, Concept2.Target, target);
            foreach (var pair in relevantProperties)
            {
                var propertyInstance = new ConceptInstance(pair.Key);
                foreach (var value in pair.Value)
                {
                    var valueInstance = new ConceptInstance(value);
                    generator.SetValue(valueInstance, Concept2.Property, propertyInstance);
                    generator.SetValue(disambiguation, Concept2.Subject, valueInstance);
                }
            }

            generator.Push(new InstanceActivationRequestEvent(disambiguation));
        }
Exemple #6
0
        public static void BeamBranchTesting()
        {
            var b = new BeamGenerator();

            b.Push(new InputPhraseEvent("x"));
            b.Pop();
            b.Push(new InputPhraseEvent("y"));
            b.PushSelf();
        }
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var subjects = generator.GetValues(instance, Concept2.Subject).ToArray();

            var answer  = generator.GetValue(instance, Concept2.Answer);
            var unknown = generator.GetValue(instance, Concept2.Unknown);
            var target  = generator.GetValue(instance, Concept2.Target);

            var directSubjects   = filterDirectSubjects(subjects, answer);
            var indirectSubjects = filterIndirectSubjects(subjects, answer, generator);

            if (answer.Concept == Concept2.Nothing)
            {
                // user does not like any option
                return;
            }

            if (directSubjects.Count() == 1)
            {
                pushSetSubject(target, directSubjects.First(), generator, unknown);
                return;
            }

            if (indirectSubjects.Count() == 1)
            {
                pushSetSubject(target, indirectSubjects.First(), generator, unknown);
                return;
            }

            if (indirectSubjects.Count() == 0)
            {
                generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.DisambiguationFailed)));
                return;
            }

            if (indirectSubjects.Count() < subjects.Count())
            {
                //create new disambiguation
                generator.Push(new StaticScoreEvent(0.1));
                pushNewDisambiguation(indirectSubjects, unknown, target, generator);
                return;
            }

            if (indirectSubjects.Count() == subjects.Count())
            {
                var knowledgeConfirmation = new ConceptInstance(Concept2.DisambiguatedKnowledgeConfirmed);
                generator.SetValue(knowledgeConfirmation, Concept2.Subject, answer);
                generator.SetValue(knowledgeConfirmation, Concept2.Target, instance);
                generator.Push(new StaticScoreEvent(0.05));
                generator.Push(new InstanceOutputEvent(knowledgeConfirmation));
                return;
            }

            //disambiguation was not helpful
            generator.Push(new StaticScoreEvent(-1.0));
        }
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var subject     = generator.GetValue(instance, Concept2.Subject);
            var description = generator.GetValue(instance, Concept2.Description);

            var conceptDescription = new ConceptDescriptionEvent(subject.Concept, description.Concept.Name);
            var export             = new ExportEvent(conceptDescription);

            generator.Push(export);
            generator.Push(conceptDescription);
        }
Exemple #9
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var property = generator.GetValue(instance, Concept2.Property);
            var target   = generator.GetValue(instance, Concept2.Target);

            var setTarget = new PropertySetTarget(target, Concept2.HasProperty);
            var evt       = new PropertySetEvent(setTarget, property, allowActivation: false);

            generator.Push(evt);
            generator.Push(new ExportEvent(evt));
        }
Exemple #10
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var activeInstance = Get <InstanceActiveEvent>(e => e.Request != null && e.Request.ActivationPhrases.Any() && canBeReported(e.Instance));

            if (activeInstance == null)
            {
                yield break;
            }

            generator.Push(new Events.StaticScoreEvent(-0.3));
            generator.Push(new InstanceReferencedEvent(activeInstance.Instance));
            yield return($"I know {singular(activeInstance.Instance)} but what should I do?");
        }
Exemple #11
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var unknownPhrases      = GetUnknownPhrases(generator);
            var isInLearnPhraseMode = PreviousPolicy <LearnNewPhrase>(out var learnPolicy) || PreviousPolicy <UnknownAnsweredToLearnNewPhrase>(out learnPolicy);

            if (!isInLearnPhraseMode || unknownPhrases.Count() != 1)
            {
                yield break;
            }

            var unknown = generator.GetValue(learnPolicy.Tag, Concept2.Unknown);
            var prompt  = generator.GetValue(learnPolicy.Tag, Concept2.Prompt);


            //remember runtime info so others can use it
            generator.SetValue(TagInstance, Concept2.Unknown, unknown);
            generator.SetValue(TagInstance, Concept2.Prompt, prompt);

            generator.Push(new InstanceActivationRequestEvent(prompt));
            yield return($"Still, I'm not getting it. What does {singular(unknown)} mean?");

            yield return($"That is complicated. What does {singular(unknown)} mean?");

            yield return($"I don't know those words. Could you put {singular(unknown)} differently?");
        }
Exemple #12
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var target         = generator.GetValue(instance, Concept2.Target);
            var targetProperty = generator.GetValue(instance, Concept2.TargetProperty);
            var subject        = generator.GetValue(instance, Concept2.Subject);

            var generalTarget = new PropertySetTarget(target.Concept, targetProperty.Concept);
            var setEvent      = new PropertySetEvent(generalTarget, subject);

            generator.Push(new ExportEvent(setEvent));
            generator.Push(setEvent);
            if (generator.IsDefined(instance.Concept))
            {
                generator.Push(new InstanceOutputEvent(instance));
            }
        }
        private void pushSetSubject(ConceptInstance target, ConceptInstance resolvedSubject, BeamGenerator generator, ConceptInstance unknown)
        {
            RememberConceptDescription.Activate(resolvedSubject.Concept, unknown.Concept.Name, generator);

            var relevantProperty = generator.GetValue(resolvedSubject, Concept2.Property);

            generator.Push(new StaticScoreEvent(0.1));
            generator.SetValue(target, relevantProperty.Concept, resolvedSubject);
        }
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            generator.Push(new Events.StaticScoreEvent(-0.5));
            yield return("How can I help you?");

            yield return("I need to know what should I do.");

            yield return("Please, tell me what should I do.");
        }
Exemple #15
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var subject                = generator.GetValue(instance, Concept2.Subject);
            var inheritedProperties    = generator.GetPropertyValues(subject, includeInstanceProps: false);
            var pureInstanceProperties = generator.GetPropertyValues(subject, includeInheritedProps: false);

            if (!pureInstanceProperties.Any())
            {
                var confirmation = new ConceptInstance(Concept2.KnowledgeConfirmed);
                generator.SetValue(confirmation, Concept2.Subject, subject);
                generator.Push(new InstanceOutputEvent(confirmation));
                return;
            }

            var unknown = new List <KeyValuePair <Concept2, ConceptInstance> >();

            foreach (var propertyValue in pureInstanceProperties)
            {
                if (!inheritedProperties.TryGetValue(propertyValue.Key, out var knownValue) || knownValue.Concept != propertyValue.Value.Concept)
                {
                    unknown.Add(propertyValue);
                }
            }

            if (unknown.Count == 0)
            {
                var confirmation2 = new ConceptInstance(Concept2.KnowledgeConfirmed);
                generator.SetValue(confirmation2, Concept2.Subject, subject);
                generator.Push(new InstanceOutputEvent(confirmation2));
                return;
            }

            var unknownReport = new ConceptInstance(subject.Concept);

            foreach (var propertyValue in unknown)
            {
                generator.SetValue(unknownReport, propertyValue.Key, propertyValue.Value);
            }

            var confirmation3 = new ConceptInstance(Concept2.KnowledgeRefutation);

            generator.SetValue(confirmation3, Concept2.Subject, subject);
            generator.Push(new InstanceOutputEvent(unknownReport));
        }
Exemple #16
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var answer = generator.GetValue(instance, Concept2.Answer).Concept;

            if (answer == Concept2.Yes)
            {
                var yesInstance = generator.GetValue(instance, Concept2.Yes);
                generator.Push(new InstanceActivationRequestEvent(yesInstance));
            }
            else if (answer == Concept2.No)
            {
                var noInstance = generator.GetValue(instance, Concept2.No);
                generator.Push(new InstanceActivationRequestEvent(noInstance));
            }
            else
            {
                generator.Push(new StaticScoreEvent(-1));
            }
        }
Exemple #17
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var request = Get <IncompleteRelationEvent>(p => !p.IsFilled);

            if (request == null || request.Subject == null)
            {
                yield break;
            }

            var instanceConcept = request.Subject?.Concept;

            if (instanceConcept.Name == "the" || instanceConcept.Name == "a")
            {
                yield break;
            }

            if (instanceConcept == Concept2.What)
            {
                var subject  = generator.GetValue(request.Subject, Concept2.Subject);
                var property = generator.GetValue(request.Subject, Concept2.Property);

                generator.Push(request);


                if (subject == null && property != null)
                {
                    yield return($"{singular(property)} of what ?");
                }
                else if (property == null && subject != null)
                {
                    yield return($"What are you interested in about {singular(subject)} ?");
                }
                else
                {
                    yield return("What are you interested in?");
                }
            }
            else
            {
                generator.Push(request);
                yield return("What should I " + singular(request.Subject) + " ?");
            }
        }
Exemple #18
0
        internal static void GenerateActivationRequest(string unknown, BeamGenerator generator)
        {
            var newConcept         = Concept2.From(unknown);
            var newConceptInstance = new ConceptInstance(newConcept);

            var learnInstance = new ConceptInstance(Concept2.LearnNewConcept);

            generator.SetValue(learnInstance, Concept2.Unknown, newConceptInstance);
            generator.Push(new InstanceActivationRequestEvent(learnInstance));
        }
Exemple #19
0
        private void pushNewOptions(IEnumerable <ConceptInstance> options, BeamGenerator generator)
        {
            var optionPrompt = new ConceptInstance(Concept2.OptionPrompt);

            foreach (var option in options)
            {
                generator.SetValue(optionPrompt, Concept2.Option, option);
            }
            generator.Push(new InstanceActivationRequestEvent(optionPrompt));
        }
        private void pushNewDisambiguation(IEnumerable <ConceptInstance> indirectSubjects, ConceptInstance unknown, ConceptInstance target, BeamGenerator generator)
        {
            var disambiguation = new ConceptInstance(Concept2.PropertyValueDisambiguation);

            generator.SetValue(disambiguation, Concept2.Unknown, unknown);
            generator.SetValue(disambiguation, Concept2.Target, target);
            foreach (var subject in indirectSubjects)
            {
                generator.SetValue(disambiguation, Concept2.Subject, subject);
            }

            generator.Push(new InstanceActivationRequestEvent(disambiguation));
        }
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            //we are searching for deactivated instances because after call instance is deactivated
            var rememberAbility = FindDeactivatedTurnInstances(i => i.Concept == Concept2.RememberConceptDescription).FirstOrDefault();

            if (rememberAbility == null)
            {
                yield break;
            }

            var subject = generator.GetValue(rememberAbility, Concept2.Subject);

            generator.Push(new Events.InstanceReferencedEvent(subject));
            yield return($"Thank you. What should I do with {singular(subject)}?");
        }
Exemple #22
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var answer  = generator.GetValue(instance, Concept2.Answer);
            var options = generator.GetValues(instance, Concept2.Option);
            var disambiguatedOptions = disambiguate(options, answer);

            if (disambiguatedOptions.Count() == 1)
            {
                var activeOption       = disambiguatedOptions.First();
                var instanceToActivate = generator.GetValue(activeOption, Concept2.Invocation);
                generator.Push(new StaticScoreEvent(0.1));
                generator.Push(new InstanceActivationRequestEvent(instanceToActivate));
            }
            else if (disambiguatedOptions.Count() == 0)
            {
                generator.Push(new StaticScoreEvent(-0.2));
                //push same options again
                pushNewOptions(options, generator);
            }
            else
            {
                pushNewOptions(disambiguatedOptions, generator);
            }
        }
Exemple #23
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var unknown = generator.GetValue(instance, Concept2.Unknown);
            var answer  = generator.GetValue(instance, Concept2.Answer).Concept;


            if (answer == Concept2.Nothing || answer == Concept2.No || answer == Concept2.Nothing)
            {
                //nothing to report
            }
            else
            {
                generator.Push(new InstanceOutputEvent(instance));
            }
        }
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var evt = Get <PropertySetEvent>(p => p.Target.Property == Concept2.HasProperty);

            if (evt == null)
            {
                yield break;
            }

            var learnedProperty = evt.SubstitutedValue;
            var propertyTarget  = evt.Target.Instance;
            var request         = new IncompleteRelationEvent(propertyTarget, learnedProperty.Concept, null);

            generator.Push(request);
            yield return($"What value of '{singular(learnedProperty)}' does {singular(propertyTarget)} have ?");
        }
Exemple #25
0
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var criterion       = generator.GetValue(instance, _parameter);
            var criterionValues = generator.GetPropertyValues(criterion);

            criterionValues.Remove(Concept2.OnSetListener); // TODO internal property removal should be done in more systematic way
            criterionValues.Remove(Concept2.HasProperty);
            criterionValues.Remove(Concept2.HasPropertyValue);

            var requiredProperties = new HashSet <Concept2>(criterionValues.Values.Select(i => i.Concept));

            requiredProperties.Add(criterion.Concept);

            var result         = FindRelevantConcepts(generator, requiredProperties);
            var isSubjectClass = generator.GetInverseConceptValues(Concept2.InstanceOf, criterion).Any();


            if (result.Count == 0)
            {
                if (isSubjectClass)
                {
                    generator.Push(new StaticScoreEvent(0.1));
                }
                else
                {
                    generator.Push(new StaticScoreEvent(-0.1));
                }

                generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.NotFound)));
            }
            else if (result.Count == 1)
            {
                generator.Push(new StaticScoreEvent(0.5));
                generator.Push(new InstanceOutputEvent(result.First()));
            }
            else
            {
                if (generator.IsProperty(criterion.Concept))
                {
                    generator.Push(new StaticScoreEvent(-0.15));
                }

                var needRefinementInstance = new ConceptInstance(Concept2.NeedsRefinement);
                generator.SetValue(needRefinementInstance, Concept2.Subject, criterion);
                generator.SetValue(criterion, Concept2.OnSetListener, instance);
                generator.Push(new InstanceOutputEvent(needRefinementInstance));
            }
        }
Exemple #26
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var evt = Find <IncompleteRelationEvent>(s => !s.IsFilled && s.Subject?.Concept == Concept2.AssignUnknownProperty, precedingTurns: 1);

            if (evt == null)
            {
                yield break;
            }

            var disambiguation = evt.Subject;
            var unknown        = generator.GetValue(disambiguation, Concept2.Unknown);

            // retry the event
            generator.Push(evt);
            yield return($"I'm sorry, I don't understand that either. What does {singular(unknown)} mean?");

            yield return($"It seems to be very complicated. What does {singular(unknown)} mean?");
        }
Exemple #27
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var evt         = Get <InstanceOutputEvent>();
            var priorityEvt = Get <InstanceOutputEvent>(p => p.Instance.Concept != Concept2.NeedsRefinement && p.Instance.Concept != Concept2.NotFound);

            if (priorityEvt != null || evt?.Instance.Concept != Concept2.NeedsRefinement)
            {
                yield break;
            }

            var instanceToRefine = generator.GetValue(evt.Instance, Concept2.Subject);

            // let following policies know about the refinement target
            generator.SetValue(TagInstance, Concept2.Target, instanceToRefine);

            // generate a question
            generator.Push(new IncompleteRelationEvent(instanceToRefine, Concept2.Something, null));
            yield return($"I know many {plural(instanceToRefine)} which one would you like?");
        }
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var evt = Get <IncompleteRelationEvent>(s => !s.IsFilled && s.Subject?.Concept == Concept2.PropertyValueDisambiguation, searchInsideTurnOnly: false);

            if (evt == null)
            {
                yield break;
            }

            generator.Push(evt);


            var disambiguation = evt.Subject;
            var unknown        = generator.GetValue(disambiguation, Concept2.Unknown);
            var candidates     = generator.GetValues(disambiguation, Concept2.Subject);

            var candidateProperties = new HashSet <Concept2>();

            foreach (var candidate in candidates)
            {
                var relevantProperty = generator.GetValue(candidate, Concept2.Property);
                candidateProperties.Add(relevantProperty.Concept);
            }


            if (candidateProperties.Count == 1)
            {
                var candidateString = string.Join(", ", candidates.Select(c => singular(c.Concept)));
                yield return($"I can recognize {candidateString} as {plural(candidateProperties.First())}. Which of them is related to {singular(unknown)}?");
            }
            else if (candidateProperties.Count < 4)
            {
                var candidateString = string.Join(" or ", candidateProperties.Select(c => singular(c)));
                yield return($"What does {singular(unknown)} mean?");

                yield return($"I think, It can be {candidateString}. Which fits best the meaning of {singular(unknown)}?");
            }
            else
            {
                yield return($"What does {singular(unknown)} mean ?");
            }
        }
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var unknownPhrases = GetUnknownPhrases(generator).ToArray();

            if (unknownPhrases.Length != 1)
            {
                yield break;
            }

            var phraseToAsk = unknownPhrases.First();

            if (phraseToAsk.Split(' ').Length > 2)
            {
                yield break;
            }

            var newConcept         = Concept2.From(phraseToAsk);
            var newConceptInstance = new ConceptInstance(newConcept);

            var handlePropertyInstance = new ConceptInstance(Concept2.AcceptNewProperty);

            generator.SetValue(handlePropertyInstance, Concept2.Property, newConceptInstance);

            var handleConceptInstance = new ConceptInstance(Concept2.Nothing);
            var options = new Dictionary <Concept2, ConceptInstance>()
            {
                { Concept2.Property, handlePropertyInstance },
                { Concept2.ConceptName, handleConceptInstance },
            };

            var prompt = OptionPrompt.CreatePrompt(options, generator);

            //remember runtime info so others can use it
            generator.SetValue(TagInstance, Concept2.Unknown, newConceptInstance);
            generator.SetValue(TagInstance, Concept2.Prompt, prompt);

            generator.Push(new InstanceActivationRequestEvent(prompt));

            yield return($"What does '{unknownPhrases.First()}' mean?");
        }
Exemple #30
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var fullRelation = Get <PropertySetEvent>(p => IsDefined(p.SubstitutedValue.Concept) && IsDefined(p.Target.Instance?.Concept));

            if (fullRelation == null)
            {
                yield break;
            }

            var targetInstance = fullRelation.Target.Instance;

            if (targetInstance == null)
            {
                yield break;
            }

            var children = generator.GetInverseConceptValues(Concept2.InstanceOf, targetInstance);

            if (children.Any())
            {
                //TODO add learning for classes
                yield break;
            }

            var parameters = generator.GetParameterDefinitions(targetInstance);

            if (parameters.Any(p => p.Property == fullRelation.Target.Property))
            {
                //don't learn argument values
                yield break;
            }

            generator.Push(new StaticScoreEvent(0.1));
            var remember = RememberPropertyValue.Create(generator, fullRelation.Target, fullRelation.SubstitutedValue);

            YesNoPrompt.Generate(generator, remember, new ConceptInstance(Concept2.Nothing));
            yield return($"So you think, {singularWithProperty(fullRelation.Target.Instance)} ?");
        }