internal ConceptInstance GetParentConcept(ConceptInstance instance)
        {
            foreach (var property in _propertyValues)
            {
                if (property.Value == instance)
                {
                    return(property.Key.Item1 as ConceptInstance);
                }
            }

            return(null);
        }
        internal IEnumerable <Concept2> GetAvailableParameters(ConceptInstance instance)
        {
            var result = new List <Concept2>();

            foreach (var property in GetProperties(instance))
            {
                if (!IsParameter(property))
                {
                    continue;
                }

                if (HasParameterSubstitution(instance, property))
                {
                    continue;
                }

                result.Add(property);
            }

            return(result);
        }
        internal bool MeetsPattern(PointableInstance instance, ConceptInstance pattern)
        {
            if (pattern == null)
            {
                throw new ArgumentNullException("pattern");
            }

            var o = instance as ConceptInstance;

            if (o == null)
            {
                return(false);
            }

            //TODO something semantic and other conditionals should be refactored somewhere
            var isRootLevelMatch = o.Concept == pattern.Concept || pattern.Concept == Concept2.Something;

            if (!isRootLevelMatch)
            {
                return(false);
            }

            foreach (var property in GetProperties(pattern))
            {
                if (property == Concept2.Something)
                {
                    //placeholdered properties has to be treaded in a more complex way
                    throw new NotImplementedException();
                }

                if (!MeetsPattern(GetPropertyValue(instance, property), GetPropertyValue(pattern, property) as ConceptInstance))
                {
                    return(false);
                }
            }

            return(true);
        }