Respuestas:
Chess Query Language hace esto muy bien. El siguiente archivo corto .cql funciona a las mil maravillas para encontrar todos los juegos en input.pgn en los que un lado está arriba de un intercambio (al tiempo que permite una diferencia en el número de peones para cada lado) para 4 movimientos consecutivos (elegidos para gobernar por ejemplo, situaciones en las que una secuencia igual de intercambios comienza con una torre que toma una pieza menor u otros pseudo-sacrificios temporales).
(match
:pgn input.pgn
:output output.pgn
(position
:sequence(
(position :powerdifference [Rr] -5 -5 :powerdifference [Qq] 0 0 :powerdifference [BbNn] 3 3)
(position :powerdifference [Rr] -5 -5 :powerdifference [Qq] 0 0 :powerdifference [BbNn] 3 3)
(position :powerdifference [Rr] -5 -5 :powerdifference [Qq] 0 0 :powerdifference [BbNn] 3 3)
(position :powerdifference [Rr] -5 -5 :powerdifference [Qq] 0 0 :powerdifference [BbNn] 3 3)
)
:flipcolor
)
)
Se utilizan valores de puntos estándar para las piezas, por lo que la :powerdifference [Rr] -5 -5
condición significa que el negro tiene una torre más que el blanco, mientras :powerdifference [BbNn] 3 3
que garantiza que el blanco tiene exactamente una pieza menor más que el negro. Al :flipcolor
final realiza la misma búsqueda con los roles invertidos. De manera predeterminada, CQL inserta un comentario "COINCIDIR" en los juegos de la salida resultante.pgn en las posiciones que garantizan su inclusión, para que pueda localizar rápidamente los sacos de intercambio.