From: Fayeed Pawaskar Date: Mon, 4 Sep 2023 08:42:11 +0000 (+0530) Subject: Added new unify methods X-Git-Tag: remove~101^2~3 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=cfd67c8337639163dabef8de654e776f22492562;p=scryer-prolog.git Added new unify methods --- 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,