`≺`

, `≻`

, `≼`

, `≽`

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:

is always false.X≺X

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

is true if the positionid ofX<Y

*X*is smaller than the position id of

*Y*.

On the other hand,

is true ifX≺Y

*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

is true, then so is *X*≺*Y*

.
*X*<*Y*

The converse is not necessarily true however. If `variations`

is set in the CQL header, then it might be the case that

is true but *X*<*Y*

is false. However, if *X*<*Y*`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

is true, then its value is equal to *X*≺*Y*

.
*X*

Similarly,

has value equal toX≺Y≺Z

*X*

when the expression is true.