# `≺`, `≻`, `≼`, `≽`

Suppose X and Y are positions with the main pgn file. If the position Y is reached from X by making a nonempty sequence of moves in the pgn file, we say that position X is an ancestor of Y and write this as:
`    X≺Y`

In ASCII, we would write `X[<]Y`.

A position is not an ancestor of itself:

`  X≺X`
is always false.

If either X is an ancestor of Y or X is equal to Y, we write

`  X≼Y`

(ASCII: `X[<=]Y`.)

If X is an ancestor of Y then we say that Y is a descendant of X.

The expression

`  Y≻X`

means that Y is a descendant of X. (ASCII: `Y[>]X`).

Naturally,

`  Y≽X`

means that either Y is a descendant of X or Y is equal to X. (ASCII: `Y[>=]X`).

## comparison to <

Recall that if X and Y are positions, then

`  X<Y`
is true if the positionid of X is smaller than the position id of Y.

On the other hand,

`  X≺Y`
is true if X is an ancestor of Y .

The `positionid` of a position is chosen so that any position has a smaller position id than its descendants. Thus, if `X≺Y` is true, then so is `X<Y`.

The converse is not necessarily true however. If `variations` is set in the CQL header, then it might be the case that `X<Y` is true but `X<Y` is false. However, if `variations` is not set in the CQL header, so that only mainline positions are considered, then `<` and `≺` are identical.

# The value of `≺`

The value of the positional relational symbols `≺, ≻, ≼, ≽` follows the precedence and conventions of the other relational symbols.

Thus, if `X≺Y` is true, then its value is equal to `X`.

Similarly,

`  X≺Y≺Z`
has value equal to `X` when the expression is true.