turton.cql
; turton.cql can be downloaded
here.
; This example code finds Turtons (including Lloyd-Turton and Brunner-Turton).
;
; At the start of the Turton, there are two line pieces (i.e. Q, R or B).
; Each attack a key square, called the critical square.
;
; We call these two line pieces Front and Side, because they move in different
; directions and because Front will move first.
;
; The idea of the Turton is that instead of the Side piece just moving immediately
; onto the critical square - which would seem natural, as that is where it wants to
; go, first the Front piece crosses the critical square. Only
; after the crossing does the Side piece then move onto the critical square (from
; a different direction).
;
; By doing so, the Front piece and the Side piece from a battery, one that has the
; exact opposite orientation to the battery that would be formed had the Side piece
; moved first, before the Front piece crossed.
;
; Once the battery is formed, it fires: the Side piece, which is now on the
; critical square, moves in a direction OPPOSITE to the direction that the Front piece
; originally moved. By doing so, it is still supported by the Front piece - this
; support is crucial to the theme.
;
; In the code below, we call the Side piece "$side", we call the Front piece
; "$front" and we call the critical square "$criticalsquare".
;
; We call attention to two aspects of the code that may be confusing.
;
; First,
; move from $front
; is represents the square that $front moves to. So
;
; between ($front
; move from $front)
; is the squares between $front and its destination. These are the squares
; to which $criticalsquare is successively bound in order to see if the
; Turton works for that critical square.
;
; Second, the lines:
; {not move from $front or $side}*
; means "0 or move moves by some piece other than $front or $side". That is
; because
; $front or $side
; represents the two squares these pieces are on. The "*" is a wildcard that means
; "repeat 0 or more times"
cql (pgn heijden.pgn)
piece $front in [QRB]
move from $front to _
piece $side in [QRB]
not $front on $side
square $criticalsquare in between ($front
move from $front)
attack ($side $criticalsquare)
next ( move from $front
not ray ($front $criticalsquare $side)
{not move from $front or $side}*
move from $side to $criticalsquare
{not move from $front or $side}*
move from $side
ray ($front $criticalsquare $side)
)