systematicmaneuver.cql

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

/*Systematic maneuvers:
 1. At a position X,
 2. there is a set M of at least 4 pieces in X
 3. a pair (r, f) of rank/file offsets, not both 0,
 4. a positive ply increment inc 
 5. a number of repetitions k>=3 such that

 for each i between 1 and k, the position X' that is i*inc plies
 later than X has these properties:
    A. The position of each piece in M in X has been shifted
    by i*r rank and i*f file to get its position in X', and
    B. Each piece not in M in X either does not exist in X' or
       is on the same square in X as in M'
*/       

cql (input hhdbvi.pgn quiet)
function checkmaneuver(inc){
 start=
 firstmaneuver=position positionid+inc
  movers=
       x{
         firstmaneuver:x
         xfirstmaneuver:x}
 movers4 //change this line to get different numbers of movers
 seen=0
 xmovers
   if seen==0{
     deltarank=firstmaneuver:rank x - rank x
     deltafile=firstmaneuver:file x - file x
     seen=1}
   else{
     deltarank==firstmaneuver:rank x - rank x
     deltafile==firstmaneuver:file x - file x
   }
 find 3 100 {
    (positionid - start:positionid)%inc==0
    maneuvernumber=(positionid-start:positionid)/inc
    x{
      if start:x in movers
           {rank x - start:rank x == maneuvernumber * deltarank
	    file x -start:file x == maneuvernumber * deltafile}
      else
          x==start:x}
    if maneuvernumber>0
     ///"Maneuver repeat: " maneuvernumber " starting from: " start
   }//find all
 sort "number of participants" movers
 ///"CQL maneuver found with movers: " movers " and ply increment: " inc
}//checkmaneuver

currinc=2
success=0
loop{
 if checkmaneuver(currinc) success=1
 currinc+=2
 currinc20}
success==1