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

CQL - Beispiele

Benutzung von Akkumulatoren zur Zählung von Freibauern

Wir werden zeigen wie :accumulate und :sumrange zu verwenden sind, um nach Partien mit mindestens drei weißen Freibauern in einer Position zu suchen. Ein Freibauer ist ein Bauer, dem kein gegenerischer Bauer auf der gleichen Linie oder einer benachbarten Linie im Weg steht. Zuerst schreiben wir einen Positionsfilter, der jede Position findet mit einem weißen Freibauern:

; finde eine Position mit einem weißen Freibauern
(position
  d2
  :piececount [][d3-7] 0
  :piececount [c3-7,e3-7] 0
  :shift)

Um mindestens drei weiße Feibauern zu finden fügen wir die Akkumulation hinzu:

; finde eine Position mit mindestens drei weißen Freibauern
(position
  d2
  :piececount [][d3-7] 0
  :piececount [c3-7,e3-7] 0
  :shift
  :accumulate weisse_freibauern_zaehler
  :sumrange weisse_freibauern_zaehler 3 8)

Nun wollen wir Positionen finden mit mindestens zwei schwarzen Freibauern:

; finde eine Position mit mindestens zwei schwarzen Freibauern
(position
  d7
  :piececount [][d2-6] 0
  :piececount [c2-6,e2-6] 0
  :shift
  :accumulate schwarze_freibauern_zaehler
  :sumrange schwarze_freibauern_zaehler 2 8)

Letzendlich kombinieren wir diese Listen, um Positionen mit mindestens zwei schwarzen und drei weißen Freibauern zu finden:

; finde eine Position mit mindestens drei
; weissen und zwei schwarzen Freibauern
(position
  :sumrange weisse_freibauern_zaehler 3 8
  :sumrange schwarze_freibauern_zaehler 2 8
  :and (
    (position
      d2
      :piececount [][d3-7] 0
      :piececount [c3-7,e3-7] 0
      :shift
      :accumulate weisse_freibauern_zaehler)
    (position
      d7
      :piececount [][d2-6] 0
      :piececount [c2-6,e2-6] 0
      :shift
      :accumulate schwarze_freibauern_zaehler)))

Wir suchen nun nach Positionen mit mindestens drei Freibauern.

; Finde Positionen mit mindestens drei Freibauern.

(match
  (position
    :or (
      (position
        :sumrange zaehler 3 8
        Pd2
        :piececount [pP][d3-7] 0
        :piececount p[c3-7,e3-7] 0
        :shift
        :flipcolor ; accumulate* zählt für jede Farbe einzeln
        :accumulate* zaehler))))

Letzendlich ist anzumerken, daß diese Beispiele nur die Wirkungsweise von :accumulate veranschaulichen sollen. Tatsächlich können all diese Abfragen sehr viel effizienter mittels :pawncount realisiert werden.

Beispiele zur Relationenliste

Die folgende Positionsliste sucht nach Partien, in denen die Anordnung

  • e6 e7 e4 d5

versetzt oder gespiegelt enthalten ist, aber keine der Figuren der Originalanordnung auf denselben Feldern steht:

Wird der Parameter für :originalsamecount verändert, beispielsweise vom derzeitigen Wert 0 auf den Bereich 0 3, dann wäre eine Überlappung mit bis zu drei Feldern der Originalanordnung erlaubt.

Beispiele für Markierungen

Wir untersuchen das Problem, alle Partien zu erkennen, in denen der gleiche Turm alle vier Ecken des Bretts besucht:

(match
  :forany turm [] ; über alle Türme iterieren
  (position $turm[a1])
  (position $turm[h1])
  (position $turm[h8])
  (position $turm[a8]))

In diesem Beipiel definiert das Schlüsselwort :forany eine Markierung mit dem Namen "turm", die an weiße oder schwarze Türme gebunden wird, (die auch aus einer Bauernumwandlung enstanden sein konnten).

Die erste Positionsliste findet Partien in denen eine Position vorliegt, in der die Markierung "turm" einen Turm auf a1 repräsentiert. Die nächste Positionsliste findet Partien in denen eine Position vorliegt, in der die Markierung "turm" einen Turm auf h1 repräsentiert. Die Markierung repräsentiert die gleiche Figur zwischen den Positionslisten. Das Schlüsselwort :forany bindet nacheinander die Markierung an alle erlaubten Figuren.

Da eine Suchliste nur dann Partien filtert, wenn jeder einzelne Positionsfilter diese Partien gefiltert hat, findet dieses Skript was wir suchen.

Zweites Beispiel, das Excelsior-Thema: ein Bauer startet auf der zweiten Reihe und verwandelt sich dann.

(match
  :forany bauer []
  (position
    :initial
    :tagmatch bauer []?[27]
    :gappedsequence ((position :movefrom $bauer :promote ))))

:tagmatch findet in der Startposition Bauern auf der zweiten oder siebten Reihe, und die mit :gappedsequence definierte Positionsreihe ist erfolgreich, wenn die Markierung "bauer" in irgendeiner nachfolgenden Position verwandelt.

Drittes Beispiel: die gleiche Figur bietet mindestens 30 mal Schach in einer Partie.

(match
  :forany schachgeber 
  (position
    :btm
    :attackcount $schachgeber  1
    :matchcount >=30
    :flipcolor))

Viertes Beispiel: ein Springer gibt Matt mit seinem ersten Zug.

(match
  :forany springer []
  (position
    :movefrom $springer
    :matchcount 1)
  (position
    :mate
    :attackcount $springer [] 1))

Beispiele für Zugsequenzen

; Wir suchen nach einem Mattmanöver im Legall-Stil,
; wie in der Partie Falkbeer-N.N., Wien 1847:
; 1.e4 e5 2.f3 c6 3.d4 exd4 4.c3 dxc3 5.xc3 d6
; 6.c4 g4 7.0-0 e5 8.xe5 xd1 9.xf7+ e7 10.d5#
; Wir wollen auch Partien finden, in denen der Unterlegene
; bereits nach dem Läuferschach aufgibt.

(match
  (position
    :flipcolor ; auch nach dem farbinvertierten Thema suchen
    ; Erinnerung: '!' bedeutet 'einziger Zug'.
    :line (xe5 x :f7+ | e7! d5#)))

; Dies vermag auch die folgenden Partien zu finden:
; 1.e4 e5 2.f3 d6 3.c4 g4 4.c3 h6 5.xe5 xd1
; 6.xf7+ 1-0
; 1–0 Banks-Pakenham, Halesowen v Warley Quinbourne 2001
; 1–0 Zaynytdinov-Kalashnikov, Povolje 2010
; Suche nach einem Mattmanöver im Réti-Stil,
; wie in der Partie Réti-Tartakower, Wien 1910:
; 1.e4 c6 2.d4 d5 3.c3 dxe4 4.xe4 f6 5.d3 e5 6.dxe5
; a5+ 7.d2 xe5 8.0-0-0 xe4 9.d8+ xd8 10.g5++ c7
; (10...e8 11.d8#) 11.d8#
; Finde auch dann Partien, wenn der Unterlegene bereits
; nach dem Damenschach aufgibt.

(match
  (position
    :flipcolor ; auch nach dem farbinvertierten Thema suchen
    ; Erinnerung: '!' bedeutet 'einziger Zug'.
    :line (d8+ | xd8! :g5++  []d8#)))

; Dies vermag auch die folgende Partie zu finden:
; 1.e4 c5 2.d4 cxd4 3.c3 d5 4.exd5 xd5 5.f3 g4 6.a4+
; c6 7.xd4 d7 8.b5 0-0-0 9.xa7+ xa7 10.xa7 d1+
; 0–1 Dutch-Sugden, London 1964

In beiden obigen Beispielen ist zu beachten, daß auch Partien aufgefunden werden können, in denen die potentiellen Zugfolgen nicht gespielt wurden, sondern eine anderer Fortsetzung erfolgte. D.h. es werden auch Partien aufgefunden, in denen die potentielle Zugfolge verpaßt wurde. Sollen solche Partien ausgeschlossen werden, dann findet hier :terminal eine Anwendung:

(match
  (position
    :sequence (
      (position
        :flipcolor
        :line (d8+ | xd8! :g5++  []d8#))
      (position :terminal))))

Nun werden nur diejenigen Partien aufgefunden, die auch mit einem der Züge d8, xd8, :g5, , oder []d8# enden.

Bauernendspiele

; Eine der Parteien opfert in einem materiell gleichstehenden
; Bauernendspiel zwei Bauern, erhält mindestens einen nicht
; aufhaltbaren Freibauern, und gewinnt die Partie.

(match
  (position
    :flipcolor    ; auch nach dem farbinvertierten Thema suchen
    :result 1-0   ; Weiß gewinnt die Partie
    :gappedsequence (
      (position
        :piececount [] 0    ; es ist ein Bauernendspiel
        :powerdifference  0     ; materielle Ausgeglichenheit
        ; noch keine unaufhaltbare Freibauern
        :pawncount  passed-!inside 0)
      (position
        :btm                     ; Schwarz ist am Zug
        :piececount [] 0    ; nach wie vor ein Bauernendspiel
        :powerdifference  <=−2  ; zwei Bauern im Nachteil
        ; mindestens ein unaufhaltbarer Freibauer
        :pawncount  passed-!inside >=1))))

Noch mehr Beispiele

; Ersticktes Matt

; Ein ersticktes Matt liegt vor, wenn ein Springer Matt
; setzt und der König nicht entweichen kann, weil er
; von eigenen Figuren umgeben (erstickt) ist.

(match
  (position
    :flipcolor            ; Jede Farbe
    :attackcount  [.] 0 ; König ist von eigenen Figuren umzingelt
    :btm                  ; Schwarz ist am Zug
    :mate))               ; und ist matt
; Allumwandlung: Suche nach Partien mit Bauernumwandlungen in alle
; Figuren. Die Reihenfolge der Positionslisten spielt keine Rolle.

(match
  (position :promote [])
  (position :promote [])
  (position :promote [])
  (position :promote []))
; Allumwandlung: Suche nach Partien mit Bauernumwandlungen in alle
; Figuren. Die Reihenfolge der Positionslisten spielt keine Rolle.
; Es wird verlangt, daß alle Umwandlungen aufeinanderfolgend sind.

(match
  (position :matchconsecutive (
    (position :promote [])
    (position :promote [])
    (position :promote [])
    (position :promote [])))