У меня нет знаний об абстрактной интерпретации, поэтому я приму функциональный подход к программированию свертывания. : -)
В функциональном программировании сгиб - это операция, применяемая к списку, чтобы что-то делать с каждым элементом, обновляя значение на каждой итерации. Например, вы можете реализовать map
следующим образом (на схеме):
(define (map1 func lst)
(fold-right (lambda (elem result)
(cons (func elem) result))
'() lst))
Что он делает, так это то, что он начинается с пустого списка (назовем это результатом), а затем для каждого элемента списка, с правой стороны, перемещающейся влево, вы вызываете func
для элемента и cons
его результат в списке результатов.
Ключевым моментом здесь в том, что касается завершения, является то, что при сгибе цикл гарантированно завершится, пока список конечен, поскольку вы каждый раз переходите к следующему элементу списка, и если список конечен, тогда со временем следующего элемента не будет.
Сравните это с циклом for
в стиле C, который не работает со списком, а вместо этого имеет форму for (init; test; update)
. test
гарантированно никогда не вернет false, и поэтому цикл не гарантированно завершится.