From cfd67c8337639163dabef8de654e776f22492562 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 4 Sep 2023 14:12:11 +0530 Subject: [PATCH] Added new unify methods --- src/machine/unify.rs | 51 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/machine/unify.rs b/src/machine/unify.rs index e73fa4a1..ed14f296 100644 --- a/src/machine/unify.rs +++ b/src/machine/unify.rs @@ -12,6 +12,7 @@ use std::ops::{Deref, DerefMut}; use derive_deref::*; use fxhash::FxBuildHasher; use indexmap::IndexSet; +use num_order::NumOrd; pub(crate) trait Unifier: DerefMut { fn unify_structure(&mut self, s1: usize, value: HeapCellValue) { @@ -426,8 +427,8 @@ pub(crate) trait Unifier: DerefMut { match Number::try_from(value) { Ok(n2) => match n2 { Number::Fixnum(n2) if n1.get_num() == n2.get_num() => {} - Number::Integer(n2) if n1.get_num() == *n2 => {} - Number::Rational(n2) if n1.get_num() == *n2 => {} + Number::Integer(n2) if (*n2).num_eq(&n1.get_num()) => {} + Number::Rational(n2) if (*n2).num_eq(&Integer::from(n1.get_num())) => {} _ => { self.fail = true; } @@ -464,6 +465,48 @@ pub(crate) trait Unifier: DerefMut { } } + fn unify_big_integer(&mut self, n1: TypedArenaPtr, value: HeapCellValue) { + if let Some(r) = value.as_var() { + Self::bind(self, r, typed_arena_ptr_as_cell!(n1)); + return; + } + + match Number::try_from(value) { + Ok(n2) => match n2 { + Number::Fixnum(n2) if (*n1).num_eq(&n2.get_num()) => {} + Number::Integer(n2) if (*n1).num_eq(&n2.value()) => {} + Number::Rational(n2) if (*n2).num_eq(&n1.value()) => {} + _ => { + self.fail = true; + } + }, + Err(_) => { + self.fail = true; + } + } + } + + fn unify_big_rational(&mut self, n1: TypedArenaPtr, value: HeapCellValue) { + if let Some(r) = value.as_var() { + Self::bind(self, r, typed_arena_ptr_as_cell!(n1)); + return; + } + + match Number::try_from(value) { + Ok(n2) => match n2 { + Number::Fixnum(n2) if (*n1).num_eq(&Integer::from(n2.get_num())) => {} + Number::Integer(n2) if (*n1).num_eq(&n2.value()) => {} + Number::Rational(n2) if n1 == n2 => {} + _ => { + self.fail = true; + } + }, + Err(_) => { + self.fail = true; + } + } + } + fn unify_f64(&mut self, f1: F64Ptr, value: HeapCellValue) { if let Some(r) = value.as_var() { Self::bind(self, r, HeapCellValue::from(f1)); @@ -489,10 +532,10 @@ pub(crate) trait Unifier: DerefMut { match_untyped_arena_ptr!(ptr, (ArenaHeaderTag::Integer, int_ptr) => { - Self::unify_big_num(self, int_ptr, value); + Self::unify_big_integer(self, int_ptr, value); } (ArenaHeaderTag::Rational, rat_ptr) => { - Self::unify_big_num(self, rat_ptr, value); + Self::unify_big_rational(self, rat_ptr, value); } (ArenaHeaderTag::Stream, stream) => { read_heap_cell!(value, -- 2.54.0