From: Mark Thom Date: Tue, 1 Feb 2022 01:23:16 +0000 (-0700) Subject: count cycle lengths in skip_max_list_cycle (#1260) X-Git-Tag: v0.9.0^2~35 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=4b71607215eefe15012fe5b7ae81ece79adca79d;p=scryer-prolog.git count cycle lengths in skip_max_list_cycle (#1260) --- diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index a9f1b91f..4f3ed651 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -462,12 +462,21 @@ impl MachineState { hare = step(&self.heap, self.heap[hare]); } + let mut count = 1; + while hare != tortoise { hare = step(&self.heap, self.heap[hare]); tortoise = step(&self.heap, self.heap[tortoise]); + + count += 1; } - unify!(self, self.registers[4], self.heap[hare]); + let target_n = self.store(self.deref(self.registers[1])); + self.unify_fixnum(Fixnum::build_with(count), target_n); + + if !self.fail { + unify!(self, self.registers[4], self.heap[hare]); + } } fn finalize_skip_max_list(&mut self, n: i64, value: HeapCellValue) {