# flip

`flip` is a transform filter corresponding to the following 8 basic transforms.
• id, the identity
• rotate90: counterclockwise rotation about the board center by 90°
• rotate180: rotation by 180° about the board center
• rotate270: clockwise rotation about the board center by 90°
• reflecth: reflection about the horizontal bisector.
• reflectv: reflection about the vertical bisector.
• reflecta1h8 reflection about the `a1-h8` diagonal.
• reflecth1a8: reflection about the `h1-a8` diagonal.

These are called dihedral transforms because they arise from the rigid transformations of a chessboard into itself.

`flip` is normally called with a single argument filter, F:

`      flip F`

`flip` also accepts an optional `count` parameter. `flip F` matches the current position if any transformation of F by one of the 8 basic transforms above matches the current position.

For example, suppose F is the filter `{Ka1 kh8}`, matching a position in which the white king is on `a1` and the black king is on `h8`. If we transform this filter by reflecth we get the new filter `{Ka8 kh1}`. The filters that results from transforming `{Ka1 kh8}` by all the elements of `flip`, which is to say all the reflections and rotations of the board including the identity, are:

```  {Ka1 kh8}
{Kh1 ka8}
{Ka8 kh1}
{Kh8 ka1}```

The filter `flip {Ka1 kh8}` will thus match a position if any of these four filters match the position, that is, if the kings are on opposite corners in the current position. (This can also be done, much more efficiently, using `k==diagonal 7 K` )

If F is a set filter then so is

`flip F`

in which case its value is the union of the values of each of the sets represented by each transformed version of F.

For example,

`flip a1` is the set `[a1,h1,a8,h8]`.

If F is a numeric filter then so is `flip F` in which case its value is the maximum of the values of all the values of the matching transformed versions of F.

`flip count F`

is a numeric filter whose value is the number of distinct matching transformed versions of F. For example, if the current position is the initial position, then

`flip count find {Qa1 qh8}`

is the number of distinct configurations of the white and black queens on opposite corners that occur in a game. In other words, this is the number of corner squares such that there is some position in the game in which a white queen is on that corner and a black queen on the opposite corner.

The `flip` filter also modifies directions parameters and filters. Thus,

`flip ray up (R K)`

will match if and only if

`ray orthogonal (R K)`

matches.

# Examples

`flip` is used in staircase.cql and staircase-sort.cql , which find staircase maneuvers by the queen. There, a staircase is defined using a particular pair of directions, and `flip` is used to generate all the other directions.