001: /******************************************************************
002: * File: EnvironmentFrameWithDerivation.java
003: * Created by: Dave Reynolds
004: * Created on: 18-Aug-2003
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: EnvironmentFrameWithDerivation.java,v 1.10 2008/01/02 12:06:16 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys.impl;
010:
011: import com.hp.hpl.jena.graph.*;
012: import com.hp.hpl.jena.reasoner.TriplePattern;
013:
014: import java.util.*;
015:
016: /**
017: * Extension of the normal AND-stack environment frame to support
018: * incremental derivation logging.
019: *
020: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
021: * @version $Revision: 1.10 $ on $Date: 2008/01/02 12:06:16 $
022: */
023: public class EnvironmentFrameWithDerivation extends EnvironmentFrame {
024:
025: /** The initial starting arguments for the call */
026: Node[] argVars = new Node[RuleClauseCode.MAX_ARGUMENT_VARS];
027:
028: /** The set of instantiated subgoals processed so far */
029: TriplePattern[] matches;
030:
031: /**
032: * Constructor
033: * @param clause the compiled code being interpreted by this env frame
034: */
035: public EnvironmentFrameWithDerivation(RuleClauseCode clause) {
036: super (clause);
037: if (clause.getRule() != null) {
038: matches = new TriplePattern[clause.getRule().bodyLength()];
039: }
040: }
041:
042: /** Instantiate and record a matched subgoal */
043: public void noteMatch(TriplePattern pattern, int pc) {
044: TriplePattern match = pattern;
045: int term = clause.termIndex(pc);
046: if (term >= 0) {
047: matches[term] = match;
048: }
049: }
050:
051: /**
052: * Return the final instantiated goal given the current binding state.
053: */
054: public Triple getResult() {
055: return new Triple(LPInterpreter.deref(argVars[0]),
056: LPInterpreter.deref(argVars[1]), LPInterpreter
057: .derefPossFunctor(argVars[2]));
058: }
059:
060: /**
061: * Return a safe copy of the list of matched subgoals in this subderivation.
062: */
063: public List getMatchList() {
064: ArrayList matchList = new ArrayList();
065: for (int i = 0; i < matches.length; i++) {
066: matchList.add(LPInterpreter.deref(matches[i]));
067: }
068: return matchList;
069: }
070:
071: /**
072: * Create an initial derivation record for this frame, based on the given
073: * argument registers.
074: */
075: public void initDerivationRecord(Node[] args) {
076: System.arraycopy(args, 0, argVars, 0,
077: RuleClauseCode.MAX_ARGUMENT_VARS);
078: }
079:
080: }
081:
082: /*
083: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
084: All rights reserved.
085:
086: Redistribution and use in source and binary forms, with or without
087: modification, are permitted provided that the following conditions
088: are met:
089:
090: 1. Redistributions of source code must retain the above copyright
091: notice, this list of conditions and the following disclaimer.
092:
093: 2. Redistributions in binary form must reproduce the above copyright
094: notice, this list of conditions and the following disclaimer in the
095: documentation and/or other materials provided with the distribution.
096:
097: 3. The name of the author may not be used to endorse or promote products
098: derived from this software without specific prior written permission.
099:
100: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
101: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
102: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
103: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
104: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
105: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
106: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
107: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
108: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
109: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
110: */
|