将埃菲尔循环翻译成不支持循环的语言 invariants/variants

Translating Eiffel loops to languages that do not support loop invariants/variants

Eiffel 中的循环遵循以下格式:

from
    Init
invariant
    Invariant
until
    Exit
variant
    Variant
loop
    Body
end

如何将上述 Eiffel 伪代码翻译成不支持循环的语言 invariants/variants?让我们假设这样的目标语言有一个 assert 指令来检查 invariant/variant.

看起来像这样:

Init
last := infinity
loop
    assert (Invariant)
    next := Variant
    assert (0 <= next and next < last)
    last := next
    if Exit then
        break
    end
    Body
end