private PrologCodeTerm ConvertGoalVariableBinaryTreeToCodeDOM(BinaryTree var)
{
if (Char.IsUpper(var.Name[0]) || var.Name[0] == '_' || var.Name == "_")
{
if (var.Name == "_")
{
_randomVariableID++;
return new PrologCodeVariable(var.Name + "%" + _randomVariableID.ToString());
}
return new PrologCodeVariable(var.Name);
}
else
{
// Not a functor, => atom | number | string
if (var.Arguments == null || var.Arguments.Count == 0)
{
if (var.Name == ".")
{
// TODO: can place return PrologCodeEmptyList() here.
return ConvertBinaryListToCodeDOM(var);
}
if (var.Left == null && var.Right == null)
{
// 'Atom string'
if (var.Name[0] == '\'')
{
return new PrologCodeStringAtom(var.Name);
}
else if (Char.IsDigit(var.Name[0]))
{
// 1.234
if (var.Name.IndexOf('.') != -1)
{
return new PrologCodeFloatAtom(float.Parse(var.Name));
}
// 213
else
{
return new PrologCodeIntegerAtom(Int32.Parse(var.Name));
}
}
else if (var.Name == "_")
{
return new PrologCodeNilAtom();
}
// atom
else
{
return new PrologCodeConstantAtom(var.Name);
}
}
else if (var.Left != null && var.Right != null)
{
PrologCodePredicate infixPredicate = new PrologCodePredicate(var.Name);
infixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Left));
infixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Right));
return infixPredicate;
}
else if (var.Left == null && var.Right != null)
{
PrologCodePredicate prefixPredicate = new PrologCodePredicate(var.Name);
prefixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Right));
return prefixPredicate;
}
else if (var.Left != null && var.Right == null)
{
PrologCodePredicate postfixPredicate = new PrologCodePredicate(var.Name);
postfixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Left));
return postfixPredicate;
}
}
// atom(a,X,atom(X)).
else
{
PrologCodePredicate functor = new PrologCodePredicate(var.Name);
ArrayList arguments = new ArrayList();
var.Flatten((BinaryTree)var.Arguments[0], ref arguments);
foreach (BinaryTree a in arguments)
{
functor.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(a));
}
return functor;
}
}
return null;
}