1:- module(meta,
2 [foldr/4, iterate/3,
3 for/3, foldnum/4,
4 fold/3, fold/4, fold/5,
5 do/3,
6 fold_args/4, fold_args/5,
7 mapterm_rec/3,
8 maplist_opp/3,
9 repeat/2, monad/3, time/3,
10 until/4, while/4,
11 iff/2, cputime/1, cputime/0,
12 pred_eval/2, pred_eval/3
13 ]
14 ). 15
16:- use_module(pac(basic)). 17:- use_module(pac(op)).
24:- meta_predicate do(:, ?, ?). 25
27
28do(M:X, A, B):- once(do(X, A, B, M)).
30do(M:X, A, B, _) :-!, do(X, A, B, M).
31do((X,Y), A, B, M) :-!, do(X, A, C, M), do(Y, C, B, M).
32do((X;Y), A, B, M) :-!, ( do(X, A, B, M); do(Y, A, B, M)).
33do((X->Y), A, B, M) :-!, ( do(X, A, C, M) -> do(Y, C, B, M)).
34do({G}, A, A, M) :-!, call(M:G).
35do(X, A, B, M) :- call(M:X, A, B).
36
43user:local(X):- copy_term(X, Y), call(Y).
44user:local(X,A):- copy_term(X, Y), call(Y,A).
45user:local(X,A,B):- copy_term(X, Y), call(Y,A,B).
46user:local(X,A,B,C):- copy_term(X, Y), call(Y,A,B,C).
47user:local(X,A,B,C,D):- copy_term(X, Y), call(Y,A,B,C,D).
48user:local(X,A,B,C,D,E):- copy_term(X, Y), call(Y,A,B,C,D,E).
49
52iff(C0, C1) :- \+( (C0,\+C1) ; (C1, \+C0)).
53
59
60:- meta_predicate user:flip_arg(2, ?, ?). 61user:flip_arg(F, X, Y):- call(F, Y, X).
62
64user:flip_call(G) :- flip_call([2,1], G). 66user:flip_call(Is, G):- flip_call(Is, G, G0), call(G0).
67
69flip_call(Is, M:X, M:Y):-!, flip_call(Is, X, Y).
70flip_call(Is, X, Y):- length(Is, N),
71 functor(X, F, N),
72 functor(Y, F, N),
73 flip_call(Is, 1, X, Y).
74
76flip_call([], _, _, _).
77flip_call([I|Is], J, X, Y):-
78 arg(J, X, A),
79 arg(I, Y, A),
80 !,
81 J0 is J + 1,
82 flip_call(Is, J0, X, Y).
83
84:- meta_predicate foldr(3, ?, ?, ?). 85foldr(_, [], X, X):-!.
86foldr(F, [A|L], X, Y):- call(F, A, Y, Y0), foldr(F, L, X, Y0).
87
95fold_paths_of_term(G, T, X, Y):- fold_paths_of_term([[T]], [], X, Y, G).
97fold_paths_of_term([], _, X, X, _):-!.
98fold_paths_of_term([Ts|L], P, X, Y, G):-
99 ( Ts==[]
100 -> fold_paths_of_term(L, P, X, Y, G)
101 ; Ts=[T|Rs],
102 fold_paths_of_term(T, [Rs|L], P, X, Y, G)
103 ).
105fold_paths_of_term(T, Ls, P, X, Y, G):- atomic(T), !,
106 call(G, [T|P], X, Xtp),
107 fold_paths_of_term(Ls, P, Xtp, Y, G).
108fold_paths_of_term(T, Ls, P, X, Y, G):- T=..[F,A|As],
109 fold_paths_of_term(A, [As|Ls], [F|P], X, Y, G).
110
111:- meta_predicate fold_args(?, 3, ?, ?). 112:- meta_predicate fold_args(?, 3, ?, ?, ?). 117
118fold_args(F, V, A, B):-
119 fold_args(1, F, V, A, B).
121fold_args(I, F, V, A, B):- arg(I, V, Vi), !,
122 call(F, Vi, A, Ai),
123 I1 is I+1,
124 fold_args(I1, F, V, Ai, B).
125fold_args(_I, _F, _V, A, A).
126
127
133
134
146
147
149callargs(F, A):- callargs(1, F, A).
151
152callargs(I, F, A):- arg(I, A, Ai), !,
153 call(F, Ai),
154 J is I+1,
155 callargs(J, F, A).
156callargs(_, _, _).
157
158
162
175
177
178
180scanargs(F, A, B):- ( var(A)
181 -> functor(B, C, N),
182 functor(A, C, N)
183 ; functor(A, C, N),
184 functor(B, C, N)
185 ),
186 scanargs(1, N, F, A, B).
188scanargs(I, N, _, _, _):- I > N, !.
189scanargs(I, N, F, A, B):- arg(I, A, Ai),
190 arg(I, B, Bi),
191 call(F, I, Ai, Bi),
192 J is I +1,
193 scanargs(J, N, F, A, B).
194
196scanargs(F, A):- functor(A, _, N),
197 scanargs_(1, N, F, A).
199scanargs_(I, N, _, _):- I > N, !.
200scanargs_(I, N, F, A):- arg(I, A, Ai),
201 call(F, I, Ai),
202 J is I + 1,
203 scanargs_(J, N, F, A).
204
205
207setargs(F, A, B):- functor(A, C, N),
208 ( var(B)
209 -> functor(B, C, N)
210 ; true
211 ),
212 setargs(1, N, F, A, B).
214setargs(I, N, _, _, _):- I > N, !.
215setargs(I, N, F, A, B):- arg(I, A, Ai),
216 call(F, I, Ai, Bi),
217 setarg(I, B, Bi),
218 J is I + 1,
219 setargs(J, N, F, A, B).
220
222setargs(F, A):- functor(A, _, N),
223 setargs_(1, N, F, A).
225setargs_(I, N, _, _):- I > N, !.
226setargs_(I, N, F, A):- arg(I, A, Ai),
227 call(F, I, Ai, Bi),
228 setarg(I, A, Bi),
229 J is I + 1,
230 setargs_(J, N, F, A).
231
236maprows(_, A, A):- atom(A), !.
237maprows(F, A, B):- arg(1, A, A1),
238 functor(A1, Fa, Na),
239 functor(B, Fa, Na),
240 maprows(Na, F, A, B).
242maprows(0, _, _, _):-!.
243maprows(I, F, A, B):- arg(I, B, Bi),
244 call(F, I, A, Bi),
245 J is I - 1,
246 maprows(J, F, A, B).
247
249until(F, S, X, Y):- call(S, X, X0),
250 ( call(F, X0) -> Y = X0
251 ; until(F, S, X0, Y)
252 ).
254iterate(_, stop(X), X):-!.
255iterate(S, X, Y):- call(S, X, X0),
256 iterate(S, X0, Y).
257
258while(F, S, X, Y):-
259 ( call(F, X) ->
260 call(S, X, X0),
261 while(F, S, X0, Y)
262 ; Y = X
263 ).
264
269
275
276:- meta_predicate for(?, 1). 277for(I..J, F):-!, for(I, J, F).
278for(I-J, F):-for(I, J, F).
279
281for(I, J, _):- I>J, !.
282for(I, J, F):- call(F, I), !,
283 I0 is I + 1,
284 for(I0, J, F).
285
290
291:- meta_predicate foldnum(3, ?, ?, ?). 292foldnum(F, I-J, U, V):-!, foldnum(I, J, U, V, F).
293foldnum(F, I..J, U, V):- foldnum(I, J, U, V, F).
295foldnum(I, J, U, U, _):- I>J, !.
296foldnum(I, J, U, V, F):- call(F, I, U, U0),
297 K is I + 1,
298 foldnum(K, J, U0, V, F).
299
301maplist_opp([F|Fs], X, [FX|Y]):- call(F, X, FX), !,
302 maplist_opp(Fs, X, Y).
303maplist_opp([], _, []).
304
306:- meta_predicate map(2, ?, ?). 307map(P) --> maplist(phrase(P)).
309:- meta_predicate phrase_list(2, ?, ?). 310phrase_list(P) --> maplist(phrase(P)).
311
315:- meta_predicate repeat(?, 0). 316repeat(1, G):-!, call(G).
317repeat(N, G):- simple_int_exp(N), !,
318 N0 is N,
319 (between(1, N0, _), call(G), fail; true).
320repeat(P, G):- (call(P), call(G), fail) ; true.
322repeat_cond(N, between(1, N0, _)):- simple_int_exp(N), !, N0 is N.
323repeat_cond(X, X).
325simple_int_exp(N):- integer(N).
326simple_int_exp(E):- ground(E),
327 functor(E, F, _),
328 memberchk(F, [+,-,^,mod, //]).
329
336
337
338:- meta_predicate time(0, ?). 339time(G, T):- time(G, T0, T1), T is T1-T0.
341time(G, T, T0):- statistics(cputime, T),
342 call(G),
343 statistics(cputime, T0).
344
352:- meta_predicate cputime(?, 0, ?). 354cputime(N, G, T):- writeln("Running pac runtime library cputime/3... "),
355 cputime(N, G, 0.00, T).
357cputime(0, _G, T, T).
358cputime(N, G, T, T0):- succ(N0, N),
359 cputime_for_step(G, S),
360 T1 is T + S,
361 cputime(N0, G, T1, T0).
363cputime_for_step(G, T):-
364 statistics(cputime, T0),
365 call(G),
366 statistics(cputime, T1),
367 T is T1-T0.
369cputime:- statistics(cputime, T), b_setval(cputime, T).
370cputime(T):- statistics(cputime, Stop), b_getval(cputime, Start), T is Stop - Start.
371
375
377:- meta_predicate monad(:, ?, ?). 378monad(G, X, Y):- once(ml:bind_context(G, (X, []), (Y, _))).
379
384
385pred_eval(X, Y):- pred_eval(call, X, Y).
386
387:- meta_predicate pred_eval(2, ?, ?). 388pred_eval(_, X, X):- ( var(X); number(X); string(X); is_list(X)), !.
389pred_eval(P, X, V):- atom(X), !, call(P, X, V).
390pred_eval(P, X, V):- functor(X, F, N),
391 functor(Y, F, N),
392 pred_eval_args(1, P, X, Y),
393 call(P, Y, V).
395pred_eval_args(I, P, X, Y):- arg(I, X, A), !,
396 arg(I, Y, B),
397 pred_eval(P, A, B),
398 J is I + 1,
399 pred_eval_args(J, P, X, Y).
400pred_eval_args(_, _, _, _).
401
402
404:- meta_predicate mapterm_rec(2, ?, ?). 405
407
408mapterm_rec(_, A, B):- var(A), !, B = A.
409mapterm_rec(F, A, B):- atomic(A), !, call(F, A, B).
410mapterm_rec(F, A, B):- functor(A, Fa, Na),
411 functor(B, Fa, Na),
412 mapterm_rec(F, 1, A, B).
414mapterm_rec(F, I, A, B):- arg(I, A, Ai), !,
415 arg(I, B, Bi),
416 mapterm_rec(F, Ai, Bi),
417 J is I + 1,
418 mapterm_rec(F, J, A, B).
419mapterm_rec(_, _, _, _):-!.
420
422:- meta_predicate maplist_rec(2, ?, ?). 423maplist_rec(_, [], []):-!.
424maplist_rec(F, [X|Xs], [Y|Ys]):-
425 ( X = [_|_]
426 -> maplist_rec(F, X, Y)
427 ; call(F, X, Y)
428 ),
429 maplist_rec(F, Xs, Ys).
430
433
434:- meta_predicate fold(?, :, :, ?, ?). 435fold(V, G, A, X, Y):- Acc = '$ACC'(X),
436 ( call(G),
437 arg(1, Acc, U),
438 call(A, V, U, W),
439 nb_setarg(1, Acc, W),
440 fail
441 ; arg(1, Acc, Y)
442 ).
443
446test_add_to_acc(X, Acc):- arg(1, Acc, V),
447 V0 is X + V,
448 nb_setarg(1, Acc, V0).
449
450:- meta_predicate fold(?, :, :, ?). 451fold(V, G, Fun, X):-
452 ( call(G),
453 call(Fun, V, X),
454 fail
455 ; true
456 ).
457
460:- meta_predicate fold(?, :, ?). 461fold(V, G, V^Act):-!,
462 ( call(G),
463 call(Act),
464 fail
465 ; true
466 ).
467fold(V, G, A):-
468 ( call(G),
469 call(A, V),
470 fail
471 ; true
472 ).
473
496
497det_foreach(Gen, Con):- term_variables(Gen, Vs),
498 sort(Vs, Vs0),
499 term_variables(Con, Ws),
500 sort(Ws, Ws0),
501 ord_subtr_var(Ws0, Vs0, Ws1),
502 once(foreach_by_copy(Gen, Con, Vs0, Ws1)).
504foreach(Gen, Con, Vs, Ws):- once(foreach_by_copy(Gen, Con, Vs, Ws)).
505
507foreach_by_copy(A, B, Vs, Ws):-
508 findall(Vs, A, Sol),
509 copy_of_goal(Sol, Vs, Ws, B, Cs),
510 maplist(call, Cs).
512copy_of_goal([], _, _, _, []).
513copy_of_goal([A|As], Vs, Ws, B, [G|Gs]):-
514 copy_term(Vs+Ws+B, A+Ws+G),
515 copy_of_goal(As, Vs, Ws, B, Gs).
517ord_subtr_var([], _, []):-!.
518ord_subtr_var(X, [], X):-!.
519ord_subtr_var([X|Xs], [Y|Ys], Zs):- X==Y, !,
520 ord_subtr_var(Xs, Ys, Zs).
521ord_subtr_var([X|Xs], [Y|Ys], [X|Zs]):- X@<Y, !,
522 ord_subtr_var(Xs, [Y|Ys], Zs).
523ord_subtr_var(Xs, [_|Ys], Zs):- ord_subtr_var(Xs, Ys, Zs).
524
525
526
527
528
529
530 533
546