babson.cql

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

/*
This finds "partial Babsons".

A "Babson pair" is a black promotion followed by a white promotion to
the same piece type to which black just promoted. (The white
promotion should be the only refutation of the Black promotion).

We say two Babson pairs are "compatible" if they use the same two
pawns but different piece types to promote to.

The "Babson count" of a position is the size of the largest collection
of compatible Babson pairs in that position.

The "Babson task" is to find a position whose Babson count is 4.

In other words, there is a position in which there is a black pawn X
and white pawn Y such that if X promotes to Q, white refutes by
promoting Y to Q; if X promotes to R white refutes by promoting Y to
R; if X promotes to B then white refutes by promoting Y to B; if X
promotes to a N then white refutes by promoting Y to N.

The Babson task has never been found for a study (it has for problems).

This CQL file sorts games by their Babson count.

The function babsonpair(PieceType) increments the variable
"numberbabsons" whenever the current position has a Babson pair
promoting to Piecetype using pawns "pawn" and "Pawn".
*/

cql(input heijden.pgn variations quiet)

function babsonpair(PieceType){
  if line
       --> move from pawn promote A
       --> {type pawn == PieceType
            comment("promotion to " pawn)
	    move primary // next position should be only refutation
           }
       --> {type Pawn == PieceType
            comment ("responding promotion to " Pawn)}
   then numberbabsons+=1}	    

piece pawn in pa-h2
 piece Pawn in Pa-h7
  sort "Number of Babson pairs"{
    numberbabsons=0
    babsonpair(2) // Knight
    babsonpair(3) // Bishop
    babsonpair(4) // Rook
    babsonpair(5) // Queen
    comment ("Babson theme with " numberbabsons " pairs")
    numberbabsons>=2
}