View Javadoc

1   /*
2    * #%L
3    * prolobjectlink-jpi-tuprolog
4    * %%
5    * Copyright (C) 2019 Prolobjectlink Project
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 2.1 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-2.1.html>.
20   * #L%
21   */
22  package io.github.prolobjectlink.prolog.tuprolog;
23  
24  import java.util.ArrayList;
25  import java.util.List;
26  import java.util.Map;
27  
28  import alice.tuprolog.Parser;
29  import alice.tuprolog.Prolog;
30  import alice.tuprolog.Struct;
31  import alice.tuprolog.Term;
32  import io.github.prolobjectlink.prolog.AbstractProvider;
33  import io.github.prolobjectlink.prolog.PrologAtom;
34  import io.github.prolobjectlink.prolog.PrologConverter;
35  import io.github.prolobjectlink.prolog.PrologDouble;
36  import io.github.prolobjectlink.prolog.PrologEngine;
37  import io.github.prolobjectlink.prolog.PrologFloat;
38  import io.github.prolobjectlink.prolog.PrologInteger;
39  import io.github.prolobjectlink.prolog.PrologJavaConverter;
40  import io.github.prolobjectlink.prolog.PrologList;
41  import io.github.prolobjectlink.prolog.PrologLogger;
42  import io.github.prolobjectlink.prolog.PrologLong;
43  import io.github.prolobjectlink.prolog.PrologProvider;
44  import io.github.prolobjectlink.prolog.PrologStructure;
45  import io.github.prolobjectlink.prolog.PrologTerm;
46  import io.github.prolobjectlink.prolog.PrologVariable;
47  
48  /**
49   * 
50   * @author Jose Zalacain
51   * @since 1.0
52   */
53  public class TuProlog extends AbstractProvider implements PrologProvider {
54  
55  	private static final PrologLogger logger = new TuPrologLogger();
56  	static final String VERSION = Prolog.getVersion();
57  	static final String NAME = "tuProlog";
58  
59  	public TuProlog() {
60  		super(new TuPrologConverter());
61  	}
62  
63  	public TuProlog(PrologConverter<Term> converter) {
64  		super(converter);
65  	}
66  
67  	public PrologTerm prologNil() {
68  		return new TuPrologNil(this);
69  	}
70  
71  	public PrologTerm prologCut() {
72  		return new TuPrologCut(this);
73  	}
74  
75  	public PrologTerm prologFail() {
76  		return new TuPrologFail(this);
77  	}
78  
79  	public PrologTerm prologTrue() {
80  		return new TuPrologTrue(this);
81  	}
82  
83  	public PrologTerm prologFalse() {
84  		return new TuPrologFalse(this);
85  	}
86  
87  	public PrologTerm prologEmpty() {
88  		return new TuPrologEmpty(this);
89  	}
90  
91  	public PrologTerm prologInclude(String file) {
92  		return newStructure("include", newAtom(file));
93  	}
94  
95  	// engine
96  
97  	public PrologEngine newEngine() {
98  		Prolog prolog = new Prolog();
99  		return new TuPrologEngine(this, prolog);
100 	}
101 
102 	public PrologEngine newEngine(String path) {
103 		PrologEngine engine = newEngine();
104 		engine.consult(path);
105 		return engine;
106 	}
107 
108 	// parser helpers
109 
110 	public PrologTerm parseTerm(String term) {
111 		return toTerm(Term.createTerm(term), PrologTerm.class);
112 	}
113 
114 	public PrologTerm[] parseTerms(String stringTerms) {
115 		List<PrologTerm> list = new ArrayList<PrologTerm>();
116 		Parser parser = new Parser(stringTerms);
117 		Term term = parser.nextTerm(false);
118 		while (term instanceof Struct) {
119 			Struct struct = (Struct) term;
120 			if (struct.getName().equals(",") && struct.getArity() == 2) {
121 				list.add(toTerm(struct.getArg(0), PrologTerm.class));
122 				term = struct.getArg(1);
123 			} else {
124 				list.add(toTerm(term, PrologTerm.class));
125 				term = parser.nextTerm(false);
126 			}
127 		}
128 		return list.toArray(new PrologTerm[0]);
129 	}
130 
131 	// terms
132 
133 	public PrologAtom newAtom(String functor) {
134 		return new TuPrologAtom(this, functor);
135 	}
136 
137 	public PrologFloat newFloat(Number value) {
138 		return new TuPrologFloat(this, value);
139 	}
140 
141 	public PrologDouble newDouble(Number value) {
142 		return new TuPrologDouble(this, value);
143 	}
144 
145 	public PrologInteger newInteger(Number value) {
146 		return new TuPrologInteger(this, value);
147 	}
148 
149 	public PrologLong newLong(Number value) {
150 		return new TuPrologLong(this, value);
151 	}
152 
153 	public PrologVariable newVariable(int position) {
154 		return new TuPrologVariable(this);
155 	}
156 
157 	public PrologVariable newVariable(String name, int position) {
158 		return new TuPrologVariable(this, name);
159 	}
160 
161 	public PrologList newList() {
162 		return new TuPrologEmpty(this);
163 	}
164 
165 	public PrologList newList(PrologTerm[] arguments) {
166 		if (arguments != null && arguments.length > 0) {
167 			return new TuPrologList(this, arguments);
168 		}
169 		return new TuPrologEmpty(this);
170 	}
171 
172 	public PrologList newList(PrologTerm head, PrologTerm tail) {
173 		return new TuPrologList(this, head, tail);
174 	}
175 
176 	public PrologList newList(PrologTerm[] arguments, PrologTerm tail) {
177 		return new TuPrologList(this, arguments, tail);
178 	}
179 
180 	public PrologStructure newStructure(String functor, PrologTerm... arguments) {
181 		return new TuPrologStructure(this, functor, arguments);
182 	}
183 
184 	public PrologTerm newStructure(PrologTerm left, String operator, PrologTerm right) {
185 		return new TuPrologStructure(this, left, operator, right);
186 	}
187 
188 	public final PrologTerm newEntry(PrologTerm key, PrologTerm value) {
189 		return new TuPrologEntry(this, key, value);
190 	}
191 
192 	public final PrologTerm newEntry(Object key, Object value) {
193 		PrologJavaConverter transformer = getJavaConverter();
194 		PrologTerm keyTerm = transformer.toTerm(key);
195 		PrologTerm valueTerm = transformer.toTerm(value);
196 		return new TuPrologEntry(this, keyTerm, valueTerm);
197 	}
198 
199 	public final PrologTerm newMap(Map<PrologTerm, PrologTerm> map) {
200 		return new TuPrologMap(this, map);
201 	}
202 
203 	public final PrologTerm newMap(int initialCapacity) {
204 		return new TuPrologMap(this, initialCapacity);
205 	}
206 
207 	public final PrologTerm newMap() {
208 		return new TuPrologMap(this);
209 	}
210 
211 	public PrologTerm newReference(Object reference) {
212 		return new TuPrologReference(this, reference);
213 	}
214 
215 	public PrologTerm falseReference() {
216 		return newReference(false);
217 	}
218 
219 	public PrologTerm trueReference() {
220 		return newReference(true);
221 	}
222 
223 	public PrologTerm nullReference() {
224 		return newReference(null);
225 	}
226 
227 	public PrologTerm voidReference() {
228 		return newReference(void.class);
229 	}
230 
231 	public PrologJavaConverter getJavaConverter() {
232 		return new TuPrologJavaConverter(this);
233 	}
234 
235 	public PrologLogger getLogger() {
236 		return logger;
237 	}
238 
239 	@Override
240 	public String toString() {
241 		return "TuProlog [converter=" + converter + "]";
242 	}
243 
244 }