lacny.cql

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

cql(quiet variations)
/*
 3-fold Lacny theme in mate-in-2
 After the key:
     black moves x, y, z
 are mated respectively by
       white moves X, Y, Z
 Set play: After initial null move by white,
      black moves x, y, z
 are mated respectively by
      white moves Z, X, Y

 Each move is represented by the position it leads to.
 Note that many of the compound filters are longer than they appear:
 they sometimes continue on the next line without indentation.
*/

/*
S(other) is true if the move represented by position other
 is the same as the move represented by the current position
*/

function S(other){
   move from . previous == other:move from . previous
   move to . previous == other:move to . previous
}

/*
D(other): shorthand for "not S(other)"
*/

function D(other){
  not S(other)
}

initial start=currentposition wtm
line primary
    --> .
    --> {key=currentposition}
    --> {x=currentposition}
    --> {mate X=currentposition}

key:line firstmatch
         --> . //after the key move
         --> {y=currentposition D(x)}
         --> {mate Y=currentposition D(X) //note: compound filter continues...

key:line   --> .
           --> {z=currentposition D(x) D(y)}
	   --> {mate Z=currentposition D(X) D(Y)

start:line --> move null
           --> {set=currentposition}
	   --> {S(x) set_x=currentposition}
	   --> {mate set_Z=currentposition S(Z)

set:line   --> . //after the set move
	   -->{S(y) set_y=currentposition}
	   -->{mate S(X) set_X=currentposition

set:line   -->.
	   -->{S(z) set_z=currentposition}
	   -->{mate S(Y) set_Y=currentposition

//comments
X:comment("[X]") Y:comment("[Y]") Z:comment("[Z]")
x:comment("[x]") y:comment("[y]") z:comment("[z]")
set_x:comment("[set play: x]") set_y:comment("[set play: y]") set_z:comment("[set play: z]")
set_X:comment("[set play: X]") set_Y:comment("[set play: Y]") set_Z:comment("[set play: Z]")
key:comment("[key]")
}}}}}