/**
  * Returns an array of all {@link Term}s that make up the conjunction represented by the specified
  * {@link Term}.
  *
  * <p>If the specified {@link Term} does not represent a conjunction then it will be used as the
  * only element in the returned array.
  */
 public static Term[] toArrayOfConjunctions(Term t) {
   List<Term> l = new ArrayList<>();
   while (isConjunction(t)) {
     l.add(0, t.getArgs()[1]);
     t = t.getArgs()[0];
   }
   l.add(0, t);
   return l.toArray(new Term[l.size()]);
 }
 private void assertMultipleResultsTailRecursive(String input) {
   Term parsedSentence = TestUtils.parseSentence(input);
   assertFalse(isSingleResultTailRecursive(copyClauses(), parsedSentence.getArgs()));
 }
 /** Returns a {@link Predicate} instance for the specified {@link Term}. */
 public static Predicate getPredicate(KnowledgeBase kb, Term t) {
   return kb.getPredicateFactory(t).getPredicate(t.getArgs());
 }
 /**
  * Returns {@code true} if the specified {@link Term} represent a conjunction, else {@code false}.
  *
  * <p>A {@link Term} is judged to represent a conjunction if is a structure with a functor of
  * {@link #CONJUNCTION_PREDICATE_NAME} and exactly two arguments.
  */
 public static boolean isConjunction(Term t) {
   // is relying on assumption that conjunctions are only, and always, represented by a comma
   return t.getType() == TermType.STRUCTURE
       && CONJUNCTION_PREDICATE_NAME.equals(t.getName())
       && t.getArgs().length == 2;
 }