Did you know ... Search Documentation:
Pack chess_db -- prolog/chess_db.pl
PublicShow source

This library produces chess games databases from PGN files and provides some
predicates for manipulating these databases.

Once connected to a number of chess_db databases, information about the games
can be interrogated. (See chess_db_opening/2 for an example.)

Ideally we want to hook this pack to a web-based interface for playing the games as we select them.
Currently selected games can be saved to a PGN file and be displayed with any PGN displaying program.


?- pack_install( chess_db ).

The pack includes code to:

  • parse PGN's pgn/2
  • store the parsed terms into prosqlite databases chess_db/2
  • manipulate the resulting databases chess_db_opening_pgn/2

There are three example pgns in pack(chess_db/data/pgn) and an example program, examples/short.pl



  • prosqlite (1.5)
  • db_facts (0.5)
  • stoics_lib (1.0)
  • options (1.0)
  • debug_call (1.1)


By default, chess database dirs contain 3 sqlite databases:

  • game_info.sqlite contains game_info(Gid,Key,Val) info about each game
  • game_move.sqlite table is of form game_move(Gid,Num,Turn,Move)
  • game_orig.sqlite table is game_orig(Gid,Orig); where Orig is the verbatim of the section in the PGN for that game

A number of databases can be connected at the same time. Operations are implicit to all open databases. Connecting is via chess_db_connect/2.


?- [pack('chess_db/examples/short.pl')].
?- short.      % creates a chess_db in subdirectory short/ from data/4ncl_short.pgn
               % and displays the game ids for games that start with [e4,e6] (French defence)

?- french.     % creates a new pgn file from the base for the 2 games in short/ that start with e4,e6
% Using existing chess_db directory: /home/nicos/short
% (short) Following games start with 1.e4,e6
% (short) Writing 1.e4,e6 starting games to: 'short/french.pgn'
% Closing chess db: '/home/nicos/short'

% open file short/french.pgn on program that can play the games eg
linux> chessx short/french.pgn

Mini tutorial

The above example in detail.

Turn debugging of writing out the original games as they are added to the database.

?- debug( chess_db(original) ).

Create a database in fresh directory short/. The DB will be populated with games from pgn file chess_db/data/4ncl_short.pgn
The database is closed after it is populated.

?- chess_db( pgn('4ncl_short'), short, create(true) ).
1. e4 e6 2. d4 d5 3. Nd2 Be7 4. Bd3 c5 5. dxc5 Nf6 6. Qe2 O-O 7. Ngf3 a5 8. O-O
Na6 9. e5 Nd7 10. Nb3 Ndxc5 11. Bb5 Bd7 12. Bxd7 Qxd7 13. Nbd4 Ne4 14. Be3 f5
15. Qb5 Qxb5 16. Nxb5 Rfc8 17. c3 Nac5 18. Nfd4 Ra6 19. f3 Ng5 20. Rad1 Nf7 21.
f4 Ne4 1/2-1/2


Connect to the new database. The connections are managed internally.

?- chess_db_connect( short, profile(false) ).

Interrogate all connected databases for games starting with the sequence [e4,e6] (French defence).

?- findall( Gid, (chess_db_opening([e4,e6],Gid),write(Gid),nl), Gids ).
Gids = [chdbs(<sqlite>(0x276c930), <sqlite>(0x278f320), <sqlite>(0x2792450)):1, chdbs(<sqlite>(0x276c930), <sqlite>(0x278f320), <sqlite>(0x2792450)):31].

Turn general library debugging on.

?- debug(chess_db).

Re-connecting is handled fine.

?- chess_db_connect( short, profile(false) ).
% Handles already exist, for chess_db directory: '/home/nicos/short'

Create a new PGN file from the original scripts of the two French defence 2 games in their original script. Moves are matched to game_move/4 and are pulled from the game_orig/2 sub-database.

?- PgnF = 'short/french.pgn', chess_db_opening_pgn( [e4,e6], PgnF ).

View the two games in a PGN interface program such as:

?- shell( 'chessx short/french.pgn' ).

Debug terms

Listens to:

  • chess_db
  • chess_db(move)
  • chess_db(original)
  • chess_db(true) (on-by-default channel, turn off for silent operation)

Pack predicates

parsing of and saving to pgn files, and storing/retriving on/from chess_dbs

  • pgn/2
  • chess_db/1,chess_db/2,chess_db/3
  • chess_db_ids_pgn/2

manage database connections

  • chess_db_connect/1,chess_db_connect/2
  • chess_db_disconnect/0, chess_db_disconnect/1
  • chess_db_current/1,chess_db_current/2

access db games and info

  • chess_db_game/1
  • chess_db_game_info/3
  • chess_db_opening/2
  • chess_db_match/2

info interactions

  • chess_db_list/1
  • chess_db_max_id/2


Pack info

- nicos angelopoulos
- 0.1 2018/3/18
- 0.2 2018/3/20
- 0.3 2018/9/14
See also
- http://stoics.org.uk/~nicos/sware/chess_db
- https://github.com/nicos-angelopoulos/chess_db
- [pack('chess_db/examples/short.pl')]
- pack(prosqlite), pack(db_facts), pack(stoics_lib), pack(options)
 chess_db_version(-Version, -Date)
The current version. Version is a Mj:Mn:Fx term, and date is a date(Y,M,D) term.
?- chess_db_version( 0:3:0, date(2018,3,21) ).

Undocumented predicates

The following predicates are exported, but not or incorrectly documented.

 pgn(Arg1, Arg2)
 chess_db(Arg1, Arg2)
 chess_db(Arg1, Arg2, Arg3)
 chess_db_ids_pgn(Arg1, Arg2)
 chess_db_connect(Arg1, Arg2)
 chess_db_current(Arg1, Arg2)
 chess_db_game_info(Arg1, Arg2, Arg3)
 chess_db_match(Arg1, Arg2)
 chess_db_opening(Arg1, Arg2)
 chess_db_opening_pgn(Arg1, Arg2)
 chess_db_max_id(Arg1, Arg2)