From 6c9e704aa8dbf7daf5ee5391b9ba740223f4362b Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Fri, 13 Mar 2020 13:18:47 -0600 Subject: [PATCH] sort variables in findall_with_existential before computing set difference (#282), trawl back changes of (#279) --- src/prolog/heap_print.rs | 43 +++++++----------------------- src/prolog/lib/builtins.pl | 4 ++- src/prolog/machine/system_calls.rs | 2 +- 3 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 17501652..ea54de38 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -312,8 +312,7 @@ pub struct HCPrinter<'a, Outputter> { last_item_idx: usize, inner_numbervar_count: usize, cyclic_terms: IndexMap, - var_names_set: IndexSet, - var_names: IndexMap, + pub(crate) var_names: IndexMap, pub(crate) numbervars_offset: Integer, pub(crate) numbervars: bool, pub(crate) quoted: bool, @@ -445,7 +444,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { ignore_ops: false, cyclic_terms: IndexMap::new(), var_names: IndexMap::new(), - var_names_set: IndexSet::new(), } } @@ -612,34 +610,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { self.last_item_idx = self.outputter.len(); self.outputter.append(s); } - - pub fn set_var_names(&mut self, var_names: IndexMap) { - for var in var_names.values().cloned() { - self.var_names_set.insert(var); - } - - self.var_names = var_names; - } - - fn inner_numbervar(&mut self, r: Ref) -> Var { - let mut nv; - - loop { - nv = numbervar(Integer::from(self.inner_numbervar_count)); - nv = format!("_{}", nv); - - if !self.var_names_set.contains(&nv) { - break; - } else { - self.inner_numbervar_count += 1; - } - } - - self.var_names.insert(r.as_addr(), nv.clone()); - self.var_names_set.insert(nv.clone()); - - nv - } fn offset_as_string(&mut self, iter: &mut HCPreOrderIterator, addr: Addr) -> Option { if let Some(var) = self.var_names.get(&addr) { @@ -653,11 +623,18 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { match addr { Addr::Lis(h) | Addr::Str(h) => { - Some(self.inner_numbervar(Ref::HeapCell(h))) + Some(format!("{}", h)) } _ => { if let Some(r) = addr.as_var() { - Some(self.inner_numbervar(r)) + match r { + Ref::StackCell(fr, sc) => { + Some(format!("_s_{}_{}", fr, sc)) + } + Ref::HeapCell(h) | Ref::AttrVar(h) | Ref::PStrTail(h, _) => { + Some(format!("_{}", h)) + } + } } else { None } diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index 92807ac6..623d7870 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -475,7 +475,9 @@ findall_with_existential(Template, Goal, PairedSolutions, Witnesses0, Witnesses) ( nonvar(Goal), Goal = _ ^ _ -> rightmost_power(Goal, Goal1, ExistentialVars0), term_variables(ExistentialVars0, ExistentialVars), - set_difference(Witnesses0, ExistentialVars, Witnesses), + sort(Witnesses0, Witnesses1), + sort(ExistentialVars, ExistentialVars1), + set_difference(Witnesses1, ExistentialVars1, Witnesses), findall(Witnesses-Template, Goal1, PairedSolutions) ; Witnesses = Witnesses0, findall(Witnesses-Template, Goal, PairedSolutions) diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 4c05ffda..137c5ce0 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -2707,7 +2707,7 @@ impl MachineState { } } - printer.set_var_names(var_names); + printer.var_names = var_names; } Err(err) => return Err(err), } -- 2.54.0