View Javadoc

1   /*
2    * #%L
3    * prolobjectlink-jpi
4    * %%
5    * Copyright (C) 2019 Prolobjectlink Project
6    * %%
7    * Permission is hereby granted, free of charge, to any person obtaining a copy
8    * of this software and associated documentation files (the "Software"), to deal
9    * in the Software without restriction, including without limitation the rights
10   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11   * copies of the Software, and to permit persons to whom the Software is
12   * furnished to do so, subject to the following conditions:
13   * 
14   * The above copyright notice and this permission notice shall be included in
15   * all copies or substantial portions of the Software.
16   * 
17   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23   * THE SOFTWARE.
24   * #L%
25   */
26  package io.github.prolobjectlink.prolog;
27  
28  import java.util.Collection;
29  import java.util.Iterator;
30  import java.util.List;
31  import java.util.Map;
32  
33  /**
34   * <p>
35   * Prolog query is the mechanism to query the prolog database loaded in prolog
36   * engine. The way to create a new prolog query is invoking
37   * {@link PrologEngine#query(String)},
38   * {@link PrologEngine#query(PrologTerm, PrologTerm...)} or
39   * {@link PrologEngine#query(PrologTerm[])}. When this methods are called the
40   * prolog query is open an only with {@link #dispose()} close the current query
41   * and release all internal resources.
42   * </p>
43   * 
44   * <p>
45   * Prolog query implement {@link Iterable} and {@link Iterator}. This
46   * implementation help to obtain successive solutions present in the query.
47   * </p>
48   * 
49   * <pre>
50   * PrologEngine engine = provider.newEngine("zoo.pl");
51   * PrologVariable x = provider.newVariable("X", 0);
52   * PrologQuery query = engine.query(provider.newStructure("dark", x));
53   * while (query.hasNext()) {
54   * 	PrologTerm value = query.nextVariablesSolution().get(&quot;X&quot;);
55   * 	System.out.println(value);
56   * }
57   * query.dispose();
58   * </pre>
59   * 
60   * <pre>
61   * PrologEngine engine = provider.newEngine("zoo.pl");
62   * PrologVariable x = provider.newVariable("X", 0);
63   * PrologQuery query = engine.query(provider.newStructure("dark", x));
64   * for (Collection&lt;PrologTerm&gt; col : query) {
65   * 	for (PrologTerm prologTerm : col) {
66   * 		System.out.println(prologTerm);
67   * 	}
68   * }
69   * query.dispose();
70   * </pre>
71   * 
72   * @author Jose Zalacain
73   * @since 1.0
74   */
75  public interface PrologQuery extends Iterator<Collection<PrologTerm>>, Iterable<Collection<PrologTerm>> {
76  
77  	/**
78  	 * Provider instance
79  	 * 
80  	 * @return provider instance
81  	 * @since 1.0
82  	 */
83  	public PrologProvider getProvider();
84  
85  	/**
86  	 * Engine hold by the current query
87  	 * 
88  	 * @return used by the current query
89  	 * @since 1.0
90  	 */
91  	public PrologEngine getEngine();
92  
93  	/**
94  	 * <p>
95  	 * Check that the current query has solution.
96  	 * </p>
97  	 * 
98  	 * @return true if the current query has solution, false if not
99  	 * @since 1.0
100 	 */
101 	public boolean hasSolution();
102 
103 	/**
104 	 * <p>
105 	 * Check if the current query has more solutions.
106 	 * </p>
107 	 * 
108 	 * @return true if the current query has more solutions, false if not
109 	 * @since 1.0
110 	 */
111 	public boolean hasMoreSolutions();
112 
113 	/**
114 	 * Return the prolog terms that conform the solution set for the current query.
115 	 * The solution is a prolog terms array and every term is an instance value for
116 	 * the variables not anonymous involved in the query.
117 	 * 
118 	 * @return prolog terms solution array for the current query
119 	 * @since 1.0
120 	 */
121 	public PrologTerm[] oneSolution();
122 
123 	/**
124 	 * Return the prolog terms that conform the solution set for the current query.
125 	 * The solution set is a prolog terms map and every map entry is a pair variable
126 	 * name and variable instance value for the variables not anonymous involved in
127 	 * the query.
128 	 * 
129 	 * @return variable name - variable instance (key - value) map that conform the
130 	 *         solution set for the current query.
131 	 * @since 1.0
132 	 */
133 	public Map<String, PrologTerm> oneVariablesSolution();
134 
135 	/**
136 	 * Return the next prolog terms solution array for the current query. The
137 	 * solution is a prolog terms array and every term is an instance value for the
138 	 * variables not anonymous involved in the query.
139 	 * 
140 	 * @return prolog terms solution array for the current query
141 	 * @since 1.0
142 	 */
143 	public PrologTerm[] nextSolution();
144 
145 	/**
146 	 * Return the next prolog terms that conform the solution set for the current
147 	 * query. The solution set is a prolog terms map and every map entry is a pair
148 	 * variable name and variable instance value for the variables not anonymous
149 	 * involved in the query.
150 	 * 
151 	 * @return variable name - variable instance (key - value) map that conform the
152 	 *         solution set for the current query.
153 	 * @since 1.0
154 	 */
155 	public Map<String, PrologTerm> nextVariablesSolution();
156 
157 	/**
158 	 * Return a Prolog terms matrix of n x m order that conform the solution set for
159 	 * the current query where n is the solution number and m is a free variable
160 	 * number in the query.
161 	 * 
162 	 * @param n array order or Prolog term rows number
163 	 * @return a Prolog terms matrix of n x m order that conform the solution set
164 	 * @since 1.0
165 	 */
166 	public PrologTerm[][] nSolutions(int n);
167 
168 	/**
169 	 * Return an array of n size with maps of variables name key and Prolog terms as
170 	 * value that conform the solution set for the current query where n is the
171 	 * solution number.
172 	 * 
173 	 * @param n array order or Prolog term items number
174 	 * @return an array of n size with maps of variables name key and Prolog terms
175 	 *         as value that conform the solution set
176 	 * @since 1.0
177 	 */
178 	public Map<String, PrologTerm>[] nVariablesSolutions(int n);
179 
180 	/**
181 	 * Return a Prolog terms matrix of n x m order that conform the solution set for
182 	 * the current query where n is the solution number and m is a free variable
183 	 * number in the query.
184 	 * 
185 	 * @return a Prolog terms matrix of n x m order that conform the solution set
186 	 * @since 1.0
187 	 */
188 	public PrologTerm[][] allSolutions();
189 
190 	/**
191 	 * Return an array of map of variables name key and Prolog terms as value that
192 	 * conform the solution set for the current query.
193 	 * 
194 	 * @return an array of map of variables name key and Prolog terms as value that
195 	 *         conform the solution set
196 	 * @since 1.0
197 	 */
198 	public Map<String, PrologTerm>[] allVariablesSolutions();
199 
200 	/**
201 	 * 
202 	 * Return the equivalent Java objects that conform the solution set for the
203 	 * current query. The solution set is a Java objects list and every term is a
204 	 * conversion of the instance value for the variables not anonymous involved in
205 	 * the query.
206 	 * 
207 	 * 
208 	 * <pre>
209 	 * List&lt;Object&gt; solution = query.oneResult();
210 	 * for (int i = 0; i &lt; solution.size(); i++) {
211 	 * 	System.out.println(solution.get(i));
212 	 * }
213 	 * </pre>
214 	 * 
215 	 * @return Java objects solution list for the current query
216 	 * @since 1.0
217 	 */
218 	public List<Object> oneResult();
219 
220 	/**
221 	 * 
222 	 * Return the equivalent Java objects that conform the solution set for the
223 	 * current query. The solution set is a Java object map and every map entry is a
224 	 * pair variable name and a Java object conversion of the variable instance
225 	 * value for the variables not anonymous involved in the query.
226 	 * 
227 	 * @return variable name - Java object conversion of the variable instance (key
228 	 *         - value) map that conform the solution set for the current query.
229 	 * @since 1.0
230 	 */
231 	public Map<String, Object> oneVariablesResult();
232 
233 	/**
234 	 * Return the next Java objects solution list for the current query. The
235 	 * solution is a Java objects list and every object is an instance value for the
236 	 * variables not anonymous involved in the query.
237 	 * 
238 	 * @return Java objects solution list for the current query
239 	 * @since 1.1
240 	 */
241 	public List<Object> nextResult();
242 
243 	/**
244 	 * Return the next Java objects that conform the solution set for the current
245 	 * query. The solution set is an objects map and every map entry is a pair
246 	 * variable name and variable instance value for the variables not anonymous
247 	 * involved in the query.
248 	 * 
249 	 * @return variable name - variable instance (key - value) map that conform the
250 	 *         solution set for the current query.
251 	 * @since 1.1
252 	 */
253 	public Map<String, Object> nextVariablesResult();
254 
255 	/**
256 	 * Return a list of list of Java Objects that conform the solution set for the
257 	 * current query where n is the solution number and m is a free variable number
258 	 * in the query.
259 	 * 
260 	 * @param n list order or Java objects rows number
261 	 * @return a list of list of Java Objects that conform the solution set
262 	 * @since 1.1
263 	 */
264 	public List<List<Object>> nResult(int n);
265 
266 	/**
267 	 * Return a list of n size with maps of variables name key and Java objects as
268 	 * value that conform the solution set for the current query where n is the
269 	 * solution number.
270 	 * 
271 	 * @param n list order or Java objects items number
272 	 * @return a list of n size with maps of variables name key and Java objects as
273 	 *         value that conform the solution set
274 	 * @since 1.1
275 	 */
276 	public List<Map<String, Object>> nVariablesResults(int n);
277 
278 	/**
279 	 * Return a list of list of Java Objects that conform the solution set for the
280 	 * current query.
281 	 * 
282 	 * @return a list of list of Java Objects that conform the solution set for the
283 	 *         current query.
284 	 * @since 1.0
285 	 */
286 	public List<List<Object>> allResults();
287 
288 	/**
289 	 * Return a list of map of variables name key and Java objects as value that
290 	 * conform the solution set for the current query.
291 	 * 
292 	 * @return a list of map of variables name key and Java objects as value that
293 	 *         conform the solution set
294 	 * @since 1.0
295 	 */
296 	public List<Map<String, Object>> allVariablesResults();
297 
298 	/**
299 	 * Return a map of variables name key and Prolog terms as value that conform the
300 	 * solution set for the current query.
301 	 * 
302 	 * @return a map of variables name key and Prolog terms as value that conform
303 	 *         the solution set
304 	 * @since 1.0
305 	 */
306 	public Map<String, PrologTerm> one();
307 
308 	/**
309 	 * Return the next prolog terms that conform the solution set for the current
310 	 * query. The solution set is a prolog terms map and every map entry is a pair
311 	 * variable name and variable instance value for the variables not anonymous
312 	 * involved in the query.
313 	 * 
314 	 * @return variable name - variable instance (key - value) map that conform the
315 	 *         solution set for the current query.
316 	 * @since 1.1
317 	 */
318 	public Map<String, PrologTerm> more();
319 
320 	/**
321 	 * Return a list of n size with maps of variables name key and Prolog terms as
322 	 * value that conform the solution set for the current query where n is the
323 	 * solution number.
324 	 * 
325 	 * @return an list of n size with maps of variables name key and Prolog terms as
326 	 *         value that conform the solution set
327 	 * @param n list order or Prolog term items number
328 	 * @since 1.1
329 	 */
330 	public List<Map<String, PrologTerm>> nths(int n);
331 
332 	/**
333 	 * Return a list of map of variables name key and Prolog terms as value that
334 	 * conform the solution set for the current query.
335 	 * 
336 	 * @return a list of map of variables name key and Prolog terms as value that
337 	 *         conform the solution set
338 	 * @since 1.0
339 	 */
340 	public List<Map<String, PrologTerm>> all();
341 
342 	/**
343 	 * Release all allocations for the query
344 	 * 
345 	 * @since 1.0
346 	 */
347 	public void dispose();
348 
349 }