Merge pull request #3360 from Skgland/fix-discussion-3359

Fix discussion 3359
This commit is contained in:
Mark Thom
2026-06-03 13:35:56 -07:00
committed by GitHub
4 changed files with 36 additions and 11 deletions

View File

@@ -15,9 +15,8 @@ impl MachineState {
pub(crate) fn partial_string_to_pdl(&mut self, pstr_loc: usize, l: usize) { pub(crate) fn partial_string_to_pdl(&mut self, pstr_loc: usize, l: usize) {
let (c, succ_cell) = self.heap.last_str_char_and_tail(pstr_loc); let (c, succ_cell) = self.heap.last_str_char_and_tail(pstr_loc);
self.pdl.push((heap_loc_as_cell!(l + 1), succ_cell)); self.pdl.push((succ_cell, heap_loc_as_cell!(l + 1)));
self.pdl.push((char_as_cell!(c), heap_loc_as_cell!(l)));
self.pdl.push((heap_loc_as_cell!(l), char_as_cell!(c)));
} }
} }
@@ -33,7 +32,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
if n1 == n2 && a1 == a2 { if n1 == n2 && a1 == a2 {
for idx in (0..a1).rev() { for idx in (0..a1).rev() {
self.pdl.push((heap_loc_as_cell!(s2+1+idx), heap_loc_as_cell!(s1+1+idx))); self.pdl.push((heap_loc_as_cell!(s1+1+idx), heap_loc_as_cell!(s2+1+idx)));
} }
} else { } else {
self.fail = true; self.fail = true;
@@ -42,7 +41,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
(HeapCellValueTag::Lis, l2) => { (HeapCellValueTag::Lis, l2) => {
if a1 == 2 && n1 == atom!(".") { if a1 == 2 && n1 == atom!(".") {
for idx in (0..2).rev() { for idx in (0..2).rev() {
self.pdl.push((heap_loc_as_cell!(l2+1+idx), heap_loc_as_cell!(s1+1+idx))); self.pdl.push((heap_loc_as_cell!(s1+1+idx), heap_loc_as_cell!(l2+1+idx)));
} }
} else { } else {
self.fail = true; self.fail = true;
@@ -70,7 +69,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
read_heap_cell!(value, read_heap_cell!(value,
(HeapCellValueTag::Lis, l2) => { (HeapCellValueTag::Lis, l2) => {
for idx in (0..2).rev() { for idx in (0..2).rev() {
self.pdl.push((heap_loc_as_cell!(l2 + idx), heap_loc_as_cell!(l1 + idx))); self.pdl.push((heap_loc_as_cell!(l1 + idx), heap_loc_as_cell!(l2 + idx)));
} }
} }
(HeapCellValueTag::Str, s2) => { (HeapCellValueTag::Str, s2) => {
@@ -79,7 +78,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
if a2 == 2 && n2 == atom!(".") { if a2 == 2 && n2 == atom!(".") {
for idx in (0..2).rev() { for idx in (0..2).rev() {
self.pdl.push((heap_loc_as_cell!(s2+1+idx), heap_loc_as_cell!(l1+idx))); self.pdl.push((heap_loc_as_cell!(l1+idx), heap_loc_as_cell!(s2+1+idx)));
} }
} else { } else {
self.fail = true; self.fail = true;
@@ -128,7 +127,7 @@ pub(crate) trait Unifier: DerefMut<Target = MachineState> {
(HeapCellValueTag::PStrLoc, other_pstr_loc) => { (HeapCellValueTag::PStrLoc, other_pstr_loc) => {
match machine_st.heap.compare_pstr_segments(pstr_loc, other_pstr_loc) { match machine_st.heap.compare_pstr_segments(pstr_loc, other_pstr_loc) {
PStrSegmentCmpResult::Continue(v1, v2) => { PStrSegmentCmpResult::Continue(v1, v2) => {
machine_st.pdl.push((v1.offset_by(pstr_loc), v2.offset_by(other_pstr_loc))); machine_st.pdl.push((v2.offset_by(other_pstr_loc), v1.offset_by(pstr_loc)));
} }
_ => { _ => {
machine_st.fail = true; machine_st.fail = true;

View File

@@ -402,21 +402,21 @@ macro_rules! index_store {
macro_rules! unify { macro_rules! unify {
($machine_st:expr, $($v1:expr, $v2:expr),*) => {{ ($machine_st:expr, $($v1:expr, $v2:expr),*) => {{
$($machine_st.pdl.push(($v1, $v2));)* $($machine_st.pdl.push(($v2, $v1));)*
$machine_st.unify() $machine_st.unify()
}}; }};
} }
macro_rules! unify_fn { macro_rules! unify_fn {
($machine_st:expr, $($v1:expr, $v2: expr),*) => {{ ($machine_st:expr, $($v1:expr, $v2: expr),*) => {{
$($machine_st.pdl.push(($v1, $v2));)* $($machine_st.pdl.push(($v2, $v1));)*
$machine_st.occurs_check.unify(&mut $machine_st) $machine_st.occurs_check.unify(&mut $machine_st)
}}; }};
} }
macro_rules! unify_with_occurs_check { macro_rules! unify_with_occurs_check {
($machine_st:expr, $($v1:expr, $v2:expr),*) => {{ ($machine_st:expr, $($v1:expr, $v2:expr),*) => {{
$($machine_st.pdl.push(($v1, $v2));)* $($machine_st.pdl.push(($v2, $v1));)*
$machine_st.unify_with_occurs_check() $machine_st.unify_with_occurs_check()
}}; }};
} }

View File

@@ -0,0 +1,11 @@
:- use_module(library(clpz)).
:- use_module(library(tabling)).
:- table expr//0.
expr --> "1".
expr --> expr, "+", expr.
run :- phrase(expr, "1+1+1+1+1").
:- initialization(run).

View File

@@ -173,3 +173,18 @@ fn http_open_hanging() {
"received response with status code:200\nreceived response with status code:200\nreceived response with status code:200\nreceived response with status code:200\nreceived response with status code:200\n" "received response with status code:200\nreceived response with status code:200\nreceived response with status code:200\nreceived response with status code:200\nreceived response with status code:200\n"
); );
} }
#[test]
#[cfg_attr(miri, ignore = "it takes too long to run")]
#[cfg_attr(
all(
target_arch = "x86",
target_os = "linux",
target_vendor = "unknown",
target_env = "gnu"
),
ignore = "FIXME was already broken before d50d42509903dc3cc1841eb757a703753de84754"
)]
fn discussion3359() {
load_module_test("tests-pl/discussion3359.pl", "");
}