9

I am looking for a way within any of the common chess packages to search for a specific maneuver, such as a rook capturing a protected. bishop. I've heard of CQL, but have never used it. I am curious if it supports something like this.

Rewan Demontay
  • 16,942
  • 4
  • 65
  • 109
Joe
  • 4,341
  • 2
  • 23
  • 42

1 Answers1

8

Chess Query Language does do this very well. The following short .cql file works like a charm to find all games in input.pgn in which one side is up an exchange (while allowing a difference in the number of pawns for each side) for 4 straight moves (picked so as to rule out, say, situations in which an equal sequence of trades happens to begin with a rook taking a minor piece, or other such temporary pseudo-sacrifices).

(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
    )
)

Standard point values for pieces are used, so the :powerdifference [Rr] -5 -5 condition means that Black has one more rook than White, while :powerdifference [BbNn] 3 3 guarantees that White has exactly one more minor piece than Black. The :flipcolor at the end does the same search with the roles reversed. By default, CQL inserts a "MATCH" comment in the games of the resulting output.pgn at the positions that warrant their inclusion, so you can quickly locate the exchange sacs.

ETD
  • 23,592
  • 4
  • 95
  • 169