Loops 什么是;回路必须折叠以确保端接;什么意思?

Loops 什么是;回路必须折叠以确保端接;什么意思?,loops,formal-methods,abstract-interpretation,Loops,Formal Methods,Abstract Interpretation,我在一篇关于形式化方法(精确地说是抽象解释)的论文中遇到了“循环必须折叠起来才能终止”。我很清楚终止意味着什么,但我不知道折叠循环是什么,也不知道如何在循环上执行折叠 有人能给我解释一下什么是折叠环吗?如果它不是隐含的,或者没有立即遵循折叠循环的定义,这如何确保终止 谢谢我不懂抽象解释,所以我将采用函数式编程方法进行折叠。:-) 在函数式编程中,折叠是一种应用于列表的操作,用于对每个元素进行处理,每次迭代更新一个值。例如,您可以通过这种方式(在方案中)实现map: 它的作用是从一个空列表开始(我

我在一篇关于形式化方法(精确地说是抽象解释)的论文中遇到了“循环必须折叠起来才能终止”。我很清楚终止意味着什么,但我不知道折叠循环是什么,也不知道如何在循环上执行折叠

有人能给我解释一下什么是折叠环吗?如果它不是隐含的,或者没有立即遵循折叠循环的定义,这如何确保终止


谢谢

我不懂抽象解释,所以我将采用函数式编程方法进行折叠。:-)

在函数式编程中,折叠是一种应用于列表的操作,用于对每个元素进行处理,每次迭代更新一个值。例如,您可以通过这种方式(在方案中)实现
map

它的作用是从一个空列表开始(我们称之为结果),然后对于列表中的每个元素,从右边向左移动,调用元素上的
func
,并将其结果放到结果列表上

这里的关键,就终止而言,是使用折叠,只要列表是有限的,循环就保证终止,因为每次都要迭代到列表的下一个元素,如果列表是有限的,那么最终将不会有下一个元素


与之相比,这是一个更为C风格的
for
循环,它不在列表上运行,而是具有形式
for(init;test;update)
测试
不能保证返回false,因此循环也不能保证完成。

折叠循环与更为人熟知的循环展开相反,后者本身更为人熟知。给定一个循环,展开它意味着将主体重复几次,以减少执行循环测试的频率。当循环的执行次数提前时,循环可以完全展开,留下一个简单的指令序列。例如,这个循环

for i := 1 to 4 do
  writeln(i);
可以展开到

writeln(1);
writeln(2);
writeln(3);
writeln(4);
有关部分展开的另一个示例,请参见

这个比喻是程序被多次折叠在自己身上;展开意味着移除部分或全部褶皱

在一些静态分析技术中,很难处理循环,因为找到循环入口点的先决条件(即找到循环不变量)需要不动点计算,这通常是无法解决的。因此,一些分析展开循环;这需要对迭代次数有一个合理的界限,这限制了可以分析的程序的范围


在其他静态分析技术中,找到一个好的不变量是分析的关键部分。这无助于展开循环,事实上,部分展开循环会使循环体变大,从而使确定良好的不变量变得更加困难;如果迭代次数很大或没有限制,则完全展开循环将是不切实际或不可能的。在没有看到论文的情况下,我觉得这句话有点令人惊讶,因为代码可能是用展开的形式编写的,但也可能有一些程序的分析只是以更折叠的形式进行的。

噢。。。那个褶皱。太好了,谢谢。因此,对于命令式语言来说,有必要用一个不变量对循环进行注释,这个不变量的折叠可以用来推断程序的正确性?@Tom不,这不是循环展开的意思!有必要使用不变量对循环进行注释,但是折叠(在函数/范畴意义上)与此无关。
writeln(1);
writeln(2);
writeln(3);
writeln(4);