Mercurial > repo
comparison interps/brachylog/brachylog/Brachylog-master/src/metapredicates.pl @ 11868:70dedbc831e9 draft
<ais523> ` mv ibin/brachylog interps/brachylog
author | HackEso <hackeso@esolangs.org> |
---|---|
date | Tue, 16 Jul 2019 21:39:11 +0000 |
parents | ibin/brachylog/Brachylog-master/src/metapredicates.pl@318de151d0ec |
children |
comparison
equal
deleted
inserted
replaced
11867:b0414b6b332f | 11868:70dedbc831e9 |
---|---|
1 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
2 ____ ____ | |
3 \ \ / / | |
4 \ \ ____ / / | |
5 \ \/ \/ / | |
6 \ /\ / BRACHYLOG | |
7 \ / \ / A terse declarative logic programming language | |
8 / \ / \ | |
9 / \/ \ Written by Julien Cumin - 2017 | |
10 / /\____/\ \ https://github.com/JCumin/Brachylog | |
11 / / ___ \ \ | |
12 /___/ /__/ \___\ | |
13 | |
14 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
15 | |
16 | |
17 :- module(metapredicates, [brachylog_meta_accumulate/6, | |
18 brachylog_meta_bagof/6, | |
19 brachylog_meta_count/6, | |
20 brachylog_meta_declare/6, | |
21 brachylog_meta_existence/6, | |
22 brachylog_meta_find/6, | |
23 brachylog_meta_groupby/6, | |
24 brachylog_meta_head/6, | |
25 brachylog_meta_iterate/6, | |
26 brachylog_meta_leftfold/6, | |
27 brachylog_meta_map/6, | |
28 brachylog_meta_nonexistence/6, | |
29 brachylog_meta_orderby/6, | |
30 brachylog_meta_select/6, | |
31 brachylog_meta_tail/6, | |
32 brachylog_meta_unique/6, | |
33 brachylog_meta_verify/6, | |
34 brachylog_meta_zip/6 | |
35 ]). | |
36 | |
37 :- use_module(library(clpfd)). | |
38 :- use_module(predicates). | |
39 | |
40 | |
41 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
42 BRACHYLOG_META_ACCUMULATE | |
43 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
44 brachylog_meta_accumulate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
45 ( Input = [Arg] -> true | |
46 ; Input = Arg | |
47 ), | |
48 brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
49 brachylog_meta_accumulate(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
50 reverse(Input, ['integer':I|T]), | |
51 ( T = [Arg] -> true | |
52 ; reverse(T, Arg) | |
53 ), | |
54 brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
55 brachylog_meta_accumulate(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
56 brachylog_meta_accumulate(GlobalVariables, 'integer':1, P, Sub, Input, Output). | |
57 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'string':Input, Output) :- | |
58 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['string':Input], Output). | |
59 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'integer':Input, Output) :- | |
60 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['integer':Input], Output). | |
61 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'float':Input, Output) :- | |
62 brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['float':Input], Output). | |
63 brachylog_meta_accumulate(_, 'integer':0, _P, _Sub, Input, Input). | |
64 brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
65 I #> 0, | |
66 is_brachylog_list(Input), | |
67 ( GlobalVariables = 'ignore', | |
68 call(P, Sub, Input, E) | |
69 ; dif(GlobalVariables, 'ignore'), | |
70 call(P, GlobalVariables, Sub, Input, E) | |
71 ), | |
72 J #= I - 1, | |
73 append(Input, [E], F), | |
74 brachylog_meta_accumulate(GlobalVariables, 'integer':J, P, Sub, F, Output). | |
75 | |
76 | |
77 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
78 BRACHYLOG_META_BAGOF | |
79 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
80 brachylog_meta_bagof(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
81 ( Input = [Arg] -> true | |
82 ; Input = Arg | |
83 ), | |
84 brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
85 brachylog_meta_bagof(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
86 reverse(Input, ['integer':I|T]), | |
87 ( T = [Arg] -> true | |
88 ; reverse(T, Arg) | |
89 ), | |
90 brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
91 brachylog_meta_bagof(_, 'integer':0, _, _, _, []). | |
92 brachylog_meta_bagof(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
93 bagof(X, | |
94 ( GlobalVariables = 'ignore', | |
95 call(P, Sub, Input, X) | |
96 ; dif(GlobalVariables, 'ignore'), | |
97 call(P, GlobalVariables, Sub, Input, X) | |
98 ), | |
99 Output). | |
100 brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
101 I #> 0, | |
102 bagof(X, call_firstn( | |
103 ( GlobalVariables = 'ignore', | |
104 call(P, Sub, Input, X) | |
105 ; dif(GlobalVariables, 'ignore'), | |
106 call(P, GlobalVariables, Sub, Input, X) | |
107 ), I), | |
108 Output). | |
109 | |
110 | |
111 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
112 BRACHYLOG_META_COUNT | |
113 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
114 brachylog_meta_count(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
115 ( Input = [Arg] -> true | |
116 ; Input = Arg | |
117 ), | |
118 brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
119 brachylog_meta_count(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
120 reverse(Input, ['integer':I|T]), | |
121 ( T = [Arg] -> true | |
122 ; reverse(T, Arg) | |
123 ), | |
124 brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
125 brachylog_meta_count(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
126 brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output). | |
127 brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output) :- | |
128 brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, E), | |
129 brachylog_length('default', E, Output). | |
130 brachylog_meta_count(GlobalVariables, 'integer':1, P, Sub, Input, Output) :- | |
131 brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, E), | |
132 brachylog_length('default', E, Output). | |
133 | |
134 | |
135 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
136 BRACHYLOG_META_DECLARE | |
137 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
138 brachylog_meta_declare(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
139 ( Input = [Arg] -> true | |
140 ; Input = Arg | |
141 ), | |
142 brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
143 brachylog_meta_declare(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
144 reverse(Input, ['integer':I|T]), | |
145 ( T = [Arg] -> true | |
146 ; reverse(T, Arg) | |
147 ), | |
148 brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
149 brachylog_meta_declare(GlobalVariables, 'default', P, Sub, [H,T], T) :- | |
150 ( GlobalVariables = 'ignore', | |
151 call(P, Sub, H, T) | |
152 ; dif(GlobalVariables, 'ignore'), | |
153 call(P, GlobalVariables, Sub, H, T) | |
154 ). | |
155 brachylog_meta_declare(GlobalVariables, 'integer':0, P, Sub, [H,T], [H,T]) :- | |
156 ( GlobalVariables = 'ignore', | |
157 call(P, Sub, H, T) | |
158 ; dif(GlobalVariables, 'ignore'), | |
159 call(P, GlobalVariables, Sub, H, T) | |
160 ). | |
161 brachylog_meta_declare(GlobalVariables, 'integer':1, P, Sub, [H,T], H) :- | |
162 ( GlobalVariables = 'ignore', | |
163 call(P, Sub, T, H) | |
164 ; dif(GlobalVariables, 'ignore'), | |
165 call(P, GlobalVariables, Sub, T, H) | |
166 ). | |
167 brachylog_meta_declare(GlobalVariables, 'integer':2, P, Sub, [H,T], [H,T]) :- | |
168 ( GlobalVariables = 'ignore', | |
169 call(P, Sub, T, H) | |
170 ; dif(GlobalVariables, 'ignore'), | |
171 call(P, GlobalVariables, Sub, T, H) | |
172 ). | |
173 | |
174 | |
175 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
176 BRACHYLOG_META_EXISTENCE | |
177 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
178 brachylog_meta_existence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :- | |
179 ( Input = [Arg] -> true | |
180 ; Input = Arg | |
181 ), | |
182 brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I). | |
183 brachylog_meta_existence(GlobalVariables, 'last', P, Sub, Input, Arg) :- | |
184 reverse(Input, [I|T]), | |
185 ( T = [Arg] -> true | |
186 ; reverse(T, Arg) | |
187 ), | |
188 brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I). | |
189 brachylog_meta_existence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :- | |
190 dif(I, 'default'), | |
191 brachylog_meta_existence(GlobalVariables, P, Sub, Input, 'integer':I). | |
192 brachylog_meta_existence(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
193 brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output). | |
194 | |
195 brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output) :- | |
196 brachylog_in('default', Input, E), | |
197 ( GlobalVariables = 'ignore', | |
198 call(P, Sub, E, Output) | |
199 ; dif(GlobalVariables, 'ignore'), | |
200 call(P, GlobalVariables, Sub, E, Output) | |
201 ). | |
202 | |
203 | |
204 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
205 BRACHYLOG_META_FIND | |
206 | |
207 Credits to @false for call_firstf/2 and call_nth/2 | |
208 http://stackoverflow.com/a/20866206/2554145 | |
209 http://stackoverflow.com/a/11400256/2554145 | |
210 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
211 brachylog_meta_find(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
212 ( Input = [Arg] -> true | |
213 ; Input = Arg | |
214 ), | |
215 brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
216 brachylog_meta_find(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
217 reverse(Input, ['integer':I|T]), | |
218 ( T = [Arg] -> true | |
219 ; reverse(T, Arg) | |
220 ), | |
221 brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
222 brachylog_meta_find(_, 'integer':0, _, _, _, []). | |
223 brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
224 findall(X, | |
225 ( GlobalVariables = 'ignore', | |
226 call(P, Sub, Input, X) | |
227 ; dif(GlobalVariables, 'ignore'), | |
228 call(P, GlobalVariables, Sub, Input, X) | |
229 ), | |
230 Output). | |
231 brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
232 I #> 0, | |
233 findall(X, call_firstn( | |
234 ( GlobalVariables = 'ignore', | |
235 call(P, Sub, Input, X) | |
236 ; dif(GlobalVariables, 'ignore'), | |
237 call(P, GlobalVariables, Sub, Input, X) | |
238 ), I), | |
239 Output). | |
240 | |
241 call_firstn(Goal_0, N) :- | |
242 N + N mod 1 >= 0, % ensures that N >=0 and N is an integer | |
243 call_nth(Goal_0, Nth), | |
244 ( Nth == N -> ! ; true ). | |
245 | |
246 call_nth(Goal_0, C) :- | |
247 State = count(0, _), | |
248 Goal_0, | |
249 arg(1, State, C1), | |
250 C2 is C1+1, | |
251 nb_setarg(1, State, C2), | |
252 C = C2. | |
253 | |
254 | |
255 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
256 BRACHYLOG_META_GROUPBY | |
257 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
258 brachylog_meta_groupby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
259 ( Input = [Arg] -> true | |
260 ; Input = Arg | |
261 ), | |
262 brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
263 brachylog_meta_groupby(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
264 reverse(Input, ['integer':I|T]), | |
265 ( T = [Arg] -> true | |
266 ; reverse(T, Arg) | |
267 ), | |
268 brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
269 brachylog_meta_groupby(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
270 ( is_brachylog_list(Input) -> FixedInput = Input | |
271 ; brachylog_elements('default', Input, FixedInput) | |
272 ), | |
273 brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L), | |
274 brachylog_zip('default', [L,Input], L2), | |
275 brachylog_meta_groupby_group(L2, L3), | |
276 maplist(brachylog_meta_groupby_tail, L3, Output). | |
277 | |
278 brachylog_meta_groupby_group(L, Gs) :- | |
279 brachylog_meta_groupby_group(L, [], Gs). | |
280 | |
281 brachylog_meta_groupby_group([], Gs, Gs). | |
282 brachylog_meta_groupby_group([[G,H]|T], TempGs, Gs) :- | |
283 ( member(G:L, TempGs) -> | |
284 reverse(L, RL), | |
285 reverse([H|RL], L2), | |
286 select(G:L, TempGs, G:L2, TempGs2) | |
287 ; append(TempGs, [G:[H]], TempGs2) | |
288 ), | |
289 brachylog_meta_groupby_group(T, TempGs2, Gs). | |
290 | |
291 brachylog_meta_groupby_tail(_:T, T). | |
292 | |
293 | |
294 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
295 BRACHYLOG_META_HEAD | |
296 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
297 brachylog_meta_head(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
298 ( Input = [Arg] -> true | |
299 ; Input = Arg | |
300 ), | |
301 brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
302 brachylog_meta_head(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
303 reverse(Input, ['integer':I|T]), | |
304 ( T = [Arg] -> true | |
305 ; reverse(T, Arg) | |
306 ), | |
307 brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
308 brachylog_meta_head(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
309 brachylog_meta_head(GlobalVariables, 'integer':1, P, Sub, Input, Output). | |
310 brachylog_meta_head(_, 'integer':0, _, _, Input, Input). | |
311 brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
312 I #> 0, | |
313 brachylog_head('integer':I, Input, Heads), | |
314 brachylog_behead('integer':I, Input, Tails), | |
315 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Heads, NewHeads), | |
316 brachylog_concatenate('default', [NewHeads,Tails], Output). | |
317 | |
318 | |
319 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
320 BRACHYLOG_META_ITERATE | |
321 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
322 brachylog_meta_iterate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
323 ( Input = [Arg] -> true | |
324 ; Input = Arg | |
325 ), | |
326 brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
327 brachylog_meta_iterate(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
328 reverse(Input, ['integer':I|T]), | |
329 ( T = [Arg] -> true | |
330 ; reverse(T, Arg) | |
331 ), | |
332 brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
333 brachylog_meta_iterate(_, 'integer':0, _, _, Input, Input). | |
334 brachylog_meta_iterate(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
335 I #>= 1, | |
336 brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output). | |
337 brachylog_meta_iterate(GlobalVariables, 'integer':1, P, Sub, Input, Output) :- | |
338 ( GlobalVariables = 'ignore', | |
339 call(P, Sub, Input, Output) | |
340 ; dif(GlobalVariables, 'ignore'), | |
341 call(P, GlobalVariables, Sub, Input, Output) | |
342 ). | |
343 brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
344 I #> 1, | |
345 ( GlobalVariables = 'ignore', | |
346 call(P, Sub, Input, TOutput) | |
347 ; dif(GlobalVariables, 'ignore'), | |
348 call(P, GlobalVariables, Sub, Input, TOutput) | |
349 ), | |
350 J #= I - 1, | |
351 brachylog_meta_iterate(GlobalVariables, 'integer':J, P, Sub, TOutput, Output). | |
352 | |
353 | |
354 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
355 BRACHYLOG_META_LEFTFOLD | |
356 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
357 brachylog_meta_leftfold(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
358 ( Input = [Arg] -> true | |
359 ; Input = Arg | |
360 ), | |
361 brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
362 brachylog_meta_leftfold(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
363 reverse(Input, ['integer':I|T]), | |
364 ( T = [Arg] -> true | |
365 ; reverse(T, Arg) | |
366 ), | |
367 brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
368 brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'string':S, Output) :- | |
369 brachylog_elements('default', 'string':S, E), | |
370 brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O), | |
371 ( brachylog_concatenate('default', O, X), | |
372 X = 'string':_ -> | |
373 Output = X | |
374 ; Output = O | |
375 ). | |
376 brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'integer':Input, Output) :- | |
377 brachylog_elements('default', 'integer':Input, E), | |
378 brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O), | |
379 ( brachylog_concatenate('default', O, X), | |
380 X = 'integer':_ -> | |
381 Output = X | |
382 ; Output = O | |
383 ). | |
384 brachylog_meta_leftfold(_, 'default', _P, _Sub, [], []). | |
385 brachylog_meta_leftfold(_, 'default', _P, _Sub, [X], [X]). | |
386 brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, [H,I|T], Output) :- | |
387 brachylog_meta_leftfold_(GlobalVariables, P, Sub, [I|T], H, Output). | |
388 | |
389 brachylog_meta_leftfold_(_, _P, _Sub, [], Output, Output). | |
390 brachylog_meta_leftfold_(GlobalVariables, P, Sub, [H|T], A, Output) :- | |
391 ( GlobalVariables = 'ignore', | |
392 call(P, Sub, [A,H], E) | |
393 ; dif(GlobalVariables, 'ignore'), | |
394 call(P, GlobalVariables, Sub, [A,H], E) | |
395 ), | |
396 brachylog_meta_leftfold_(GlobalVariables, P, Sub, T, E, Output). | |
397 | |
398 | |
399 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
400 BRACHYLOG_META_MAP | |
401 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
402 brachylog_meta_map(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
403 ( Input = [Arg] -> true | |
404 ; Input = Arg | |
405 ), | |
406 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
407 brachylog_meta_map(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
408 reverse(Input, ['integer':I|T]), | |
409 ( T = [Arg] -> true | |
410 ; reverse(T, Arg) | |
411 ), | |
412 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
413 brachylog_meta_map(GlobalVariables, 'integer':0, P, Sub, Input, Output) :- | |
414 ( GlobalVariables = 'ignore', | |
415 call(P, Sub, Input, Output) | |
416 ; dif(GlobalVariables, 'ignore'), | |
417 call(P, GlobalVariables, Sub, Input, Output) | |
418 ). | |
419 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
420 brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output). | |
421 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'string':S, Output) :- | |
422 brachylog_elements('default', 'string':S, E), | |
423 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O), | |
424 ( brachylog_concatenate('default', O, X), | |
425 X = 'string':_ -> | |
426 Output = X | |
427 ; Output = O | |
428 ). | |
429 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'integer':Input, Output) :- | |
430 brachylog_elements('default', 'integer':Input, E), | |
431 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O), | |
432 ( brachylog_concatenate('default', O, X), | |
433 X = 'integer':_ -> | |
434 Output = X | |
435 ; Output = O | |
436 ). | |
437 brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output) :- | |
438 ( GlobalVariables = 'ignore', | |
439 Pred =.. [P, Sub] | |
440 ; dif(GlobalVariables, 'ignore'), | |
441 Pred =.. [P, GlobalVariables, Sub] | |
442 ), | |
443 is_brachylog_list(Input), | |
444 maplist(Pred, Input, Output). | |
445 brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
446 I #> 1, | |
447 J #= I - 1, | |
448 is_brachylog_list(Input), | |
449 maplist(brachylog_meta_map(GlobalVariables, 'integer':J, P, Sub), Input, Output). | |
450 | |
451 | |
452 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
453 BRACHYLOG_META_NONEXISTENCE | |
454 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
455 brachylog_meta_nonexistence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :- | |
456 ( Input = [Arg] -> true | |
457 ; Input = Arg | |
458 ), | |
459 brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I). | |
460 brachylog_meta_nonexistence(GlobalVariables, 'last', P, Sub, Input, Arg) :- | |
461 reverse(Input, [I|T]), | |
462 ( T = [Arg] -> true | |
463 ; reverse(T, Arg) | |
464 ), | |
465 brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I). | |
466 brachylog_meta_nonexistence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :- | |
467 dif(I, 'default'), | |
468 brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, 'integer':I). | |
469 brachylog_meta_nonexistence(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
470 brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output). | |
471 | |
472 brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output) :- | |
473 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T), | |
474 brachylog_zip('default', [T,[Output]], Z), | |
475 brachylog_meta_map(GlobalVariables, 'default', brachylog_different, 'default', Z, _). | |
476 | |
477 | |
478 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
479 BRACHYLOG_META_ORDERBY | |
480 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
481 brachylog_meta_orderby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
482 ( Input = [Arg] -> true | |
483 ; Input = Arg | |
484 ), | |
485 brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
486 brachylog_meta_orderby(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
487 reverse(Input, ['integer':I|T]), | |
488 ( T = [Arg] -> true | |
489 ; reverse(T, Arg) | |
490 ), | |
491 brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
492 brachylog_meta_orderby(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
493 brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output). | |
494 brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output) :- | |
495 ( is_brachylog_list(Input) -> FixedInput = Input | |
496 ; brachylog_elements('default', Input, FixedInput) | |
497 ), | |
498 brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L), | |
499 brachylog_zip('default', [L,Input], L2), | |
500 brachylog_order(integer:0, L2, SL2), | |
501 ( SL2 = [] -> | |
502 Output = [] | |
503 ; brachylog_zip('default', SL2, [_,Output]) | |
504 ). | |
505 brachylog_meta_orderby(GlobalVariables, 'integer':1, P, Sub, Input, Output) :- | |
506 ( is_brachylog_list(Input) -> FixedInput = Input | |
507 ; brachylog_elements('default', Input, FixedInput) | |
508 ), | |
509 brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L), | |
510 brachylog_zip('default', [L,Input], L2), | |
511 brachylog_order(integer:1, L2, SL2), | |
512 ( SL2 = [] -> | |
513 Output = [] | |
514 ; brachylog_zip('default', SL2, [_,Output]) | |
515 ). | |
516 brachylog_meta_orderby(GlobalVariables, 'integer':2, P, Sub, Input, Output) :- | |
517 ( is_brachylog_list(Input) -> FixedInput = Input | |
518 ; brachylog_elements('default', Input, FixedInput) | |
519 ), | |
520 brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L), | |
521 brachylog_order(integer:0, L, Output). | |
522 brachylog_meta_orderby(GlobalVariables, 'integer':3, P, Sub, Input, Output) :- | |
523 ( is_brachylog_list(Input) -> FixedInput = Input | |
524 ; brachylog_elements('default', Input, FixedInput) | |
525 ), | |
526 brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L), | |
527 brachylog_order(integer:1, L, Output). | |
528 | |
529 | |
530 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
531 BRACHYLOG_META_SELECT | |
532 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
533 brachylog_meta_select(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
534 ( Input = [Arg] -> true | |
535 ; Input = Arg | |
536 ), | |
537 brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
538 brachylog_meta_select(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
539 reverse(Input, ['integer':I|T]), | |
540 ( T = [Arg] -> true | |
541 ; reverse(T, Arg) | |
542 ), | |
543 brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
544 brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'string':S, Output) :- | |
545 brachylog_elements('default', 'string':S, E), | |
546 brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O), | |
547 ( brachylog_concatenate('default', O, X), | |
548 X = 'string':_ -> | |
549 Output = X | |
550 ; Output = O | |
551 ). | |
552 brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'integer':S, Output) :- | |
553 brachylog_elements('default', 'integer':S, E), | |
554 brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O), | |
555 ( brachylog_concatenate('default', O, X), | |
556 X = 'integer':_ -> | |
557 Output = X | |
558 ; Output = O | |
559 ). | |
560 brachylog_meta_select(_, 'default', _, _, [], []). | |
561 brachylog_meta_select(GlobalVariables, 'default', P, Sub, [H|T], Output) :- | |
562 ( ( GlobalVariables = 'ignore', | |
563 call(P, Sub, H, H2) | |
564 ; dif(GlobalVariables, 'ignore'), | |
565 call(P, GlobalVariables, Sub, H, H2) | |
566 ) | |
567 *-> Output = [H2|T2] | |
568 ; Output = T2 | |
569 ), | |
570 brachylog_meta_select(GlobalVariables, 'default', P, Sub, T, T2). | |
571 | |
572 | |
573 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
574 BRACHYLOG_META_TAIL | |
575 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
576 brachylog_meta_tail(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
577 ( Input = [Arg] -> true | |
578 ; Input = Arg | |
579 ), | |
580 brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
581 brachylog_meta_tail(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
582 reverse(Input, ['integer':I|T]), | |
583 ( T = [Arg] -> true | |
584 ; reverse(T, Arg) | |
585 ), | |
586 brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
587 brachylog_meta_tail(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
588 brachylog_meta_tail(GlobalVariables, 'integer':1, P, Sub, Input, Output). | |
589 brachylog_meta_tail(_, 'integer':0, _, _, Input, Input). | |
590 brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
591 I #> 0, | |
592 brachylog_tail('integer':I, Input, Tails), | |
593 brachylog_knife('integer':I, Input, Heads), | |
594 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Tails, NewTails), | |
595 brachylog_concatenate('default', [Heads,NewTails], Output). | |
596 | |
597 | |
598 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
599 BRACHYLOG_META_UNIQUE | |
600 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
601 brachylog_meta_unique(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
602 ( Input = [Arg] -> true | |
603 ; Input = Arg | |
604 ), | |
605 brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
606 brachylog_meta_unique(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
607 reverse(Input, ['integer':I|T]), | |
608 ( T = [Arg] -> true | |
609 ; reverse(T, Arg) | |
610 ), | |
611 brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
612 brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
613 brachylog_meta_unique_(GlobalVariables, 1, -1, P, Sub, Input, [], Output). | |
614 brachylog_meta_unique(_, 'integer':0, _, _, _, []). | |
615 brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Input, Output) :- | |
616 brachylog_meta_unique_(GlobalVariables, 1, I, P, Sub, Input, [], Output). | |
617 | |
618 brachylog_meta_unique_(_, _, 0, _, _, _, ROutput, Output) :- | |
619 reverse(ROutput, Output). | |
620 brachylog_meta_unique_(GlobalVariables, Nth, J, P, Sub, Input, A, Output) :- | |
621 J #\= 0, | |
622 ( call_nth( ( GlobalVariables = 'ignore', | |
623 call(P, Sub, Input, X) | |
624 ; dif(GlobalVariables, 'ignore'), | |
625 call(P, GlobalVariables, Sub, Input, X) | |
626 ), Nth) -> | |
627 ( \+ member(X, A) -> | |
628 M #= Nth + 1, | |
629 K #= J - 1, | |
630 brachylog_meta_unique_(GlobalVariables, M, K, P, Sub, Input, [X|A], Output) | |
631 ; M #= Nth + 1, | |
632 brachylog_meta_unique_(GlobalVariables, M, J, P, Sub, Input, A, Output) | |
633 ) | |
634 ; reverse(A, Output) | |
635 ). | |
636 | |
637 | |
638 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
639 BRACHYLOG_META_VERIFY | |
640 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
641 brachylog_meta_verify(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :- | |
642 ( Input = [Arg] -> true | |
643 ; Input = Arg | |
644 ), | |
645 brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I). | |
646 brachylog_meta_verify(GlobalVariables, 'last', P, Sub, Input, Arg) :- | |
647 reverse(Input, [I|T]), | |
648 ( T = [Arg] -> true | |
649 ; reverse(T, Arg) | |
650 ), | |
651 brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I). | |
652 brachylog_meta_verify(GlobalVariables, 'integer':I, P, Sub, Input, Input) :- | |
653 dif(I, 'default'), | |
654 brachylog_meta_verify(GlobalVariables, P, Sub, Input, 'integer':I). | |
655 brachylog_meta_verify(GlobalVariables, 'default', P, Sub, Input, Output) :- | |
656 brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output). | |
657 | |
658 brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output) :- | |
659 brachylog_length('default', Input, L), | |
660 brachylog_length('default', T, L), | |
661 brachylog_equal('default', T, _), | |
662 brachylog_head('default', T, Output), | |
663 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T). | |
664 | |
665 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
666 BRACHYLOG_META_ZIP | |
667 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | |
668 brachylog_meta_zip(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :- | |
669 ( Input = [Arg] -> true | |
670 ; Input = Arg | |
671 ), | |
672 brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
673 brachylog_meta_zip(GlobalVariables, 'last', P, Sub, Input, Output) :- | |
674 reverse(Input, ['integer':I|T]), | |
675 ( T = [Arg] -> true | |
676 ; reverse(T, Arg) | |
677 ), | |
678 brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output). | |
679 brachylog_meta_zip(GlobalVariables, 'default', P, Sub, Arg, Output) :- | |
680 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O), | |
681 brachylog_zip('default', [Arg,O], Output). | |
682 brachylog_meta_zip(GlobalVariables, 'integer':0, P, Sub, Arg, Output) :- | |
683 brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O), | |
684 brachylog_zip('default', [Arg,O], Output). | |
685 brachylog_meta_zip(GlobalVariables, 'integer':1, P, Sub, Arg, Output) :- | |
686 brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O), | |
687 brachylog_zip('default', [O,Arg], Output). | |
688 brachylog_meta_zip(GlobalVariables, 'integer':2, P, Sub, Arg, Output) :- | |
689 brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O), | |
690 brachylog_zip('default', [O,Arg], Output). |