make term{_attributed_}variables/2 order {attributed} variables by left-to-right occurrence

This commit is contained in:
Mark Thom
2020-05-03 18:43:23 -06:00
parent 9e220e8416
commit b8400e0c92
2 changed files with 6 additions and 12 deletions

View File

@@ -1,8 +1,6 @@
use crate::prolog::heap_iter::*; use crate::prolog::heap_iter::*;
use crate::prolog::machine::*; use crate::prolog::machine::*;
use indexmap::IndexSet;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::vec::IntoIter; use std::vec::IntoIter;
@@ -142,13 +140,13 @@ impl MachineState {
} }
pub(super) pub(super)
fn attr_vars_of_term(&self, addr: Addr) -> IndexSet<Addr> { fn attr_vars_of_term(&self, addr: Addr) -> Vec<Addr> {
let mut seen_vars = IndexSet::new(); let mut seen_vars = vec![];
let mut iter = self.acyclic_pre_order_iter(addr); let mut iter = self.acyclic_pre_order_iter(addr);
while let Some(addr) = iter.next() { while let Some(addr) = iter.next() {
if let HeapCellValue::Addr(Addr::AttrVar(h)) = self.heap.index_addr(&addr).as_ref() { if let HeapCellValue::Addr(Addr::AttrVar(h)) = self.heap.index_addr(&addr).as_ref() {
seen_vars.insert(addr); seen_vars.push(addr);
let mut l = h + 1; let mut l = h + 1;
let mut list_elements = vec![]; let mut list_elements = vec![];

View File

@@ -20,8 +20,6 @@ use crate::prolog::rug::Integer;
use crate::ref_thread_local::RefThreadLocal; use crate::ref_thread_local::RefThreadLocal;
use indexmap::IndexSet;
use std::cmp; use std::cmp;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::io::{stdout, Read, Write}; use std::io::{stdout, Read, Write};
@@ -3378,18 +3376,16 @@ impl MachineState {
} }
&SystemClauseType::TermVariables => { &SystemClauseType::TermVariables => {
let a1 = self[temp_v!(1)]; let a1 = self[temp_v!(1)];
let mut seen_vars = IndexSet::new(); let mut seen_vars = vec![];
for addr in self.acyclic_pre_order_iter(a1) { for addr in self.acyclic_pre_order_iter(a1) {
if addr.is_ref() { if addr.is_ref() {
seen_vars.insert(addr); seen_vars.push(addr);
} }
} }
let outcome = Addr::HeapCell(self.heap.to_list(seen_vars.into_iter())); let outcome = Addr::HeapCell(self.heap.to_list(seen_vars.into_iter()));
self.unify(self[temp_v!(2)], outcome);
let a2 = self[temp_v!(2)];
self.unify(a2, outcome);
} }
&SystemClauseType::TruncateLiftedHeapTo => { &SystemClauseType::TruncateLiftedHeapTo => {
match self.store(self.deref(self[temp_v!(1)])) { match self.store(self.deref(self[temp_v!(1)])) {