private void AddGoalVariables(PrologCodeTerm term)
{
// no variables to add: predicate/0
if(PrologCodeTerm.IsAtom(term) || PrologCodeTerm.IsAtomicPredicate(term))
{
return;
}
// goal is a variable X
else if(PrologCodeTerm.IsVariable(term))
{
_currentArgumentIndex = 0;
this.Add(((PrologCodeVariable)term).Name,null);
return;
}
// goal is a list, [Term|Term]
else if(PrologCodeTerm.IsList(term))
{
_currentArgumentIndex = 0;
if(term is PrologCodeNonEmptyList)
{
PrologCodeNonEmptyList list = (PrologCodeNonEmptyList)term;
AddGoalArgumentVariables(list.Head);
_currentArgumentIndex = 1;
if(list.Tail != null)
{
if(list.Tail is PrologCodeNonEmptyList)
{
AddGoalArgumentVariables(list.Tail);
}
else
{
AddGoalArgumentVariables(list.Tail);
}
}
}
}
// Goal is a predicate, term(term,...)
else if(PrologCodeTerm.IsStruct(term))
{
_currentArgumentIndex = 0;
PrologCodePredicate goal = (PrologCodePredicate)term;
foreach(PrologCodeTerm argument in goal.Arguments)
{
AddGoalArgumentVariables(argument);
_currentArgumentIndex++;
}
}
}