From: Skgland Date: Sun, 17 May 2026 18:50:37 +0000 (+0200) Subject: reuse tabu list X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=e4792429d3864eabd840f8cdb1f3723a56d27908;p=scryer-prolog.git reuse tabu list --- diff --git a/src/machine/machine_state.rs b/src/machine/machine_state.rs index 860cfb79..56795ce6 100644 --- a/src/machine/machine_state.rs +++ b/src/machine/machine_state.rs @@ -16,7 +16,9 @@ use crate::parser::ast::*; use crate::read::TermWriteResult; use crate::types::*; +use fxhash::FxBuildHasher; use indexmap::IndexMap; +use indexmap::IndexSet; use std::convert::TryFrom; use std::fmt; @@ -116,6 +118,7 @@ pub struct MachineState { pub atom_tbl: Arc, pub arena: Arena, pub(super) pdl: Vec<(HeapCellValue, HeapCellValue)>, + pub(super) unify_tabu_list: IndexSet<(HeapCellValue, HeapCellValue), FxBuildHasher>, pub(super) s: HeapPtr, pub(super) s_offset: usize, pub(super) p: usize, diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index 390ad99d..b9b5538f 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -1,3 +1,6 @@ +use fxhash::FxBuildHasher; +use indexmap::IndexSet; + use crate::arena::*; use crate::atom_table::*; use crate::forms::*; @@ -31,6 +34,7 @@ impl MachineState { arena: Arena::new().unwrap(), atom_tbl: AtomTable::new().unwrap(), pdl: Vec::with_capacity(1024), + unify_tabu_list: IndexSet::with_hasher(FxBuildHasher::default()), s: HeapPtr::default(), s_offset: 0, p: 0, diff --git a/src/machine/unify.rs b/src/machine/unify.rs index 0957537c..e7516929 100644 --- a/src/machine/unify.rs +++ b/src/machine/unify.rs @@ -9,8 +9,6 @@ use crate::types::*; use std::ops::{Deref, DerefMut}; use derive_more::*; -use fxhash::FxBuildHasher; -use indexmap::IndexSet; use num_order::NumOrd; impl MachineState { @@ -348,7 +346,7 @@ pub(crate) trait Unifier: DerefMut { } fn unify_internal(&mut self) { - let mut tabu_list = IndexSet::with_hasher(FxBuildHasher::default()); + debug_assert!(self.unify_tabu_list.is_empty()); while let Some((s1, s2)) = self.pdl.pop() { if self.fail { @@ -378,7 +376,7 @@ pub(crate) trait Unifier: DerefMut { Self::unify_atom(self, name, d2); } (HeapCellValueTag::Str, s1) => { - if tabu_list.contains(&(d1, d2)) { + if self.unify_tabu_list.contains(&(d1, d2)) { continue; } @@ -386,11 +384,11 @@ pub(crate) trait Unifier: DerefMut { if !self.fail { let d2 = self.store(d2); - tabu_list.insert((d1, d2)); + self.unify_tabu_list.insert((d1, d2)); } } (HeapCellValueTag::Lis, l1) => { - if d2.is_ref() && tabu_list.contains(&(d1, d2)) { + if d2.is_ref() && self.unify_tabu_list.contains(&(d1, d2)) { continue; } @@ -398,7 +396,7 @@ pub(crate) trait Unifier: DerefMut { if !self.fail { let d2 = self.store(d2); - tabu_list.insert((d1, d2)); + self.unify_tabu_list.insert((d1, d2)); } } (HeapCellValueTag::PStrLoc, l) => { @@ -406,7 +404,7 @@ pub(crate) trait Unifier: DerefMut { (HeapCellValueTag::PStrLoc | HeapCellValueTag::Lis | HeapCellValueTag::Str) => { - if tabu_list.contains(&(d1, d2)) { + if self.unify_tabu_list.contains(&(d1, d2)) { continue; } } @@ -424,7 +422,7 @@ pub(crate) trait Unifier: DerefMut { if !self.fail && !d2.is_constant() { let d2 = self.store(d2); - tabu_list.insert((d1, d2)); + self.unify_tabu_list.insert((d1, d2)); } } (HeapCellValueTag::F64Offset, f1) => { @@ -445,6 +443,8 @@ pub(crate) trait Unifier: DerefMut { ); } } + + self.unify_tabu_list.clear(); } fn bind(&mut self, r: Ref, value: HeapCellValue);