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); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var definedConcepts = new HashSet <Concept2>(generator.GetDefinedConcepts()); var conceptWithAssignedProperty = Get <PropertySetEvent>((s) => hasExtraInformation(s, definedConcepts, generator)); if (conceptWithAssignedProperty == null) { yield break; } var target = conceptWithAssignedProperty.Target; var rememberValue = RememberPropertyValue.Create(generator, target, conceptWithAssignedProperty.SubstitutedValue); YesNoPrompt.Generate(generator, rememberValue, new ConceptInstance(Concept2.Nothing)); yield return($"You think that {singular(target.Instance)} has {singular(conceptWithAssignedProperty.SubstitutedValue)} {singular(target.Property)}?"); }
private Dictionary <Concept2, HashSet <Concept2> > getRelevantProperties(ConceptInstance targetInstance, BeamGenerator generator) { var properties = new Dictionary <Concept2, HashSet <Concept2> >(); var definedConcepts = new HashSet <Concept2>(generator.GetDefinedConcepts()); foreach (var conceptCandidate in definedConcepts) { var conceptCandidateInstance = new ConceptInstance(conceptCandidate); var instanceOf = generator.GetValue(conceptCandidateInstance, Concept2.InstanceOf); if (conceptCandidate != targetInstance.Concept && instanceOf?.Concept != targetInstance.Concept) { continue; } var instanceProperties = generator.GetPropertyValues(conceptCandidateInstance); foreach (var instanceProperty in instanceProperties) { if (!definedConcepts.Contains(instanceProperty.Value.Concept)) { continue; } if (!definedConcepts.Contains(instanceProperty.Key)) { continue; } if (!properties.TryGetValue(instanceProperty.Key, out var propertyValues)) { properties[instanceProperty.Key] = propertyValues = new HashSet <Concept2>(); } propertyValues.Add(instanceProperty.Value.Concept); } } return(properties); }