From af23258152abf80f95422e06e14629944adb03b0 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sat, 22 Feb 2020 15:13:01 -0700 Subject: [PATCH] remove setof/3, bagof/3 non-determinism (#270) --- src/prolog/lib/builtins.pl | 12 +++++++++--- src/prolog/machine/machine_state_impl.rs | 5 +++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index 2ac2ec38..6a3f091e 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -456,7 +456,10 @@ group_by_variants([V-S|Pairs], [V-Solution|Solutions]) :- group_by_variants(Pairs0, Solutions). group_by_variants([], []). -iterate_variants([V-Solution|GroupSolutions], V, Solution). +iterate_variants([V-Solution|GroupSolutions], V, Solution) :- + ( GroupSolutions == [] -> ! + ; true + ). iterate_variants([_|GroupSolutions], Ws, Solution) :- iterate_variants(GroupSolutions, Ws, Solution). @@ -491,7 +494,10 @@ bagof(Template, Goal, Solution) :- iterate_variants(GroupedSolutions, Witnesses, Solution). iterate_variants_and_sort([V-Solution0|GroupSolutions], V, Solution) :- - sort(Solution0, Solution). + sort(Solution0, Solution), + ( GroupSolutions == [] -> ! + ; true + ). iterate_variants_and_sort([_|GroupSolutions], Ws, Solution) :- iterate_variants_and_sort(GroupSolutions, Ws, Solution). @@ -948,7 +954,7 @@ chars_or_vars([C|Cs], PI) :- ). can_be_codes_or_vars(Cs, _) :- var(Cs), !. -can_be_codes_or_vars(Cs, PI) :- +can_be_codes_or_vars(Cs, PI) :- ( string(Cs) -> current_prolog_flag(double_quotes, codes) ; codes_or_vars(Cs, PI) diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index c6db779b..fbc249cd 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -2207,7 +2207,7 @@ impl MachineState { (HeapCellValue::Addr(Addr::PStrLocation(..)), HeapCellValue::Addr(Addr::Con(Constant::String(..)))) | (HeapCellValue::Addr(Addr::Con(Constant::String(..))), - HeapCellValue::Addr(Addr::PStrLocation(..))) + HeapCellValue::Addr(Addr::PStrLocation(..))) if self.flags.double_quotes.is_chars() => { continue; } @@ -3169,7 +3169,8 @@ impl MachineState { false } - pub(super) fn setup_built_in_call(&mut self, ct: BuiltInClauseType) { + pub(super) + fn setup_built_in_call(&mut self, ct: BuiltInClauseType) { self.num_of_args = ct.arity(); self.b0 = self.b; -- 2.54.0