1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
51
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
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
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
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 }