]> Repositorios git - scryer-prolog.git/commitdiff
sort variables in findall_with_existential before computing set difference (#282...
authorMark Thom <[email protected]>
Fri, 13 Mar 2020 19:18:47 +0000 (13:18 -0600)
committerMark Thom <[email protected]>
Fri, 13 Mar 2020 19:18:47 +0000 (13:18 -0600)
src/prolog/heap_print.rs
src/prolog/lib/builtins.pl
src/prolog/machine/system_calls.rs

index 175016526f6c9ebf9a53eb530034927a2b4b8a68..ea54de38a3a9177fcbf167b784fcb3c75f4e7ff2 100644 (file)
@@ -312,8 +312,7 @@ pub struct HCPrinter<'a, Outputter> {
     last_item_idx: usize,
     inner_numbervar_count: usize,
     cyclic_terms: IndexMap<Addr, usize>,
-    var_names_set: IndexSet<Var>,
-    var_names: IndexMap<Addr, Var>,
+    pub(crate) var_names: IndexMap<Addr, Var>,
     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<Addr, Var>) {
-        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<Var> {
         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
                 }
index 92807ac6aab07c7935ac7dfd6753902273e58ca3..623d7870f9d27b4f1d29cabf0269eff9743cd379 100644 (file)
@@ -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)
index 4c05ffdac7b5d0a9e3d2aa4dbb37d7b8641e85be..137c5ce08780cab12c892550f08db149ca909058 100644 (file)
@@ -2707,7 +2707,7 @@ impl MachineState {
                             }
                         }
 
-                        printer.set_var_names(var_names);
+                        printer.var_names = var_names;
                     }
                     Err(err) => return Err(err),
                 }