sort variables in findall_with_existential before computing set difference (#282), trawl back changes of (#279)
This commit is contained in:
@@ -312,8 +312,7 @@ pub struct HCPrinter<'a, Outputter> {
|
|||||||
last_item_idx: usize,
|
last_item_idx: usize,
|
||||||
inner_numbervar_count: usize,
|
inner_numbervar_count: usize,
|
||||||
cyclic_terms: IndexMap<Addr, usize>,
|
cyclic_terms: IndexMap<Addr, usize>,
|
||||||
var_names_set: IndexSet<Var>,
|
pub(crate) var_names: IndexMap<Addr, Var>,
|
||||||
var_names: IndexMap<Addr, Var>,
|
|
||||||
pub(crate) numbervars_offset: Integer,
|
pub(crate) numbervars_offset: Integer,
|
||||||
pub(crate) numbervars: bool,
|
pub(crate) numbervars: bool,
|
||||||
pub(crate) quoted: bool,
|
pub(crate) quoted: bool,
|
||||||
@@ -445,7 +444,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
ignore_ops: false,
|
ignore_ops: false,
|
||||||
cyclic_terms: IndexMap::new(),
|
cyclic_terms: IndexMap::new(),
|
||||||
var_names: 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.last_item_idx = self.outputter.len();
|
||||||
self.outputter.append(s);
|
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> {
|
fn offset_as_string(&mut self, iter: &mut HCPreOrderIterator, addr: Addr) -> Option<Var> {
|
||||||
if let Some(var) = self.var_names.get(&addr) {
|
if let Some(var) = self.var_names.get(&addr) {
|
||||||
@@ -653,11 +623,18 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
|
|
||||||
match addr {
|
match addr {
|
||||||
Addr::Lis(h) | Addr::Str(h) => {
|
Addr::Lis(h) | Addr::Str(h) => {
|
||||||
Some(self.inner_numbervar(Ref::HeapCell(h)))
|
Some(format!("{}", h))
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if let Some(r) = addr.as_var() {
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -475,7 +475,9 @@ findall_with_existential(Template, Goal, PairedSolutions, Witnesses0, Witnesses)
|
|||||||
( nonvar(Goal), Goal = _ ^ _ ->
|
( nonvar(Goal), Goal = _ ^ _ ->
|
||||||
rightmost_power(Goal, Goal1, ExistentialVars0),
|
rightmost_power(Goal, Goal1, ExistentialVars0),
|
||||||
term_variables(ExistentialVars0, ExistentialVars),
|
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)
|
findall(Witnesses-Template, Goal1, PairedSolutions)
|
||||||
; Witnesses = Witnesses0,
|
; Witnesses = Witnesses0,
|
||||||
findall(Witnesses-Template, Goal, PairedSolutions)
|
findall(Witnesses-Template, Goal, PairedSolutions)
|
||||||
|
|||||||
@@ -2707,7 +2707,7 @@ impl MachineState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printer.set_var_names(var_names);
|
printer.var_names = var_names;
|
||||||
}
|
}
|
||||||
Err(err) => return Err(err),
|
Err(err) => return Err(err),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user