fix cycle detection in lists by looking backward analogously to the same process for structures (#2130)
This commit is contained in:
@@ -186,6 +186,15 @@ impl<'a, const STOP_AT_CYCLES: bool> CycleDetectingIter<'a, STOP_AT_CYCLES> {
|
|||||||
self.heap[last_cell_loc].set_mark_bit(self.mark_phase);
|
self.heap[last_cell_loc].set_mark_bit(self.mark_phase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.cycle_detection_active() {
|
||||||
|
for idx in (self.next as usize .. last_cell_loc).rev() {
|
||||||
|
if self.heap[idx].get_forwarding_bit() {
|
||||||
|
self.cycle_found = true;
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.heap[last_cell_loc].set_forwarding_bit(true);
|
self.heap[last_cell_loc].set_forwarding_bit(true);
|
||||||
|
|
||||||
self.next = self.heap[last_cell_loc].get_value();
|
self.next = self.heap[last_cell_loc].get_value();
|
||||||
|
|||||||
@@ -29,6 +29,16 @@ term6(A) :-
|
|||||||
A=[B|B],
|
A=[B|B],
|
||||||
B=[C|C].
|
B=[C|C].
|
||||||
|
|
||||||
|
term7(A) :-
|
||||||
|
B=[C|D],
|
||||||
|
A=[D|C],
|
||||||
|
B=[B|D].
|
||||||
|
|
||||||
|
term8(A) :-
|
||||||
|
B=C,
|
||||||
|
B=[C|_D],
|
||||||
|
A=[C|_E].
|
||||||
|
|
||||||
test("acyclic_term_1", (
|
test("acyclic_term_1", (
|
||||||
L = [_Y,[M,B],B|M], acyclic_term(L)
|
L = [_Y,[M,B],B|M], acyclic_term(L)
|
||||||
)).
|
)).
|
||||||
@@ -235,6 +245,16 @@ test("acyclic_term#2125", (
|
|||||||
\+ acyclic_term(B)
|
\+ acyclic_term(B)
|
||||||
)).
|
)).
|
||||||
|
|
||||||
|
test("acyclic_term#2130_1", (
|
||||||
|
term7(T),
|
||||||
|
\+ acyclic_term(T)
|
||||||
|
)).
|
||||||
|
|
||||||
|
test("acyclic_term#2130_2", (
|
||||||
|
term8(T),
|
||||||
|
\+ acyclic_term(T)
|
||||||
|
)).
|
||||||
|
|
||||||
main :-
|
main :-
|
||||||
findall(test(Name, Goal), test(Name, Goal), Tests),
|
findall(test(Name, Goal), test(Name, Goal), Tests),
|
||||||
run_tests(Tests, Failed),
|
run_tests(Tests, Failed),
|
||||||
|
|||||||
Reference in New Issue
Block a user