This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
:- use_module(library(dif)).
|
:- use_module(library(dif)).
|
||||||
|
|
||||||
:- meta_predicate if_(0, 0, 0).
|
:- meta_predicate if_(1, 0, 0).
|
||||||
|
|
||||||
if_(If_1, Then_0, Else_0) :-
|
if_(If_1, Then_0, Else_0) :-
|
||||||
call(If_1, T),
|
call(If_1, T),
|
||||||
|
|||||||
@@ -586,10 +586,16 @@ strip_module(Goal, M, G) :-
|
|||||||
expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :-
|
expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :-
|
||||||
( var(UnexpandedGoals) ->
|
( var(UnexpandedGoals) ->
|
||||||
UnexpandedGoals = ExpandedGoals
|
UnexpandedGoals = ExpandedGoals
|
||||||
; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
|
; ( MS == 0 ->
|
||||||
( Module \== user ->
|
% only expand complete goals. call/N will take care of incomplete goals
|
||||||
goal_expansion(UnexpandedGoals1, user, Goals)
|
% by calling goal expansion after it is supplied the remaining arguments.
|
||||||
; Goals = UnexpandedGoals1
|
( goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
|
||||||
|
( Module \== user ->
|
||||||
|
goal_expansion(UnexpandedGoals1, user, Goals)
|
||||||
|
; Goals = UnexpandedGoals1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
; Goals = UnexpandedGoals
|
||||||
),
|
),
|
||||||
( inner_meta_specs(MS, Goals, _, MetaSpecs) ->
|
( inner_meta_specs(MS, Goals, _, MetaSpecs) ->
|
||||||
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
|
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
|
||||||
@@ -740,14 +746,6 @@ thread_goals(Goals0, Goals1, Hole, Functor) :-
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
|
||||||
call_clause(M:G1, G0) :-
|
|
||||||
functor(G1, F, _),
|
|
||||||
atom(F),
|
|
||||||
atom(M),
|
|
||||||
F \== [],
|
|
||||||
!,
|
|
||||||
expand_goal(M:G1, M, G0).
|
|
||||||
|
|
||||||
% The '$call' functor is an escape hatch from goal expansion. So far,
|
% The '$call' functor is an escape hatch from goal expansion. So far,
|
||||||
% it is used only to avoid infinite recursion into expand_goal/3.
|
% it is used only to avoid infinite recursion into expand_goal/3.
|
||||||
|
|
||||||
@@ -770,11 +768,15 @@ call_clause('$call'(G), G0) :-
|
|||||||
).
|
).
|
||||||
|
|
||||||
call_clause(G, G0) :-
|
call_clause(G, G0) :-
|
||||||
functor(G, F, _),
|
strip_module(G, M, G1),
|
||||||
|
functor(G1, F, _),
|
||||||
atom(F),
|
atom(F),
|
||||||
F \== [],
|
F \== [],
|
||||||
load_context(M),
|
( var(M) ->
|
||||||
expand_goal(M:G, M, G0).
|
load_context(M)
|
||||||
|
; true
|
||||||
|
),
|
||||||
|
expand_goal(M:G1, M, G0).
|
||||||
|
|
||||||
|
|
||||||
call(G) :-
|
call(G) :-
|
||||||
@@ -786,16 +788,6 @@ call(G) :-
|
|||||||
).
|
).
|
||||||
|
|
||||||
|
|
||||||
call_clause(M:G1, Args, _, G0) :-
|
|
||||||
atom(M),
|
|
||||||
G1 =.. [F | As],
|
|
||||||
atom(F),
|
|
||||||
F \== [],
|
|
||||||
!,
|
|
||||||
append(As, Args, As1),
|
|
||||||
G2 =.. [F | As1],
|
|
||||||
expand_goal(M:G2, M, G0).
|
|
||||||
|
|
||||||
call_clause('$call'(G1), Args, N, G0) :-
|
call_clause('$call'(G1), Args, N, G0) :-
|
||||||
( var(G1),
|
( var(G1),
|
||||||
instantiation_error(call/N)
|
instantiation_error(call/N)
|
||||||
@@ -819,10 +811,14 @@ call_clause('$call'(G1), Args, N, G0) :-
|
|||||||
).
|
).
|
||||||
|
|
||||||
call_clause(G, Args, _, G0) :-
|
call_clause(G, Args, _, G0) :-
|
||||||
G =.. [F | As],
|
strip_module(G, M, G1),
|
||||||
|
G1 =.. [F | As],
|
||||||
atom(F),
|
atom(F),
|
||||||
F \== [],
|
F \== [],
|
||||||
load_context(M),
|
( var(M) ->
|
||||||
|
load_context(M)
|
||||||
|
; true
|
||||||
|
),
|
||||||
append(As, Args, As1),
|
append(As, Args, As1),
|
||||||
G2 =.. [F | As1],
|
G2 =.. [F | As1],
|
||||||
expand_goal(M:G2, M, G0).
|
expand_goal(M:G2, M, G0).
|
||||||
|
|||||||
@@ -171,7 +171,11 @@ submit_query_and_print_results_(_, _) :-
|
|||||||
|
|
||||||
|
|
||||||
submit_query_and_print_results(Term0, VarList) :-
|
submit_query_and_print_results(Term0, VarList) :-
|
||||||
expand_goal(call(Term0), user, call(Term)),
|
( functor(Term0, call, _) ->
|
||||||
|
Term = Term0 % prevent pre-mature expansion of incomplete goal
|
||||||
|
% in the first argument, which is done by call/N
|
||||||
|
; expand_goal(call(Term0), user, call(Term))
|
||||||
|
),
|
||||||
setup_call_cleanup(bb_put('$first_answer', true),
|
setup_call_cleanup(bb_put('$first_answer', true),
|
||||||
submit_query_and_print_results_(Term, VarList),
|
submit_query_and_print_results_(Term, VarList),
|
||||||
bb_put('$first_answer', false)).
|
bb_put('$first_answer', false)).
|
||||||
|
|||||||
Reference in New Issue
Block a user