Respostas:
O Chess Query Language faz isso muito bem. O arquivo .cql curto a seguir funciona como um encanto para encontrar todos os jogos em input.pgn nos quais um lado está em uma troca (enquanto permite uma diferença no número de peões para cada lado) por 4 movimentos retos (escolhidos de acordo com as regras digamos, situações em que uma sequência igual de negociações começa com uma torre pegando uma peça menor ou outros pseudo-sacrifícios temporários).
(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
)
)
São utilizados valores de pontos padrão para peças, portanto, a :powerdifference [Rr] -5 -5
condição significa que o preto tem mais uma torre que o branco, enquanto :powerdifference [BbNn] 3 3
garante que o branco tenha exatamente mais uma peça menor que o preto. O :flipcolor
final faz a mesma pesquisa com os papéis invertidos. Por padrão, o CQL insere um comentário "MATCH" nos jogos do output.pgn resultante nas posições que justificam sua inclusão, para que você possa localizar rapidamente os sacos de troca.