回答:
Chess Query Languageはこれを非常にうまく行います。次の短い.cqlファイルはチャームのように機能し、input.pgnですべてのゲームを検索します。このゲームでは、片方が交換(両サイドのポーンの数に差がある)で、4つの直線移動を行います(ルールに従って選択)アウト、たとえば、一連の取引が偶然にルークがマイナーな駒を取っている、または他のそのような一時的な疑似犠牲で始まる状況)
(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
    )
)
ピースには標準のポイント値が使用されるため、:powerdifference [Rr] -5 -5条件は、ブラックがホワイトよりもルークが1つ多いことを意味し:powerdifference [BbNn] 3 3、ホワイトはブラックよりもマイナーなピースが1つ多いことを保証します。:flipcolor最後には逆の役割と同じ検索を行います。デフォルトでは、CQLは、結果のoutput.pgnのゲームに含めることを保証する位置に「MATCH」コメントを挿入するので、交換袋をすばやく見つけることができます。