# Array Predicates

This clever idea of Bob Bernecky's [1] provides a performance improvement for certain expressions by marking certain arrays with special properties. For example, the property of being a Permutation Vector [2] is invariant (is still a Permutation Vector, albeit a different one) under various APL primitives such as rotate/reversal (L⌽PV and ⌽PV) and grade up/down (⍋PV and ⍒PV).

Bernecky has defined several array predicate properties, two of which have been implemented in NARS2000 so far.

## Permutation Vectors

In this case, index generator (⍳S) produces a Permutation Vector, as do the grade primitives (⍋V and ⍒V), as well as deal (L?R) when the left and right arguments are the same — the results of these primitives are marked internally as Permutation Vectors. Subsequent use of such arrays maintains that property when operated on by rotate/reversal (L⌽PV and ⌽PV). Moreover, the two grade (⍋PV and ⍒PV) and the index of (PV⍳R) and membership (L∊PV) primitives use a much faster (linear) algorithm than they would normally, given that the lookup argument is a Permutation Vector.

In summary,

Set the bit in the result: ⍳S, ⍋V, ⍒V, and R?R.

Pass on the bit: L⌽PV and ⌽PV.

Read and take advantage of the bit: ⍋PV, ⍒PV, PV⍳R, and L∊PV.

## Example

In the common expression ⍋⍋R, the right hand grade sets the bit and the left hand grade reads it and uses a linear algorithm to produce the result.

## All 2s

Mostly for the Representation primitive (L⊤R), if the left argument is all 2s and the right argument is integer, the result can be represented as Boolean.