From c5057127ee25fd55dbbbb4f6f86647655ad6392f Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 10 May 2020 13:43:39 -0600 Subject: [PATCH] eliminate duplicates in term_variables/2, term_attributed_variables/2 (#481) --- src/prolog/machine/attributed_variables.rs | 9 +++++++++ src/prolog/machine/system_calls.rs | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/prolog/machine/attributed_variables.rs b/src/prolog/machine/attributed_variables.rs index b7e9ceee..3ca2ec2e 100644 --- a/src/prolog/machine/attributed_variables.rs +++ b/src/prolog/machine/attributed_variables.rs @@ -1,6 +1,8 @@ use crate::prolog::heap_iter::*; use crate::prolog::machine::*; +use crate::indexmap::IndexSet; + use std::cmp::Ordering; use std::vec::IntoIter; @@ -141,12 +143,19 @@ impl MachineState { pub(super) fn attr_vars_of_term(&self, addr: Addr) -> Vec { + let mut seen_set = IndexSet::new(); let mut seen_vars = vec![]; + let mut iter = self.acyclic_pre_order_iter(addr); while let Some(addr) = iter.next() { if let HeapCellValue::Addr(Addr::AttrVar(h)) = self.heap.index_addr(&addr).as_ref() { + if seen_set.contains(h) { + continue; + } + seen_vars.push(addr); + seen_set.insert(*h); let mut l = h + 1; let mut list_elements = vec![]; diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 47780568..b4857b59 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -18,6 +18,8 @@ use crate::prolog::ordered_float::OrderedFloat; use crate::prolog::read::readline; use crate::prolog::rug::Integer; +use crate::indexmap::IndexSet; + use crate::ref_thread_local::RefThreadLocal; use std::cmp; @@ -4838,11 +4840,13 @@ impl MachineState { } &SystemClauseType::TermVariables => { let a1 = self[temp_v!(1)]; + let mut seen_set = IndexSet::new(); let mut seen_vars = vec![]; for addr in self.acyclic_pre_order_iter(a1) { - if addr.is_ref() { + if addr.is_ref() && !seen_set.contains(&addr) { seen_vars.push(addr); + seen_set.insert(addr); } } -- 2.54.0