Skip to content

Commit ccf581d

Browse files
committed
expand module names in transitive goals (#2255)
1 parent 1dc546a commit ccf581d

File tree

1 file changed

+58
-38
lines changed

1 file changed

+58
-38
lines changed

src/loader.pl

Lines changed: 58 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@
299299
( atom(Module) ->
300300
prolog_load_context(module, Target),
301301
module_expanded_head_variables(Head2, HeadVars),
302-
catch(expand_goal(Body0, Target, Body1, HeadVars),
302+
catch(expand_goal(Body0, Target, Body1, HeadVars, []),
303303
error(type_error(callable, Pred), _),
304304
( loader:print_goal_expansion_warning(Pred),
305305
builtins:(Body1 = Body0)
@@ -309,7 +309,7 @@
309309
)
310310
; module_expanded_head_variables(Head1, HeadVars),
311311
prolog_load_context(module, Target),
312-
catch(expand_goal(Body0, Target, Body1, HeadVars),
312+
catch(expand_goal(Body0, Target, Body1, HeadVars, []),
313313
error(type_error(callable, Pred), _),
314314
( loader:print_goal_expansion_warning(Pred),
315315
builtins:(Body1 = Body0)
@@ -729,9 +729,9 @@
729729
).
730730

731731

732-
:- non_counted_backtracking expand_subgoal/5.
732+
:- non_counted_backtracking expand_subgoal/6.
733733

734-
expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :-
734+
expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars, TGs) :-
735735
strip_subst_module(UnexpandedGoals, M, Module, UnexpandedGoals0),
736736
nonvar(UnexpandedGoals0),
737737
complete_partial_goal(MS, UnexpandedGoals0, _, SuppArgs, UnexpandedGoals1),
@@ -743,7 +743,7 @@
743743
),
744744
strip_subst_module(UnexpandedGoals3, Module, Module1, UnexpandedGoals4),
745745
( inner_meta_specs(0, UnexpandedGoals4, _, MetaSpecs) ->
746-
expand_module_names(UnexpandedGoals4, MetaSpecs, Module1, ExpandedGoals0, HeadVars)
746+
expand_module_names(UnexpandedGoals4, MetaSpecs, Module1, ExpandedGoals0, HeadVars, TGs)
747747
; ExpandedGoals0 = UnexpandedGoals4
748748
),
749749
'$compile_inline_or_expanded_goal'(ExpandedGoals0, SuppArgs, ExpandedGoals1, Module1, UnexpandedGoals0),
@@ -772,10 +772,10 @@
772772

773773
:- non_counted_backtracking eq_member/2.
774774

775-
eq_member(V, [L-_|Ls]) :-
775+
eq_member(V-M, [L-M|Ls]) :-
776776
V == L.
777-
eq_member(V, [_|Ls]) :-
778-
eq_member(V, Ls).
777+
eq_member(V-M, [_|Ls]) :-
778+
eq_member(V-M, Ls).
779779

780780
:- non_counted_backtracking qualified_spec/1.
781781

@@ -785,11 +785,19 @@
785785

786786
:- non_counted_backtracking expand_meta_predicate_subgoals/5.
787787

788-
expand_meta_predicate_subgoals([SG | SGs], [MS | MSs], M, [ESG | ESGs], HeadVars) :-
788+
expand_meta_predicate_subgoals([SG | SGs], [MS | MSs], M, [ESG | ESGs], HeadVars, TGs) :-
789789
( var(SG) ->
790790
( qualified_spec(MS) ->
791-
( eq_member(SG, HeadVars) ->
791+
( eq_member(SG-_, HeadVars) ->
792792
ESG = SG
793+
; eq_member(SG-TG, TGs),
794+
% transitive goals come about from previous equalities:
795+
% if SG was bound by (=)/2 to a potential goal TG earlier
796+
% in the goal sequence, expand TG and substitute SG with it
797+
% in this subgoal context. the binding to SG must not be
798+
% changed.
799+
expand_subgoal(TG, MS, M, ESG, HeadVars, TGs) ->
800+
true
793801
; expand_module_name(SG, MS, M, ESG)
794802
)
795803
; ESG = SG
@@ -798,53 +806,53 @@
798806
expand_module_name(SG, MS, M, ESG)
799807
; '$is_expanded_or_inlined'(SG) ->
800808
ESG = SG
801-
; expand_subgoal(SG, MS, M, ESG, HeadVars) ->
809+
; expand_subgoal(SG, MS, M, ESG, HeadVars, TGs) ->
802810
true
803811
; integer(MS),
804812
MS >= 0 ->
805813
expand_module_name(SG, MS, M, ESG)
806814
; SG = ESG
807815
),
808-
expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars).
816+
expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars, TGs).
809817

810-
expand_meta_predicate_subgoals([], _, _, [], _).
818+
expand_meta_predicate_subgoals([], _, _, [], _, _).
811819

812-
:- non_counted_backtracking expand_module_names/5.
820+
:- non_counted_backtracking expand_module_names/6.
813821

814-
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :-
822+
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars, TGs) :-
815823
Goals =.. [GoalFunctor | SubGoals],
816824
( GoalFunctor == (:),
817825
SubGoals = [M, SubGoal] ->
818-
expand_module_names(SubGoal, MetaSpecs, M, ExpandedSubGoal, HeadVars),
826+
expand_module_names(SubGoal, MetaSpecs, M, ExpandedSubGoal, HeadVars, TGs),
819827
expand_module_name(ExpandedSubGoal, 0, M, ExpandedGoals)
820-
; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars),
828+
; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars, TGs),
821829
ExpandedGoals =.. [GoalFunctor | ExpandedGoalList]
822830
).
823831

824832

825833
:- non_counted_backtracking expand_goal/3.
826834

827835
expand_goal(UnexpandedGoals, Module, ExpandedGoals) :-
828-
catch(loader:expand_goal(UnexpandedGoals, Module, ExpandedGoals, []),
836+
catch(loader:expand_goal(UnexpandedGoals, Module, ExpandedGoals, [], []),
829837
error(type_error(callable, _), _),
830838
UnexpandedGoals = ExpandedGoals),
831839
!.
832840

833-
:- non_counted_backtracking expand_goal/4.
841+
:- non_counted_backtracking expand_goal/5.
834842

835-
expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :-
843+
expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars, TGs) :-
836844
( var(UnexpandedGoals) ->
837-
expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars)
845+
expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars, TGs)
838846
; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
839847
( Module \== user ->
840848
goal_expansion(UnexpandedGoals1, user, Goals)
841849
; Goals = UnexpandedGoals1
842850
),
843-
( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) ->
851+
( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars, TGs) ->
844852
true
845853
; predicate_property(Module:Goals, meta_predicate(MetaSpecs0)),
846854
MetaSpecs0 =.. [_ | MetaSpecs] ->
847-
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
855+
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars, TGs)
848856
; thread_goals(Goals, ExpandedGoals, (','))
849857
; Goals = ExpandedGoals
850858
)
@@ -877,28 +885,40 @@
877885
)
878886
).
879887

880-
:- non_counted_backtracking expand_goal_cases/4.
888+
:- non_counted_backtracking transitive_goal/3.
889+
890+
transitive_goal(G, TGs0, TGs1) :-
891+
( G = (G1 = PotentialGoal),
892+
callable(PotentialGoal),
893+
subsumes_term(G1, PotentialGoal) ->
894+
TGs1 = [G1-PotentialGoal|TGs0]
895+
; TGs1 = TGs0
896+
).
897+
898+
:- non_counted_backtracking expand_goal_cases/5.
881899

882-
expand_goal_cases((Goal0, Goals0), Module, ExpandedGoals, HeadVars) :-
883-
( expand_goal(Goal0, Module, Goal1, HeadVars) ->
884-
expand_goal(Goals0, Module, Goals1, HeadVars),
900+
expand_goal_cases((Goal0, Goals0), Module, ExpandedGoals, HeadVars, TGs) :-
901+
( expand_goal(Goal0, Module, Goal1, HeadVars, TGs) ->
902+
transitive_goal(Goal0, TGs, TGs1),
903+
expand_goal(Goals0, Module, Goals1, HeadVars, TGs1),
885904
thread_goals(Goal1, ExpandedGoals, Goals1, (','))
886-
; expand_goal(Goals0, Module, Goals1, HeadVars),
905+
; expand_goal(Goals0, Module, Goals1, HeadVars, TGs),
887906
ExpandedGoals = (Goal0, Goals1)
888907
).
889-
expand_goal_cases((Goals0 -> Goals1), Module, ExpandedGoals, HeadVars) :-
890-
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars),
891-
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars),
908+
expand_goal_cases((Goals0 -> Goals1), Module, ExpandedGoals, HeadVars, TGs) :-
909+
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars, TGs),
910+
transitive_goal(ExpandedGoals0, TGs, TGs1),
911+
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars, TGs1),
892912
ExpandedGoals = (ExpandedGoals0 -> ExpandedGoals1).
893-
expand_goal_cases((Goals0 ; Goals1), Module, ExpandedGoals, HeadVars) :-
894-
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars),
895-
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars),
913+
expand_goal_cases((Goals0 ; Goals1), Module, ExpandedGoals, HeadVars, TGs) :-
914+
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars, TGs),
915+
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars, TGs),
896916
ExpandedGoals = (ExpandedGoals0 ; ExpandedGoals1).
897-
expand_goal_cases((\+ Goals0), Module, ExpandedGoals, HeadVars) :-
898-
expand_goal(Goals0, Module, Goals1, HeadVars),
917+
expand_goal_cases((\+ Goals0), Module, ExpandedGoals, HeadVars, TGs) :-
918+
expand_goal(Goals0, Module, Goals1, HeadVars, TGs),
899919
ExpandedGoals = (\+ Goals1).
900-
expand_goal_cases((Module:Goals0), _, ExpandedGoals, HeadVars) :-
901-
expand_goal(Goals0, Module, Goals1, HeadVars),
920+
expand_goal_cases((Module:Goals0), _, ExpandedGoals, HeadVars, TGs) :-
921+
expand_goal(Goals0, Module, Goals1, HeadVars, TGs),
902922
ExpandedGoals = (Module:Goals1).
903923

904924
:- non_counted_backtracking thread_goals/3.

0 commit comments

Comments
 (0)