comparison ibin/brachylog/Brachylog-master/src/metapredicates.pl @ 11865:318de151d0ec draft

<b_jonas> python3 -cimport os,zipfile; os.chdir("ibin/brachylog"); zipfile.ZipFile("master.zip").extractall()
author HackEso <hackeso@esolangs.org>
date Tue, 16 Jul 2019 21:37:27 +0000
parents
children
comparison
equal deleted inserted replaced
11864:d054de7f80f2 11865:318de151d0ec
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).