From: Mark Thom Date: Tue, 13 Dec 2022 06:55:43 +0000 (-0700) Subject: use append/3 rather than set_difference/3 to gather witnesses in bagof/3 and setof... X-Git-Tag: v0.9.2~252 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=a5054c006441b38e2092a9c28137f725413028b3;p=scryer-prolog.git use append/3 rather than set_difference/3 to gather witnesses in bagof/3 and setof/3 (#1663, #1664) --- diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index 1d2d0aed..d73ff8df 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -745,11 +745,10 @@ findall_with_existential(Template, Goal, PairedSolutions, Witnesses0, Witnesses) bagof(Template, Goal, Solution) :- error:can_be(list, Solution), - term_variables(Template, TemplateVars0), - term_variables(Goal, GoalVars0), - sort(TemplateVars0, TemplateVars), - sort(GoalVars0, GoalVars), - set_difference(GoalVars, TemplateVars, Witnesses0), + term_variables(Template, TemplateVars), + term_variables(Goal, GoalVars), + term_variables(TemplateVars+GoalVars, TGVs), + lists:append(TemplateVars, Witnesses0, TGVs), findall_with_existential(Template, Goal, PairedSolutions0, Witnesses0, Witnesses), keysort(PairedSolutions0, PairedSolutions), group_by_variants(PairedSolutions, GroupedSolutions), @@ -773,11 +772,10 @@ iterate_variants_and_sort([_|GroupSolutions], Ws, Solution) :- setof(Template, Goal, Solution) :- error:can_be(list, Solution), - term_variables(Template, TemplateVars0), - term_variables(Goal, GoalVars0), - sort(TemplateVars0, TemplateVars), - sort(GoalVars0, GoalVars), - set_difference(GoalVars, TemplateVars, Witnesses0), + term_variables(Template, TemplateVars), + term_variables(Goal, GoalVars), + term_variables(TemplateVars+GoalVars, TGVs), + lists:append(TemplateVars, Witnesses0, TGVs), findall_with_existential(Template, Goal, PairedSolutions0, Witnesses0, Witnesses), keysort(PairedSolutions0, PairedSolutions), group_by_variants(PairedSolutions, GroupedSolutions),