for _ in 0 .. arity {
self.state_stack.push(TokenOrRedirect::FunctorRedirect);
self.state_stack.push(TokenOrRedirect::Comma);
- }
+ }
self.state_stack.pop();
self.state_stack.push(TokenOrRedirect::Open);
fn print_string(&mut self, s: StringList) {
match self.machine_st.machine_flags().double_quotes {
- DoubleQuotes::Chars | DoubleQuotes::Codes => {
+ DoubleQuotes::Chars | DoubleQuotes::Codes =>
if !s.is_empty() {
if self.ignore_ops {
self.format_struct(2, clause_name!("."));
}
} else if !self.at_cdr("") {
self.append_str("[]");
- }
- },
+ },
DoubleQuotes::Atom => {
let borrowed_str = s.borrow();
}
}
}
-
+
fn push_list(&mut self) {
let cell = Rc::new(Cell::new(true));
pub(super) fn unify(&mut self, a1: Addr, a2: Addr) {
let mut pdl = vec![a1, a2];
-
+ let mut tabu_list: HashSet<(Addr, Addr)> = HashSet::new();
+
self.fail = false;
while !(pdl.is_empty() || self.fail) {
let d2 = self.deref(pdl.pop().unwrap());
if d1 != d2 {
- match (self.store(d1.clone()), self.store(d2.clone())) {
+ let d1 = self.store(d1);
+ let d2 = self.store(d2);
+
+ if tabu_list.contains(&(d1.clone(), d2.clone())) {
+ continue;
+ } else {
+ tabu_list.insert((d1.clone(), d2.clone()));
+ }
+
+ match (d1.clone(), d2.clone()) {
(Addr::AttrVar(h), addr) | (addr, Addr::AttrVar(h)) =>
self.bind(Ref::AttrVar(h), addr),
(Addr::HeapCell(h), _) =>