Пример #1
0
        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));
            }
        }
Пример #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));
            }
        }
Пример #3
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();
            }
        }
Пример #4
0
        private string getConstraintDescription(ConceptInstance conceptInstance)
        {
            if (conceptInstance is null || conceptInstance.Concept != Concept2.Something)
            {
                return(conceptInstance.ToPrintable());
            }

            var description = getPropertyValue(conceptInstance, Concept2.InstanceOf)?.ToPrintable();

            if (description == null)
            {
                description = "thing";
            }

            //collect modifiers
            foreach (var property in getProperties(conceptInstance))
            {
                if (property == Concept2.InstanceOf)
                {
                    continue;
                }

                var modifier = getPropertyValue(conceptInstance, property).ToPrintable();
                description = modifier + " " + description;
            }

            return(description);
        }
Пример #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));
        }
Пример #6
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();
            }
        }
Пример #7
0
        internal static List <ConceptInstance> FindRelevantConcepts(BeamGenerator generator, HashSet <Concept2> requiredProperties)
        {
            //TODO better matching logic
            var concepts = generator.GetDefinedConcepts();
            var result   = new List <ConceptInstance>();

            foreach (var concept in concepts)
            {
                var conceptInstance   = new ConceptInstance(concept);
                var missingProperties = new HashSet <Concept2>(requiredProperties);

                foreach (var propertyValue in generator.GetPropertyValues(conceptInstance))
                {
                    var property = propertyValue.Key;
                    var value    = propertyValue.Value;

                    missingProperties.Remove(value.Concept);
                }

                if (missingProperties.Count == 0)
                {
                    result.Add(conceptInstance);
                }
            }

            return(result);
        }
Пример #8
0
        public ConceptInstance DefineConceptInstance(string conceptName)
        {
            var concept  = DefineConcept(conceptName);
            var instance = new ConceptInstance(concept);

            return(instance);
        }
Пример #9
0
        internal Dictionary <ConceptInstance, string> GetPrefixingUnknowns(ConceptInstance instance)
        {
            //TODO all subvalues could be considered here
            var result = new Dictionary <ConceptInstance, string>();

            var activation = GetInstanceActivationRequest(instance);

            if (activation == null || !activation.ActivationPhrases.Any())
            {
                return(result);
            }

            var inputs = new List <InputPhraseEvent>();

            foreach (var input in GetPrecedingEvents(getCurrentNode(), activation.ActivationPhrases.First(), true))
            {
                if (IsInputUsed(input))
                {
                    break;
                }

                inputs.Add(input);
            }

            if (inputs.Count > 0)
            {
                inputs.Reverse();
                result[instance] = string.Join(" ", inputs.Select(i => i.Phrase));
            }

            return(result);
        }
Пример #10
0
        private void pushCompleteIfPossible(ConceptInstance instance, bool allowTurnReactivation = true, bool requireActivationRequest = true)
        {
            var request = GetInstanceActivationRequest(instance);

            if (request == null && requireActivationRequest)
            {
                // only activated instances can fire completition
                return;
            }

            if (!allowTurnReactivation && GetTurnInstanceActivation(instance) != null)
            {
                // we dont want to reactivate instance again
                return;
            }

            var parameters = GetParameterDefinitions(instance);

            foreach (var parameter in parameters)
            {
                var value = GetValue(instance, parameter);
                if (value == null)
                {
                    //instance is not complete yet
                    return;
                }
            }

            var canBeReferenced = !requireActivationRequest || request.ActivationPhrases.Any();

            Push(new InstanceActiveEvent(instance, canBeReferenced, request));
        }
Пример #11
0
        protected string singularWithProperty(ConceptInstance instance)
        {
            var properties = _generator.GetPropertyValues(instance, includeInheritedProps: false);

            foreach (var property in properties.Keys.ToArray())
            {
                var value = properties[property];
                if (value.Concept == Concept2.Something)
                {
                    continue;
                }

                //properties.Remove(property);
            }

            if (properties.Count == 0)
            {
                return(instance.ToPrintable());
            }

            var reportedProperty = properties.Keys.First();
            var reportedValue    = properties[reportedProperty];
            var propertyName     = reportedProperty.Name;

            if (reportedValue.Concept == Concept2.Something)
            {
                return(instance.ToPrintable() + " " + propertyName);
            }
            else
            {
                return(instance.ToPrintable() + " " + propertyName + " is " + reportedValue.ToPrintable());
            }
        }
Пример #12
0
        internal AbilityBase Property(Concept2 instanceProperty, Concept2 value)
        {
            var target        = _currentConcept == null ? new PropertySetTarget(_currentInstance, instanceProperty) : new PropertySetTarget(_currentConcept, instanceProperty);
            var valueInstance = new ConceptInstance(value);

            AddInitializationEvent(new PropertySetEvent(target, valueInstance));
            return(this);
        }
        internal static ConceptInstance Create(BeamGenerator generator, Concept2 subject, string description)
        {
            var instance = new ConceptInstance(Concept2.RememberConceptDescription);

            generator.SetValue(instance, Concept2.Subject, new ConceptInstance(subject));
            generator.SetValue(instance, Concept2.Description, new ConceptInstance(Concept2.From(description)));
            return(instance);
        }
Пример #14
0
        internal AbilityBase DefineInstance(string conceptName, out Concept2 concept)
        {
            DefineConcept(conceptName, out concept);
            _currentConcept  = null;
            _currentInstance = new ConceptInstance(concept);

            return(this);
        }
Пример #15
0
        internal static ConceptInstance Create(BeamGenerator generator, ConceptInstance yesInstance, ConceptInstance noInstance)
        {
            var prompt = new ConceptInstance(Concept2.Prompt);

            generator.SetValue(prompt, Concept2.Yes, yesInstance);
            generator.SetValue(prompt, Concept2.No, noInstance);
            return(prompt);
        }
        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);
        }
Пример #17
0
        internal static ConceptInstance Create(ConceptInstance instanceToRefine, string unknown, BeamGenerator generator)
        {
            var assignUnknownProperty    = new ConceptInstance(Concept2.AssignUnknownProperty);
            var unknownPropertyCandidate = new ConceptInstance(Concept2.From(unknown));

            generator.SetValue(assignUnknownProperty, Concept2.Subject, unknownPropertyCandidate);
            generator.SetValue(assignUnknownProperty, Concept2.Target, instanceToRefine);
            return(assignUnknownProperty);
        }
        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));
        }
Пример #19
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));
        }
Пример #20
0
        internal static ConceptInstance Create(BeamGenerator generator, PropertySetTarget target, ConceptInstance value)
        {
            var rememberValue = new ConceptInstance(Concept2.RememberPropertyValue);

            generator.SetValue(rememberValue, Concept2.Target, target.Instance);
            generator.SetValue(rememberValue, Concept2.TargetProperty, new ConceptInstance(target.Property));
            generator.SetValue(rememberValue, Concept2.Subject, value);

            return(rememberValue);
        }
Пример #21
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));
        }
Пример #22
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));
        }
        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);
        }
Пример #24
0
        internal AbilityBase DefineConcept(string conceptName, out Concept2 concept, bool fireConceptDefinedEvt = true)
        {
            _currentInstance = null;
            _currentConcept  = concept = Concept2.From(conceptName);

            if (fireConceptDefinedEvt)
            {
                AddInitializationEvent(new ConceptDefinedEvent(concept));
            }

            return(this);
        }
Пример #25
0
        internal AbilityBase DefineProperty(Concept2 property, params Concept2[] domain)
        {
            var target = new PropertySetTarget(property, Concept2.PropertyDomain);

            foreach (var domainValue in domain)
            {
                var domainValueInstance = new ConceptInstance(domainValue);
                AddInitializationEvent(new PropertySetEvent(target, domainValueInstance));
            }

            return(this);
        }
        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));
        }
Пример #27
0
        internal static ConceptInstance CreatePrompt(Dictionary <Concept2, ConceptInstance> optionEffect, BeamGenerator generator)
        {
            var prompt = new ConceptInstance(Concept2.OptionPrompt);

            foreach (var pair in optionEffect)
            {
                var optionInstance = new ConceptInstance(pair.Key);
                var effect         = pair.Value;
                generator.SetValue(optionInstance, Concept2.Invocation, effect);
                generator.SetValue(prompt, Concept2.Option, optionInstance);
            }

            return(prompt);
        }
Пример #28
0
        internal bool IsKnownPropertyOf(ConceptInstance instance, Concept2 property)
        {
            var hierarchy      = GetClassHierarchy();
            var hierarchyChain = new HashSet <Concept2>();

            var currentConcept = instance.Concept;

            while (currentConcept != null && hierarchyChain.Add(currentConcept))
            {
                hierarchy.TryGetValue(currentConcept, out currentConcept);
            }

            hierarchyChain.Remove(instance.Concept); //dont include instance's concept
            return(GetAllEvents <PropertySetEvent>(getCurrentNode()).Where(s => s.SubstitutedValue.Concept == property && s.Target.Property == Concept2.HasProperty && hierarchyChain.Contains(s.Target.Concept)).Any());
        }
Пример #29
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));
            }
        }
Пример #30
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));
            }
        }