public Node get(final int target) { for (int size = _variablesStore.size(); size <= target; size++) _variablesStore.add(new Node_RuleVariable(PREFIX + size, size)); return _variablesStore.get(target); } }
/** * Dereference a node, following any binding trail. */ public static Node deref(Node node) { if (node instanceof Node_RuleVariable) { return ((Node_RuleVariable)node).deref(); } else { return node; } }
/** * Bind a variable in the current envionment to the given value. * Overrides and ignores any current binding. * @param var a Node_RuleVariable defining the variable to bind * @param value the value to bind */ public void bindNoCheck(Node_RuleVariable var, Node value) { environment[var.getIndex()] = value; }
/** * Clone the rule variable to allow multiple rule instaces to be active at the same time. */ public Node_RuleVariable cloneNode() { return new Node_RuleVariable(getName(), index); }
ai = code[pc++]; arg = argVars[ai]; if (arg instanceof Node_RuleVariable) arg = ((Node_RuleVariable)arg).deref(); constant = (Node) args[ac++]; if (arg instanceof Node_RuleVariable) { boolean match = false; Node o = argVars[2]; if (o instanceof Node_RuleVariable) o = ((Node_RuleVariable)o).deref(); if (Functor.isFunctor(o)) { Functor funcArg = (Functor)o.getLiteralValue(); for (int i = 0; i < fargs.length; i++) { Node template = templateArgs[i]; if (template.isVariable()) template = new Node_RuleVariable(null, i+3); fargs[i] = template; argVars[i+3] = template; bind(((Node_RuleVariable)o).deref(), newFunc); match = true; yi = code[pc++]; ai = code[pc++]; argVars[ai] = pVars[yi] = new Node_RuleVariable(null, yi); break; argVars[ai] = new Node_RuleVariable(null, ai); break;
/** * Compare triple patterns, taking into account variable indices. * The equality function ignores differences between variables. */ @Override public boolean sameAs(Object o) { if (! (o instanceof TriplePattern) ) return false; TriplePattern other = (TriplePattern) o; return Node_RuleVariable.sameNodeAs(subject, other.subject) && Node_RuleVariable.sameNodeAs(predicate, other.predicate) && Node_RuleVariable.sameNodeAs(object, other.object); }
/** * Close a single node. */ private Node cloneNode(Node nIn, Map<Node_RuleVariable, Node> vmap, BindingEnvironment env) { Node n = (env == null) ? nIn : env.getGroundVersion(nIn); if (n instanceof Node_RuleVariable) { Node_RuleVariable nv = (Node_RuleVariable)n; Node c = vmap.get(nv); if (c == null) { c = ((Node_RuleVariable)n).cloneNode(); vmap.put(nv, c); } return c; } else if (Functor.isFunctor(n)) { Functor f = (Functor)n.getLiteralValue(); return Functor.makeFunctorNode(cloneFunctor(f, vmap, env)); } else { return n; } }
/** * Preserve the state of an interpreter into this frame. */ public void preserveState( List<Node> trail ) { // Save the trail state int trailLen = trail.size(); if (trailLen > trailLength) { trailValues = new Node[trailLen]; trailVars = new Node_RuleVariable[trailLen]; } trailLength = trailLen; for (int i = 0; i < trailLen; i++) { Node_RuleVariable var = (Node_RuleVariable) trail.get(i); trailVars[i] = var; trailValues[i] = var.getRawBoundValue(); } // Save the permanent variables Node[] currentPVars = envFrame.pVars; if (currentPVars != null) { if (pVars == null || pVars.length < currentPVars.length) { pVars = new Node[currentPVars.length]; } System.arraycopy(currentPVars, 0, pVars, 0, currentPVars.length); } }
/** * Clone the rule variable to allow multiple rule instaces to be active at the same time. */ public Node_RuleVariable cloneNode() { return new Node_RuleVariable(getName(), index); }
ai = code[pc++]; arg = argVars[ai]; if (arg instanceof Node_RuleVariable) arg = ((Node_RuleVariable)arg).deref(); constant = (Node) args[ac++]; if (arg instanceof Node_RuleVariable) { boolean match = false; Node o = argVars[2]; if (o instanceof Node_RuleVariable) o = ((Node_RuleVariable)o).deref(); if (Functor.isFunctor(o)) { Functor funcArg = (Functor)o.getLiteralValue(); for (int i = 0; i < fargs.length; i++) { Node template = templateArgs[i]; if (template.isVariable()) template = new Node_RuleVariable(null, i+3); fargs[i] = template; argVars[i+3] = template; bind(((Node_RuleVariable)o).deref(), newFunc); match = true; yi = code[pc++]; ai = code[pc++]; argVars[ai] = pVars[yi] = new Node_RuleVariable(null, yi); break; argVars[ai] = new Node_RuleVariable(null, ai); break;
/** * Compare triple patterns, taking into account variable indices. * The equality function ignores differences between variables. */ @Override public boolean sameAs(Object o) { if (! (o instanceof TriplePattern) ) return false; TriplePattern other = (TriplePattern) o; return Node_RuleVariable.sameNodeAs(subject, other.subject) && Node_RuleVariable.sameNodeAs(predicate, other.predicate) && Node_RuleVariable.sameNodeAs(object, other.object); }
/** * Close a single node. */ private Node cloneNode(Node nIn, Map<Node_RuleVariable, Node> vmap, BindingEnvironment env) { Node n = (env == null) ? nIn : env.getGroundVersion(nIn); if (n instanceof Node_RuleVariable) { Node_RuleVariable nv = (Node_RuleVariable)n; Node c = vmap.get(nv); if (c == null) { c = ((Node_RuleVariable)n).cloneNode(); vmap.put(nv, c); } return c; } else if (Functor.isFunctor(n)) { Functor f = (Functor)n.getLiteralValue(); return Functor.makeFunctorNode(cloneFunctor(f, vmap, env)); } else { return n; } }
/** * Preserve the state of an interpreter into this frame. */ public void preserveState( List<Node> trail ) { // Save the trail state int trailLen = trail.size(); if (trailLen > trailLength) { trailValues = new Node[trailLen]; trailVars = new Node_RuleVariable[trailLen]; } trailLength = trailLen; for (int i = 0; i < trailLen; i++) { Node_RuleVariable var = (Node_RuleVariable) trail.get(i); trailVars[i] = var; trailValues[i] = var.getRawBoundValue(); } // Save the permanent variables Node[] currentPVars = envFrame.pVars; if (currentPVars != null) { if (pVars == null || pVars.length < currentPVars.length) { pVars = new Node[currentPVars.length]; } System.arraycopy(currentPVars, 0, pVars, 0, currentPVars.length); } }
/** * Find the variable index for the given variable name * and return a Node_RuleVariable with that index. */ Node_RuleVariable getNodeVar(String name) { Node_RuleVariable node = varMap.get(name); if (node == null) { node = new Node_RuleVariable(name, varMap.size()); varMap.put(name, node); } return node; }
/** * Bind a variable in the current envionment to the given value. * Overrides and ignores any current binding. * @param var a Node_RuleVariable defining the variable to bind * @param value the value to bind */ public void bindNoCheck(Node_RuleVariable var, Node value) { environment[var.getIndex()] = value; }
/** * Dereference a node, following any binding trail. */ public static Node deref(Node node) { if (node instanceof Node_RuleVariable) { return ((Node_RuleVariable)node).deref(); } else { return node; } }
/** * Compare Functors, taking into account variable indices. * The equality function ignores differences between variables. */ @Override public boolean sameAs(Object o) { if (o instanceof Functor) { Functor f2 = (Functor)o; if (name.equals(f2.name) && args.length == f2.args.length) { for (int i = 0; i < args.length; i++) { if (! Node_RuleVariable.sameNodeAs(args[i], f2.args[i])) return false; } return true; } } return false; }