turton.cql

// Download turton.cql
// PGN output when run on sample.pgn

/*************
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 attacks 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.

A discussion of the code can be found in the documentation for the line filter.
***************/

cql (input hhdbvi.pgn quiet)
 piece Front in move from  [QRB] to _
    piece Side in [QRB] &~Front
     square CriticalSquare in between (Front
                                       move to . from Front){
      CriticalSquare attackedby Side
      comment("Turton with Front: " Front " Side: " Side " critical square: " CriticalSquare)
      line -->  move from Front
                 comment ("Front moves to " Front
		           " crossing critical square "
			   CriticalSquare)
           -->  not xray (Front CriticalSquare Side)
           -->  not move from (Front | Side) *
	   -->  move from Side to CriticalSquare
	          comment ("Side moves to the critical square: " CriticalSquare)
           -->  not move from (Front | Side) *
	   -->  move from Side
	           comment ("Side moves to " Side
		            " while supported by " Front)
	   -->  xray (Front CriticalSquare Side)
     }