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.Iterator; 29 30 /** 31 * <p> 32 * Prolog clause is composed by two prolog terms that define a prolog clause, 33 * the head and the body. This representation consider the prolog clause body 34 * like a single term. If the body is a conjunctive set of terms, the body is an 35 * structure with functor/arity (,/2) and the first argument is the first 36 * element in the conjunction and the rest is a recursive functor/arity (,/2). 37 * </p> 38 * <p> 39 * The functor and arity for the clause is given from head term functor and 40 * arity. 41 * </p> 42 * <p> 43 * This class define some properties for commons prolog clause implementations. 44 * They are boolean flags that indicate if the prolog clause is dynamic 45 * multifile and discontiguos. 46 * </p> 47 * <p> 48 * This class have several methods to access to the clause components and 49 * retrieve some clause properties and information about it. 50 * </p> 51 * <p> 52 * Additionally this class contains a prolog provider reference for build terms 53 * in some operations. 54 * </p> 55 * 56 * @author Jose Zalacain 57 * @since 1.0 58 */ 59 public interface PrologClause extends PrologElement, PrologDocumentable { 60 61 /** 62 * Integer number that represent the arguments number in the clause head. The 63 * arity for this clause can be implemented like {@code getHead().getArity()}. 64 * 65 * @return the arguments number in the clause head. 66 * @since 1.0 67 */ 68 public int getArity(); 69 70 /** 71 * String that represent the functor in the clause head. The functor for this 72 * clause can be implemented like {@code getHead().getFunctor()}. 73 * 74 * @return the functor in the clause head 75 * @since 1.0 76 */ 77 public String getFunctor(); 78 79 /** 80 * Term arguments present in the clause head. 81 * 82 * @return Term arguments present in the clause head. 83 * @since 1.0 84 */ 85 public PrologTerm[] getArguments(); 86 87 /** 88 * Term located at some given index position in the clause head arguments. 89 * 90 * @param index position to retrieve the correspondent term. 91 * @return Term located at some given index position. 92 * @throws ArrayIndexOutOfBoundsException if the index value is out of term 93 * array bound. 94 * @since 1.0 95 */ 96 public PrologTerm getArgument(int index); 97 98 /** 99 * Prolog term representation of the current clause. This prolog term is a 100 * structure with functor/arity (:-/2) and the arguments head and body. 101 * 102 * @return term representation of the current clause. 103 * @since 1.0 104 */ 105 public PrologTerm getTerm(); 106 107 /** 108 * Prolog term that represent the clause head. 109 * 110 * @return the clause head. 111 * @since 1.0 112 */ 113 public PrologTerm getHead(); 114 115 /** 116 * Prolog term that represent the clause body. If the clause body representation 117 * it's not the term itself, the prolog term should be created and returned. 118 * 119 * @return the clause body. 120 * @since 1.0 121 */ 122 public PrologTerm getBody(); 123 124 /** 125 * Clause family functor/arity based indicator. The clause family indicator is 126 * the same indicator for all clauses head in the clause family. 127 * 128 * @return functor/arity based indicator of the current clause family. 129 * @since 1.0 130 */ 131 public String getIndicator(); 132 133 /** 134 * Check if the current clause have functor/arity based indicator specified by 135 * arguments, false in otherwise. 136 * 137 * @param functor clause functor to be checked 138 * @param arity clause arity to be checked 139 * @return true if the current clause have functor/arity based indicator 140 * specified by arguments, false in otherwise. 141 * @since 1.0 142 */ 143 public boolean hasIndicator(String functor, int arity); 144 145 /** 146 * True if this clause is a directive, false in other case. The implementation 147 * for this method can be {@code getHead()==null && getBody()!=null}. 148 * 149 * @return whether this clause is a directive. 150 * @since 1.0 151 */ 152 public boolean isDirective(); 153 154 /** 155 * True if this clause is a fact, false in other case. The implementation for 156 * this method can be {@code getHead()!=null && getBody()==null}. 157 * 158 * @return whether this clause is a fact. 159 * @since 1.0 160 */ 161 public boolean isFact(); 162 163 /** 164 * True if this clause is a rule, false in other case. The implementation for 165 * this method can be {@code getHead()!=null && getBody()!=null}. 166 * 167 * @return whether this clause is a rule. 168 * @since 1.0 169 */ 170 public boolean isRule(); 171 172 /** 173 * True if this clause is a rule, false in other case. The implementation for 174 * this method can be {@code getHead()!=null && getBody()!=null}. 175 * 176 * @return whether this clause is a rule. 177 * @since 1.1 178 */ 179 public boolean isMethod(); 180 181 /** 182 * True if this clause is a function, false in other case. The implementation 183 * for this method can be {@code getHead()!=null && getBody()!=null}. 184 * 185 * @return whether this clause is a rule. 186 * @since 1.1 187 */ 188 public boolean isFunction(); 189 190 /** 191 * Check that two clauses unify. Prolog clauses unify if and only if the head 192 * and the body for both clauses unify. 193 * 194 * @param clause the clause to unify with the current clause 195 * @return true if the given clause unify whit the current clause, false 196 * otherwise 197 * @since 1.0 198 */ 199 public boolean unify(PrologClause clause); 200 201 /** 202 * True if this clause is a dynamic, false in other case 203 * 204 * @deprecated Natives engine don't offer information about that. 205 * @return whether this clause is a dynamic 206 * @since 1.0 207 */ 208 @Deprecated 209 public boolean isDynamic(); 210 211 /** 212 * True if this clause is a multifile, false in other case 213 * 214 * @deprecated Natives engine don't offer information about that. 215 * @return whether this clause is a multifile 216 * @since 1.0 217 */ 218 @Deprecated 219 public boolean isMultifile(); 220 221 /** 222 * True if this clause is a discontiguos, false in other case 223 * 224 * @deprecated Natives engine don't offer information about that. 225 * @return whether this clause is a discontiguos. 226 * @since 1.0 227 */ 228 @Deprecated 229 public boolean isDiscontiguous(); 230 231 /** 232 * Clause family PrologIndicator based indicator. The clause family indicator is 233 * the same indicator for all clauses head in the clause family. 234 * 235 * @return PrologIndicator based indicator of the current clause family. 236 * @since 1.0 237 */ 238 public PrologIndicator getPrologIndicator(); 239 240 /** 241 * Iterator to iterate over all body terms. 242 * 243 * @return Iterator to iterate over all body terms. 244 * @since 1.0 245 */ 246 public Iterator<PrologTerm> getBodyIterator(); 247 248 /** 249 * Get the clause body as terms array. 250 * 251 * @return clause terms body array. 252 * @since 1.0 253 */ 254 public PrologTerm[] getBodyArray(); 255 256 /** 257 * Casts the current PrologClause to the class or interface represented by this 258 * {@code Class} object. 259 * 260 * @return the PrologTerm after casting, or null if term is null 261 * 262 * @throws ClassCastException if the object is not null and is not assignable to 263 * the type T. 264 * @since 1.1 265 */ 266 public <T extends PrologClause> T cast(); 267 268 }