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 such that and
 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 heijden.pgn quiet)
function checkmaneuver(inc){
 start=currentposition
 firstmaneuver=position positionid+inc
  movers=
       piece x in [Aa]{
         firstmaneuver:x
         x!=firstmaneuver:x}
 movers>=4 //change this line to get different numbers of movers
 seen=0
 piece all x in movers
   if(seen==0) then{
     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
    piece all x in [Aa]{
      if(start:x in movers) then
           {rank x - start:rank x == maneuvernumber * deltarank
	    file x -start:file x == maneuvernumber * deltafile}
      else
          x==start:x}
    if maneuvernumber>0 then
     comment("Maneuver repeat: " maneuvernumber " starting from: " start)
   }//find all
 sort "number of participants" movers
 comment ("CQL maneuver found with movers: " movers " and ply increment: " inc)
}//checkmaneuver

currinc=2
success=0
loop{
 if checkmaneuver(currinc) then success=1
 currinc+=2
 currinc<=20}
success==1