001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.mandarax.kernel;
019:
020: import java.util.Iterator;
021:
022: import org.apache.commons.collections.iterators.ArrayIterator;
023:
024: /**
025: * Goal of a derivation step.
026: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
027: * @version 3.4 <7 March 05>
028: * @since 1.0
029: * Prova re-integration
030: * @author <A HREF="mailto:a.kozlenkov@city.ac.uk">Alex Kozlenkov</A>
031: * @version 3.4 <7 March 05>
032: */
033: public final class Goal extends AbstractClause {
034:
035: private Fact fact = null;
036: private static java.util.List posLiterals = new java.util.Vector();
037: private java.util.List negLiterals = null;
038:
039: /**
040: * Constructor.
041: * @param query a query fact
042: */
043: public Goal(Fact query) {
044: super ();
045:
046: fact = query;
047: }
048:
049: /**
050: * Add a clause set listener.
051: * Nothing to do here.
052: * @param l the listener
053: */
054: public void addClauseSetChangeListener(ClauseSetChangeListener l) {
055: }
056:
057: /**
058: * Apply a set of substitutions to a fact.
059: * @see org.mandarax.kernel.Replacement
060: * @return the clause that is the result of applying the replacements
061: * @param r the collection of replacements
062: */
063: public Clause apply(java.util.Collection r) {
064: return (fact != null) ? new Goal(fact.applyToFact(r)) : null;
065: }
066:
067: /**
068: * Apply a substitution to a fact.
069: * @param r the replacement applied
070: * @return the clause that is the result of applying the replacement
071: */
072: public Clause apply(Replacement r) {
073: return (fact != null) ? new Goal(fact.applyToFact(r)) : null;
074: }
075:
076: /**
077: * Get the key for the object.
078: * @return the key object
079: */
080: public Object getKey() {
081: return fact.getKey();
082: }
083:
084: public boolean isBound() {
085: return false;
086: }
087:
088: /**
089: * Get the negative literals.
090: * @return the list of negative literals
091: */
092: public java.util.List getNegativeLiterals() {
093: if (negLiterals == null) {
094: negLiterals = new java.util.ArrayList(1);
095: negLiterals.add(fact);
096: }
097: return negLiterals;
098: }
099:
100: /**
101: * Get the positive literals.
102: * @return the list of positive literals
103: */
104: public java.util.List getPositiveLiterals() {
105: return posLiterals;
106: }
107:
108: /**
109: * Indicates whether the clause is atomic.
110: * @return a boolean
111: */
112: public boolean isAtomic() {
113: return true;
114: }
115:
116: /**
117: * Indicates whether the clause is the empty clause.
118: * @return true if the goal is empty, false otherwise
119: */
120: public boolean isEmpty() {
121: return getNegativeLiterals().isEmpty();
122: }
123:
124: /**
125: * Remove a clause set listener.
126: * Nothing to do here.
127: * @param l the listener
128: */
129: public void removeClauseSetChangeListener(ClauseSetChangeListener l) {
130: }
131:
132: /**
133: * Convert the object to a string.
134: * @return the string presentation of this object
135: */
136: public String toString() {
137: return "? " + fact.toString();
138: }
139:
140: /**
141: * Indicates whether the object (usually a term or a clause set) can be performed
142: * using the java semantics.
143: * @return a boolean
144: */
145: public boolean isExecutable() {
146: return fact.isExecutable();
147: }
148:
149: /**
150: * Get an iterator iterating over the predicates contained in this clause set.
151: * @return an iterator
152: */
153: public Iterator predicates() {
154: return fact == null ? new ArrayIterator(new Predicate[] {})
155: : fact.predicates();
156: }
157:
158: /**
159: * Indicates whether the clause is ground (= does not have variables).
160: * @return a boolean
161: */
162: public boolean isGround() {
163: return fact.isGround();
164: }
165: }
|