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