Algorithm 进步索引习语中的APL恒等式

Algorithm 进步索引习语中的APL恒等式,algorithm,sorting,apl,Algorithm,Sorting,Apl,成语#1和#5是两个名称相同的词:“递进索引(不替换)”: 这种口是心非的行为背后有什么重要的共同点吗 旁注: 在APL中强调身份是APL从一开始就与众不同的特征之一。APL的创始人肯尼斯·艾弗森说: “同一性是两个不同表达之间的等价物。虽然恒等式通常只被认为是数学分析的工具,但它们可以成为简化和修改定义函数时使用的表达式的重要实用工具。”这些习语有一些共同之处。最后一步是操作索引,它们都使用某种镜像连接策略,也许最重要的是,左右参数的输出都是相同的。这大大简化了对恒等式的搜索,因为我们可以比较

成语#1和#5是两个名称相同的词:“递进索引(不替换)”:

这种口是心非的行为背后有什么重要的共同点吗

旁注:

在APL中强调身份是APL从一开始就与众不同的特征之一。APL的创始人肯尼斯·艾弗森说:


“同一性是两个不同表达之间的等价物。虽然恒等式通常只被认为是数学分析的工具,但它们可以成为简化和修改定义函数时使用的表达式的重要实用工具。”

这些习语有一些共同之处。最后一步是操作索引,它们都使用某种镜像连接策略,也许最重要的是,左右参数的输出都是相同的。这大大简化了对恒等式的搜索,因为我们可以比较#1的右参数和#5的右参数:

另一个可以简化搜索的方法是删除或修改截断输出的任何内容,因为两个参数的输出在不截断的情况下是相同的。成语#1使用
(⍴Y)⍴
将其截断为
Y
,而成语#5中正确参数的长度取决于
Y
的长度⍳⍴Y。在第一种情况下,可以删除截断,在第二种情况下,可以将截断修改为
Y,X

⍋⍋X⍳Y,X                     ⍝ #1
(⍋X⍳Y,X)⍳⍳⍴Y,X              ⍝ #5
假设两个表达式都包含
⍋X⍳Y、 X
,让我们将其分配给变量
a← ⍋X⍳Y、 X
并简化。然而,重要的是要指出,我们现在的恒等式只适用于A是置换向量的情况,我将在后面进一步讨论。同时,我们有这样的身份:

⍋A ←→ A⍳⍳⍴Y,X
⍋A ←→ A⍳⍳⍴Y,X
由于“Y,X”在该表达式中除了提供向量长度外没有任何作用,并且由于该长度等于“A”,因此可以将恒等式简化为其最终形式:

⍋A ←→ A⍳⍳⍴A, where A is a permutation vector
这很有道理。标识左侧的grade up运算符返回索引值,
A
的每个值如果按升序进行分类,将具有这些索引值。右边的index of运算符返回A中的索引,其中
⍳⍴一个
位于。例如:

5 2 1 4 3                   ⍝ A←5 2 1 4 3
3 2 5 4 1                   ⍝ ⍋A

5 2 1 4 3                   ⍝ A←5 2 1 4 3
1 2 3 4 5                   ⍝ ⍳⍴A
3 2 5 4 1                   ⍝ A⍳⍳⍴A
查看最后两行,1在A中的索引为3,2为2,3为5,4为4,最后5为1。这是有道理的,因为根据定义,这基本上就是升级操作符所做的

置换向量

如前所述,该恒等式仅在A是置换向量时有效。肯尼斯·艾弗森(Kenneth Iverson)在其论文《作为思维工具的符号》(Notation as a Tool of Thinking)中定义了一个置换向量:“一个向量P,其元素是其索引的一些置换(即,^/1=+/P)∘.=⍳⍴P) 通过观察一些习语本身,你可以看到这个概念以不同的方式表现出来:

Y[⍋Y]^.=X[⍋X]           #6 permutations of each other 
X^.=⍋⍋X                 #7 test if permutation vector
X[⍋X]^.=⍳⍴X             #29 test if permutation vector
⍋X                      #48 Inverting a permutation 
X⍳⍳⍴X                   #212 Inverting a permutation
^/1=+⌿X∘.=⍳⍴X           #281 test if permutation vector
^/(⍳⍴X)∊X               #454 test if permutation vector
A←⍳⍴X ⋄ A[X]←A ⋄ A      #654 Inverting a permutation 
在习语#7中,表达式的右侧是升序基数习语,我在另一篇文章中讨论了这一习语。在那篇文章中,我谈到了一个事实,即递增运算符在两种状态(秩和索引)之间来回切换,因此我们有以下两个恒等式:

⍋X ←→ ⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋X ...
⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X ...
第二个恒等式可以扩展如下,如果X是惯用语#7确定的置换向量:

X ←→ ⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X …
我们知道,grade up运算符返回从1到参数中值个数的所有数字。再应用两次grade up运算符,您将以相同的顺序得到完全相同的向量。因此,成语#7只是说一个置换向量是一个包含从1到其他值的所有数字的向量,并且只包含一次。(假设将1设置为第一个索引值。)

关于上面的习语列表,另一件有趣的事情是习语#48和#212是答案中讨论的身份的左右两侧:

X ←→ ⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X …
⍋A ←→ A⍳⍳⍴Y,X