AIMA.Core.Logic.FOL.Unifier.cascadeOccurCheck C# (CSharp) Метод

cascadeOccurCheck() приватный Метод

private cascadeOccurCheck ( Term>.Dictionary theta, Variable var, List varsToCheck, List varsCheckedAlready ) : bool
theta Term>.Dictionary
var AIMA.Core.Logic.FOL.Parsing.AST.Variable
varsToCheck List
varsCheckedAlready List
Результат bool
        private bool cascadeOccurCheck(Dictionary<Variable, Term> theta, Variable var,
                List<Variable> varsToCheck, List<Variable> varsCheckedAlready)
        {
            // Want to check if any of the variable to check end up
            // looping back around on the new variable.
            List<Variable> nextLevelToCheck = new List<Variable>();
            foreach (Variable v in varsToCheck)
            {
                Term t = null;
                if (theta.ContainsKey(v))
                {
                  t = theta[v];
                }
                if (null == t)
                {
                    // Variable may not be a key so skip
                    continue;
                }
                if (t.Equals(var))
                {
                    // e.g.
                    // v1=v2
                    // v2=SFO(v1)
                    return true;
                }
                else if (t is Function)
                {
                    // Need to ensure the function this variable
                    // is to be replaced by does not contain var.
                    List<Variable> indirectvars = _variableCollector
                            .collectAllVariables(t);
                    if (indirectvars.Contains(var))
                    {
                        return true;
                    }
                    else
                    {
                        // Determine the next cascade/level
                        // of variables to check for looping
                        foreach (Variable iv in indirectvars)
                        {
                            if (!varsCheckedAlready.Contains(iv))
                            {
                                nextLevelToCheck.Add(iv);
                            }
                        }
                    }
                }
            }
            if (nextLevelToCheck.Count > 0)
            {
                varsCheckedAlready.AddRange(nextLevelToCheck);
                return cascadeOccurCheck(theta, var, nextLevelToCheck,
                        varsCheckedAlready);
            }
            return false;
        }