private IEnumerable<BeliefPair> internal_AskPossibleProperties(Name property, List<Name> ToMList, IEnumerable<SubstitutionSet> constraints)
{
property = RemovePropertyPerspective(property, ToMList);
//ToM property shift
property = ExtractPropertyFromToM(property, ToMList, nameof(property));
var mind_key = ToMList2Key(ToMList);
if (!property.IsVariable)
{
bool dynamicFound = false;
foreach (var r in AskDynamicProperties(property, mind_key, constraints))
{
dynamicFound = true;
yield return r;
}
if (dynamicFound)
yield break;
}
var group = constraints.GroupBy(property.MakeGround);
foreach (var g in group)
{
if (g.Key.IsPrimitive)
{
yield return Tuples.Create(g.Key, (IEnumerable<SubstitutionSet>)g);
continue;
}
Name fact;
try
{
fact = property.ApplyToTerms(p => SimplifyProperty(p, ToMList));
}
catch (Exception)
{
continue;
}
var g2 = g.SelectMany(c => m_knowledgeStorage.Unify(fact, c)).GroupBy(r => r.Item1, r => r.Item2);
foreach (var r in g2)
{
var value = r.Key.GetValueFor(mind_key);
if (value == null)
continue;
yield return Tuples.Create(value, r.Distinct());
}
}
}