# 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 hhdbvi.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{ 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 {rank x - start:rank x == maneuvernumber * deltarank file x -start:file x == maneuvernumber * deltafile} else x==start:x} if maneuvernumber>0 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) success=1 currinc+=2 currinc<=20} success==1