/** * Creates a built-in for the specified functor. * * @param functor The functor to create a built-in for. */ public BuiltInFunctor(Functor functor) { super(functor.getName(), functor.getArguments()); this.functor = functor; }
/** {@inheritDoc} */ public Iterator<Operator<Term>> traverse(Functor functor, boolean reverse) { /*log.fine("Traversing functor " + functor.toString());*/ Queue<Operator<Term>> queue = (!reverse) ? new StackQueue<Operator<Term>>() : new LinkedList<Operator<Term>>(); Term[] arguments = functor.getArguments(); // For a top-level functor clear top-level flag, so that child functors are not taken as top-level. if (arguments != null) { for (int i = leftToRightFunctorArgs ? 0 : (arguments.length - 1); leftToRightFunctorArgs ? (i < arguments.length) : (i >= 0); i = i + (leftToRightFunctorArgs ? 1 : -1)) { Term argument = arguments[i]; argument.setReversable(createTermOperator(argument, i, functor)); argument.setTermTraverser(this); queue.offer(argument); } } return queue.iterator(); }
/** {@inheritDoc} */ public Iterator<Operator<Term>> traverse(Functor functor, boolean reverse) { /*log.fine("Traversing functor " + functor.toString());*/ Queue<Operator<Term>> queue = (!reverse) ? new StackQueue<Operator<Term>>() : new LinkedList<Operator<Term>>(); Term[] arguments = functor.getArguments(); // For a top-level functor clear top-level flag, so that child functors are not taken as top-level. if (arguments != null) { for (int i = leftToRightFunctorArgs ? 0 : (arguments.length - 1); leftToRightFunctorArgs ? (i < arguments.length) : (i >= 0); i = i + (leftToRightFunctorArgs ? 1 : -1)) { Term argument = arguments[i]; argument.setReversable(createTermOperator(argument, i, functor)); argument.setTermTraverser(this); queue.offer(argument); } } return queue.iterator(); }
/** {@inheritDoc} */ public void visit(Functor functor) { // functor is ground if all of its arguments are ground. boolean ground = true; if (functor.getArguments() != null) { for (Term argument : functor.getArguments()) { SymbolKey symbolKey = argument.getSymbolKey(); TermDomain annotation = (TermDomain) symbolTable.get(symbolKey, TERM_DOMAIN); if ((annotation == null) || !annotation.ground) { ground = false; break; } } } /*log.fine((ground ? "ground " : "non-ground ") + functor.toString(interner, true, false));*/ symbolTable.put(functor.getSymbolKey(), TERM_DOMAIN, new TermDomain(ground)); }
/** {@inheritDoc} */ public void visit(Functor functor) { // functor is ground if all of its arguments are ground. boolean ground = true; if (functor.getArguments() != null) { for (Term argument : functor.getArguments()) { SymbolKey symbolKey = argument.getSymbolKey(); TermDomain annotation = (TermDomain) symbolTable.get(symbolKey, TERM_DOMAIN); if ((annotation == null) || !annotation.ground) { ground = false; break; } } } /*log.fine((ground ? "ground " : "non-ground ") + functor.toString(interner, true, false));*/ symbolTable.put(functor.getSymbolKey(), TERM_DOMAIN, new TermDomain(ground)); }
/** * Applies a built-in replacement transformation to functors. If the functor matches built-in, a * {@link BuiltInFunctor} is created with a mapping to the functors built-in implementation, and the functors * arguments are copied into this new functor. If the functor does not match a built-in, it is returned unmodified. * * @param functor The functor to attempt to map onto a built-in. * * @return The functor umodified, or a {@link BuiltInFunctor} replacement for it. */ public Functor transform(Functor functor) { FunctorName functorName = interner.getFunctorFunctorName(functor); if (builtInExpressions.containsKey(functorName)) { Class<? extends Functor> builtInExpressionClass = builtInExpressions.get(functorName); return ReflectionUtils.newInstance(ReflectionUtils.getConstructor(builtInExpressionClass, new Class[] { Integer.TYPE, Term[].class }), new Object[] { functor.getName(), functor.getArguments() }); } else { return functor; } } }
Term[] arguments = functor.getArguments();
Term[] arguments = functor.getArguments();
parentFunctor.getArguments()[pos] = builtInFunctor;
SizeableLinkedList<WAMInstruction> instructions; Term[] expressions = functor.getArguments();