public void Tell(Name property, Name value, Name perspective)
{
if (property.IsPrimitive)
throw new ArgumentException("The given property name cannot be a primitive value.",nameof(property));
if (!property.IsConstant)
throw new ArgumentException("The given property name is not constant. Only constant names can be stored",nameof(property));
var ToMList = AssertPerspective(perspective, nameof(perspective));
property = RemovePropertyPerspective(property, ToMList);
//ToM property shift
property = ExtractPropertyFromToM(property, ToMList, nameof(property));
if (m_dynamicProperties.Unify(property).Any())
throw new ArgumentException("The given name will be objuscated by a dynamic property", nameof(property));
var fact = property.ApplyToTerms(p => SimplifyProperty(p, ToMList));
KnowledgeEntry entry;
if (!m_knowledgeStorage.TryGetValue(fact, out entry))
{
entry = new KnowledgeEntry();
m_knowledgeStorage[fact] = entry;
}
var mind_key = ToMList2Key(ToMList);
entry.TellValueFor(mind_key,value);
if (entry.IsEmpty())
m_knowledgeStorage.Remove(fact);
}