public Object visitPredicate(Predicate predicate, Object arg)
{
List<Term> terms = predicate.getTerms();
List<Term> newTerms = new List<Term>();
for (int i = 0; i < terms.Count; i++)
{
Term t = terms[i];
Term subsTerm = (Term)t.accept(this, arg);
newTerms.Add(subsTerm);
}
return new Predicate(predicate.getPredicateName(), newTerms);
}