private PrologCodeTerm ConvertGoalBinaryTreeToCodeDOM(BinaryTree goal)
{
if (goal.Name == ".")
{
return ConvertBinaryListToCodeDOM(goal);
}
else if (Char.IsUpper(goal.Name[0])) // Goal is a variable
{
return new PrologCodeVariable(goal.Name);
}
else
{
PrologCodePredicate goalPredicate = new PrologCodePredicate(goal.Name);
ArrayList gargs = new ArrayList();
goal.Flatten(goal, ref gargs);
goalPredicate.IsMethod = IsMethod(goal.Name, gargs.Count);
goalPredicate.MethodInfo = GetMethodInfo(goal.Name);
if (goal.Arguments != null && goal.Arguments.Count != 0)
{
// Example:
// goal(X,a).
ArrayList arguments = new ArrayList();
goal.Flatten((BinaryTree)goal.Arguments[0], ref arguments);
foreach (BinaryTree a in arguments)
{
goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(a));
}
return goalPredicate;
}
else
{
// X = a (goal is '=')
if (goal.Left != null && goal.Right != null)
{
goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Left));
goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Right));
return goalPredicate;
}
// [] + foo.
if (goal.Left == null && goal.Right != null)
{
goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Right));
return goalPredicate;
}
// X + []
if (goal.Left != null && goal.Right == null)
{
goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Left));
return goalPredicate;
}
if (goal.Left == null && goal.Right == null)
{
return goalPredicate;
}
}
}
return null;
}