use prolog::machine::*;
use std::collections::HashSet;
-use std::collections::hash_set::IntoIter;
+use std::vec::IntoIter;
pub static VERIFY_ATTRS: &str = include_str!("attributed_variables.pl");
pub static PROJECT_ATTRS: &str = include_str!("project_attributes.pl");
self[temp_v!(2)] = value_list_addr;
}
- fn gather_attr_vars_created_since(&self, h: usize) -> IntoIter<Addr> {
- let mut attr_vars = HashSet::new();
-
- for i in h .. self.heap.h {
- let addr = self.heap[i].as_addr(i);
+ pub(super)
+ fn gather_attr_vars_created_since(&self, b: usize) -> IntoIter<Addr>
+ {
+ let mut attr_vars: Vec<_> = self.attr_var_init.attr_var_queue[b ..]
+ .iter().filter_map(|h|
+ match self.store(self.deref(Addr::HeapCell(*h))) {
+ Addr::AttrVar(h) => Some(Addr::AttrVar(h)),
+ _ => None
+ }).collect();
- match addr {
- Addr::AttrVar(h) if i == h => {
- attr_vars.insert(Addr::AttrVar(h));
- },
- _ => {}
- }
- }
+ attr_vars.sort_unstable_by(|a1, a2| self.compare_term_test(a1, a2));
+ self.term_dedup(&mut attr_vars);
attr_vars.into_iter()
}
match self.store(self.deref(addr)) {
Addr::Con(Constant::Usize(b)) => {
- let mut attr_vars: Vec<_> = self.attr_var_init.attr_var_queue[b ..]
- .iter().filter_map(|h|
- match self.store(self.deref(Addr::HeapCell(*h))) {
- Addr::AttrVar(h) => Some(Addr::AttrVar(h)),
- _ => None
- }).collect();
-
- attr_vars.sort_unstable_by(|a1, a2| self.compare_term_test(a1, a2));
-
- self.term_dedup(&mut attr_vars);
- let var_list_addr = Addr::HeapCell(self.heap.to_list(attr_vars.into_iter()));
-
+ let iter = self.gather_attr_vars_created_since(b);
+
+ let var_list_addr = Addr::HeapCell(self.heap.to_list(iter));
let list_addr = self[temp_v!(2)].clone();
- self.unify(var_list_addr, list_addr);
+
+ self.unify(var_list_addr, list_addr);
},
_ => self.fail = true
}