index Zurück zur Hilfe-Übersichthome Zurück zur Homepage

CQL – Die Positionsliste

Das Symbol im Titel einer Schlüsselwortdefinition kennzeichnet, daß dieses Schlüsselwort eine Erweiterung ist, also nicht zum CQL-Standard gehört.

Die Schlüsselwörter :castling, :endgame und :inside sind von Chess Assistant 9 entlehnt worden. Die Beschreibung dieser Schlüsselwörter entstammt dem Dokument The CQL 3.GX Extension .

Einige der Schlüsselwörter können mit einem vorangehenden Ausrufungszeichen negiert werden, dies ist dann eine Kurzschreibweise; z.B. ist

(position !:check)

eine Kurzschreibweise für

(position :not (position :check))

Die Schlüsselwörter :nocheck und :noenpassant werden in CQL-S nicht mehr benötigt – hier werden stattdessen die Ausdrücke !:check bzw. !:enpassant verwendet – aber beim Importieren eines CQL-Skripts erkannt und entsprechend umgeformt.

Index

:accumulate  •:flipvertical  •:matchcount  •:rayorthogonal
:accumulate*  •:forced  •:mate  •:rayvertical
:and  •:gameisover  •:matingmaterial  •:relation
:attackcount  •:gappedsequence  •:maxswapevaluation  •:repetitioncount
:blackcannotwin  •:goodbishop  •:moveevaluation  •:result
:blackelo  •:halfmoveclock  •:movefrom  •:sequence
:btm  •:halfmovenumber  •:movenumber  •:shift
:captureforced  •:initial  •:moveto  •:shiftdiagonal
:castling  •:inside  •:mustcapture  •:shifthorizontal
:check  •:insidevariation  •:noannotate  •:shiftmaindiagonal
:checkcount  •:iscastling  •:nocheck  •:shiftoffdiagonal
:cond  •:ischeck  •:noenpassant  •:shiftvertical
:contactcheck  •:ischess960  •:not  •:skip
:cut  •:iscontactcheck  •:opposition  •:stalemate
:doublecheck  •:isdoublecheck  •:or  •:startposition
:elo  •:isillegal  •:pawncount  •:sumrange
:endgame  •:isinvalid  •:piececount  •:tagmatch
:endgameevaluation  •:ismate  •:pawncountdifference  •:takeslastpiece
:endgameevaluation*  •:isnull  •:piececountdifference  •:terminal
:enpassant  •:isshufflechess  •:power  •:threefoldrepetition
:evaluation  •:isstalemate  •:powerdifference  •:threechecks
:exchangeevaluation  •:kingonthehill  •:pretransformmatchcount  •:variant
:exclude  •:line  •:pretransformrepetitioncount  •:variations
:fen  •:line*  •:promote  •:variationsonly
:flip  •:losing  •:ray  •:whitecannotwin
:flipcolor  •:markall  •:rayattack  •:whiteelo
 •:flipdiagonal  •:match  •:raydiagonal  •:wtm
 •:flipdihedral  •:match  •:rayhorizontal  •:xor
 •:fliphorizontal

Schlüsselwörter für die Kontrolllogik

:and
:cond
:not
:or
:xor

:and (Und)

Erwartet eine Liste von Positionslisten, und filtert genau dann eine Position, wenn jede von ihnen diese Position filtert. Die Argumente werden von links nach rechts ausgewertet.

Beispiel:

(position
  :wtm
  :check
  :and (
    (position e2 g2 :shift :flip)
    (position e2)))

Filtert Positionen in denen die Könige in direkter Opposition stehen, ein Springer auf e2 platziert ist, und der weiße König steht im Schach.

:cond (Bedingte Auswertung)

Dieses Schlüsselwort wird in folgender allgemeinen Form angewandt:

:cond (
  (position <Bedingung1>) (position <Ausdruck1>)
  (position <Bedingung2>) (position <Ausdruck2>)
  ...
  (position <Bedingungk>) (position <Ausdruckk>))

:cond erwartet eine beliebige Anzahl von Argumenten. Jedes Argument <Bedingungi> wird eine Klausel genannt, und jedes Argument <Ausdrucki> ist eine Assoziation. Es werden nacheinander alle Klauseln von links nach rechts ausgewertet, bis eine der Klauseln eine Position filtern würde, dann ist das Resultat des gesamtem Ausdrucks das Resultat der Auswertung der Klausel und der zugehörigen Assoziation. Wenn keine Klausel filtert, dann kann diese Position nicht aufgefunden werden.

Oftmals wird als letztes Paar ein Ausdruck der folgenden Form verwendet:

(position) (position <Ausdruck>)

Die leere Positionsliste filtert jede Position. Dieser letzte Fall kann verkürzt ausgedrückt werden, indem das vorletzte Argument (position) weggelassen wird, dann wird in jedem Fall das Resultat des letzten Ausdrucks gewertet, wenn alle zuvorigen Klauseln nicht erfüllt werden.

Tatsächlich ist das Schlüsselwort :cond nicht redundant, denn die folgende Umformumg mit :or ist nicht in allen Fällen äquivalent (die Verwendung von :cut, :exclude oder :skip durchbricht die Äquivalenz):

(position :or (
  (position <Bedingung1> <Ausdruck1>)
  (position <Bedingung2> <Ausdruck2>)
  ...
  (position <Bedingungk> <Ausdruckk>)))

Zudem wird der :cond-Ausdruck teilweise wesentlich effizienter ausgeführt (beachte beispielsweise den Fall, das <Bedingung1> erfüllt wird, aber nicht <Ausdruck1>, dann wird der :or-Ausdruck mit der nächsten Liste fortgesetzt, während der :cond-Ausdruck sofort das Resultat von <Ausdruck1> liefert).

Jedoch ist mit der :or-Umformung ersichtlich, warum :cond beim Filtern sowohl die Klausel als auch die Assoziation verwendet, um die gefundene Position zu markieren (auch dies unterscheidet sich vom umgeformten Ausdruck mit :or). Dazu ein simples Beispiel zur Erläuterung:

(match
  (position :cond (
    (position e7) (position e2))))

Steht auf den Feldern e7 ein weißer Bauer, und ein schwarzer Bauer auf dem Feld e2, dann werden in einer gefundenen Partie sowohl das Feld e7 als auch das Feld e2 markiert.

Für ein reelles Beispiel für die Anwendung von :cond siehe bei :exclude.

:not (Nicht)

Dieses Schlüsselwort kann in zwei Formen angewandt werden: entweder ist es parameterlos, oder es hat eine Positionsliste als Parameter. Im ersten Fall filtert dieses Schlüsselwort, wenn die Positionsliste ohne dieses Schlüsselwort nicht filtern würde. Im zweiten Fall: das Resultat des Arguments wird negiert. Die erste Form ist konform mit dem CQL-Standard des Schlüsselwortes :not, die zweite Form ist eine Erweiterung.

Beispiele:

(position
  ; wir suchen für beide Seiten
  :flipcolor
  ; die Mattposition muß alle folgenden Kriterien erfüllen
  :and (
    ; der König ist von Leerfeldern umgeben, wird einmal
    ; attackiert, und ist matt
    (position
      :attackcount  . 8
      :attackcount   1
      :mate
      :btm)
    ; überprüfe daß kein Nachbar des schwarzen Königs
    ; mehr als einmal attackiert wird
    (position
      :not
      :attackcount  .e4 1
      :attackcount  .e4 >=2
      :shift)))

Dies findet alle Idealmatts: Studien in denen der König von Leerfeldern umgeben ist und genau einmal angegriffen wird, so daß er auf einem Nachbarsfeld ebenfalls genau einmal angegriffen wäre.

Die folgende Positionsliste

(position a3 :not)

ist äquivalent zu

(position [.]a3)

Hier ist die einfachere Schreibweise mit :not vorzuziehen.

:or (Oder)

Erwartet eine Liste von Positionslisten, und filter genau dann eine Position, wenn mindestens eine von ihnen diese Position filtert. Die Argumente werden von links nach rechts ausgewertet.

Beispiel:

(position
  :or (
    (position :piececount ? 2)
    (position :piececount ? 2)
    (position :piececount ? 2)
    (position :piececount ? 2)))

Suche nach Partien, die Positionen mit zwei gleichfarbigen Läufern auf einer Seite beinhalten.

:xor (Exklusives Oder)

Erwartet eine Liste von Positionslisten und filtert nur dann eine Position, wenn genau eine von ihnen diese Position filtert. Die Argumente werden von links nach rechts ausgewertet.

Beispiel:

(position :xor ((position ?) (position ?)))

Findet Positionen auf, in denen Weiß entweder einen weißfeldrigen Läufer, oder einen schwarzfeldrigen Läufer hat, aber nicht beides.

Einfache Schlüsselwörter

:blackcannotwin  •:kingonthehill
:btm  •:losing
:castling  •:mate
:check  •:matingmaterial
:contactcheck  •:mustcapture
:catureforced  •:nocheck
:doublecheck  •:stalemate
:endgame  •:terminal
:fen  •:threefoldrepetition
:gameisover  •:threechecks
:halfmoveclock  •:variations
:initial  •:variationsonly
:insidevariation  •:whitecannotwin
 •:ispromotedpiece  •:wtm

:blackcannotwin (Schwarz kann nicht gewinnen)

Filtere nur dann wenn der schwarze Spieler keine Gewinnmöglichkeit mehr hat.

Normalerweise ist dies äquivalent zu folgender Abfrage:

:or (
  ; nur schwarzer König
  (:piececount  1)
  ; nur schwarzer König und schwarze Leichtfigur
  (:piececount  2 :piececount  1))

In der Schachform Dreimal-Schach filtert die Suche mit :blackcannotwin nur dann, wenn Schwarz nur noch den König besitzt, und in allen anderen Schachformen hat dieses Schlüsselwort keine Bedeutung und ist immer erfolglos.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:blackcannotwin)

Filtere alle Positionen, in denen Schwarz (theoretisch) noch Gewinnmöglichkeiten hat.

Siehe auch: :whitecannotwin.

:btm (Schwarz am Zug)

Filtere nur wenn Schwarz am Zug ist.

Siehe auch: :wtm.

:check (Schachgebot)

Eine Seite befindet sich im Schach. Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:check)

Keine Seite befindet sich im Schach.

Siehe auch: :ischeck, :contactcheck, :doublecheck.

:castling (Rochade)

Dieses Schlüsselwort spezifiziert die Rochademöglichkeiten beider Seiten. Es erwartet als Argument einen Figurenartbezeichner, wobei die Figurenarten folgende Bedeutung haben:

  • Weiß besitzt das Recht zur kurzen Rochade.
    Weiß besitzt das Recht zur langen Rochade.
    Schwarz besitzt das Recht zur kurzen Rochade.
    Schwarz besitzt das Recht zur langen Rochade.

Beispiele:

(position :castling )

Weiß hast das Recht zu kurzen Rochade.

(position :castling [])

Weiß has das Recht entweder für die kurze oder für die lange Rochade (aber nicht für beide).

(position :castling :castling )

Weiß hat das Recht für kurze und lange Rochade.

Siehe auch: :iscastling,

:contactcheck (Kontaktschachgebot)

Eine Seite befindet sich im Schach, und es ist ein Kontaktschachgebot (kein Zwischensetzen einer Figur möglich, auch nicht theoretisch). Dies beinhaltet Springerschachgebote sowie Doppelschachgebote.

Dies ist äquivalent zu:

(position
  :check ; um Schlagschachpartien auszufiltern
  :or (
    (position :doublecheck)
    (position :attackcount []  1 :flipcolor)
    (position []d4 [c4,e4,d3,d5] :flipcolor :shift)
    (position []d4 [c3,c5,e3,e5] :flipcolor :shift)))

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:contactcheck)

Keine Seite befindet sich im Schach, oder aber es ist kein Kontaktschachgebot.

Siehe auch: :iscontactcheck, :check, :doublecheck.

:doublecheck (Doppelschachgebot)

Eine Seite befindet sich im Schach, und es ist ein Doppelschachgebot.

Tatsächlich ist dies eine Kurzschreibweise für:

(position
  :check ; um Schlagschachpartien auszufiltern
  :attackcount   2
  :flipcolor)

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:doublecheck)

Filtere alle Positionen, in denen keine Seite ein Doppelschachgebot erhalten hat.

Siehe auch: :isdoublecheck, :check, :contactcheck.

:endgame (Endspiel)

Die Position ist eine Endspielposition. Dieses Schlüsselwort ist äquivalent zur folgenden Abfrage:

  (position
    :or (
      (position
        :piececount [] 0
        :piececount [] 0 3
        :piececount [] 0 3)
      (position
        :piececount  1
        :piececount  1
        :piececount [] 0
        :piececount  0 1
        :piececount  0 1)
      (position
        :piececount  1
        :piececount  0
        :piececount  0 1
        :piececount  0
        :power [] 0 16
        :flipcolor)))

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:endgame)

Filtere alle Positionen, in denen keine Endspielstellung vorliegt.

:fen 

Die Position ist identisch zur beschriebenen Stellung im Argument. Dieses Argument muß eine gültige FEN (Forsyth-Edwards-Notation) sein.

Beispiel:

(position
  :fen "rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2")

Bezeichnet die Grundstellung des französischen Abspiels, die normalerweise mit der Zugfolge 1.e4 e6 2.d4 d5 erreicht wird.

Siehe auch: :line*.

:gameisover 

Dies ist eine Kurzschreibweise für:

  :or (
    (position :mate)
    (position :stalemate)
    (position :losing)           ; Schlagschach
    (position :threechecks)      ; Dreimal-Schach
    (position :kingonthehill)    ; König-auf-dem-Hügel
    (position !:matingmaterial))

Zu beachten ist das unerwartete Resultate erfolgen können, wenn die Suche Untervarianten mit einschließt.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden.

Beispiele:

(position :gameisover)

Filtere alle Partien die in einer Stellung enden, die nicht mehr weitergespielt werden kann.

(position !:gameisover)

Filtert alle Positionen, die (aus Sicht der Schachregeln) noch weitergespielt werden können.

:halfmoveclock (Halbzugzähler)

Dieses Schlüsselwort filtert Positionen, in denen der Halbzugzähler innerhalb der gegebenen Bereichsangabe liegt. Innerhalb von Untervarianten hat dieses Schlüsselwort keine Wirkung und wird immer erfüllt.

Halbzugzähler: Das ist die Anzahl der Halbzüge seit dem letzten Zug, in dem ein Bauer zog oder eine Figur geschlagen wurde. Dieser Zähler entscheidet auch, ob eine Seite ein Remis reklamieren kann aufgrund der 50-Züge-Regel.

Beispiel:

(position :halfmoveclock <=30)

Schließe alle Positionen aus, in denen in mehr als 30 Halbzügen (15 Züge auf jeder Seite) kein Bauernzug erfolgte und auch kein Stein geschlagen wurde.

(position :halfmoveclock 100 !:terminal)

Finde alle Positionen in denen die Seite am Zug aufgrund der 50-Züge-Regel Remis hätte reklamieren könnte, es aber nicht tat.

:initial (Startposition)

Dies ist die erste Position in der Partie (vor dem ersten Zug). Tatsächlich ist dies nur eine andere Schreibweise für:

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:initial)

Filtere alle Positionen außer der ersten Position in der Partie.

Siehe auch: :halfmovenumber, :terminal.

:insidevariation (Innerhalb einer Untervariante)

Dieses Schlüsselwort filtert genau dann, wenn eine Position in einer Untervariante aufgefunden wird. Dies kann niemals geschehen, wenn nicht mit :variations die Suche in Untervarianten zugelassen wird.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:insidevariation)

Diese Position wird nicht in einer Untervariante vorgefunden.

Siehe auch: :variations.

:kingonthehill (König auf dem Hügel)

Dieses Schlüsselwort hat nur in der Schachform König-auf-dem-Hügel eine Bedeutung und filtert alle Endstellungen, in denen ein König eines der Zentralfelder (d4,e4,d5,e5) erreicht hat. In allen anderen Schachformen wird dieses Schlüsselwort niemals erfüllt.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden.

Anmerkung: Der offizielle Name dieser Schachform (im Englischen) ist zwar King-of-the-Hill, nach Ansicht des Autors sollte sie aber King-on-the-Hill benannt werden, denn das Spiel endet, sobald eben ein König den Hügel erreichte.

:losing (Verlust)

Filtere nur Endstellungen, in denen eine der Seiten alle Figuren verlor. Dies ist nur in der Schachformen Schlagschach möglich.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:losing)

Filtere nur Stellungen, in denen keine der Seiten alle Figuren verlor.

:mate (Schachmatt)

Filtere nur dann, wenn es eine Mattstellung ist.

annotation Wenn nach Mattstellungen gesucht wird, dann sollte stets auch dieses Schlüsselwort mitverwendet werden auch wenn es aufgrund anderer Bedingungen überflüssig erscheint, denn es beschleunigt die Suche (nur Endstellungen werden geprüft).

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:mate)

Schließe alle Mattstellungen aus.

Ein weiteres Beispiel:

(position :mate :movenumber 1 20)

Filtere nur dann wenn eine Seite in den ersten 20 Zügen mattgesetzt wurde.

Siehe auch: :ismate,

:matingmaterial (Mattmaterial)

Filtere Positionen, in denen einer der Spieler noch über Mattmaterial verfügt. In der Schachform Dreimal-Schach filtert die Suche mit :matingmaterial nur dann, solange nicht nur noch Könige auf dem Schachbrett sind, und in allen anderen Schachformen (außer Dreimal-Schach und Normalschach) hat dieses Schlüsselwort keine Bedeutung und ist immer erfolgreich.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:matingmaterial)

Filtere Positionen, in denen keiner der Spieler noch über Mattmaterial verfügt. Normalerweise ist dies äquivalent zur folgenden Abfrage:

:or (
  ; König gegen König
  (position :piececount  2)
  ; König und Leichtfigur gegen König
  (position :piececount  3 :piececount [] 1)
  ; König and Läufer gegen König und Läufer,
  ; beide Läufer entweder weiß- oder schwarzfeldrig
  (position :piececount  4 :piececount []? 2)
  (position :piececount  4 :piececount []? 2))

Die negierte Form ist in allen anderen Schachformen als Dreimal-Schach immer erfolglos.

:mustcapture (Schlagzwang)

In dieser Stellung ist die Seite am Zug verpflichtet eine Figur zu schlagen (was auch heißt, daß in dieser Stellung eine Figur geschlagen werden kann). Dieses Schlüsselwort ist für die Schachform Schlagschach vorgesehen, und wird in anderen Schachform niemals erfüllt.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:mustcapture)

In dieser Stellung ist die Seite am Zug nicht verpflichtet eine Figur zu schlagen (was auch heißt, das keine geschlagen werden kann). Diese Bedingung wird für alle anderen Schachformen (als Schlagschach) immer erfüllt.

Siehe auch: :mustcapture,

:nocheck (Kein Schachgebot)

Dieses Schlüsselwort ist veraltet und sollte nicht mehr verwendet werden, es wird nur aus Kompatibilitätsgründen zu CQL unterstützt. Es hat die gleiche Bedeutung wie !:check.

:stalemate (Patt)

Filtert nur Pattstellungen.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:stalemate)

Filtere nur Positionen in denen niemand patt ist.

Siehe auch: :isstalemate,

:terminal (Endstellung)

Dies ist die letzte Position in der Partie (nach dem letzten Zug). Tatsächlich ist dies nur eine andere Schreibweise für:

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:terminal)

Dies ist nicht die letzte Position in der Partie.

Siehe auch: :halfmovenumber,:initial.

:threefoldrepetition (Dreifache Stellungswiederholung)

Filtere die erste Position in der Hauptvariante, die zum dritten Mal in der Partie wiederholt wurden, mit der gleichen Seite am Zug, und den gleichen Rochade- und en-passant-Rechten. Diese Wiederholung muß nicht aufeinanderfolgen. Dies stimmt mit der FIDE-Regelung der Stellungswiederholung  überein.

Innerhalb von Untervarianten hat dieses Schlüsselwort keine Wirkung und ist immer erfolglos.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:threefoldrepetition)

Filtere nur Positionen, in denen keine dreifache Stellungswiederholung aufgetreten ist. Soll keine Positionen mehr aufgefunden werden nachdem eine dreifache Zugwiederholung stattgefunden hat, so wird dies mit :cut realisiert:

(position :threefoldrepetition :cut)

:threechecks (Drittes Schach)

Dieses Schlüsselwort hat nur in der Schachform Dreimal-Schach eine Bedutung und filtert alle Endstellungen, in denen einem König zum dritten Mal Schach geboten wurde. In allen anderen Schachformen wird dieses Schlüsselwort niemals erfüllt. Somit ist dieses Schlüsselwort nicht identisch zu

denn obiger Ausdruck kann auch in anderen Schachformen erfüllt werden.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden.

:variations (Varianten)

Ziehe die Untervarianten in die Suche mit ein. Ohne diese Angabe werden die Untervarianten bei der Suche ausgelassen.

:variationsonly (Nur die Varianten)

Suche nur in den Untervarianten, nicht in der Hauptvariante.

:whitecannotwin (Weiß kann nicht gewinnen)

Filtert nur dann wenn Weiß keine Gewinnmöglichkeit mehr hat.

Normalerweise ist dies äquivalent zur folgenden Abfrage:

:or (
  ; nur weißer König
  (position :piececount  1)
  ; nur weißer König und weiße Leichtfigur
  (position :piececount  2 :piececount  1))

In der Schachform Dreimal-Schach filtert die Suche mit :whitecannotwin nur dann, wenn Weiß nur noch den König besitzt, und in allen anderen Schachformen hat dieses Schlüsselwort keine Bedeutung und ist immer erfolglos.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:whitecannotwin)

Filtere alle Positionen, in denen Weiß noch Gewinnmöglichkeiten hat (wenn vielleicht auch nur theoretisch).

Siehe auch: :blackcannotwin.

:wtm (Weiß am Zug)

Filtert nur wenn Weiß am Zug ist.

Transformierende Schlüsselwörter

:flip
:flipcolor
:flipdiagonal
:flipdihedral
:fliphorizontal
:flipvertical
:inside
:shift
:shiftdiagonal
:shifthorizontal
:shiftmaindiagonal
:shiftoffdiagonal
:shiftvertical

:flip (Spiegelung)

Dies ist identisch zu :flipdihedral (⇒ Transformationen).

:flipcolor (Farbwechsel)

Diese Farbwechseltransformation bewirkt zwei Transformationen: zum einen eine Spiegelung an der vertikalen Halbierungslinie des Schachbretts (⇒ Transformationen), zum anderen einen Austausch der Farben; aus Weiß wird Schwarz, und aus Schwarz wird Weiß. Diese Farbwechseltransformation wirkt sich nicht auf die Suchliste (match ...) aus (dafür gibt es :eithercolor : match).

:flipdiagonal (Diagonale Spiegelung)

Die diagonale und gegendiagonale Spiegelungstransformation (⇒ Transformationen).

:flipdihedral (Diedrische Transformation)

Die diedrische Transformation (⇒ Transformationen).

:fliphorizontal (Horizontale Spiegelung)

Die horizontale Spiegelungstransformation (⇒ Transformationen).

:flipvertical (Vertikale Spiegelung)

Die vertikale Spiegelungstransformation (⇒ Transformationen).

:inside (Innerhalb)

Dieses Schlüsselwort filtert Translationen, bei denen die involvierten Figuren innerhalb einer bestimmten Region auf dem Schachbrett verbleiben. Es werden zwei Argumente erwartet, ein Figurenbezeichner und ein Felderbezeichner. Jegliche Translation beinflußt nur das erste Argument. Eine Translation wird von der :inside-Beschränkung gefiltert, wenn mindestens eine Figur, die mit dem ersten Argument bezeichnet wird (wobei die Transformation mit einbezogen ist), auf einem Feld steht, das vom zweiten Argument bezeichnet wird.

Die nachfolgenden Beispiele dienen nur zur Demonstration, zur Trippelbauernsuche sollte das Schlüsselwort :pawncount eingesetzt werden.

Wir formulieren die folgende Abfrage um Trippelbauern aufzufinden:

(position
  :piececount [b2-7] 3
  :shifthorizontal)

Um Trippelbauern auf der Hauptdiagonalen (a1-h8) aufzufinden, erweitern wir diese Abfrage:

(position
  :inside [b2-7] [b2,c3,d4,e5,f6,g7]
  :piececount [b2-7] 3
  :shifthorizontal)

:shift (Translation)

Die Translation (⇒ Transformationen).

:shiftdiagonal (Diagonale Translation)

Die hauptdiagonale und gegendiagonale Translation (⇒ Transformationen).

:shifthorizontal (Horizontale Translation)

Die horizontale Translation (⇒ Transformationen).

:shiftmaindiagonal (Hauptdiagonale Translation)

Die hauptdiagonale Translation (⇒ Transformationen).

:shiftoffdiagonal (Gegendiagonale Translation)

Die gegendiagonale Translation (⇒ Transformationen).

:shiftvertical (Vertikale Translation)

Die vertikale Translation (⇒ Transformationen).

Schlüsselwörter für die Figurenanalyse

:attackcount
:goodbishop
:opposition
:pawncount
:pawncountdifference
:piececount
:piececountdifference
:power
:powerdifference
:ray
:rayattack
:raydiagonal
:rayhorizontal
:rayorthogonal
:rayvertical

:attackcount (Angriffszähler)

Dieses Schlüsselwort erwartet als Argumente zwei Figurenbezeichner, gefolgt von einer Bereichsangabe. Der erste ist der Figurenbezeichner der attackierenden Figuren, der zweite ist der Figurenbezeichner der angegriffenen Figuren. Ein Angriff einer Figur auf ein Feld liegt vor, wenn die bezeichnete Figur auf dieses Feld ziehen kann. :attackcount zählt alle gültigen Züge (Angriffe), deren Ausgangsfeld vom ersten Argument bezeichnet wird, und deren Zielfeld vom zweiten Argument bezeichnet wird.

Das Schlüsselwort :attackcount filtert eine Position, wenn die Gesamtzahl aller gültigen Angriffe in dieser Position innerhalb der gegebenen Bereichsangabe liegt.

Beispiele:

(position :attackcount 2)

Filtert jede Position mit einem Doppelangriff weißer Figuren auf den schwarzen König (jedoch sollte für diese Abfrage :doublecheck in Verbindung mit :btm vorgezogen werden).

(position :attackcount 2 :flipcolor)

Filtert jede Position mit einem Doppelangriff auf einen König (auch hier sollte :doublecheck vorgezogen werden).

(position :attackcount .h3 1)

Filtert eine Position, in der genau eine weiße Figur auf das freie Feld h3 ziehen kann.

(position :attackcount [][a-c8] ??1 5 9)

Filtert eine Position, in der die Anzahl der Möglichkeiten, daß ein weißer Turm oder ein weißer Läufer auf den Feldern a8, b8, oder c8 auf ein Feld der ersten Reihe ziehen kann, zwischen 5 und 9 liegt (inklusive).

(position :attackcount [] >=3)

Filtert eine Position, in der es genau drei Möglichkeiten gibt, daß ein schwarzer Springer den weißen König oder eine weiße Schwerfigur attackiert.

(position :attackcount [] ? 0)

Beide Könige können in dieser Position nicht ziehen.

(position :attackcount ??8 0)

Keine weiße Figur kann in dieser Position auf die schwarze Grundreihe ziehen.

(position :attackcount ? 1)

In dieser Position gibt es nur einen möglichen Zug. Allerdings sollte zu diesem Zweck :forced verwendet werden.

(position :attackcount [][+] . 0)

In dieser Position kann kein Springer eingesetzt werden (Einsetzschach, Tandemschach).

:goodbishop (Guter Läufer?)

Filtert Positionen mit mindestens einem Läufer, der als gut bzw. als schlecht eingestuft wurde. :goodbishop erwartet als Argumente zuerst einen Figurenbezeichner, bei dem nur Läufer als Figuren erlaubt sind. Dann folgen entweder zwei Bereichsangaben oder zwei prozentuale Angaben. Die erste Bereichsangabe ist die Anzahl bzw. der prozentuale Anteil der gegnerischen Bauern, die von diesem Läufer angreifbar sind – wobei sich die prozentuale Angabe auf die Anzahl der gegnerischen Bauern bezieht – und die zweite Bereichsangabe ist die Anzahl bzw. der prozentuale Anteil der eigenen Bauern, die den Läufer nicht blockieren – wobei sich hier die prozentuale Angabe auf die Anzahl eigener Bauern bezieht. Alle Bereichsangaben werden für jeden gefundenen Läufer einzeln geprüft. Die beiden Bereichsangaben müssen durch das Trennzeichen : abgetrennt werden.

Beispiele:

(position :goodbishop [?] >50% : >50%)

Weiß hat mindestens einen guten schwarzfeldrigen Läufer, denn mehr als 50% der gegnerischen Bauern stehen auf einem schwarzen Feld (und sind somit für ihn angreifbar), und mehr als 50% der eigenen Bauern stehen auf einem weißen Feld (und blockieren somit nicht diesen Läufer).

(position :goodbishop >50% : >50%)

Weiß hat mindestens einen guten Läufer.

(position :goodbishop [] <=30% : <=20%)

Eine der Parteien hat einen sehr schlechten Läufer.

:opposition (Opposition)

Dieses Schlüsselwort filtert alle Positionen, in denen der König in Opposition zum anderen König steht. Als optionales Argument kann ein Figurenartbezeichner mitgegeben werden, wobei die Figurenarten folgende Bedeutung haben:

  • Der weiße König steht in Opposition zum schwarzen König.
    Der schwarze König steht in Opposition zum weißen König.

Ist keine Figurenart gegeben, dann wird berechnet, ob der König der Seite mit dem Zugrecht in Opposition zum anderen König steht.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden, dann werden die Positionen gefiltert, in denen der König nicht in Oppositin steht.

Die Anwendung dieses Schlüsselwortes ist nur in bestimmten Endspielsituationen sinnvoll, um zu überprüfen, ob z.B. der König wieder in Opposition ist. Es wird mit einer rein formalen Berechnung über den Abstand der Könige unter Einbeziehung des Zugrechts über die Opposition entschieden. Andere Figuren auf dem Brett, selbst Schachgebote, werden nicht in dieser Berechnung berücksichtigt. So würde das folgende Beispiel sogar bereits die Grundstellung filtern:

(position :opposition )

:pawncount (Bauernzählung)

:pawncount dient zur Zählung von Bauernstrukturen, bzw. von Bauerneigenschaften. Das erste Argument ist ein Figurenbezeichner, der nur Bauern enthalten darf, gefolgt von einer bindestrich-separierten Aufzählung von Eigenschaften, und als letztes Argument wird entweder eine Bereichsangabe oder eine prozentuale Angabe erwartet. Die prozentuale Angabe bezieht sich immer auf die gesamte Anzahl der Bauern auf dem Brett, die die Farbe der Bauern im Figurenbezeichner besitzen. Dieses Schlüsselwort filtert genau dann, wenn die Zählung von Bauernvorkommen mit allen der genannten Eigenschaften innerhalb des gegebenen Bereichs liegt.

Die unterstützen Bauerneigenschaften bzw. Bauernstruktureigenschaften sind:

single Einzelbauern: Zähle alle Bauern einer Farbe.
single! Einzelbauern: Zähle alle Linien, auf denen nur ein Bauer einer Farbe steht (ohne die gegnerische Farbe zu beachten).
double Doppelbauern: Zähle alle Bauern einer Farbe auf einer Linie, wenn sich mindestens zwei Bauern dieser Farbe auf dieser Linie befinden.
double! Doppelbauern (exakt): Zähle zwei Bauern einer Farbe auf einer Linie, wenn sich dort genau zwei Bauern dieser Farbe auf dieser Linie befinden.
triple Trippelbauern: Zähle alle Bauern einer Farbe auf einer Linie, wenn sich mindestens zwei Bauern dieser Farbe auf dieser Linie befinden.
triple! Trippelbauern (exakt): Zähle drei Bauern einer Farbe auf einer Linie, wenn sich dort genau drei Bauern dieser Farbe auf dieser Linie befinden.
triple(n) Zähle alle Bauern einer Farbe auf einer Linie, wenn sich mindestens n Bauern dieser Farbe auf dieser Linie befinden.
triple!(n) Zähle n Bauern einer Farbe auf einer Linie, wenn sich dort genau n Bauern dieser Farbe auf dieser Linie befinden.
uno Einzelbauern: Zähle alle Bauern einer Farbe. (dies ist äquivalent zu single).
uno! Einzelbauern: Zähle alle Reihen, auf denen nur ein Bauer einer Farbe steht (ohne die gegnerische Farbe zu beachten).
duo Bauernduo: Zähle alle Bauern einer Farbe auf einer Reihe, wenn sich mindestens zwei Bauern dieser Farbe auf dieser Reihe befinden.
duo! Bauernduo (exakt): Zähle zwei Bauern einer Farbe auf einer Reihe, wenn sich dort genau zwei Bauern dieser Farbe auf dieser Reihe befinden.
trio Bauerntrio: Zähle alle Bauern einer Farbe auf einer Reihe, wenn sich mindestens drei Bauern dieser Farbe auf dieser Reihe befinden.
trio! Bauerntrio (exakt): Zähle drei Bauern einer Farbe auf einer Reihe, wenn sich dort genau drei Bauern dieser Farbe auf dieser Reihe befinden.
quart Bauernquart: Zähle alle Bauern einer Farbe auf einer Reihe, wenn sich mindestens vier Bauern dieser Farbe auf dieser Reihe befinden.
quart! Bauernquart (exakt): eZähle vier Bauern einer Farbe auf einer Reihe, wenn sich dort genau vier Bauern dieser Farbe auf dieser Reihe befinden.
quart(n) Bauern verbunden in einer Reihe: es werden alle verbundenen Bauern auf einer Reihe gezählt, wenn mindestens n Bauern zu diesem Verbund gehören.
quart!(n) Bauern verbunden in einer Reihe (exakt): es werden alle verbundenen Bauern auf einer Reihe gezählt, wenn genau n Bauern zu diesem Verbund gehören.
connected Verbundene Bauern: es werden alle Bauern gezählt, die einen Bauern der gleichen Farbe auf einer benachbarten Linie haben.
integrated Integrierte Bauern: es werden alle Bauern gezählt, die auf allen Nachbarslinien Bauern der gleichen Farbe haben.
isolated Isolierte Bauern (Isolani): es werden alle Bauern gezählt, die keinen Bauern gleicher Farbe auf einer benachbarten Linie haben.
halfisolated Halb-isolierte Bauern: es werden alle Bauern gezählt, die auf einer benachbarten Linie mindstens einen gleichfarbigen Bauern haben, aber keinen auf der anderen benachbarten Linie. Ein Randbauer kann niemals halb-isoliert sein.
defended Verteidigte Bauern: es werden alle Bauern gezählt, die von einem Bauern der gleichen Farbe gedeckt werden (auch wenn sie nicht angegriffen sind).
defender Verteidigende Bauern: es werden alle Bauern gezählt, die einen Bauern der gleichen Farbe decken (auch wenn der gedeckte Bauer nicht angegriffen ist).
chained Bauernkette: es werden alle Bauern gezählt, die sich mit gleichfarbigen Bauern auf einer Schräge befinden (sie sind verbunden, und bis auf den hintersten sind alle gedeckt).
chained(n) Bauernkette: es werden alle Bauern gezählt, die sich mit gleichfarbigen Bauern auf einer Schräge befinden (sie sind verbunden, und bis auf den hintersten sind alle gedeckt), aber nur wenn sich in diesem Verbund mindestens n Bauern befinden.
chained!(n) Bauernkette: es werden alle Bauern gezählt, die sich mit gleichfarbigen Bauern auf einer Schräge befinden (sie sind verbunden, und bis auf den hintersten sind alle gedeckt), aber nur wenn sich in diesem Verbund genau n Bauern befinden.
passed Freibauern: es werden alle Bauern gezählt, die keinen gegnerischen Bauer auf der gleichen Linie vor sich haben, und von keinem gegnerischen Bauern auf einer benachbarten Linie gestoppt werden können.
candidate Kandidaten: es werden alle Bauern gezählt, die keinen gegnerischen Bauer auf der gleichen Linie vor sich haben, und wenn die Anzahl der gleichfarbigen Bauern seitlich des Bauern bzw. hinter dem Bauern auf benachbarten Linien mindestens so groß ist wie die Anzahl der andersfarbigen Bauern auf den benachbarten Linien in der Vowärtsrichtung (somit ein Kanditat für einen Freibauern). Freibauern (d.h. Bauern die keinen andersfarbigen Bauern auf den Nachbarslinien begegnen) werden auch als Kandidat gezählt.
candidate! Kandidaten: Ein Kandidat für einen Freibauern, der jedoch noch kein Freibauer ist.
blocked Blockierte Bauern: zählt alle Bauern, denen auf der gleichen Linie ein gegnerischer Bauer gegenübersteht.
blocked! Blockierte Bauern (unmittelbar): zählt alle Bauern, denen unmittelbar ein Bauer gegenübersteht.
behind Bauern hinter dem Feind: zählt alle Bauern, die hinter dem hintersten gegenerischen Bauer auf der gleichen Linie stehen. Z.B. kann ein weißer Bauer c7 hinter einem schwarzen Bauer c5 stehen, wenn auch entfernt.
behind! Bauern unmittelbar hinter dem Feind: zählt alle Bauern, die unmittelbar hinter dem hintersten gegenerischen Bauer auf der gleichen Linie stehen. Z.B. kann ein weißer Bauer c7 unmittelbar hinter einem schwarzen Bauer c6 stehen.
stoppable Stoppbare Bauern: alle Bauern, die am Weiterrücken bis zur gegnerischen Grundreihe von einem gegnerischen Bauern in einer benachbarten Linie gehindert werden.
stopped Gestoppte Bauern: alle Bauern, die am Weiterrücken von einem gegnerischen Bauern, der in einer benachbarten Reihe einer benachbarten Linie steht, gehindert werden.
backward Rückständige Bauern: alle Bauern, deren benachbarte Bauern gleicher Farbe zu weit vorgerückt sind, um ihn decken zu können. Isolierte Bauern sind niemals rückständig.
advanced Vorgerückte Bauern: alle Bauern, die bereits in der gegnerischen Hälfte stehen.
consecutive Hintereinanderstehende Bauern: alle Bauern gleicher Farbe, die auf einer Linie direkt hintereinander stehen, werden gezählt.
consecutive(n) Hintereinanderstehende Bauern: mindestens n Bauern gleicher Farbe, die auf einer Linie direkt hintereinander stehen, werden gezählt.
consecutive!(n) Hintereinanderstehende Bauern: genau n Bauern gleicher Farbe, die auf einer Linie direkt hintereinander stehen, werden gezählt.
inside Einholbare Bauern: zählt die Bauern, die sich noch innerhalb der Reichweite des gegnerischen Königs befinden.
symmetrical Symmetrische Bauernstruktur: zählt die Bauern, auf deren Linie sich die gleiche Anzahl gegnerischer Bauern befindet.
mirrored Gespiegelte Bauernstruktur: zählt alle Bauern, auf deren Linie alle gegnerischen Bauern auf horizontal gespiegelten Feldern stehen.

Es muss mindestens eine dieser Bauerneigenschaften verwendet werden.

Alle Bauerneigenschaften können auch mit einem vorangestellten Ausrufungszeichen negiert werden, dazu Beispiele:

:pawncount !blocked >50%

Mehr als 50% der weißen Bauern stehen keine gegnerischen Bauern auf der gleichen Linie gegenüber.

:pawncount !blocked! >50%

Mehr als 50% der weißen Bauern stehen keine gegnerischen Bauern auf der gleichen Linie unmittelbar gegenüber.

:pawncount !inside-passed >0

Mindestens ein Freibauer ist nicht mehr innerhalb der Reichweite des gegnerischen Königs.

Bemerkung: Das Attribut passed ist nur eine Kurzschreibweise:

  • passed = !blocked-!stoppable

Jedoch ist !passed keine Kurzschreibweise.

Bemerkung: Das Attribut candidate! ist nur eine Kurzschreibweise:

  • candidate! = candidate-!passed

Die folgenden Attribute, die ebenfalls mit einem vorangestellten Ausrufungszeichen negiert werden können, schränken die Sichtweise auf die Bauern ein:

forefront Vorhut: nur die vordersten Bauern auf einer Linie werden untersucht.
rear Nachhut: nur die hintersten Bauern auf einer Linie werden untersucht.

Die Position von forefront bzw. rear innerhalb der Liste der Eigenschaften beeinflußt, für welche Attribute die Sichtweise eingeschränkt wird. Beispiel:

(position :pawncount [] double!-forefront-duo >0)

Dies findet nebeneinanderstehende Doppelbauern gleicher Farbe auf, wobei sie auf den gleichen Reihen stehen müssen. forefront muß nach double! verwendet werden, ansonsten ist kein Doppelbauer auffindbar (tatsächlich meldet die Applikation dann einen Fehler). Die Reihenfolge zu duo spielt hier keine Rolle.

Die unterstützen Attribute für die Modifikation der Zählweise sind:

islands Bauerninseln: zähle alle Bauerninseln (nicht die Anzahl der Bauern, die zu den Inseln gehören). Eine Bauerninsel besteht aus einem Bauernverbund gleicher Farbe, die jeweils alle auf benachbarten Linien stehen. Zwischen gleichfarbigen Inseln kann sich also kein Bauer gleicher Farbe befinden.
islands(n) Bauerninseln: zähle alle Bauerninseln (nicht die Anzahl der Bauern, die zu den Inseln gehören). Eine Bauerninsel besteht aus einem Bauernverbund gleicher Farbe, die jeweils alle auf benachbarten Linien stehen. Zwischen gleichfarbigen Inseln kann sich also kein Bauer gleicher Farbe befinden. Es werden jedoch nur die Inseln gezählt, zu denen jeweils mindestens n Bauern gehören.
islands!(n) Bauerninseln: zähle alle Bauerninseln (nicht die Anzahl der Bauern, die zu den Inseln gehören). Eine Bauerninsel besteht aus einem Bauernverbund gleicher Farbe, die jeweils alle auf benachbarten Linien stehen. Zwischen gleichfarbigen Inseln kann sich also kein Bauer gleicher Farbe befinden. Es werden jedoch nur die Inseln gezählt, zu denen jeweils genau n Bauern gehören.
compounds Bauernverbünde: zähle alle Bauernverbünde (nicht die Anzahl der Bauern, die zu dem Verbund gehören). Eine Bauernverbund besteht aus Bauern gleicher Farbe, die jeweils alle auf benachbarten Reihen stehen. Zwischen gleichfarbigen Verbünden kann sich also kein Bauer gleicher Farbe befinden.
compounds(n) Bauernverbünde: zähle alle Bauernverbünde (nicht die Anzahl der Bauern, die zu dem Verbund gehören). Eine Bauernverbund besteht aus Bauern gleicher Farbe, die jeweils alle auf benachbarten Reihen stehen. Zwischen gleichfarbigen Verbünden kann sich also kein Bauer gleicher Farbe befinden. Es werden jedoch nur die Verbünde gezählt, zu denen jeweils mindestens n Bauern gehören
compounds!(n) Bauernverbünde: zähle alle Bauernverbünde (nicht die Anzahl der Bauern, die zu dem Verbund gehören). Eine Bauernverbund besteht aus Bauern gleicher Farbe, die jeweils alle auf benachbarten Reihen stehen. Zwischen gleichfarbigen Verbünden kann sich also kein Bauer gleicher Farbe befinden. Es werden jedoch nur die Verbünde gezählt, zu denen jeweils genau n Bauern gehören
files Bauer pro Linie: zähle alle Linien (nicht die Bauern auf den Linien), auf denen sich Bauern mit den genannten Eigenschaften befinden.
files(n) Bauer pro Linie: zähle alle Linien (nicht die Bauern auf den Linien), auf denen sich mindestens n Bauern mit den genannten Eigenschaften befinden.
files!(n) Bauer pro Linie: zähle alle Linien (nicht die Bauern auf den Linien), auf denen sich genau n Bauern mit den genannten Eigenschaften befinden.
ranks Bauer pro Reihe: zähle alle Reihen (nicht die Bauern auf den Linien), auf denen sich Bauern mit den genannten Eigenschaften befinden.
ranks(n) Bauer pro Reihe: zähle alle Reihen (nicht die Bauern auf den Linien), auf denen sich mindestens n Bauern mit den genannten Eigenschaften befinden.
ranks!(n) Bauer pro Reihe: zähle alle Reihen (nicht die Bauern auf den Linien), auf denen sich genau n Bauern mit den genannten Eigenschaften befinden.
bothsides Beide Flügel: das Resultat der Zählung ist das Minimum der Bauernzahl auf dem Damenflügel (a-d) und der Bauernzahl auf dem Königsflügel (e-h).
oneside Ein Flügel: entweder wird Null gezählt, wenn kein Bauer vorhanden ist, bzw. wenn mindestens ein Bauer sowohl auf dem Dameflügel (a-d) als auch auf dem Königsflügel (e-h) vorhanden ist, ansonsten wird die Gesamtzahl der Bauern gezählt.

Eine Zählung erfolgt immer am Schluß, nachdem aller Bauern mit den gewünschten Eigenschaften aufgefunden wurden. Damit dies klarer beim Lesen des Ausdrucks wird, dürfen Attribute für die Zählung nur am Ende einer Attributliste verwendet werden.

Die Attribute für die Zählweise haben keinen Einfluß auf die Auswahl der gezählten Bauern. Sobald beispielsweise islands in einer Verknüpfung verwendet wird, werden immer die Anzahl der Insel gezählt. Dazu Beispiele:

(position :pawncount [] trio-islands)

Nun wird die Anzahl aller Bauerntrios gezählt, nicht mehr die Anzahl der beteiligten Bauern.

(position :pawncount [] chained-islands)

Die Anzahl der Bauernketten wird gezählt, nicht die Anzahl der beteiligten Bauern.

Manche dieser Attribute können ein Zähler als Argument haben. Der Zähler muß den Wertebereich einhalten:

compounds, compounds!, ranks, ranks! 1 ≤ n ≤ 6
islands, islands!, files, files! 1 ≤ n ≤ 8
consecutive, consecutive! 2 ≤ n ≤ 6
chained, chained! 2 ≤ n ≤ 8
triple, triple! 3 ≤ n ≤ 6
quart, quart! 4 ≤ n ≤ 8

Grundsätzlich können alle Attribute miteinander verknüpft werden, jedoch sind nicht alle Verknüpfungen sinnvoll. Es erfolgt eine Fehlermeldung, wenn sich in einer Verknüpfung Attribute widersprechen (wie z.B. bei chained-isolated, oder mirrored-unblocked).

Die Attribute wirken als Filter, d.h. jedes Attribut filtert die Bauern mit der spezifizierten Eigenschaft, und das nachfolgende Attribut filtert dann die verbliebenen Bauern aus der vorhergehenden Zählung. Daraus resultiert, daß die Reihenfolge der verknüpften Attribute generell eine Rolle spielt, so sind die folgenden Beispiele nicht äquivalent:

:pawncount [] single!-behind >0
:pawncount [] behind-single! >0

Im ersten Fall können tatsächlich nur dann Bauern auf einer Linie gezählt werden, wenn es keinen weiteren der gleichen Farbe auf dieser Linie gibt, aber im zweiten Fall würde behind evt. nur Bauern zurücklassen (filtern), die dann ganz alleine auf der Linie sind (gegnerische Bauern werden nicht berücksichtigt), und diese werden dann alle als Einzelbauern gezählt. Diese Methodik mit der Filterung erlaubt mehr Einflußmöglichkeiten auf die Zählung als eine einfache Und-Verknüpfung.

Weitere Beispiele:

(position :pawncount blocked 100%)

Alle weißen Bauern sind blockiert, d.h. jedem weißen Bauern steht ein schwarzer Bauer (möglicherweise entfernt) gegenüber.

(position :pawncount [][a-d?] blocked 100%)

Alle Bauern auf dem Damenflügel sind blockiert, d.h. jedem Bauern auf dem Damenflügel steht ein gegnerischer Bauer (möglicherweise entfernt) gegenüber.

(position :pawncount [a-d?] blocked! >=50%)

Mindestens der Hälfte der weißen Bauern auf dem Damenflügel steht ein schwarzer Bauer direkt gegenüber (dies kann niemals zutreffen, wenn es keine weißen Bauern auf dem Damenflügel gibt).

(position
  :flipcolor
  :pawncount  double-!advanced-compounds >=2)

Einer der Parteien hat mindestens zwei Doppelbauern, wobei keiner der betroffenen Bauern in der gegnerischen Hälfte steht.

(position :pawncount [] isolated-consecutive(3) >=3)

Findet isolierte Trippelbauern auf verbundenen Feldern, wie in folgender Stellung:

Die Alternative

(position :pawncount [] isolated-triple-consecutive >=3)

wäre hier nicht das gewünschte, denn in diesem Fall werden beispielsweise auch Trippelbauern gezählt, die nicht allesamt miteinander verbunden sind, beispielsweise zwei isolierte Doppelbauern auf einer Linie. Wird jedoch

(position :pawncount [] isolated-triple!-consecutive >=3)

verwendet, dann werden zwar wieder hintereinanderstehende isolierte Trippelbauern gefunden, aber keine Stellungen mit mehr als drei hintereinanderstehenden isolierten Bauern. Aber in diesem speziellen Beispiel ist die folgende alternative Formulierung äquivalent zu isolated-consecutive(3):

(position :pawncount [] isolated-triple-compounds(3) >0)

Hier ist das Attribut triple redundant, macht aber die Sache einfacher lesbar.

(position :pawncount [] backward-stopped-!blocked >0)

Einer der Parteien hat mindestens einen rückständigen Bauern, der keinen gegnerischen Bauern auf der gleichen Linie vor ihm hat, aber von einem gegnerischen Bauer auf einer benachbarten Linie in direkter Weise am Vorücken gehindert wird.

(position :pawncount ?4 stoppable-!blocked-duo! >0)

Weiß hat hängende Bauern auf der vierten Reihe: ein Bauerduo (zwei Bauern nebeneinander auf einer Reihe), die sich auf halboffenen Linien befinden (d.h. sie sind nicht blockiert, aber auch keine Freibauern).

(position :pawncount bothsides 0)

Schwarz hat nicht mehr auf beiden Flügeln Bauern aufzuweisen.

(position :pawncount oneside >0)

Schwarz hat alle seine Bauern entweder auf dem Damenflügel oder auf dem Königsflügel, aber nicht auf beiden Flügeln.

Siehe bei CQL-Beispiele für weiter Beispiele.

Siehe auch: :piececount, :pawncountdifference, :piececountdifference.

:pawncountdifference (Bauerndifferenz)

:pawncountdifference filtert Positionen, wenn die Differenz der Zählung von Bauern mit den spezifizierten Eigenschaften oder Strukturen innerhalb der gegebenen Bereichsangabe liegt. Dieses Schlüsselwort kann ein oder zwei Figurenbezeichner, die nur Bauern enthalten dürfen, als Argumente erhalten, gefolgt von einer bindestrich-separierten Aufzählung von Eigenschaften, und als letztes Argument wird eine Bereichsangabe erwartet. Ist nur ein Figurenbezeichner gegeben, dann wird die Differenz des Resultats der Zählung der weißen Figuren im Figurenbezeichner minus dem Resultat der Zählung der schwarzen Figuren im Figurenbezeichner ermittelt. Bei der Angabe von zwei Figurenbezeichnern wird die Differenz des Resultats der Zählung des ersten Figurenbezeichners minus dem Resultat der Zählung des zweiten Figurenbezeichners ermittelt. Diese Differenz muß innerhalb der Bereichsangabe liegen, damit eine Position gefiltert wird.

Die unterstützen Bauerneigenschaften bzw. Bauernstruktureigenschaften sind die gleichen wie unter :pawncount.

Beispiele:

(position
  :pawncountdifference [?5-7] [?2-4] passed-lines >0)

Weiß hat mehr Freibauern, die in der gegnerischen Hälfte stehen, als Schwarz. Es werden hier jedoch für jede Farbe nur ein Freibauer pro Linie gezählt (in diesem speziellen Fall könnte statt lines auch forefront verwendet werden).

Siehe auch: :pawncount, :piececount, :piececountdifference.

:piececount (Materialzählung)

Dieses Schlüsselwort erwartet als Argument einen Figurenbezeichner, gefolgt von einer Bereichsangabe. Es filtert eine Position genau dann, wenn die Anzahl der Vorkommen der bezeichneten Figuren in dieser Position innerhalb der gegebenen Bereichsangabe liegt.

Beispiele:

(position :piececount 2)

Dies wird jede Position filtern mit exakt zwei weißen Türmen – eine Position mit drei weißen Türmen würde nicht gefiltert werden.

(position
  d4
  :piececount [][a1-8] 1 3
  :piececount [][a-h8] 4)

Dies wird jede Position filtern mit einem weißen Springer auf d4, ein bis drei Türmen auf eine Linie, und exakt vier Damen auf der achten Reihe. Ein alternative Schreibweise dieser Abfrage ist:

(position
  d4
  :piececount [][a?] 1 3
  :piececount [][?8] 4)

Siehe auch: :pawncountdifference, :piececountdifference, :powerdifference.

:piececountdifference (Materialdifferenz)

Dieses Schlüsselwort erwartet als Argumente zuerst entweder ein oder zwei Figurenbezeichner, gefolgt von einer Bereichsangabe. Es filtert Positionen in denen die Differenz der Figurenzählung, die von den Figurenbezeichnern spezifiziert werden, innerhalb der gegebenen Bereichsangabe liegt. Ist nur ein Figurenbezeichner gegeben, dann muß die Differenz der Zählung der weißen Figuren im Figurenbezeichner minus der Zählung der schwarzen Figuren im Figurenbezeichner innerhalb der Bereichsangabe liegen. Bei zwei Figurenbezeichnern muß die Differenz der Zählung aller bezeichneten Figuren im ersten Figurenbezeichner minus der Zählung aller bezeichneten Figuren im zweiten Figurenzähler innerhalb der Bereichsangabe liegen.

Beispiele:

(position
  :piececountdifference [][a1,a8,h1,h8] 1)

Weiß hat genau einen Turm mehr als Schwarz auf den Eckfeldern stehen.

(position
  :piececountdifference [][b2,g2] [][b7,g7] >0)

Weiß hat mehr fianchettierte Läufer als Schwarz.

(position
  :flipcolor
  :piececountdifference   1
  :piececountdifference   1
  :piececountdifference   1 2)

Finde alle Positionen, in denen eine der Parteien genau eine Dame weniger hat, und als Ausgleich genau einen Turm, genau eine Leichtfigur, und ein oder zwei Bauern mehr hat.

Siehe auch: :piececount, :pawndifference, :powerdifference.

:power (Figurenpotential)

Dieses Schlüsselwort erwartet als Argumente einen Figurenbezeichner, gefolgt von einer Bereichsangabe. Es wird jede Position gefiltert, in der das Gesamtfigurenpotential in dieser Position innerhalb der gegebenen Bereichsangabe liegt. Das Potential einer Figur ist sein Materialwert, abhängig von der Schachform:

  • Normalschach, Dreimal-Schach, König-auf-dem-Hügel  0 9 5 3 3 1
    Crazyhouse, Tandemschach  0 5 3 3 3 1
    Losers  0 5 4 3 4 1
    Suicide, Giveaway  30 3 9 0 9 1

Beispiele:

(position :power 6)

Dies wird Positionen finden deren Gesamtfigurenpotential aller schwarzen Figuren genau den Wert 6 hat.

(position :power [a-h1-4] 10 25)

Dies wird Positionen finden deren Gesamtfigurenpotential aller weißen Figuren in der weißen Hälfte einen Wert zwischen 10 und 25 aufweist (inklusive).

Siehe auch: :pawncount, :piececount.

:powerdifference (Figurenpotentialdifferenz)

Dieses Schlüsselwort erwartet als Argumente ein oder zwei Figurenbezeichner, gefolgt von einer Bereichsangabe. Es filtert Positionen, in denen die Differenz des Figurenpotentials (⇒ :power) der bezeichneten Figuren innerhalb der gegebenen Bereichsangabe liegt. Im Falle nur eines Figurenbezeichners ist die Differenz die Summe des Figurenpotentials aller bezeichneten weißen Figuren im Figurenbezeichner minus dem Figurenpotential aller bezeichneten schwarzen Figuren im Figurenbezeichner. Im Fall von zwei Figurenbezeichnern wird die Differenz aus dem Figurenpotential aller bezeichneten Figuren im ersten Figurenbezeichner minus dem Figurenpotential aller bezeichneten Figuren im zweiten Figurenbezeichner gebildet.

note Standard-CQL kennt nur die Form mit einem Figurenbezeichner.

Beispiele:

(position :powerdifference 4)

Dies filtert Positionen, in denen das Potential der weißen Figuren genau um 4 größer ist als das Potential der schwarzen Figuren.

(position :powerdifference -5 10)

Diese filtert Positionen, in denen Weiß ein Potential zwischen einem Turm Materialnachteil und zwei Türmen Materialvorteil besitzt.

(position :powerdifference [] [] <=−2)

Dies filtert Positionen, in denen Schwarz mindestens eine Qualität Vorteil hat.

(position
  :flipcolor
  :powerdifference [] [] <=−2)

Dies filtert Positionen, in denen eine der Partien mindestens eine Qualität Vorteil hat.

(match
  (position
    :result 1-0
    :sequence (
      (position
        :powerdifference  -2 +2
        :powerdifference   0)
      (position
        :repetitioncount >=12
        :powerdifference   <=−9))
    :flipcolor))

Dieses Beispiel zeigt eine Möglichkeit auf, wie mit Hilfe von :powerdifference nach Damenopfern gesucht wird. Eine Seite opfert eine Dame, und verbleibt mindestens 12 Züge lang mit einer Dame in Materialnachteil, um letztendlich zu gewinnen.

Siehe auch: :pawncountdifference, :piececountdifference, :power.

:ray (Strahl)

Ein Strahl bezeichnet eine Liste von Figurenbezeichnern. Es ist eine zusammenhängende Menge von Feldern entweder auf einer Linie, einer Reihe, oder einer Diagonalen auf dem Schachbrett.

Sei R ein Felderstrahl mit einer geordneten Menge von Feldern in einer zusammenhängenden Linie, Reihe, oder Diagonalen S1, S2, ..., Sn. Gegeben sei eine Strahlendefinition (G1, G2, ..., Gk), wobei jedes Gi einen Figurenbezeichner definiert. Der Felderstrahl R ist gültig in Bezug auf die gegebene Strahlendefinition wenn G1 eine Figur auf dem Feld S1 bezeichnet, Gk eine Figur auf dem Feld Sn bezeichnet, und wenn alle anderen Gi jeweils mit einem Feld einer Untermenge des Felderstrahls gepaart werden können ohne die Reihenfolge zu verletzen, so daß jedes Gi eine Figur auf dem zugeordneten Feld bezeichnet, und alle ungepaarten Felder leer sind.

Das Schlüsselwort :ray erwartet eine Strahlendefinition und eine optionale Bereichsangabe. Wenn die Bereichsangabe nicht vorhanden ist, so wird >=1 als Bereich angenommen. :ray filtert eine Position wenn die Anzahl der Felderstrahlen in dieser Position, die in Bezug auf die Strahlendefinition gültig sind, innerhalb der Bereichsangabe liegen.

Beispiele:

(position :ray ( ))

Filtert eine Position, in der eine weiße Dame den schwarzen König attackiert.

(position :ray (a? [?4-8]))

Filtert eine Position, in der eine weiße Dame auf der a-Linie einen schwarzen Springer fesselt, und der schwarze König auf den letzten vier Reihen steht.

(position :ray (a? c? e? g?))

Filtert entweder eine Position, in der alle drei weißen Damen und der schwarze König auf der gleichen Reihe stehen mit jeweils exakt einem Leerfeld zwischen diesen Figuren, oder eine Position, in der alle drei weißen Damen und der schwarze König eine Diagonale formen mit jeweils einem Leerfeld zwischen diesen Figuren, und die Damen stehen in beiden Fällen auf den a, c, und e-Linien.

(position :ray ( ) 2 4)

Zwei bis vier schwarze Springer sind gefesselt.

Siehe auch: :rayattack.

:rayattack (Strahlenangriff)

Hat die gleiche Syntax wie :ray. Es hat auch die gleiche Semantik, außer das nur orthogonale Strahlen, die auf einem Feld mit einer Schwerfigur starten, sowie diagonale Strahlen, die auf einem Feld mit einer Dame oder einem Läufer starten, eingeschlossen sind.

Beispiele:

(position :rayattack ( ))

Filtert eine Position, in der eine schwarze Figur gefesselt ist.

(position :rayattack (d5 [][a-h1-4]) 3)

Filtert Positionen, in denen drei schwarze Figuren von einer weißen Figur auf d5 gefesselt werden, wobei ein schwarzer Turm und der schwarze König auf den ersten vier Reihen stehen.

(position :stalemate :rayattack ( ) 2 8 :flipcolor)

Findet Pattstellungen mit Mehrfachfesselungen auf.

Siehe auch: :ray.

:raydiagonal (Diagonalstrahl)

Dieses Schlüsselwort arbeitet genauso wie :ray, nur daß die Strahlen auf diagonale Linien beschränkt sind.

:rayhorizontal (Horizontaler Strahl)

Dieses Schlüsselwort arbeitet genauso wie :ray, nur daß die Strahlen auf horizontale Linien beschränkt sind.

:rayorthogonal (Othogonaler Strahl)

Dieses Schlüsselwort arbeitet genauso wie :ray, nur daß die Strahlen auf vertikale und horizontale Linien beschränkt sind.

:rayvertical (Vertikaler Strahl)

Dieses Schlüsselwort arbeitet genauso wie :ray, nur daß die Strahlen auf vertikale Linien beschränkt sind.

Schlüsselwörter für die Zuganalyse

Ein Zug hat drei Ausprägungen: einen Herkunftsbezeichner, einen Zielbezeichner, und einen Bauernumwandlungsbezeichner. Diese beziehen sich auf die Figur und das Feld von der dieser Zug weggeht; die Figur und das Feld wohin dieser Zug geht (aber bevor dieser Zug tatsächlich erfolgt), und die Figur und das Feld wo eine Bauernumwandlung stattfindet, sofern eine solche vorhanden. In den Schachformen Einsetzschach und Tandemschach hat ein Zug noch eine vierte Ausprägung: den Figurenartbezeichner für die Einsetzfigur. Er bezieht sich auf die Figurenart die eingesetzt wird, sofern es ein Einsetzzug ist.

Beispielsweise ist der Zielbezeichner für einen weißen Turm auf a4, der einen schwarzen Springer auf d4 schlägt: d4, und der Herkunftsbezeichner ist a4. Der Zielbezeichner eines Zuges nach e4, der keine Figur schlägt, ist .e4.

Es werden einige Schlüsselwörter angeboten, die auf die nachfolgende Position vorausschauen, wie z.B. :ismate. Während :mate die Position findet, in der eine der Seiten matt ist, findet :ismate die Position, in der die Seite am Zug matt setzt. In einigen Fällen ist diese Vorausschau sehr nützlich, insbesondere in Verbindung mit :cond, :cut und :exclude. Diese Vorausschau kann auch die Verwendung von :sequence ersparen.

:captureforced
:enpassant
:forced
:halfmovenumber
:iscastling
:ischeck
:iscontactcheck
:isdoublecheck
:isillegal
:isinvalid
:ismate
:isnull
:isstalemate
:movefrom
:movenumber
:moveto
:noenpassant
:promote
:takeslastpiece

:captureforced (Schlagen ist erzwungen)

Der nächste Zug ist verpflichtet eine Figur zu schlagen. Dieses Schlüsselwort hat nur in der Schachform Schlagschach eine Bedeutung und wird in anderen Schachformen niemals erfüllt.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:captureforced)

Der nächste Zug ist nicht verpflichtet eine Figur zu schlagen, dies heißt das in dieser Stellung auch keine Figur geschlagen werden kann. Dies gilt jedoch nur für die Schachform Schlagschach, in allen anderen Schachformen wird diese Bedingung immer erfüllt.

Siehe auch: :mustcapture.

:forced (Forciert)

Der nächste Zug ist erzwungen, kein anderer Zug ist möglich.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:forced)

Der nächste Zug ist nicht erzwungen, es gibt auch andere Züge (auch wenn sie nicht gut sein sollten).

:enpassant

Der nächste Zug ist ein en-passant Schlagzug.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:enpassant)

Der nächste Zug ist kein en-passant Schlagzug.

:halfmovenumber (Halbzugnummer)

:halfmovenumber erwartet als Argument eine Bereichsangabe, und filtert eine Position nur dann, wenn die aktuelle Halbzugnummer innerhalb des gegebenen Bereichs liegt. Innerhalb von Untervarianten hat dieses Schlüsselwort keine Wirkung und ist immer erfolglos.

Beispiele:

(position :halfmovenumber 0)

Dies bezeichnet die erste Position in der Partie (vor dem ersten Zug). Dies ist identisch zu:

(position :initial)

Als eine Erweiterung kann auch end, bzw. end−N als numerisches Argument verwendet werden. Auch dazu Beispiele:

(position :halfmovenumber end)

Dies bezeichnet die Endposition (nach dem letzten Zug der Partie); siehe auch :terminal.

(position :halfmovenumber end-3)

Dies bezeichnet den drittletzten Halbzug in der Partie, d.h. es folgen noch drei Halbzüge.

(position :halfmovenumber end-1 :moveto )

Filtere alle Partien, in denen im letzten Zug der Partie eine Figur geschlagen wird. Dies ist einfacher und viel effizienter als der äquivalente Ausdruck:

(position :sequence (
  (position :moveto )
  (position :terminal)))
annotation Der Einsatz von :halfmovenumber kann die Suchzeiten erheblich verkürzen.

Siehe auch: :initial, :terminal, :movenumber.

:iscastling (Rochadezug?)

Der nächste Zug ist eine Rochade. Als Argument können die Figurenartbezeichner , , und folgen, die die Rochade genauer spezifizieren.

Beispiele:

:iscastling ; die Seite am Zug rochiert
:iscastling ; Weiß rochiert kurz
:iscastling [] ; Weiß rochiert
:iscastling [] ; die Seite am Zug rochiert lang

Hier muß zur Negierung das Schlüsselwort :not verwendet werden; zum Beispiel:

(position :not (position :iscastling ))

Der nächste Zug ist keine kurze weiße Rochade.

Siehe auch: :castling,

:ischeck (Schachgebot?)

Filtert eine Position, wenn der nächste Zug ein Schachgebot ist. Ist als Argument eine Bereichsangabe vorhanden, dann wird eine Position gefiltert, wenn der nächste Zug ein Schachgebot ist, und die Anzahl der Schachgebote, die die Seite am Zug dem Gegner bot, einschließlich des nächsten Zugs, innerhalb dieser Bereichsangabe liegt. Die untere Schranke dieser Bereichsangabe kann nicht kleiner als 1 sein.

note :ischeck mit nachfolgender Bereichsangabe ist in erster Linie nützlich in der Schachform Dreimal-Schach. Das nachfolgende Beispiel gilt für diese Schachform.

(position :ischeck 3)

Die Seite am Zug bietet nun zum dritten Mal in der Partie dem Gegner Schach. Dies kann nur eine Endstellung sein (in Dreimal-Schach).

(position :matchcount 1 :ischeck)

Das einzige Schachgebot in der Partie überhaupt.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:ischeck)

Der nächste Zug ist kein Schachgebot.

Siehe auch: :checkcount,

:iscontactcheck (Kontaktschachgebot?)

Der nächste Zug ist ein Kontaktschachgebot.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:iscontactcheck)

Der nächste Zug ist kein Kontaktschachgebot (aber trotzdem möglicherweise ein Schachgebot).

Siehe auch: :contactcheck,

:isdoublecheck (Doppelschachgebot?)

Der nächste Zug ist ein Doppelschachgebot.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isdoublecheck)

Der nächste Zug ist kein Doppelschachgebot (aber trotzdem möglicherweise ein Schachgebot).

Siehe auch: :doublecheck,

:isillegal (Regelwidrig?)

Der nächste Zug ist ein regelwidriger Zug, beispielsweise eine Rochade, obwohl der König im Schach steht.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isillegal)

Der nächste Zug ist kein regelwidriger Zug.

:isinvalid (Unerlaubt?)

Der nächste Zug ist ein unerlaubter Zug, beispielsweise ein Läuferzug, der auf einem schwarzen Feld beginnt, aber auf einem weißen Feld endet (dies unterstützt den Kinderschachmodus).

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isinvalid)

Der nächste Zug ist kein unerlaubter Zug.

:ismate (Mattgebot?)

Der nächste Zug ist ein Mattgebot.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:ismate)

Der nächste Zug ist kein Mattgebot.

Siehe auch: :mate,

:isnull (Nullzug?)

Der nächste Zug ist ein Nullzug.

(position :isnull)

Suche nach Partien die einen Nullzug enthalten.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isnull)

Filtere alle Positionen, in denen kein Nullzug erfolgt.

:isstalemate (Pattgebot?)

Der nächste Zug ist ein Pattgebot.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isstalemate)

Der nächste Zug ist kein Pattgebot.

Siehe auch: :stalemate,

:movefrom (Zug von)

Erwartet als Parameter eine Figurenbezeichner. Eine Position wird gefiltert, wenn dieser Figurenbezeichner den Herkunftsbezeichner des nächsten Zuges beinhaltet.

Beispiele:

(position :movefrom a3)

Filtere eine Position, in der der nächste Zug ein Turmzug von a3 ist.

(position :movefrom ?8)

Filtere eine Position, in der der nächste Zug mit einer Figur von der achten Reihe geschieht.

(position :movefrom [+] :moveto .?8)

Ein weiße Dame wird auf der schwarzen Grundreihe eingesetzt (Einsetzschach, Tandemschach).

(position :movefrom ???)

Dieser Ausdruck ist in den Schachformen Einsetzschach und Tandemschach sinnvoll: in dieser Position wird keine Figur (aus der Rückhand) eingesetzt.

(position :movefrom .)

Dies kann niemals gefiltert werden, auch keinen Einsetzzug (Einsetzschach, Tandemschach).

Siehe auch: :isnull, :line, :moveto, :promote.

:movenumber (Zugnummer)

:movenumber erwartet als Argument eine Bereichsangabe, und filtert eine Position nur dann, wenn die aktuelle Zugnummer innerhalb des gegebenen Bereichs liegt. Die Zugnummernzählung geht von einem Anzugsrecht der weißen Seite aus.

Beispiele:

(position :movenumber 10 20 :check)

Filtert eine Position, in der ein Schachgebot zwischen dem 10. und dem 20. Zug erfolgt.

(position :movenumber 35 :mate)

Filtert eine Position, in der im 35. Zug mattgesetzt wird.

Als eine Erweiterung (des CQL-Standards) kann auch end, bzw. end−N als Argument verwendet werden. Jedoch ist das Verhalten undefiniert, wenn die Suche in den Untervarianten erfolgt (⇒ :variations), sollte also in diesem Fall nicht verwendet werden. Auch dazu Beispiele:

(position :movenumber end)

Dies bezeichnet die Endposition (nach dem letzten Zug der Partie); siehe auch :terminal.

(position :movenumber end-3)

Dies bezeichnet den drittletzten Zug in der Partie (nicht zu verwechseln mit Halbzügen; siehe :halfmovenumber).

(position :movenumber end-4 end-3)

Dies bezeichnet den Bereich vom viertletzten bis zum drittletzten Zug in der Partie.

Siehe auch: :halfmovenumber, :initial, :terminal.

:moveto (Zug nach)

Erwartet als Argument einen Figurenbezeichner. :moveto filtert einen Zug wenn dieses Argument den Zielbezeichner des Zuges beinhaltet.

Beispiele:

(position :moveto )

Filtert eine Position dessen nächster Zug ein Schlagzug ist.

(position :moveto .)

Filtert eine Position dessen nächster Zug kein Schlagzug ist.

(position :moveto ~)

Im nächsten Zug wird eine Figur geschlagen, die aus einer Bauernumwandlung hervorging.

(position :moveto ~~)

Die Figur, die im nächsten Zug geschlagen wird, stammt nicht von einer Bauernumwandlung ab.

(position :moveto [b1-8])

Filtert eine Position, in der der nächste Zug einen weißen Turm auf der b-Linie schlagen wird. Beachte daß dies sehr verschieden ist von der Interpretation einer Zugbeschreibung im PGN-Format  : dort würde dies als ein Turmzug auf die b-Linie interpretiert werden. Und dies wiederum geschieht in CQL auf diese Weise:

(position :movefrom :moveto ?b?)

Filtert einen Zug, in dem der weiße Turm auf die b-Linie zieht. Dies schließt einen Turm aus der Rückhand aus (Einsetzschach und Tandemschach). Soll eine Figur aus der Rückhand mit einbezogen werden, so ist folgende Erweiterung notwendig:

(position :movefrom [*] :moveto ?b?)

Im nächsten Beispiel wird der en-passant-Fall behandelt:

(position :moveto .e6 :enpassant)

Ein Bauer auf e5 wird en-passant geschlagen.

Siehe auch: :isnull, :line, :movefrom, :promote.

:noenpassant (Kein en-passant)

Dieses Schlüsselwort ist veraltet und sollte nicht mehr verwendet werden, es wird nur aus Kompatibilitätsgründen zu CQL unterstützt. Es hat die gleiche Bedeutung wie !:enpassant.

:promote (Bauernumwandlung)

Erwartet als Argument einen Figurenbezeichner. Ein Zug wird gefiltert wenn es sich um eine Bauernumwandlung handelt, und der gegebene Figurenbezeichner den Bauernumwandlungsbezeichner des Zuges beinhaltet.

Beispiele:

(position :promote [])

Filtert eine Position dessen nächster Zug eine weiße Unterverwandlung ist.

(position :promote []a8)

Filtert eine Position dessen nächster Zug eine weiße Bauernumwandlung in eine Leichtfigur ist.

(position :promote e8 :movefrom f7 :moveto )

Filtert eine Position, in der der nächster Zug einen Bauern von f7 nach e8 zieht, wobei eine schwarze Dame geschlagen wird und eine Bauernumwandlung in einen Turm geschieht.

(position :promote [])

Filtert eine Position, in der der nächster Zug keine Bauernumwandlung ist (denn der Figurenartbezeichner ist leer).

Siehe auch: :isnull. :line, :movefrom, :moveto,

:takeslastpiece (Schlägt die letzte Figur)

Dieses Schlüsselwort hat nur in der Schachform Schlagschach eine Bedeutung, und kann in anderen Schachformen niemals erfüllt werden. Es wird erfüllt, wenn im nächsten Zug die letzte gegnerische Figur geschlagen wird.

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:takeslastpiece)

In der Schachformen Schlagschach wird es erfüllt, wenn im nächsten Zug nicht die letzte gegnerische Figur geschlagen wird. In anderen Schachformen wird diese Bedingung immer erfüllt.

Siehe auch: :losing,

Schlüsselwörter für Sequenzen

Standard-CQL hat die folgende Einschränkung: Die Gesamtzahl von Sequenzen in Positionslisten, die auf oberster Ebene einer Positionsliste auftreten können, darf Eins nicht überschreiten. Um die Wirkung von beiden Schlüsselwörtern in einer Positionsliste zu erhalten, wird mit dem Gebrauch von :and bewerkstelligt.

Diese Einschränkung gilt nicht für CQL-S, aber es ist zu beachten, daß insbesondere die Verwendung von :gappedsequence bei geschachtelten Sequenzen zu unerwarteten Resultaten führen kann. Auch die Kombination von geschachtelten Sequenzen mit logischen Kontrollwörtern (:and, :or, …) ist im allgemeinen sehr undurchsichtig.

:gappedsequence
:line
:line*
:match
:matchconsecutive
:sequence

:gappedsequence (Löchrige Folge)

Erwartet als Argument eine Liste von Positionslisten. Eine Positionsliste A wird als eine Verfeinerung einer Positionsliste B definiert, wenn A aus B geformt werden kann durch das Einfügen von beliebig vielen (einschließlich Null) Listen der Form (position) auf oberster Ebene in B. Zum Beispiel:

((position a4) (position) (position b2))

verfeinert

((position a4) (position b2))

denn es wurde geformt durch das Einfügen einer einzelnen Position in die letztere Liste.

Eine löchrige Folge (:gappedsequence) mit Argument B filtert eine Position genau dann, wenn es eine Verfeinerung A von B gibt, so daß eine Folge (:sequence) mit Argument A diese Position filtern würde. D.h., :gappedsequence ist wie :sequence, außer das die Folge von filternden Positionen dazwischenliegende Positionen der Partie enthalten kann.

Beispiele:

(position
  :gappedsequence (
    (position :movefrom a3)
    (position :movefrom b4)))

Diese wird jede Position filtern, die mit der ersten Position in der Liste von :gappedsequence startet, und nach Null oder mehr weiteren aufeinanderfolgenden Positionen in der Partie die zweite Position von :gappedsequence auffindet.

Die folgende Positionsliste filtert eine Position, in der ein Springer auf d4 steht in irgendeiner Partiestellung, aber nach der gefundenen Position:

(position
  :gappedsequence (
    (position)
    (position d4)))

Siehe auch: :match.

:line (Zugfolge)

Dieses Schlüsselwort bietet eine Kurzschreibweise für Sequenzen, die nur Schlüsselwörter für die Zuganalyse verwendet. Daher bietet :line nur wenig neue Funktionalität, ist aber meistens viel besser lesbar als die enstprechende Formulierung mit :sequence. So ist die folgende Sequenz

(position
  :initial
  :sequence (
    (position :movefrom e2 :moveto e4)
    (position :movefrom e7 :moveto e6)
    (position :movefrom d2 :moveto d4)
    (position :movefrom d7 :moveto d5)))

identisch zur dieser Zugfolge:

(position :line (1.e2-e4 e7-e6 2.d2-d4 d7-d5))

Auch unter CQL-Beispiele sind gute Beispiele für den Gebrauch von :line zu finden.

Das Argument von :line ist eine Folge von Zügen innerhalb eines Klammernpaares. Die Zugfolge muß in der ausführlichen reversiblen Form notiert werden. Grundsätzlich müssen die CQL-Figurenartbezeichner verwendet werden, und es können Felderbezeichner eingesetzt werden. Es gibt sieben Zugnotationen:

  1. Züge auf leere Felder
    Hier wird ein Bindestrich verwendet, z.B. f3-e5, das Zielfeld e5 muß leer sein.
  2. Züge auf besetzte Felder
    Hier wird ein Schlagsymbol verwendet, z.B. f3xe5, das Zielfeld e5 darf nicht leer sein.
  3. Züge auf leere oder besetzte Felder
    Hier wird ein Doppelpunkt verwendet, z.B. f3:e5, das Zielfeld e5 kann leer sein, aber auch besetzt. Ist es nicht leer, dann ist es ein Schlagzug. Diese Notation ist auch in Verbindung mit Figurenartbezeichnern verwendbar, z.B. f3:e5: entweder ist das Feld e5 leer, oder es steht dort ein schwarzer Springer.
  4. Rochaden
    Mit dem speziellen Symbol O-O-O-O wird eine beliebige Rochade (lang oder kurz) bezeichnet. Wird für die Rochade eine Farbangabe benötigt dann sollte eine alternative Notation verwendet werden:
    • -Weiße lange Rochade
      -Schwarze lange Rochade
      -Weiße kurze Rochade
      -Schwarze kurze Rochade
      -Weiße Rochade (lang oder kurz)
      -Schwarze Rochade (lang oder kurz)
  5. Einsetzzüge (Einsetzschach, Tandemschach)
    Hier wird ein "at" verwendet und auf das Herkunftsfeld verzichtet, z.B. bezeichnet @f3 ein Zug, der einen weißen Springer auf das Feld f3 einsetzt.
  6. Beliebige Zuge
    Dies wird durch die Notation -- notiert, jedoch sind Nullzüge hier nicht eingeschlossen. Aber Einsetzzüge (Einsetzschach, Tandemschach) zählen dazu.
  7. Nullzüge
    Ein Nullzug wird mit dem speziellen Symbol null notiert.

Zu beachten ist, daß immer eine beliebige Figur angenommen wird, wenn der Figurenbezeichner des Herkunftfeldes nicht angegeben ist (also nicht unbedingt ein Bauer wie sonst üblich). Ist der Figurenbezeichner des Zielfeldes nicht angegeben, dann wird bei einem Schlagzug immer eine beliebige Figur angenommen.

Ist das Herkunftsfeld beliebig, dann kann abkürzend für ??-e5 auch e5 notiert werden; entsprechend xe5 als Kurzschreibweise für ??xe5, bzw. :e5 als Kurzschreibweise für ??:e5. Ist auch das Zielfeld beliebig, dann kann noch weitergehend abgekürzt werden; so bezeichnet einfach nur einen beliebigen Springerzug auf ein freies Feld; x ist eine beliebiger Springerzug auf ein besetztes Feld, und : ist ein beliebiger Springerzug auf ein freies oder auf ein besetztes Feld.

Weiterhin können auch Schachgebote (+), Doppelschachgebote (++), Kontaktschachgebote (+++) und Mattgebote (#) notiert werden. Ebenso kann auch explizit notiert werden das kein Schach geboten wird (mittels -), oder kein Matt (*), bzw. kein Doppelschach (--), oder kein Kontaktschach (---). Außerdem kann ein en-passant-Zug (ep) notiert werden, als auch ein Bauernumwandlungszug (z.B. =). Bei einem Bauernumwandlungszug ist die Angabe der verwandelten Figur zwingend. Mit dem Zeichen ! werden forcierte Züge (einzig möglicher Zug) ausgezeichnet.

Werden Zugnummern verwendet – sie müssen streng aufsteigend sein – so werden diese bei der Suche mitberücksichtigt.

Beispiele:

e2-e4 :movefrom ?e2
:moveto .e4
Eine beliebige Figur zieht von e2 nach e4.
e2-e4 :movefrom e2
:moveto .e4
Eine weißer Bauer zieht von e2 nach e4.
1.e2-e4 :halfmovenumber 1
:movefrom ?e2
:moveto .e4
Im ersten Zug der Partie zieht die Figur auf e2 nach e4 (normalerweise ein Bauernzug).
1...e7-e5 :halfmovenumber 2
:movefrom ?e7
:moveto .e5
Im ersten Zug der Partie zieht die Figur auf e7 nach e5 (normalerweise ein Bauernzug).
d5xe6 ep :movefrom d5
:moveto .e6
:enpassant
Weißer Bauer auf d5 schlägt en-passant den Bauern auf e5 (nur ein Bauer kann en-passant geschlagen werden).
d5xe6 :movefrom d5
:moveto e6
Weißer Bauer auf d5 schlägt den Bauern auf e6 (hier ist en-passant ausgeschlossen).
= :promote Weißer Bauer zieht auf die Grundreihe und verwandelt in eine Dame.
=# :promote
:ismate
Ein weißer Bauer zieht auf die Grundreihe, und verwandelt beliebig mit einem Mattgebot.
+* :movefrom
:ischeck
!:ismate
Eine weiße Dame bietet dem König Schach, aber es ist kein Mattgebot.
+++ :movefrom
:iscontactcheck
Eine weiße Dame bietet dem König Kontaktschach.
b1-[ac]3 :movefrom b1
:moveto .[ac]3
Weißer Springer zieht von b1 nach a3 oder nach c3.
[bg]7x?1 :movefrom [bg]7
:moveto ?1
Schwarzer Läufer auf b7 oder g7 schlägt eine weiße Schwerfigur auf der ersten Reihe.
?[1-7]-?8+ :movefrom ?[1-7]
:moveto .?8
:ischeck
Eine weiße Schwerfigur zieht auf die schwarze Grundreihe und bietet Schach.
?[1-7]-?8- :movefrom ?[1-7]
:moveto .?8
!:ischeck
Eine weiße Schwerfigur zieht auf die schwarze Grundreihe ohne ein Schachgebot.
g5++ :movefrom
:moveto .g5
:isdoublecheck
Weißer Läufer zieht auf das Feld g5 und Schwarz wird Doppelschach geboten.
:f7# :movefrom
:moveto ?f7
:ismate
Weißer Springer zieht auf das Feld f7 und setzt matt; f7 kann auch von einer schwarzen Figur besetzt sein.
xe4 :movefrom
:moveto e4
Ein schwarzer Springer schlägt einen Bauern auf dem Feld e4.
xe4 :movefrom
:moveto ?e4
Ein weißer Springer schlägt eine beliebige Figur auf dem Feld e4.
:movefrom
:moveto .
Ein beliebiger Springerzug eines weißen Springers auf ein freies Feld.
x :movefrom
:moveto
Ein beliebiger Springerzug eines weißen Springers auf ein besetztes Feld.
x :movefrom
:moveto
Ein beliebiger Springerzug eines weißen Springers, bei dem eine schwarze Schwerfigur geschlagen wird.
x :movefrom
:moveto
Ein beliebiger Zug mit einer weißen Figur, bei dem eine schwarze Schwerfigur geschlagen wird.
: :movefrom : Ein beliebiger Springerzug eines weißen Springers auf ein freies oder auf ein besetztes Feld.
O-O :iscastling [] Die Seite am Zug führt die kurze Rochade aus.
O-O-O :iscastling [] Die Seite am Zug führt die lange Rochade aus.
O-O-O-O :iscastling Die Seite am Zug führt eine Rochade aus (lang oder kurz).
- :iscastling [] Weiß führt eine lange Rochade aus.
- :iscastling [] Schwarz führt eine Rochade aus (lang oder kurz).
! :movefrom
:forced
Der weiße König zieht, und es handelt sich dabei um den einzig möglichen Zug in der Stellung.
x[~~] :moveto [~~] Die Seite am Zug schlägt eine Dame, die aus einer Bauernumwandlung hervorging.
~~# :movefrom ~~
:ismate
Eine weiße Dame, die nicht das Resultat einer Bauernumwandlung ist, setzt matt.
@?7 :movefrom [+]
:moveto ?7
Eine weißer Bauer wird auf der siebten Reihe eingesetzt (Einsetzschach, Tandemschach).
@+ :movefrom [+]
:ischeck
Eine weiße Figur wird mit Schachgebot eingesetzt (Einsetzschach, Tandemschach).
-- :movefrom [*] Diese Kurzschreibweise bezeichnet einen beliebigen Zug (jedoch keinen Nullzug).
null :isnull Dieses Symbol bezeichnet einen Nullzug.

Die Zugfolgen können mit oder ohne Zugnummern notiert werden. Mit der Verwendung von Zugnummern können statt den CQL-Standardfigurenartbezeichnern auch die normalen PGN -Figurenbezeichner verwendet werden, denn hier ergeben sich die Figurenfarben aus der Position in der Notation. Bei Gebrauch von Zugnummern kann :flipcolor nicht mehr verwendet werden.

Beispiele:

:line (1.e2-e4 g8-f6)
Suche nach Partien, die mit der Aljechin-Eröffnung beginnen. (die Figurenfarbe wird durch die Zugnummern bestimmt.)
:line (2...e7-e6)
Suche nach Partien, in denen im zweiten Zug ein schwarzer Bauer von e7 nach e6 zieht.
:line (e2-e4 g8-f6)
Suche nach einem Zugmuster irgendwo in der Partie. Dies wird auch alle Aljechin-Eröffnungspartien auffinden.
:line (e2-e4 g8-f6)
Dieser Ausdruck wird als fehlerhaft zurückgewiesen (die Figurenfarben müssen alternieren, wenn keine Zugnummern vorhanden sind).
:line (c4xd5 f6xd5 c3xd5 e6xd5)
Suche nach einem typischen Schlagabtauschmuster.
:line ([]x[])
Die Seite am Zug schlägt mit der Dame einen Turm. Dies erspart zwar die Verwendung von :flipcolor, aber für die Lesbarkeit ist grundsätzlich die Verwendung von :flipcolor vorzuziehen.

Bei der Verwendung von Zugnummern muß dies konsequent geschehen, d.h. eine Mischung von Sequenzen mit und ohne Zugnummern ist nicht zulässig.

Transformationen der Figuren- bzw. Felderbezeichner (:flip, :shift, usw.) wirken nicht auf das Schlüsselwort :line. Dazu muß :sequence verwendet werden, wenn solche Transformationen verlangt sind. Aber die Farbwechseltransformation :flipcolor kann verwendet, wie bereits beschrieben wurde.

:line wartet mit einem zusätzlichen Funktionalität auf: mit dem Trennzeichen | kann eine potentielle Zugfolge definiert werden. Es sei folgende formale Beschreibung einer Zugfolge gegeben:

:line (<m1> <m2> … <mk> | <mk+1> … <mn>)

Es wird eine Partie genau dann gefunden, wenn in der Partie eine Zugfolge <m1> <mk> existiert, so daß die Stellung (dies muß keine Endstellung sein) mit der restlichen Zugfolge <mk+1> <mn> fortgesetzt werden könnte. Die Züge <mk+1> <mn-1> sollten (müssen aber nicht) eindeutig bestimmt sein (siehe bei :line* wegen der eindeutigen Bestimmtheit), ansonsten kann die Suchzeit exponentiell wachsen (d.h. die Suchzeit kann sich sehr rapide steigern).

Dazu ein Beispiel: wir suchen nach mehreren nacheinanderfolgenden Turmschachgeboten, jeweils gefolgt von einem Königszug auf ein freies Feld. Dies kommt normalerweise nur dann vor, wenn ein Patt durch Schlagen des Turms vermieden werden will.

(match
  :result 1/2
  (position
    :sequence (
      (position
        :flipcolor
        :line (:+  :+  :+  :+ | ))
      (position :terminal))))

Es wird hier am Ende der Partie gesucht. Es ist zu beachten, daß die gesuchten Partien mit einem Turmzug oder aber mit einem Königszug enden können. Endet eine solche Partie mit einem Turmzug, dann wird sie gefunden, wenn in der Stellung nach dem letzten Turmzug ein Königszug möglich ist. Es werden aber auch die Partien aufgefunden, die mit dem potentiellen Königszug enden. Es werden also alle Partien aufgefunden, die entweder mit der Zugfolge

  • (:+ :+ :+ :+ )
oder aber mit der Zugfolge
  • (:+ :+ :+ :+)

enden, wobei nach letzterer Zugfolge ein weiterer Königszug in der Stellung möglich sein muss. Siehe bei Beispiele für Zugsequenzen für weitere Anwendungen potentieller Zugfolgen.

Siehe auch: :isnull, :line*, :movefrom, :moveto, :sequence.

:line* (Transpositionsinvariante Zugfolge)

Diese Version von :line prüft Zugsequenzen transpositionsinvariant, und die Suche beginnt deshalb immer mit dem ersten Zug in der vorliegenden Grundstellung. Es können optional Zugnummern verwendet werden, sie sind jedoch hier nicht erforderlich. Eine transpositionsinvariante Suche ist jedoch nur möglich wenn alle Züge eindeutig bestimmt sind (eindeutiges Herkunftsfeld, eindeutiges Zielfeld, eindeutige Figuren, eindeutige Bauernumwandlung). Dies ist erforderlich damit beispielsweise auch Schach-960-Positionen korrekt geprüft werden. Weiterhin wird bei der transpositionsinvarianten Suche ein mögliches en-passant-Recht ignoriert. Transformierende Schlüsselwörter (:flip, :flipcolor, …) sind in Verbindung mit Transpositionsinvarianz nicht erlaubt.

Auch sind bei einer transpositionsinvarianten Suche die Angaben von Schach, Doppelschach und Kontaktschach nicht erlaubt, außer im letzten Halbzug. Solche Angaben im letzten Zug schränken im allgemeinen die möglichen Transpositionen ein.

Potentielle Zugfolgen wie bei :line sind hier nicht erlaubt.

Beispiele:

:line* (e2-e4 d7-d5)
Dies ist eine fehlerhafter Ausdruck, die Figuren sind nicht eindeutig bestimmt.
:line* (e2-e4 d7-d5)
Dies ist eine korrekter Ausdruck (die Figurenfarbe wird durch die Halbzugposition eindeutig bestimmt).
:line* (e2-e4 d7-d5)
Ebenfalls ein korrekter Ausdruck.
:line* (e2-e4 d7-d5 e4xd5)
Inkorrekt, denn die geschlagene Figur ist nicht eindeutig.
:line* (e2-e4 d7-d5 e4xd5)
Korrekt, alles ist eindeutig bestimmt.
:line* (e2-e?)
Inkorrekt, denn das Zielfeld ist nicht eindeutig.
:line* (e2-e4 f7-f6 d1-h5+ g7-g6)
Inkorrekt, denn ein Schachgebot darf hier nicht notiert werden.
:line* (e2-e4 f7-f6 d1-h5+)
Korrekt, ein Schachgebot im letzten Halbzug ist zulässig,

Weitere Beispiele:

(position :line* (1.e2-e4 e7-e6 2.d2-d4 d7-d5))

Filtere alle Stellungen die mit Französisch beginnen, inklusive Zugumstellungen wie 1.d4 d5 2.e4 e6. Dies ist in Partien, die mit der Standardstartposition beginnen, äquivalent zur folgenden Abfrage:

(position
  :fen "rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2")

Diese Äquivalenz trifft jedoch nicht für Partien zu, die nicht mit der Standardstartposition beginnen.

Wird die exakte Eröffnungszugfolge 1.e4 e6 2.d4 d5 gesucht, so geschieht dies mittels :line:

(position :line (1.e2-e4 e7-e6 2.d2-d4 d7-d5))

Siehe auch: :fen, :line,

:match (Suchfolge)

Dies entspricht genau dem Verhalten der Suchliste (match ...), nur daß hier ausnahmslos Positionslisten als Argumente erwartet werden. Somit wird dieses Schlüsselwort normalerweise nicht benötigt, es kann jedoch von Nutzen sein, wenn es als Argument für eines der logischen Schlüsselwörter dient. Ein formales Beispiel:

(match
  (position
    :and (
      (position ...)
      (position :match (
        (position ...)
        (position ...)
        ...
        (position ...))))))

:matchconsecutive (Sukzessive Suchfolge)

Diese Variante der Suchfolge filtert genau dann eine Partie, wenn alle Positionen dieser Suchfolge nacheinander aufgefunden werden, jedoch unabhängig von der Reihenfolge.

Beispiel:

(match
  (position
    :flipcolor
    :matchconsecutive (
      (position :promote )
      (position)
      (position :promote ))))

Filtert alle Partien, in denen nacheinander eine der Parteien eine Bauernumwandlung in zwei verschiedene Leichtfiguren ausführt.

:sequence (Folge)

Erwartet als Argument eine Liste von Positionslisten. Eine Position wird gefiltert, wenn sie und alle aufeinanderfolgenden Positionen von jedem Element im Argument gefiltert werden.

Beispiel:

(position
  e8
  :sequence (
    (position f3 .g2)
    (position .f3 g2)))

Diese Positionsliste filtert exakt diejenigen Positionen mit einem weißen Turm auf e8, so daß:

  1. in dieser Position hat Weiß eine Dame auf f3, das Feld g2 ist leer, und
  2. nach dem nächsten Zug ist das Feld f3 leer, und die weiße Dame befindet sich auf g2.

Diese Positionsliste ist offensichtlich identisch zu:

(position e8 :movefrom f3 :moveto .g2)

Außerdem ist sie identisch zu:

(position e8 :line (f3-g2))

Der folgende recht typische Gebrauch von :sequence sucht nach allen Treppenschachmanövern mit einer Dame:

(position
  :shift :flip :flipcolor
  :sequence (
    (position :movefrom a2)
    (position :check)
    (position :movefrom b2)
    (position :check)
    (position :movefrom b3)
    (position :check)
    (position :movefrom c3)
    (position :check)
    (position :movefrom c4)
    (position :check)))

Diese Positionsliste filtert eine Position mit einer weißen Dame auf a2, die nacheinander auf die bezeichneten Felder zieht und dabei Schach bietet. Die Schlüsselwörter :shift, :flip, und :flipcolor suchen nach den gespiegelten oder gedrehten Manövern irgendwo auf dem Schachbrett. Jedoch kann dies folgendermaßen viel einfacher ausgedrückt werden:

(position
  :shift :flip :flipcolor
  :line (a2-b2+ -- b2-b3+ -- b3-c3+ -- c3-c4+))

Siehe auch: :line, :matchconsecutive.

Schlüsselwörter für die Partieinformationen

Diese Schlüsselwörter beziehen sich auf Partiemerkmale und werden nicht von den Positionen beeinflußt; sie sind als Schlüsselwörter für die Positionsliste verfügbar, damit eine von diesen Merkmalen abhängige Suche gestaltet werden kann; z.B. um Abfragen an die einzelnen Schachformen anzupassen.

Die Schlüsselwörter :elo, :whiteelo und :blackelo werden nur unterstützt, um kompatibel mit Standard-CQL zu sein, und sollten nicht mehr in Positionslisten verwendet werden.

:elo
:whiteelo
:blackelo
:ischess960
:isshufflechess
:result
:startposition
:variant

:blackelo (ELO – Schwarz)

Dieses Schlüsselwort wird nur unterstützt, um kompatibel mit dem CQL-Standard zu sein. Es wird zur Verwendung des gleichnamigen Schlüsselworts :blackelo : match in der Suchliste geraten. Dort wird es auch genauer beschrieben.

:elo

Dieses Schlüsselwort wird nur unterstützt, um kompatibel mit dem CQL-Standard zu sein. Es wird zur Verwendung des gleichnamigen Schlüsselworts :elo : match in der Suchliste geraten. Dort wird es auch genauer beschrieben.

:ischess960 (Schach-960?)

Filtert Partien, die mit einer Schach-960-Position beginnen. Dies beeinhaltet die Standardstartposition 518. Diese Schlüsselwort ist eine Kurzschreibweise für:

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:ischess960)

Filtert Partien, die nicht mit einer Schach-960-Position beginnen.

Siehe auch: :isshufflechess.

:isshufflechess (Shuffle-Schach?)

Filtert Partien, die mit einer Schuffle-Schach-Position beginnen. Dies beinhaltet Schach-960-Positionen. Diese Schlüsselwort ist eine Kurzschreibweise für:

Dieses Schlüsselwort kann auch in negierter Form – mit einem vorangestellten Ausrufungszeichen – verwendet werden. Beispiel:

(position !:isshufflechess)

Filtert Partien, die nicht mit einer Schuffle-Schach-Position beginnen.

Siehe auch: :ischess960.

:result (Ergebnis)

Dieses Schlüsselwort erwartet das gleiche Argument wie das Schlüsselwort :result : match in der Suchliste. In CQL-S wird es durch :flipcolor beeinflußt (abweichend zu Standard-CQL; das Verhalten in Standard-CQL kann durchaus als Fehler angesehen werden).

Für ein Beispiel siehe bei der Beschreibung für das Schlüsselwort :powerdifference.

:startposition 

Erwartet eine kommaseparierte Liste von Startpositionsbereichen. Eine Startposition ist entweder eine Positionsnummer, oder eine FICS-Variantenbezeichnung. Ein Startpositionsbereich ist eine Folge von Startpositionen. Für eine genauere Beschreibung siehe bei :startposition : match.

Siehe auch: :ischess960, :isshufflechess.

:variant

Für eine Beschreibung dieses Schlüsselwortes siehe beim gleichnamigen Schlüsselwort :variant : match der Suchliste. Dieses Schlüsselwort wird hier bereitgestellt, um bei einzelnen Positionslisten eine Unterscheidung zwischen den Schachformen treffen zu können.

:whiteelo (ELO – Weiß)

Dieses Schlüsselwort wird nur unterstützt, um kompatibel mit dem CQL-Standard zu sein. Es wird zur Verwendung des gleichnamigen Schlüsselworts :whiteelo : match in der Suchliste geraten. Dort wird es auch genauer beschrieben.

Relationen zwischen den Positionen

:relation

:relation

Das Argument, eine Relationenbeschreibung, wird benutzt um nach Partien zu suchen, in denen Positionenpaare P1 und P2 gewisse Eigenschaften erfüllen. Siehe Relationsliste für eine Beschreibung von Relationen.

Schlüsselwörter zur Zählung

Diese Schlüsselwörter zählen die Anzahl der Positionen, die von einer Positionsliste gefiltert werden. Jedes von ihnen erwartet eine Bereichsangabe als Argument.

Laut Standard-CQL können sie nur in Positionslisten verwendet werden, die sich auf oberster Ebene einer Suchliste befinden. Diese Einschränkung gilt nicht für CQL-S.

:checkcount
:matchcount
:pretransformmatchcount
:pretransformrepetitioncount
:repetitioncount

:checkcount (Schachgebotszähler)

Es werden zwei Bereichsangaben erwartet, deren untere Schranken nicht kleiner als Null, und deren obere Schranken den Wert 3 nicht überschreiten dürfen. Eine Position wird gefiltert, wenn die Anzahl der Schachgebote, die Weiß von Schwarz erhielt, innerhalb der ersten Bereichsangabe, und die Anzahl der Schachgebote, die Schwarz von Weiß erhielt, innerhalb der zweiten Bereichsangabe liegt. Die Bereichsangaben müssen mit dem Trennzeichen : getrennt werden.

note :checkcount ist in erster Linie nützlich in der Schachform Dreimal-Schach. Die nachfolgenden Beispiele gelten für diese Schachform.

(position :checkcount <=2 : 3)

Filtere eine Position wenn Schwarz insgesamt drei Schachgebote erhalten hat. Dies kann nur eine Endstellung sein (in Dreimal-Schach). Die Schachgebote, die Weiß erhielt, spielen hier keine Rolle, denn sie können nur im Wertebereich Null bis 2 liegen.

(position :not :checkcount 0 : 0)

Dies ist tatsächlich eine sinnvolle Abfrage. Wir nehmen an, daß eine der Partien mit folgender Position beginnt (beschrieben mit der Forsyth-Edwards-Notation):

rnb1k1nr/pppp1ppp/8/4p3/3PP2q/2N5/PP3PPP/R1BQKBNR w KQkq - 1 5 +0+2

Diese Position würde gefiltert werden (das Schlüsselwort :not ist zu beachten), denn Schwarz hat dem weißen König bereits zweimal Schach geboten. Mit anderen Worten: diese Abfrage sucht nach Partien die mit einer fortgeschrittenen Stellung beginnen, wobei eine Seite der anderen bereits ein Schachgebot gab. Kombiniert mit :initial finden wir alle Partien auf, die mit einer Startstellung beginnen, in denen eine der Seiten bereits Schachgebote erhalten hat:

(position
    :initial
    :not (position :checkcount 0 : 0))

Siehe auch: :ischeck.

:matchcount (Übereinstimmungszähler)

Filtert nur dann wenn die Anzahl der Positionen in der Partie, die von dieser Positionsliste gefunden werden, innerhalb der gegebenen Bereichsangabe liegt.

Beispiel:

(position :moveto [] :matchcount >=4)

Filtert jede Partie in der mindestens vier Damen geschlagen wurden.

(position
  :flipcolor
  :matchcount >=4
  :movefrom Q
  :moveto ?[a1,a8,h1,h8])

Filtert jede Partie, in denen eine weiße und eine schwarze Dame zusammen mindestens viermal auf ein Eckfeld zog. Wird nach Partien gesucht, in denen jeweils die weiße und schwarze Dame mindestend vier mal auf ein Eckfeld zog, dann wird stattdessen folgender Ausdruck verwendet:

(position
  :flipcolor
  :pretransformmatchcount >=4
  :movefrom Q
  :moveto ?[a1,a8,h1,h8])

Siehe dazu :pretransformmatchcount.

:pretransformmatchcount (Prä-Transformation-Übereinstimmungszähler)

Dieses Schlüsselwort hat die gleiche Syntax wie :matchcount. Zur Beschreibung dieses Schlüsselwortes nehmen wir folgende allgemeine Form einer Positionsliste an:

(position
  T1 T2 ... Tk
  X1 X2 ... Xn
  :pretransformmatchcount n1 n2)

Alle Ti sind die transformierenden Schlüsselwörter, und alle anderen Elemente (nur keine Transformationsschlüsselwörter) sind mit Xi bezeichnet. n1 n2 ist die Bereichsangabe. Wir nehmen nun an, daß Yi,j ein Element bezeichnet das aus Xi in einem der Transformationsschritte j ensteht (möglicherweise identisch zu Xi, weil es transformationsinvariant ist). m soll die Anzahl aller Transformationsschritte bezeichnen. Nun bilden wir einen neuen Ausdruck:

(position
  :or (
    (position Y1,1 Y2,1 ... Yn,1 :matchcount n1 n2)
    (position Y1,2 Y2,2 ... Yn,2 :matchcount n1 n2)
    ...
    (position Y1,m Y2,m ... Yn,m :matchcount n1 n2)))

Die Positionsliste mit :pretransformmatchcount filtert genau diejenigen Positionen, die von der neugeformten Positionsliste gefiltert werden. Mit anderen Worten: die Zählung erfolgt für jeden Transformationsschritt einzeln.

Beispiel:

(position
  :moveto d4
  :pretransformmatchcount >=12
  :shift)

Dies würde jede Partie finden in der mindestens 12 Figuren auf dem gleichen Feld geschlagen wurden. Ersetzen wir :pretransformmatchcount durch :matchcount, dann würde diese Positionsliste Partien auffinden in denen mindestens 12 Figuren irgendwo auf dem Schachbrett geschlagen wurden.

:pretransformrepetitioncount (Prä-Transformation-Wiederholungszähler)

Dieses Schlüsselwort hat die gleiche Syntax wie :repetitioncount, und ist so zu verstehen wie das ähnliche Schlüsselwort :pretransformmatchcount, nur daß :repetitioncount aufeinanderfolgende Positionsmerkmale zählt.

Beispiel:

(position
  :moveto d4
  :pretransformrepetitioncount >=6
  :shift)

Dies würde jede Partie finden in der mindestens sechs Figuren aufeinanderfolgend auf dem gleichen Feld geschlagen wurden.

:repetitioncount (Wiederholungszähler)

Filtert eine Position, wenn sich die Positionsmerkmale aufeinanderfolgend wiederholen, wobei die Anzahl der Wiederholungen durch eine Bereichsangabe spezifiziert wird.

Beispiele:

(position :moveto :repetitioncount >=10)

Filtert jede Position, in der aufeinanderfolgend mindestens zehn Figuren geschlagen werden.

(position :moveto :repetitioncount 0)

Filtert jede Partie, in der niemals eine Figur geschlagen wird. Dies ist äquivalent zu:

(position :moveto :matchcount 0)

Schlüsselwörter für die Stellungs- und Zugbeurteilung

Die folgenden Schlüsselwörter analysieren Positionen. :evaluation und :moveevaluation sollten mit Vorsicht verwendet werden, es sind sehr, sehr langsame Operationen. In einigen Fällen mögen die Schlüsselwörter :exchangeevaluation und :maxswapevaluation eine Alternative sein, diese Operationen sind viel schneller, aber auch noch recht zeitverbrauchend.

:endgameevaluation
:endgameevaluation*
:evaluation
:exchangeevaluation
:maxswapevaluation
:moveevaluation

:endgameevaluation (Endspielbewertung)

Dieses Schlüsselwort bewertet die aktuelle Endspielposition mit Hilfe von Endspieltabellen (Tablebases). Dieses Schlüsselwort kann nur dann erfüllt werden, wenn die entsprechenden Endspieltabellen lokal vorliegen (es erfolgt keine Online-Abfrage).

Als erstes Argument wird spezifiziert, welches Ergebnis laut Endspieltabellen bei bestem Spiel erzielt wird:

remisDas Endspiel ist remis.
mateDie Seite am Zug kann gewinnen.
*mateEiner der Parteien kann gewinnen.
+mateWeiß kann gewinnen.
-mateSchwarz kann gewinnen.

Das optionale zweite Argument gibt an, wieviele Halbzüge minimal und maximal bei beidseitig bestem Spiel erforderlich sind, um Matt zu setzen.

Beispiele:

(position
  :piececount  6
  :piececount  2
  :piececount  2
  :endgameevaluation *mate)

Filtert alle Positionen mit einem Endspiel ++ gegen ++, in dem einer der Parteien laut Endspieltabelle gewinnen kann.

(position
  :piececount  6
  :piececount  2
  :piececount  2
  :endgameevaluation mate >=40)

Filtert alle Positionen mit einem Endspiel ++ gegen ++, in dem die Seite am Zug laut Endspieltabelle gewinnen kann, aber dafür bei beidseitig bestem Spiel mindestens 40 Halbzüge zum Matt benötigt.

:endgameevaluation* (Endspielbewertung)

Diese Version von :endgameevaluation untersucht nur die Positionen, in denen die spezifizierte Figurenkonstellation zum ersten Mal in der Partie erfüllt wird. Somit ist diese Version unter Umständen erheblich schneller in der Suche.

:evaluation (Bewertung)

annotation Diese ist eine sehr langsame Operation und sollte eingeschränkt verwendet werden.

Dieses Schlüsselwort bewertet die aktuelle Position mit Hilfe eines externen Schachprogramms. Die ersten beide Parameter bestimmen den Berechnungsmodus:

  • depth <d> suche nur <d> Halbzüge tief
    movetime <ms> suche exakt <ms> Millisekunden pro Zug

Jetzt kann entweder eine Mattsuche oder eine Stellungsbewertungssuche spezifiziert werden.

Eine Mattsuche erwartet einen weiteren Parameter: nämlich das Wort mate (für Matt). Die Abfrage ist erfolgreich, wenn ein Matt aufgefunden wurde.

Die Stellungsbewertungssuche erfordert zwei weitere Parameter. Der erste davon ist eine Bereichsangabe, nur das hier Bauerneinheiten verwendet werden. Die Abfrage ist erfolgreich, wenn die Bewertung der Position innerhalb der gegebenen Grenzen liegt. Der zweite Parameter ist entweder sidetomove (Zugrecht) oder absolute (absolut). sidetomove bedeutet, daß die Bewertungswerte vom Zugrecht abhängig sind, und mit absolute sind die Bewertungswerte unabhängig davon.

note Beachte daß im Modus movetime die Angabe der Millisekunden auf Centisekunden aufgerundet wird, wenn das verwendete Schachprogramm auf das Protokoll WinBoard/XBoard eingeschränkt ist. Steht dem Schachprogramm das UCI-Protokoll zur Verfügung, so wird die exakte Millisekundenangabe verwendet.

Beispiele:

:evaluation depth 4 >=2.5 sidetomove

Die Seite mit dem Zugrecht hat (wahrscheinlich) eine Gewinnstellung, denn sie ist mit mindestens 2,5 Bauerneinheiten im Vorteil.

:evaluation depth 4 <=−2.5 sidetomove

Die Seite mit dem Zugrecht hat (wahrscheinlich) eine Verluststellung, denn sie ist mit mindestens 2,5 Bauerneinheiten im Nachteil.

:evaluation movetime 3000 <=−3.0 absolute

Schwarz ist (wahrscheinlich) verloren, denn er ist mindestens 3,0 Bauerneinheiten im Nachteil.

:evaluation depth 6 mate

Eine der Seiten kann in spätestens 3 Zügen (6 Halbzüge) mattgesetzt werden.

:exchangeevaluation (Figurentauschbewertung)

Dieses Schlüsselwort analysiert Schlagzüge, um zu sehen ob sie profitabel erscheinen.

Die Stellungsbewertungssuche erfordert zwei weitere Parameter. Der erste davon ist eine Bereichsangabe, nur das hier Bauerneinheiten verwendet werden. Das Schlüsselwort filtert den aktuellen Zug, wenn der Wert innerhalb der angegeben Grenzen der Bereichsangabe liegt, hier werden jedoch Bauerneinheiten verwendet. Nur Schlagzüge werden bewertet. Die Bewertungsfunktion bezieht mit ein, daß Figuren gefesselt sein können, oder daß sie von anderen Figuren gedeckt werden. Der Wert dieser Funktion hängt nicht vom Zugrecht ab.

Bezüglich der Figurenwerte siehe :power.

Beachte daß diese Funktion keine Stellungsbewertung vornimmt, stattdessen wird nur der Schlagabtausch abgeschätzt.

Beispiel:

:exchangeevaluation <=−3

Dieser Schlagzug ist (wahrscheinlich) ein Patzer.

:maxswapevaluation (Maximum einer Schlagabtauschbewertung)

Dieses Schlüsselwort erlaubt die Abschätzung von Zügen. Es erwartet als Argument zwei Figurenbezeichner, gefolgt von einer Bereichsangabe. Das erste Argument spezifiziert die erlaubten Figuren und Felder des nächsten Zuges, das zweite Argument spezifiziert die Zielfelder. Für jeden erlaubten Zug wird ein Wert berechnet, der den materiellen Vorteil bzw. Verlust dieses Zuges berechnet (in Bauerneinheiten), aufgrund möglicher Schlagabtäusche auf dem Zielfeld. Abschliessend wird das Maximum alle berechneten Werte ausgewählt.

Das Schlüsselwort filtert eine Position wenn der berechnete Wert innerhalb der gegebenen Bereichsangabe liegt, wobei der Bereich in Bauerneinheiten spezifiziert wird. Die Bewertungsfunktion bezieht mit ein, das Figuren gefesselt sein können, oder von anderen Figuren gedeckt werden. Der Wert dieser Funktion hängt nicht vom Zugrecht ab.

Bezüglich der Figurenwerte siehe :power.

Beachte daß diese Funktion keine Stellungsbewertung vornimmt, stattdessen wird nur der Schlagabtausch abgeschätzt.

note Dieses Schlüsselwort ist ähnlich dem Schlüsselwort :maxswapvalue von Chess Assistant 9 (⇒ The CQL 3.GX Extension ), aber auf sehr verschiedene Weise implementiert.

Beispiele:

(position :maxswapevaluation >0)

Diese Abfrage filtert Positionen, in denen Weiß mit Materialgewinn droht.

(position :maxswapevaluation ?1-7 ??8 >=0)

Diese Abfrage filtert Positionen, in denen eine weiße Dame die achte Reihe erobern kann ohne materiellen Verlust.

:moveevaluation (Zugbewertung)

annotation Diese ist eine sehr langsame Operation und sollte eingeschränkt verwendet werden.

Dieses Schlüsselwort vergleicht die Differenz einer Stellungsbewertung der aktuellen Position mit der nächsten Position. Die Bewertung wird mit Einsatz eines externen Schachprogramm durchgeführt. Es werden sieben Parameter erwartet. Die ersten beiden Parameter sind Figurenbezeichner. Der erste davon spezifiziert die erlaubten Figuren und Felder des nächsten Zuges, der zweite spezifiziert die Zielfelder. Der dritte und vierte Parameter spezifizieren den Berechnungsmodus:

  • depth <d> suche nur <d> Halbzüge tief
    movetime <ms> suche exakt <ms> Millisekunden pro Zug

Der fünfte Parameter ist die Bereichsangabe in Bauerneinheiten. Die Abfrage ist erfolgreich, wenn die Bewertung der Position innerhalb der gegebenen Grenzen liegt. Der Wert des letzten Zuges ist die Differenz zwischen der Bewertung der aktuellen Position und der Bewertung der vorangegangenen Position. Im Falle von Mattpositionen ist die Differenz immer größer als 10.000.

Der sechste Parameter ist entweder sidetomove (Zugrecht) oder absolute (absolut). sidetomove bedeutet, daß die Bewertungswerte vom Zugrecht abhängig sind, und mit absolute sind die Bewertungswerte unabhängig davon.

note Beachte daß im Modus movetime die Angabe der Millisekunden auf Centisekunden aufgerundet wird, wenn das verwendete Schachprogramm auf das Protokoll WinBoard/XBoard eingeschränkt ist. Steht dem Schachprogramm das UCI-Protokoll zur Verfügung, so wird die exakte Millisekundenangabe verwendet.

Beispiele:

:moveevaluation ? depth 4 >=3.0 sidetomove

Filtere die erste Position mit einer Bewertungsdifferenz von mindestens 3,0 Bauerneinheiten. Dies heißt. das der letzte Zug (wahrscheinlich) ein Patzer war.

:moveevaluation depth 4 <=−3.0 absolute

Filtere die erste Position, in der die Bewertungsdifferenz mindestens 3,0 Bauerneinheiten als Vorteil für Schwarz beträgt. Dies bedeutet, daß der letzte weiße Zug (wahrscheinlich) ein Patzer war. Nur Schlagzüge werden bewertet.

(match
  (position :moveevaluation [] ?[?1,?8]
             <=0.0 movetime 5000 absolute)
  (position :promotion  :cut))

Suche nach Positionen, in denen sie Seite mit dem Zugrecht die erste Bauernverwandlung in dieser Partie ausführt, aber keinen bessere Stellungsbewertung dadurch erzielt. Wir stellten sicher, daß nur Bauernumwandlungszüge bewertet werden.

Siehe auch: :endgameevaluation,

Schlüsselwörter für Akkumulationen

Es gibg hauptsächlich zwei Akkumulatorschlüsselwörter, :accumulate und :sumrange. Diese werden verwendet um die Anzahl der Transformationen einer Positionsliste zu zählen, die die aktuelle Position filtern. Jedesmal wenn eine transformierte Positionsliste eine Position filtert, wird der assoziierte Akkumulator inkrementiert. Jede Positionsliste kann dann mit :sumrange testen, ob der akkumulierte Wert innerhalb eines gewissen Bereichs liegt.

:accumulate
:accumulate*
:sumrange

:accumulate (Akkumulieren)

Dies erwartet als Argument den Namen des Akkumulators. Jedesmal wenn die Anwendung eines Elements auf die Menge der transformierten Positionslisten eine Position filtert, wird der mit diesem Namen assoziierte Akkumulator inkrementiert. Der Akkumulator wird wieder auf Null gesetzt, sobald eine neue Position untersucht wird (nach einem Zug). Als Folge davon sollte :accumulate nicht innerhalb von folgenden Schlüsselwörtern verwendet werden: :not, :sequence, und :gappedsequence. Zu beachten ist daß :flipcolor in den meisten Fällen unerwartete Ergebnisse hervorruft, wenn es zusammen mit :accumulate verwendet wird, denn der Akkumulator wird nicht auf Null zurückgesetzt zwischen den Farbwechseln.

Für Beispiele siehe: Benutzung von Akkumulatoren zur Zählung von Freibauern.

Siehe auch: :accumulate*.

:accumulate* (Akkumulieren)

Um auch :flipcolor verwenden zu können bietet CQL-S eine Erweiterung, indem accumulate* verwendet wird, hier wird für jede Farbe einzeln gezählt, dies macht eine getrennte Zählung möglich.

Für ein Beispiel siehe: Benutzung von Akkumulatoren zur Zählung von Freibauern.

Siehe auch: :accumulate.

:sumrange (Ergebnisbereich)

Dies erwartet als Argument den Namen eines Akkumulator und eine Bereichsangabe. Es filtert eine Position, wenn der Wert des bezeichneten Akkumulators innerhalb des gegebenen Bereichs liegt. Wenn :accumulate* verwendet wird, dann unterscheidet :sumrange automatisch zwischen den Farben.

Für Beispiele siehe: Benutzung von Akkumulatoren zur Zählung von Freibauern.

Schlüsselwörter für das Markieren

:tagmatch

:tagmatch (Markierungsvergleich)

Das Schlüsselwort :tagmatch erwartet zwei Argumente, den Namen einer Markierung und einen Figurenbezeichner. Es filtert nur dann wenn die an die Markierung gebundene Figur vom zweiten Argument bezeichnet wird. Für weitere Informationen siehe Abschnitt Markierung.

Schlüsselwörter für die Steuerung

Die folgenden steuernden Schlüsselwörter beeinflussen den Ablauf der Suche bzw. das Suchergebnis.

:cut
:exclude
:skip

:cut (Beschneiden)

Dieses Schlüsselwort kann in zwei Formen angewandt werden: entweder ist es parameterlos, oder es hat eine Positionsliste als Parameter. In der ersten Form wird die Positionssuche in der aktuellen Variante abgebrochen sobald die Bedingung der Positionsliste aufgefunden wird. In der zweiten Form bricht die Suche in der aktuellen Variante ab, sobald die Bedingung des Arguments aufgefunden wird. Dieses Schlüsselwort ist immer erfolgreich, mit anderen Worten: es beeinflußt nicht das Resultat der anderen Filter.

Der :cut-Filter hat niedrigere Priorität als alle anderen Filter. Das heißt, daß eine Position gefiltert wird, wenn alle anderen Filter diese Position akzeptieren, unabhängig vom Resultat des :cut-Filters. Soll die Suche aber immer mit einem negativen Resultat abschliessen, wenn die :cut-Bedingung zutrifft, dann wird stattdessen das Schlüsselwort :exclude verwendet.

note :cut hat eine niedrigere Priorität als :exclude.

Beispiele für :cut:

(match
  (position :mate)
  (position :cut :check))

Suche nach Partien die mit einem Matt enden, und keine der beiden Seiten hat jemals zuvor Schach geboten. Hier kann :cut nicht durch :exclude ersetzt werden, denn ein Mattgebot enthält immer auch ein Schachgebot, und dies würde auch die Partie ausschliessen.

Tatsächlich wäre das Schlüsselwort :cut für das obige Suchkriterium nicht erforderlich, wie folgende Umformung zeigt:

(match
  (position :mate)
  (position :check :matchcount 1))

Aber diese Version durchsucht evt. die gesamte Partie, und die vorhergehende Version mit :cut schlägt bereits fehl sobald das erste Schachgebot erfolgt. In vielen Fällen kann der Gebrauch des Schlüsselwortes :cut viel effizienter sein als der Gebrauch von ":matchcount 1".

Diese Suche nach dem ersten Schachgebot in der Partie, das zugleich auch Matt bietet, kann auch mit :checkcount formuliert werden:

(match
  (position
    :checkcount 1 : 0
    :mate
    :flipcolor))

Jedoch ist auch hier die Version mit :cut viel effizienter, denn auch hier wird nicht nach dem ersten Schachgebot die Suche abgebrochen, d.h. es wird unter Umständen die gesamte Partie durchsucht.

:exclude (Ausschliessen)

Dieses Schlüsselwort kann in zwei Formen angewandt werden: entweder ist es parameterlos, oder es hat eine Positionsliste als Parameter. In der ersten Form wird die aktuelle Variante ausgeschlossen wenn eine Position von der Positionsliste gefiltert wird. In der zweiten Form wird die aktuelle Variante ausgeschlossen, wenn das Resultat des Arguments positiv ist. Diese Schlüsselwort beeinflußt nicht das Resultat der anderen Filter.

Dieses Schlüsselwort schließt selbst dann Varianten aus, wenn eine Position gefiltert wurde bevor die :exclude-Bedingungen erfüllt wurden. Kurz gesagt: :exclude schließt unter gewissen Bedingungen Partien vollständig aus der Suche aus (wenn die Hauptvariante ausgeschlossen wurde).

note :exclude hat eine höhere Priorität als :cut.

Beispiel:

(match
  (position <A>)
  (position :exclude <B>))

Suche nach Partien die eine Position enthalten, die Bedingung <A> erfüllen, aber nicht wenn es in dieser Partie eine Position gibt, die die Bedingung <B> erfüllt.

Soll :exclude nicht mehr wirken, nachdem <A> erfüllt ist, dann kann folgender Ausdruck verwendet werden:

(match
  (position :cut <A>)
  (position :exclude <B>))

Aber hier wirkt :exclude, wenn <A> und <B> zugleich erfüllt werden. Soll :exclude aber nur wirken, solange <A> nicht erfüllt ist, so geschieht dies folgendermaßen:

(match
  (position :cond (
    (position <A>) (position :cut)
    (position :exclude <B>)))

Zur Erinnerung: die Auswertungsreihenfolge in von links nach rechts.

Und soll :exclude nur dann wirken, nachdem <A> erfüllt wurde, so geschieht dies mit:

(match
  (position :gappedsequence (
    (position <A>)
    (position :exclude <B>)))

:skip (Überspringen)

Mit Hilfe dieses Schlüsselwortes kann eine gefundene Stellung übersprungen werden. Dies kann auch ohne die Verwendung dieses Schlüsselwortes formuliert werden, jedoch ist die Formulierung der Positionsliste mit Hilfe dieses Schlüsselwortes manchmal unkomplizierter, und dies resultiert oft in eine schnellere Suche.

Bedeutungslose Schlüsselwörter

:markall
:noannotate

:markall (Alles markieren)

Dieses Schlüsselwort wird unterstützt um kompatibel mit dem CQL-Standard zu sein, es hat jedoch keinerlei Bedeutung in CQL-S.

:noannotate (Nicht kommentieren)

Dieses Schlüsselwort wird unterstützt um kompatibel mit dem CQL-Standard zu sein, es hat jedoch keinerlei Bedeutung in CQL-S.