Showing posts with label chess query language. Show all posts
Showing posts with label chess query language. Show all posts

Tuesday, September 13, 2011

Reflexiones sobre el "Chess Query Language"


¿Qué es lo que hace de una posición de ajedrez un patrón en particular? ¿qué elementos son los que hacen que se pueda describir un patrón como ganador -digamos- en una posición particular? Por ejemplo, consideremos la siguiente:

Juegan las blancas
(Patrón 1)

Quien sepa algunas cosas sobre el ajedrez sabrá que las blancas pueden dar mate en cuatro jugadas con 1.Axh7+ Rh8 2.Ag6+! (evitando que la dama negra capture a la blanca), 2. ... Rg8 3. Dh7+ Rf8 4.Df7#. De hecho, no importa dónde esté el alfil blanco siempre y cuando se mantenga en la diagonal b1-h7:

Juegan las blancas
(Patrón 2)

En este ejemplo podríamos caracterizar la posición como un alfil que corre sin interrupción desde b1 hasta h7, con la dama blanca en h6 y el rey negro en g8. Pero... ¿es esto suficiente? Aparentemente sí. Pero consideremos ahora la siguiente posición:

Juegan las blancas
(Patrón 3)

Este patrón parece ser el mismo que en la posición anterior, pero he aquí que cambia totalmente todo el asunto, porque ahora la torre negra de a7 defiende el punto del mate en f7. Aquí, por ejemplo, las blancas no tienen más que tablas: 1.Axh7+ Rh8 2.Ag6+ Rg8 3.Ah7+ y tablas por repetición. Las blancas no tienen mejor opción que esto.

La pregunta aquí es ¿cómo definir los elementos del patrón que hacen que el patrón 1 sea ganador, Mientras que en el patrón 3 el hecho de tener la torre negra en a7 hace imposible que el patrón de mate se dé? Yo quisiera hallar un lenguaje que describiera los patrones, algo así como una geometría analítica para el tablero de ajedrez. Déjenme ponerles un ejemplo:

Considérese la ecuación de la parábola:

Gráfica 1

y=x^2. Sin vemos la expresión, podemos hacer el dibujo que genera la imagen de la parábola, porque la expresión algebraica representa ni más ni menos a la gráfica 1. En este sentido, la expresión algebraica define y caracteriza la parábola mencionada. ¿Podría haber una especie de "lenguaje algebraico" para caracterizar sin errores cualquier posición de ajedrez? Llevo ya un par de años atorado en esta problemática. No veo cómo hacer un lenguaje que caracterice las posiciones del tablero.


Más de uno se preguntará como para qué quiero algo así. Es fácil: imaginen que tengo la siguiente posición, la cual se dio en la siguiente partida:

Paulsen - Schwarz
Lepzig 1879 (match)
3er juego

1. e4 e6 2. d4 d5 3. e5 c5 4. c3 Nc6 5. Nf3 Qb6 6. a3 Bd7 7. b4 cxd4 8. cxd4 Nge7 9. Nc3 Nf5 10. Na4 Qc7 11. Bb2 Be7 12. Rc1 a6 13. Nc5 Bxc5 14. Rxc5 O-O 15. Bd3 Nfe7?





 
Paulsen-Schwarz
Leipzig 1897 (match)
3er partida
Juegan las blancas 
(Patrón 4)

16. Bxh7+! el clásico "regalo griego". El esquema está dado: el rey negro enrocado. El caballo negro que normalmente está en f6, defendiendo h7 ya no está. El alfil blanco apunta a h7, el caballo en f3 brincará a g5 y la dama blanca entonces se incorporará al ataque.

Si tuviese una manera de describir esta posición vía este "mágico lenguaje" entonces podría hacer búsquedas sobre todas las posiciones en donde este esquema se diese en una base de datos, por ejemplo la megabase 2010. Así, por ejemplo, hallar todas las posiciones con el patrón 4 me permitiría hacer incluso un catálogo o libro con este esquema, y así practicarlo hasta que fuese parte de mi acervo ajedrecístico. Vaya, que escribir libros de ejercicios de combinación sería algo ridículamente simple, pues como autor no tendría que hurgar literalmente en las posiciones, sino que podría pedirle al sistema que hallara el patrón buscado y listo, colección de posiciones para estudiar.

Por ello mismo, el Chess Query Language - CQL, del cual ya hablé aquí antes, es quizás la herramienta que podría solventar las dificultades. Curiosamente el CQL me permite buscar todas las posiciones en un archivo PGN, en donde se dio el regalo griego. Entonces me pregunto: ¿Necesito realmente un lenguaje que describa las posiciones en ajedrez para crear patrones? o bien ¿un lenguaje de consultas en una base de datos es la sustitución natural de este potencial lenguaje y es más que suficiente? Dicho de otra manera, ¿para qué quiero describir posiciones si el CQL me permite crear una búsqueda de un patrón determinado? ¿Será esto equivalente a lo que busco? 

Me llama la atención que el problema de generar un lenguaje descriptor de posiciones sea lo mismo (o al menos equivalente, para hablar con propiedad), que el tener un lenguaje de consultas sobre una base de datos, que finalmente tiene un origen en búsquedas de cadenas. ¿Qué opina lector/a, sobre esto en particular?

Friday, February 18, 2011

Lenguaje de búsquedas para posiciones de ajedrez


Cuando Boris Spassky iba a defender su título de Campeón del Mundo frente al estadounidense Bobby Fischer, se sabe que los soviéticos tardaron unos cuatro meses en transcribir todas las partidas que hallaron sobre el retador. El asunto era muy importante, porque no se jugaba solamente un título mundial de ajedrez, sino que se ponía en jaque, literalmente, el liderazgo de los soviéticos en el ajedrez, juego que representaba un símbolo nacional y que el comunismo soviético había abanderado como parte de su revolución cultural.

Hoy día, no se necesita un grupo de ajedrecistas que compilen las partidas de un rival en particular. Gracias a las bases de datos de partidas, de los manejadores de éstas, como Chessbase o Chess Assistant, se puede tener la colección más grande de partidas de ajedrez que se pueda uno imaginar, la cual ya oscila entre los 5 y 6 millones de encuentros ajedrecísticos. Por supuesto que esta información prácticamente condensa todas las partidas de ajedrez jugadas desde que éste se practica como lo conocemos (alrededor de 1525).

Pues bien, en algún momento -ya lo he dicho- tuve un momento que considero de verdadera iluminación. Por un instante sentí que entendía cómo comprender el ajedrez y para ello me di a la tarea de trabajar en posibles herramientas que me ayudaran a demostrar que iba por el camino correcto. Por ello nació el programa que analiza los patrones de las posiciones, el cual pretende, de alguna manera, crear un lenguaje de descripción de posiciones, pero que de alguna manera tome en cuenta los patrones de posiciones arquetípicas, las cuales pueden mostrar una combinación ganadora, en donde los elementos se repiten (a eso me refiero con patrones). En estos dos enlaces, éste y éste otro, hablé de estas ideas.

Por algún tiempo, que ya se antoja largo, he buscado cómo representar los patrones de ajedrez más típicos. La razón de esto es que así se podría hacer búsquedas de patrones en partidas de ajedrez y así sacar la información relevante que se hubiese dado con un patrón determinado. Algún alumno en la UNAM me dijo que quizás sería bueno hablar con algún matemático, que él pensaba que esto era una tarea para un especialista de esta naturaleza. Pero entre que no sé quién podría ocuparse de un lenguaje de descripción como el que creo necesitar, y entre la poca información que sobre este tema puede hallarse en la red, lo he estado dejando para un mejor momento.

Pero he aquí que encuentro el Chess Query Language (CQL), un sistema para hacer búsqueda de temas en posiciones de ajedrez. Aunque esto no es estrictamente los patrones en los que estoy interesado, es evidente que tiene una fuerte correlación y que, probablemente, sea el camino correcto para desarrollar este lenguaje descriptivo del que hablo.

El Chess Query Language fue diseñado para permitir a investigadores, autores y jugadores, a buscar temas en partidas, problemas y estudios. Hay que especificar el tema que se busca y la base de datos (partidas en PGN) en donde queremos buscar. Cuando se corre la consulta (usando cql.exe), el sistema crea un nuevo archivo PGN con los partidos de ajedrez que coinciden con el tema que se busca.

Como en todos los manejadores de bases de datos, CQL especifica un conjunto pequeño, pero poderoso, de primitivas para ser usadas en los temas de ajedrez. CQL puede encontrar mucho más información relevante que cualquier otro programa de ajedrez. Los usuarios pueden buscar en temas como ahogado, clavadas múltiples, juegos en donde ocurre la misma posición pero en donde en el lado ganador falta una pieza, los temas Grimshaw y Novotny, juegos con cierto número de capturas en una sola casilla, juegos con cierta cantidad de peones pasados, blancos o negros, etc. Las posibilidades se antojan infinitas.


Una ventaja obvia de usar CQL es que se le puede programar la búsqueda de, por ejemplo, el regalo griego (el sacrificio en h7 con jaque con un alfil), y el sistema dará todas las partidas que encuentre en la base de datos de referencia que pongamos. Imaginen para qué puede servir esto: crear libros de táctica en base a temas específicos, en donde el autor del libro no tiene que buscar "a mano" cada posición, sino que puede ayudarse de esta herramienta para así encontrar las mejores posiciones sobre el tema particular que se busque.

Por ejemplo, veamos una interesante búsqueda que hace Tim Krabbé en su excelente página de ajedrez, en donde por cierto, hallé por primera vez referencias al CQL. Dice Krabbé que en alguna ocasión soñó con una combinación. He aquí la posición de interés:

Tim Krabbé
Juegan las negras

La solución es sencilla: 1. ... Dh3!! 2.Rxh3 Cf4+ 3.Rg3 Cxe2+ seguido de 4. ... Cxc3 ganando. 0-1.

Muy sencilla pero... ¿se habría dado esta posición antes? ¿o este tema (no necesariamente las piezas estrictamente en las posiciones del diagrama). Con CQL Krabbé halló dos estudios, el primero de 1954:



P. Okonkowski 
Juegan las blancas y ganan
Schach, 1954

La solución es 1.Tc6! Txc6 y ahora la combinación soñada por Krabbé:  2.Df5+ Rxf5 3.Cd4+ Re5 4.Cxc6+ Rd5 5.Cxa5 y las blancas ganan.

Sorprendente. Parece magia que algo como CQL pueda hallar este tema cuando las piezas están en situaciones por demás diferentes.

De acuerdo a Krabbé, y cosa que comparto, CQL es la respuesta también al viejo problema de la clasificación de estudios de ajedrea. La base de estudios de Van der Heijden no tiene clasificación por temas, porque entre otras cosas, el asignar y etiquetar un tema es, como en literatura, algo que tienen que ver con  gustos personales y además, la creación de nuevos temas, o el definir los ya existentes requeriría de tener que clasificar la base de estudios de nuevo.

Por ello, es quizás mejor definir primero una interpretación y luego entonces, buscar por estudios y partidas en donde se dé esta interpretación. Por ejemplo, tómese el tema que tanto le gusta a Krabbé, el de la guardia desguardada -un pieza da jaque y una pieza se interpone en una casilla no defendida. Esto ha pasado en muchas partidas y estudios, pero nunca se ha reconocido como un tema por sí mismo. En Chessbase, por ejemplo, es imposible definir esta búsqueda, pero en CQL esto se hace de manera sorprendentemente fácil:

:wtm
:check
:movefrom [QRBNP]
:moveto .d4
:attackcount A Ad4 0
:shift
:flipcolor


Esto dice que juegan las blancas (wtm - white to move) y están en jaque (check), y que moverán cualquier pieza (movefrom [QRBNP]), a excepción del Rey a la casilla vacía d4 (moveto .d4), la cual tiene cero ataques después de esto (attackcount A Ad4 0). Los eventos especificados pueden tener lugar en cualquier casilla (shift). Finalmente, la última instrucción (flipcolor) nos permite asegurar que se encuentren ejemplos con los colores cambiados. Se puede poner también ":moveto ?d4", para limitar la búsqueda a los casos en donde la pieza interpuesta es capturada.

He aquí uno de los resultados de esta consulta con CQL, que a Krabbé se le pasó por alto cuando se jugó esta partida:

Topalov - Judit Polgar
Novgorod 1996
Juegan las blancas

43.Tc7 un guarda indefenso es la justificación para esta aguda jugada. 43...Tb8 44.Txf7+ Rg8 45.e6 Dxe3+ 46.Dxe3 Tb1+ 47.Dc1 dejando libre e3 para impedir el mate. Por supuesto que Judit habrá visto, pero tal vez no, que después de 47...Txc1+ 48.Rf2, el final esta perdido, por ejemplo, 48...Tf1+ 49.Re3 Txf7 50.d7! En la partida, se siguió: 48...Tc6 49.Td7 Ab5 50.Re3 Tc2 51.Tc7 Te2+ 52.Rf4 Tf2+ 53.Rxe4 Te2+ 54.Rf5 Tf2+ 55.Re5 Te2+ 56.Rf6 Tf2+ 57.Re7 Te2 58.d7 Axd7 59.Rxd7 Td2+ 60.Re8 y las negras se rindieron. 1-0.

Aunque el CQL se desarrolló para ser usado con la base de estudios de Van der Heijden, la cual contiene más de 75,000 estudios, CQL puede ser usado también con partidas y con bases de datos mucho más grandes. Pero como el sistema genera archivos PGN, hay que convertir las bases de partidas (normalmente en formatos propietarios de Chessbase y/o Chess Assistant), al formato PGN (Portable Game Notation), Krabbé tuvo que convertir 1.9 millones de partidas a PGN. Después de unos 20 minutos, el holandés obtuvo 1.3 GBytes de partidas en un archivo PGN. Hacer búsquedas en estas enormes bases de datos puede tomar tiempo, muchas horas quizás. Se puede sin embargo hacer una consulta en CQL que sea muy amplia y así reducir la muestra a buscar. Por ejemplo, a Krabbé le tomó 15 minutos extraer 4000 partidas en donde ocurre la promoción de un peón, pero en cualquier pieza a excepción de la dama. Con esta nueva base de datos, se pudo buscar temas que involucren la sub-promoción, lo cual resulta hacerse en unas 500 veces más rápido.

Se puede descargar el Chess Query Language de forma gratuita. Viene con manual y muchos ejemplos (scripts .cql). Es un programa de línea de comandos, pero el compositor de estudios checoslovaco, Emil Vlasák, ofrece VisualCQL, una utilería que probablemente haga sentir más cómodo al usuario en un ambiente Windows.

CQL fue desarrollado por Gady Costeff y Lewis Stiller. Es gratuito (con los correspondientes Derechos de Autor 2003-2004). Utiliza una programa base de datos (partidas en este caso) del software libre llamado Scid, desarrollado por Shane Hudson. La versión de Windows usa las bibliotecas Cygwin. En el sitio http://rbnn.com/cql/ puede hallarse el sistema para descargar, instalar y se usar el CQL.

Crédito Foto (inicio del artículo): DavidR_ (http://www.flickr.com)