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::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<AtomTable>,
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,

View File

@@ -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,

View File

@@ -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<Target = MachineState> {
}
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<Target = MachineState> {
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<Target = MachineState> {
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<Target = MachineState> {
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<Target = MachineState> {
(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<Target = MachineState> {
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<Target = MachineState> {
);
}
}
self.unify_tabu_list.clear();
}
fn bind(&mut self, r: Ref, value: HeapCellValue);