我在下面阅读了一篇关于热点通过晶格的恒定传播的文章。 http://www.cliffc.org/blog/2012/02/27/too-much-theory-part-2/ 它描述了" (top meet -1)== -1 ==(-1 meet top),所以这个例子有效。所以:(1符合2,3)== bottom ==(2,3符合1)。所以:(0符合0,1)== 0,1 ==(0,1符合0)"
但是我无法理解为什么(最高符合-1)== 1和(-1见顶)== - 1?为什么(1满足2,3)和(2,3满足1)==底?如何计算会议?
答案 0 :(得分:1)
Jacky,从你的问题来看,似乎你没有得到一些基本概念。您是否尝试阅读链接的Lattice wiki文章?
我不确定我是否能比Wiki的集体思想更好,但我会尝试。
让我们从 poset 又名&#34; Partially ordered set&#34;开始。有一个&#34; poset&#34;意味着你有一组一些对象和一些比较器<=
你可以提供两个对象,它会说哪一个更少(或者更确切地说#34;更少或相等&#34;)。从完全有序的集合中部分有序集合的不同之处在于,在更常见的完全有序集合中,a <= b
和a >= b
中的至少一个成立。在&#34;部分订购&#34;意味着两者可能同时是假的。即你有一些你无法比较的元素。
现在格子是一个poset结构(可能不是每个poset都可以转换为格子)。要定义晶格,您需要定义两个方法 meet
和 join
。 meet
是一个函数,从poset的一对元素到poset的一个元素,这样(我将使用meet(a, b)
语法而不是a meet b
,因为它似乎对Java更友好-developers):
a
和b
,都有一个元素inf
= meet(a,b)
,即为每对元素定义了meet a
和b
meet(a,b) <= a
和meet(a,b) <= b
a
和b
如果inf = meet(a,b)
,则集合中没有其他元素c
,以便c <= a
和{{1} } AND NOT c <= b
ie c <= inf
定义最大的公共最小元素(或者更具技术性的meet(a,b)
),这样的元素是唯一的。同样适用于infimum
,但join
正在寻找&#34;最大值&#34;两个或更多技术上的元素join
。
现在让我们回到您引用的示例。该示例中的poset包含4种类型或更确切的元素层:
supremum
- 添加到poset的人工元素,使其大于任何其他元素Top
&#34; (此处与作者不同,我将使用&#34; [0, 1]
&#34;和&#34; [
&#34;来定义范围,以免与]
的应用混淆meet
- 添加到poset的人工元素,使其小于任何其他元素 请注意,单层中的所有元素都是 无法比较 (!),但任何更高层中的所有元素都大于任何下层中的所有元素。因此,在该poset结构下, Bottom
不得小于1
,但2
小于[1,2]
和1
。
请注意,单个图层中的所有元素都 无法比较 (!)。因此,在该poset结构下,2
不得小于1
,但2
小于[1,2]
和1
。 2
比任何事都重要。 Top
比任何东西都少。范围Bottom
与原始数[x,y]
相当,当且仅当范围内的z
行且在该情况下范围较小时,否则它们不具有可比性。
你可能会注意到poset的结构&#34;诱导&#34;相应的格子。因此,给定这样的结构,很容易理解如何定义z
函数以满足所有要求:
meet
,meet(Top, a)
= meet(a, Top)
= a
对于任何a
meet(Bottom, a)
= meet(a, Bottom)
= Bottom
a
其中meet(x, y)
和x
都是整数(即第2层)是:
y
= x
x
如果y
+ 1 = [x, y]
x
如果y
+ 1 = [y, x]
y
x
否则(我不确定这是否是正确的定义,除非Bottom
= [min(x,y), max(x,y)]
,否则它可能始终为x
范围。从示例中不清楚但它是不是很重要)
y
= meet([x,y], z)
其中meet(z, [x,y])
,x
和y
是整数,即整数z
(图层# 2)和范围(第3层)是:
meet
如果[x, y]
= x
或z
= y
(换句话说,如果z
)[x,y] < z
否则除了大多数琐碎的案例外,范围和整数的Bottom
几乎总是meet
Bottom
其中meet(a, b)
和a
都是范围,即两个范围的b
(第3层):
meet
为a
= a
b
否则除了大多数琐碎的案例外,两个范围的Bottom
也是meet
这个例子的部分实际上是关于&#34;诱导&#34;来自结构的晶格并验证大多数理想特征是否成立(除了在下一个例子中添加的对称性)。
希望这有帮助
更新(评论的答案)
很难回答&#34;为什么&#34;。这是因为作者以这种方式构建他的poset(可能因为这种方式以后会有用)。我觉得你很困惑,因为一组自然数字有一个自然的&#34; (双关语不是)我们都习惯的排序。没有任何东西可以禁止我获得相同的集合(即相同的对象=所有自然数字)并定义一些其他排序顺序。您熟悉Bottom
界面吗?使用该界面,您可以指定java.util.Comparator
类型的任何排序规则,例如&#34;所有偶数都大于所有奇数,并且偶数或奇数类内部工作&#34;通常&#34;比较规则&#34;如果由于某种原因这样的排序顺序对您的任务有意义,您可以使用这样的Integer
来对集合进行排序。这是相同的情况,对于作者的任务,定义替代(自定义)排序顺序是有意义的。此外,他想使它只是一个部分顺序(Comparartor
不可能)。他定义订单的方式就是我描述的方式。
如果可以比较[1,2]与0或3?
是的,您可以比较并且答案直接来自&#34;单层中的所有元素都不具有可比性(!),但任何更高层中的所有元素都大于任何下层中的所有元素&#34 ;:来自第2层的Comparator
,0
,3
或42
等任何数字都大于包含Integer.MAX_VALUE
的任何范围(第3层)范围。击>
经过一番思考之后,我原来的答案是错误的。要满足作者的目标范围[1,2]
,请与[1,2]
或0
不相上下。所以答案是 否 。实际上我的3
规范是正确的,但我对排序顺序的描述是错误的。
顶部和底部的解释也与您不同,原作者解释说&#34;底部“==”我们不知道这可能会带来什么值,“top”==“我们可以选择我们喜欢的任何价值&#34;,如果您对顶部和底部实际的解释都指向相同的事情,我已经知道了。
在这里,你混淆了作者如何定义meet
和top
作为数学结构的一部分,称为&#34; lattice&#34;以及他如何将它们用于实际任务。
本文的内容是有一种算法可以根据&#34;常量分析来分析代码以进行优化。并且该算法建立在所述结构的网格上。该算法基于处理定义的poset的不同对象,并涉及多次查找它们bottom
。引用的答案描述的是如何解释算法产生的最终值,而不是如何定义这些值。
AFAIU算法背后的基本思想如下:我们有一些变量,我们看到了一些分配值的地方。对于各种优化,最好知道在不运行具有所有可能输入的实际代码的情况下变量可以采用的可能值范围。所以建议的算法基于一个简单的想法:如果我们对变量有两个赋值(可能是有条件的),并且在第一个中我们知道值在meet
范围内,而在第二个值中,值在范围{ {1}},我们可以确定现在的值在[L1, R1]
范围内(这实际上是[L2, R2]
在该点阵上的定义方式)。所以现在我们可以分析函数中的所有赋值以及每个赋值范围的可能值。请注意,这种数字结构和无限范围也构成了作者在第一篇文章(http://www.cliffc.org/blog/2012/02/12/too-much-theory/)中描述的格子。
请注意[min(L1, L2), max(R1, R2)]
在Java中实际上是不可能的,因为它提供了一些保证,但在C / C ++中,正如作者所提到的,我们可以拥有一个根本没有分配的变量,在这种情况下C语言标准允许编译器将该变量视为具有编译器选择的任何值 ,即编译器可能会假设对优化最有用的任何内容,这就是meet
所代表的含义。另一方面,如果某个值作为方法的参数出现,那么它是Top
,因为它可以是任何值而没有编译器的任何控制,即编译器不能假设有关该值的任何内容。
在第二篇文章中,作者指出虽然第一篇文章中的格子在理论上在实践中很好,但计算上的效率可能非常低。因此,为了简化计算,他将格子简化为更简单的格子,但一般理论保持不变:我们在每个分配时为变量分配范围,以便稍后我们可以分析代码并对其进行优化。当我们完成所有范围的计算时,优化的解释假设分析的行在Top
中为Bottom
:
if
正在关注
if (variable > 0) {
block#1
}
else {
block#2
}
- 如果代码行可能在假设变量具有某个特定值的情况下进行优化,则编译器可以自由地进行优化。因此在示例中,编译器可以自由地消除该分支,并决定代码将始终转到块#1并完全删除块#2或者确定代码将始终转到块#2并删除块#1,无论哪个替代方案看起来更好编译器。Top
- 即一些常量值x
- 如果可以优化代码行,假设变量的值正好为x
,则编译器可以自由地进行优化。因此,在示例中,编译器可以使用该常量计算x
,并仅保留与计算的布尔值对应的代码分支,从而删除另一个分支。x > 0
- 即从[x, y]
到x
的范围。如果假设变量的值在y
和x
之间,则可以优化代码行,编译器可以自由地进行优化。所以在示例中如果y
(以及x > 0
),则编译器可以删除块#2; y > 0
(以及y <= 0
),然后编译器可以删除块#1;如果x <= 0
和x <= 0
编译器无法优化该代码y > 0
- 编译器无法优化该代码。