|
299 | 299 | ( atom(Module) ->
|
300 | 300 | prolog_load_context(module, Target),
|
301 | 301 | module_expanded_head_variables(Head2, HeadVars),
|
302 |
| - catch(expand_goal(Body0, Target, Body1, HeadVars), |
| 302 | + catch(expand_goal(Body0, Target, Body1, HeadVars, []), |
303 | 303 | error(type_error(callable, Pred), _),
|
304 | 304 | ( loader:print_goal_expansion_warning(Pred),
|
305 | 305 | builtins:(Body1 = Body0)
|
|
309 | 309 | )
|
310 | 310 | ; module_expanded_head_variables(Head1, HeadVars),
|
311 | 311 | prolog_load_context(module, Target),
|
312 |
| - catch(expand_goal(Body0, Target, Body1, HeadVars), |
| 312 | + catch(expand_goal(Body0, Target, Body1, HeadVars, []), |
313 | 313 | error(type_error(callable, Pred), _),
|
314 | 314 | ( loader:print_goal_expansion_warning(Pred),
|
315 | 315 | builtins:(Body1 = Body0)
|
|
729 | 729 | ).
|
730 | 730 |
|
731 | 731 |
|
732 |
| -:- non_counted_backtracking expand_subgoal/5. |
| 732 | +:- non_counted_backtracking expand_subgoal/6. |
733 | 733 |
|
734 |
| -expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :- |
| 734 | +expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars, TGs) :- |
735 | 735 | strip_subst_module(UnexpandedGoals, M, Module, UnexpandedGoals0),
|
736 | 736 | nonvar(UnexpandedGoals0),
|
737 | 737 | complete_partial_goal(MS, UnexpandedGoals0, _, SuppArgs, UnexpandedGoals1),
|
|
743 | 743 | ),
|
744 | 744 | strip_subst_module(UnexpandedGoals3, Module, Module1, UnexpandedGoals4),
|
745 | 745 | ( 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) |
747 | 747 | ; ExpandedGoals0 = UnexpandedGoals4
|
748 | 748 | ),
|
749 | 749 | '$compile_inline_or_expanded_goal'(ExpandedGoals0, SuppArgs, ExpandedGoals1, Module1, UnexpandedGoals0),
|
|
772 | 772 |
|
773 | 773 | :- non_counted_backtracking eq_member/2.
|
774 | 774 |
|
775 |
| -eq_member(V, [L-_|Ls]) :- |
| 775 | +eq_member(V-M, [L-M|Ls]) :- |
776 | 776 | V == L.
|
777 |
| -eq_member(V, [_|Ls]) :- |
778 |
| - eq_member(V, Ls). |
| 777 | +eq_member(V-M, [_|Ls]) :- |
| 778 | + eq_member(V-M, Ls). |
779 | 779 |
|
780 | 780 | :- non_counted_backtracking qualified_spec/1.
|
781 | 781 |
|
|
785 | 785 |
|
786 | 786 | :- non_counted_backtracking expand_meta_predicate_subgoals/5.
|
787 | 787 |
|
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) :- |
789 | 789 | ( var(SG) ->
|
790 | 790 | ( qualified_spec(MS) ->
|
791 |
| - ( eq_member(SG, HeadVars) -> |
| 791 | + ( eq_member(SG-_, HeadVars) -> |
792 | 792 | 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 |
793 | 801 | ; expand_module_name(SG, MS, M, ESG)
|
794 | 802 | )
|
795 | 803 | ; ESG = SG
|
|
798 | 806 | expand_module_name(SG, MS, M, ESG)
|
799 | 807 | ; '$is_expanded_or_inlined'(SG) ->
|
800 | 808 | ESG = SG
|
801 |
| - ; expand_subgoal(SG, MS, M, ESG, HeadVars) -> |
| 809 | + ; expand_subgoal(SG, MS, M, ESG, HeadVars, TGs) -> |
802 | 810 | true
|
803 | 811 | ; integer(MS),
|
804 | 812 | MS >= 0 ->
|
805 | 813 | expand_module_name(SG, MS, M, ESG)
|
806 | 814 | ; SG = ESG
|
807 | 815 | ),
|
808 |
| - expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars). |
| 816 | + expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars, TGs). |
809 | 817 |
|
810 |
| -expand_meta_predicate_subgoals([], _, _, [], _). |
| 818 | +expand_meta_predicate_subgoals([], _, _, [], _, _). |
811 | 819 |
|
812 |
| -:- non_counted_backtracking expand_module_names/5. |
| 820 | +:- non_counted_backtracking expand_module_names/6. |
813 | 821 |
|
814 |
| -expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :- |
| 822 | +expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars, TGs) :- |
815 | 823 | Goals =.. [GoalFunctor | SubGoals],
|
816 | 824 | ( GoalFunctor == (:),
|
817 | 825 | SubGoals = [M, SubGoal] ->
|
818 |
| - expand_module_names(SubGoal, MetaSpecs, M, ExpandedSubGoal, HeadVars), |
| 826 | + expand_module_names(SubGoal, MetaSpecs, M, ExpandedSubGoal, HeadVars, TGs), |
819 | 827 | 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), |
821 | 829 | ExpandedGoals =.. [GoalFunctor | ExpandedGoalList]
|
822 | 830 | ).
|
823 | 831 |
|
824 | 832 |
|
825 | 833 | :- non_counted_backtracking expand_goal/3.
|
826 | 834 |
|
827 | 835 | expand_goal(UnexpandedGoals, Module, ExpandedGoals) :-
|
828 |
| - catch(loader:expand_goal(UnexpandedGoals, Module, ExpandedGoals, []), |
| 836 | + catch(loader:expand_goal(UnexpandedGoals, Module, ExpandedGoals, [], []), |
829 | 837 | error(type_error(callable, _), _),
|
830 | 838 | UnexpandedGoals = ExpandedGoals),
|
831 | 839 | !.
|
832 | 840 |
|
833 |
| -:- non_counted_backtracking expand_goal/4. |
| 841 | +:- non_counted_backtracking expand_goal/5. |
834 | 842 |
|
835 |
| -expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :- |
| 843 | +expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars, TGs) :- |
836 | 844 | ( var(UnexpandedGoals) ->
|
837 |
| - expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars) |
| 845 | + expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars, TGs) |
838 | 846 | ; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
|
839 | 847 | ( Module \== user ->
|
840 | 848 | goal_expansion(UnexpandedGoals1, user, Goals)
|
841 | 849 | ; Goals = UnexpandedGoals1
|
842 | 850 | ),
|
843 |
| - ( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) -> |
| 851 | + ( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars, TGs) -> |
844 | 852 | true
|
845 | 853 | ; predicate_property(Module:Goals, meta_predicate(MetaSpecs0)),
|
846 | 854 | MetaSpecs0 =.. [_ | MetaSpecs] ->
|
847 |
| - expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) |
| 855 | + expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars, TGs) |
848 | 856 | ; thread_goals(Goals, ExpandedGoals, (','))
|
849 | 857 | ; Goals = ExpandedGoals
|
850 | 858 | )
|
|
877 | 885 | )
|
878 | 886 | ).
|
879 | 887 |
|
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. |
881 | 899 |
|
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), |
885 | 904 | thread_goals(Goal1, ExpandedGoals, Goals1, (','))
|
886 |
| - ; expand_goal(Goals0, Module, Goals1, HeadVars), |
| 905 | + ; expand_goal(Goals0, Module, Goals1, HeadVars, TGs), |
887 | 906 | ExpandedGoals = (Goal0, Goals1)
|
888 | 907 | ).
|
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), |
892 | 912 | 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), |
896 | 916 | 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), |
899 | 919 | 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), |
902 | 922 | ExpandedGoals = (Module:Goals1).
|
903 | 923 |
|
904 | 924 | :- non_counted_backtracking thread_goals/3.
|
|
0 commit comments