From: Mark Thom Date: Mon, 3 Sep 2018 06:20:01 +0000 (-0600) Subject: do not unify partial strings unless they coincide in memory X-Git-Tag: v0.8.110~403 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=3960ea4f06d0188a406e5b5aa253d85d86a7f9c4;p=scryer-prolog.git do not unify partial strings unless they coincide in memory --- diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 2e223b6e..87473934 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -254,7 +254,7 @@ impl MachineState { return true; } - } else if s2.is_expandable() { + } else if s2.is_expandable() { pdl.push(Addr::Con(Constant::String(s2.push_char(c1)))); pdl.push(Addr::Con(Constant::String(s1.tail()))); @@ -264,12 +264,12 @@ impl MachineState { if let Some(c) = s2.head() { pdl.push(Addr::Con(Constant::String(s1.push_char(c)))); pdl.push(Addr::Con(Constant::String(s2.tail()))); - } else if !s2.is_expandable() { + } else if s2.is_expandable() { + return s1 == s2; + } else { s1.set_non_expandable(); - }/*else { - //TODO: unify the tails of s1 and s2? I guess? - }*/ - + } + return true; } else if s2.head().is_none() { s2.set_non_expandable(); @@ -1445,7 +1445,7 @@ impl MachineState { false } - + pub(super) fn compare_term_test(&self, a1: &Addr, a2: &Addr) -> Ordering { let iter = self.zipped_acyclic_pre_order_iter(a1.clone(), a2.clone()); @@ -1526,7 +1526,7 @@ impl MachineState { HeapCellValue::Addr(Addr::Con(Constant::Number(_)))) => return Ordering::Greater, (HeapCellValue::Addr(Addr::Con(Constant::String(s1))), - HeapCellValue::Addr(Addr::Con(Constant::String(s2)))) => + HeapCellValue::Addr(Addr::Con(Constant::String(s2)))) => return s1.cmp(&s2), (HeapCellValue::Addr(Addr::Con(Constant::String(_))), _) => return Ordering::Less, diff --git a/src/tests.rs b/src/tests.rs index f165c0ab..bc5b9289 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1881,6 +1881,9 @@ fn test_queries_on_string_lists() assert_prolog_success!(&mut wam, "?- partial_string(\"abc\", X).", [["X = [a, b, c | _]"]]); + assert_prolog_failure!(&mut wam, "?- partial_string(\"abc\", X), partial_string(\"abc\", Y), matcher(X, V), + matcher(Y, Z), V = Z."); + submit(&mut wam, "matcher([a, b, c | X], X)."); assert_prolog_success!(&mut wam, "?- partial_string(\"abc\", X), matcher(X, Y).",