34
35:- module(qualify_meta_goal, [meta_call_goal/4,
36 qualify_meta_goal/2,
37 qualify_meta_goal/3,
38 qualify_meta_goal/4,
39 qualify_meta_call/5]). 40
41:- use_module(library(mapargs)). 42:- use_module(library(check), []). 43
44qualify_meta_goal(Goal1, M, CM, Goal) :-
45 qualify_meta_call(Goal1, M, CM, true, Goal).
46
47:- meta_predicate meta_call_goal(+, +, 0, -). 48meta_call_goal(Goal, M, MCaller, Meta) :-
49 predicate_property(M:Goal, meta_predicate(GMeta)),
50 ( predicate_property(MCaller, meta_predicate(CMeta))
51 ->true
52 ; CMeta = true
53 ),
54 functor(Goal, F, A),
55 functor(Meta, F, A),
56 strip_module(MCaller, _, Caller),
57 mapargs(meta_call_goal_arg(Caller, CMeta), Goal, GMeta, Meta).
58
59meta_call_goal_arg(Caller, CMeta, Arg, Spec1, Spec) :-
60 ( module_qualified(Spec1),
61 ( nonvar(Arg),
62 Arg = _:_
63 ; compound(CMeta),
64 arg(N, CMeta, CSpec),
65 module_qualified(CSpec),
66 arg(N, Caller, CArg),
67 CArg == Arg
68 )
69 ->Spec = +
70 ; Spec = Spec1
71 ).
72
73:- meta_predicate qualify_meta_call(+, +, ?, 0, -). 74qualify_meta_call(Goal1, M, CM, Caller, Goal) :-
75 meta_call_goal(Goal1, M, Caller, Meta), !,
76 qualify_meta_goal(CM:Goal1, Meta, Goal).
77qualify_meta_call(Goal, _, _, _, Goal).
78
79:- meta_predicate qualify_meta_goal(0, -). 80qualify_meta_goal(M:Goal1, M:Goal) :-
81 predicate_property(M:Goal1, meta_predicate(Meta)),
82 !,
83 qualify_meta_goal(M:Goal1, Meta, Goal).
84qualify_meta_goal(MGoal, MGoal).
85
86qualify_meta_goal(M:Goal1, Meta, Goal) :-
87 functor(Goal1, F, N),
88 functor(Goal, F, N),
89 mapargs(meta_goal(M), Meta, Goal1, Goal).
90
91module_qualified(:) :- !.
92module_qualified(N) :- integer(N), N >= 0.
93
94meta_goal(M, ArgM, Arg1, Arg) :-
95 ( module_qualified(ArgM)
96 ->check:add_module(Arg1, M, Arg)
97 ; Arg = Arg1
98 )