Frame agreement: Difference between revisions
Jump to navigation
Jump to search
(Yikes, didn't mean to create this page yet; it's not really ready for prime time. Not sure yet how to delete it, so here are a bunch of edits.) Tag: Reverted |
Tag: Undo |
||
Line 1: | Line 1: | ||
'''Frame agreement''' is a [[conformability]] rule designed for [[leading axis theory]] and used by [[J]] | '''Frame agreement''' is a [[conformability]] rule designed for [[leading axis theory]] and used by [[J]]. It states that a [[dyadic]] [[function]] can be applied between two [[array]]s only if one of their [[frame]]s, with frame length based on the function's dyadic [[function rank]], is a [[prefix]] of the other. The leading shape of the result is that of the [[argument]] with longer frame. | ||
== Description == | == Description == | ||
A dyadic function <syntaxhighlight lang=j inline>f</syntaxhighlight> with left and right ranks <syntaxhighlight lang=j inline> | A dyadic function <syntaxhighlight lang=j inline>f</syntaxhighlight> with left and right ranks <syntaxhighlight lang=j inline>lr</syntaxhighlight> and <syntaxhighlight lang=j inline>rr</syntaxhighlight>, respectively, splits its left argument <syntaxhighlight lang=j inline>x</syntaxhighlight> into <syntaxhighlight lang=j inline>lf</syntaxhighlight>-[[cell]]s, and splits its right argument <syntaxhighlight lang=j inline>y</syntaxhighlight> into <syntaxhighlight lang=j inline>rf</syntaxhighlight>-cells. Each argument's shape is thus split into a frame and a cell shape. Given that one frame must be a prefix of the other, the prefix (i.e. shorter) frame is called the common frame (denoted here as <syntaxhighlight lang=j inline>cf</syntaxhighlight>), and the suffix of the longer frame relative to the common frame is called the surplus frame (denoted here as <syntaxhighlight lang=j inline>sf</syntaxhighlight>. "Cells" will be used here to denote the <syntaxhighlight lang=j inline>lr</syntaxhighlight>-cells (for the left argument <syntaxhighlight lang=j inline>a</syntaxhighlight>) or the <syntaxhighlight lang=j inline>rr</syntaxhighlight>-cells (for the right argument <syntaxhighlight lang=j inline>b</syntaxhighlight>). If the frames are identical, each cell of <syntaxhighlight lang=j inline>x</syntaxhighlight> is paired with the corresponding cell of <syntaxhighlight lang=j inline>y</syntaxhighlight> in a 1-to-1 pairing. For the case in which the frame lengths differ, we'll denote the shorter-framed argument as <syntaxhighlight lang=j inline>sa</syntaxhighlight> and the longer-framed argument as <syntaxhighlight lang=j inline>la</syntaxhighlight>. Each cell of <syntaxhighlight lang=j inline>sa</syntaxhighlight> is paired with each among the corresponding group of <syntaxhighlight lang=j inline>*/sf</syntaxhighlight> cells of <syntaxhighlight lang=j inline>la</syntaxhighlight>. The collective results among all applications of <syntaxhighlight lang=j inline>f</syntaxhighlight> are framed by the longer frame <syntaxhighlight lang=j inline>lf</syntaxhighlight>. | ||
== Examples == | == Examples == | ||
<syntaxhighlight lang=j> | <syntaxhighlight lang=j> | ||
a=: 3 4 | |||
b=: i.2 3 2 | |||
'lr rr'=: }.+"0 1 b.0 NB. let lv and rv denote the left and right ranks of the verb +"0 1 | |||
lr;rr | |||
┌─┬─┐ | |||
│0│1│ | |||
└─┴─┘ | |||
]af=: (-lr)}.$a NB. a's frame | |||
2 | |||
]bf=: (-rr)}.$b NB. b's frame | |||
2 3 | |||
af =/@(<.&# {.&> ;) bf NB. one frame prefixes the other | |||
1 | |||
]cf=: af {.@(<.&#{.&>;~) bf NB. the common frame (always the shorter of the two frames) | |||
2 | |||
]lf=: af >@(-.@>&# { ;) bf NB. the longer of the two frames | |||
2 3 | |||
]sf=: lf }.~ #cf NB. the surplus frame results from removing the common frame from the left side of longer frame | |||
3 | |||
a +"0 1]b | |||
3 4 | |||
5 6 | |||
7 8 | |||
10 11 | |||
12 13 | |||
14 15 | |||
'A B'=: (<"lr]a),&<(<"rr]b) NB. frame each argument in terms of lr- or rr-cells | |||
A NB. a framed as lr-cells | |||
┌─┬─┐ | |||
│3│4│ | |||
└─┴─┘ | |||
$A | |||
2 | 2 | ||
B NB. b framed as rr-cells | |||
┌───┬───┬─────┐ | |||
│0 1│2 3│4 5 │ | |||
├───┼───┼─────┤ | |||
│6 7│8 9│10 11│ | |||
└───┴───┴─────┘ | |||
$B | |||
2 3 | 2 3 | ||
] | ]pairs=: A([;'+';])&>_1]B NB. each cell of sa is paired with each cell among the corresponding group of (*/sf) cells of la | ||
┌─┬─┬─────┐ | |||
│3│+│0 1 │ | |||
├─┼─┼─────┤ | |||
│3│+│2 3 │ | |||
├─┼─┼─────┤ | |||
│3│+│4 5 │ | |||
└─┴─┴─────┘ | |||
│0 | |||
┌─┬─┬─────┐ | |||
│4│+│6 7 │ | |||
├─┼─┼─────┤ | |||
│4│+│8 9 │ | |||
├─┼─┼─────┤ | |||
│4│+│10 11│ | |||
└─┴─┴─────┘ | |||
A+&>"_1]B NB. the results of all applications of + are framed by lf | |||
3 4 | |||
5 6 | |||
7 8 | 7 8 | ||
10 11 | |||
12 13 | |||
14 15 | |||
pairs -: a ([;'+';])"_1"(-#cf)]b | |||
1 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Works in|[[J]]}} | {{Works in|[[J]]}} | ||
In [[ | In the example above, based on the ranks <syntaxhighlight lang=j inline>0 1</syntaxhighlight> of the verb <syntaxhighlight lang=j inline>+"0 1</syntaxhighlight>, <syntaxhighlight lang=j inline>a</syntaxhighlight>'s frame is <syntaxhighlight lang=j inline>,2</syntaxhighlight> and its cell shape is [[empty array|empty]] (<syntaxhighlight lang=j inline>0$0</syntaxhighlight>); b's frame is <syntaxhighlight lang=j inline>2 3</syntaxhighlight> and its cell shape is <syntaxhighlight lang=j inline>,2</syntaxhighlight>. The shorter of these, and thus the common frame, is <syntaxhighlight lang=j inline>,2</syntaxhighlight>, so each of the two <syntaxhighlight lang=j inline>0$0</syntaxhighlight>-shaped cells (atoms) of <syntaxhighlight lang=j inline>a</syntaxhighlight> is paired with each of the corresponding <syntaxhighlight lang=j inline>6</syntaxhighlight> (i.e. <syntaxhighlight lang=j inline>*/sf</syntaxhighlight>) corresponding <syntaxhighlight lang=j inline>b</syntaxhighlight> cells. | ||
[[Category:Leading axis theory]][[Category:Function characteristics]][[Category:Conformability]]{{APL features}} | [[Category:Leading axis theory]][[Category:Function characteristics]][[Category:Conformability]]{{APL features}} |