internal Context(InferenceEngine mind, WildcardTriplet rootWildcard) { _mind = mind; _rootLevel = getState(null, rootWildcard); _levelsToExpand.Enqueue(_rootLevel); _levelsToGenerate.Enqueue(_rootLevel); }
internal InferenceLevel(InferenceLevel parent, WildcardTriplet condition, IEnumerable<InferenceStep> steps, Context context) { Condition = condition; Depth = parent == null ? 0 : parent.Depth + 1; _context = context; _steps = steps.ToArray(); }
/// <summary> /// Gets (or creates) state for inference of given wildcard. /// </summary> /// <param name="wildcard">The wildcard to infer.</param> /// <returns>The state.</returns> private InferenceLevel getState(InferenceLevel parent, WildcardTriplet wildcard) { InferenceLevel result; if (!_wildcardToLevel.TryGetValue(wildcard, out result)) _wildcardToLevel[wildcard] = result = new InferenceLevel(parent, wildcard, createSteps(wildcard), this); return result; }
/// <summary> /// Expands given inference level via back chaining. /// </summary> /// <param name="parent">The parent to be expanded.</param> /// <returns>The expansion.</returns> private IEnumerable<InferenceLevel> expand(InferenceLevel parent) { foreach (var requirement in parent.GetRequirements()) { if (!_wildcardToLevel.ContainsKey(requirement)) yield return getState(parent, requirement); } }