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;
}