public void visit(OpPropFunc opPropFunc) {
   Table table = eval(opPropFunc.getSubOp());
   table =
       evaluator.propertyFunction(
           table,
           opPropFunc.getProperty(),
           opPropFunc.getSubjectArgs(),
           opPropFunc.getObjectArgs());
   push(table);
 }
 @Override
 public Op transform(OpPropFunc opPropFunc, Op subOp) {
   if (opPropFunc.getSubOp() != subOp)
     opPropFunc =
         new OpPropFunc(
             opPropFunc.getProperty(),
             opPropFunc.getSubjectArgs(),
             opPropFunc.getObjectArgs(),
             subOp);
   // Put the (graph) back round it so the property function works on the named graph.
   return new OpGraph(getNode(), opPropFunc);
 }
    @Override
    public Op transform(OpPropFunc opPropFunc, Op subOp) {
      PropFuncArg sArgs = opPropFunc.getSubjectArgs();
      PropFuncArg oArgs = opPropFunc.getObjectArgs();

      PropFuncArg sArgs2 = substitute(sArgs, binding);
      PropFuncArg oArgs2 = substitute(oArgs, binding);

      if (sArgs2 == sArgs && oArgs2 == oArgs && opPropFunc.getSubOp() == subOp)
        return super.transform(opPropFunc, subOp);
      return new OpPropFunc(opPropFunc.getProperty(), sArgs2, oArgs2, subOp);
    }