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 /**
29 * <p>
30 * Represent structured prolog compound term. Prolog structures consist in a
31 * relation the functor (structure name) and arguments enclosed between
32 * parenthesis.
33 * </p>
34 * <p>
35 * The Prolog Provider is the mechanism to create a new Prolog structures
36 * invoking {@link PrologProvider#newStructure(String, PrologTerm...)}.
37 * </p>
38 * <p>
39 * Two structures are equals if and only if are structure and have equals
40 * functor and arguments. Structures terms unify only with same functor and
41 * arguments structures, with free variable or with with structures where your
42 * arguments unify if they have the same functor and arity.
43 * </p>
44 * <p>
45 * Structures have a special property named arity that means the number of
46 * arguments present in the structure.
47 * </p>
48 * <p>
49 * There are two special structures term. They are expressions (Two arguments
50 * structure term with operator functor) and atoms (functor with zero
51 * arguments). For the first special case must be used
52 * {@link PrologProvider#newStructure(PrologTerm, String, PrologTerm)}
53 * specifying operands like arguments and operator like functor. For the second
54 * special case must be used {@link PrologProvider#newAtom(String)} specifying
55 * functor only.
56 * </p>
57 *
58 * @author Jose Zalacain
59 * @since 1.0
60 */
61 public interface PrologStructure extends PrologTerm {
62
63 /**
64 * Return the operator (structure functor) of the current term if the current
65 * term is an evalueble structure (expression). This method is equivalent to
66 * invoke #{@link #getFunctor()}
67 *
68 * @return return the operator of the current term if the current term is an
69 * (expression).
70 * @since 1.0
71 */
72 public String getOperator();
73
74 /**
75 * Return the left operand of the current term if the current term is an
76 * evalueble structure (expression). This method is equivalent to invoke
77 * {@link #getArgument(int)} with integer parameter equals to zero.
78 *
79 * @return return the left operand of the current term if the current term is an
80 * expression.
81 * @since 1.0
82 */
83 public PrologTerm getLeft();
84
85 /**
86 * Return the right operand of the current term if the current term is an
87 * evalueble structure (expression). This method is equivalent to invoke
88 * {@link #getArgument(int)} with integer parameter equals to one.
89 *
90 * @return return the right operand of the current term if the current term is
91 * an expression.
92 * @since 1.0
93 */
94 public PrologTerm getRight();
95
96 }