reuse tabu list

This commit is contained in:
Skgland
2026-05-17 20:50:37 +02:00
parent d50d425099
commit e4792429d3
3 changed files with 16 additions and 9 deletions

View File

@@ -16,7 +16,9 @@ use crate::parser::ast::*;
use crate::read::TermWriteResult; use crate::read::TermWriteResult;
use crate::types::*; use crate::types::*;
use fxhash::FxBuildHasher;
use indexmap::IndexMap; use indexmap::IndexMap;
use indexmap::IndexSet;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::fmt; use std::fmt;
@@ -116,6 +118,7 @@ pub struct MachineState {
pub atom_tbl: Arc<AtomTable>, pub atom_tbl: Arc<AtomTable>,
pub arena: Arena, pub arena: Arena,
pub(super) pdl: Vec<(HeapCellValue, HeapCellValue)>, pub(super) pdl: Vec<(HeapCellValue, HeapCellValue)>,
pub(super) unify_tabu_list: IndexSet<(HeapCellValue, HeapCellValue), FxBuildHasher>,
pub(super) s: HeapPtr, pub(super) s: HeapPtr,
pub(super) s_offset: usize, pub(super) s_offset: usize,
pub(super) p: usize, pub(super) p: usize,

View File

@@ -1,3 +1,6 @@
use fxhash::FxBuildHasher;
use indexmap::IndexSet;
use crate::arena::*; use crate::arena::*;
use crate::atom_table::*; use crate::atom_table::*;
use crate::forms::*; use crate::forms::*;
@@ -31,6 +34,7 @@ impl MachineState {
arena: Arena::new().unwrap(), arena: Arena::new().unwrap(),
atom_tbl: AtomTable::new().unwrap(), atom_tbl: AtomTable::new().unwrap(),
pdl: Vec::with_capacity(1024), pdl: Vec::with_capacity(1024),
unify_tabu_list: IndexSet::with_hasher(FxBuildHasher::default()),
s: HeapPtr::default(), s: HeapPtr::default(),
s_offset: 0, s_offset: 0,
p: 0, p: 0,

View File

@@ -9,8 +9,6 @@ use crate::types::*;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use derive_more::*; use derive_more::*;
use fxhash::FxBuildHasher;
use indexmap::IndexSet;
use num_order::NumOrd; use num_order::NumOrd;
impl MachineState { impl MachineState {
@@ -348,7 +346,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
} }
fn unify_internal(&mut self) { 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() { while let Some((s1, s2)) = self.pdl.pop() {
if self.fail { if self.fail {
@@ -378,7 +376,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
Self::unify_atom(self, name, d2); Self::unify_atom(self, name, d2);
} }
(HeapCellValueTag::Str, s1) => { (HeapCellValueTag::Str, s1) => {
if tabu_list.contains(&(d1, d2)) { if self.unify_tabu_list.contains(&(d1, d2)) {
continue; continue;
} }
@@ -386,11 +384,11 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
if !self.fail { if !self.fail {
let d2 = self.store(d2); let d2 = self.store(d2);
tabu_list.insert((d1, d2)); self.unify_tabu_list.insert((d1, d2));
} }
} }
(HeapCellValueTag::Lis, l1) => { (HeapCellValueTag::Lis, l1) => {
if d2.is_ref() && tabu_list.contains(&(d1, d2)) { if d2.is_ref() && self.unify_tabu_list.contains(&(d1, d2)) {
continue; continue;
} }
@@ -398,7 +396,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
if !self.fail { if !self.fail {
let d2 = self.store(d2); let d2 = self.store(d2);
tabu_list.insert((d1, d2)); self.unify_tabu_list.insert((d1, d2));
} }
} }
(HeapCellValueTag::PStrLoc, l) => { (HeapCellValueTag::PStrLoc, l) => {
@@ -406,7 +404,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
(HeapCellValueTag::PStrLoc | (HeapCellValueTag::PStrLoc |
HeapCellValueTag::Lis | HeapCellValueTag::Lis |
HeapCellValueTag::Str) => { HeapCellValueTag::Str) => {
if tabu_list.contains(&(d1, d2)) { if self.unify_tabu_list.contains(&(d1, d2)) {
continue; continue;
} }
} }
@@ -424,7 +422,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
if !self.fail && !d2.is_constant() { if !self.fail && !d2.is_constant() {
let d2 = self.store(d2); let d2 = self.store(d2);
tabu_list.insert((d1, d2)); self.unify_tabu_list.insert((d1, d2));
} }
} }
(HeapCellValueTag::F64Offset, f1) => { (HeapCellValueTag::F64Offset, f1) => {
@@ -445,6 +443,8 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
); );
} }
} }
self.unify_tabu_list.clear();
} }
fn bind(&mut self, r: Ref, value: HeapCellValue); fn bind(&mut self, r: Ref, value: HeapCellValue);