|Did you know ...||Search Documentation:|
|Pack chess_db -- prolog/chess_db.pl|
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:
There are three example pgns in
pack(chess_db/data/pgn) and an example program,
By default, chess database dirs contain 3 sqlite databases:
game_info(Gid,Key,Val)info about each game
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 gid(chdbs(<#4078544a8f7f0000>,<#4078544a8f7f0000>,<#4078544a8f7f0000>):1) gid(chdbs(<#4078544a8f7f0000>,<#4078544a8f7f0000>,<#4078544a8f7f0000>):31) % (short) Writing 1.e4,e6 starting games to: 'short/french.pgn' % Closing chess db: '/home/nicos/short' true. % open file short/french.pgn on program that can play the games eg linux> chessx short/french.pgn
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 true.
Connect to the new database. The connections are managed internally.
?- chess_db_connect( short, profile(false) ). true.
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 ). chdbs(<sqlite>(0x276c930),<sqlite>(0x278f320),<sqlite>(0x2792450)):1 chdbs(<sqlite>(0x276c930),<sqlite>(0x278f320),<sqlite>(0x2792450)):31 Gids = [chdbs(<sqlite>(0x276c930), <sqlite>(0x278f320), <sqlite>(0x2792450)):1, chdbs(<sqlite>(0x276c930), <sqlite>(0x278f320), <sqlite>(0x2792450)):31].
Turn general library debugging on.
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' ).
chess_db(true)(on-by-default channel, turn off for silent operation)
parsing of and saving to pgn files, and storing/retriving on/from chess_dbs
manage database connections
access db games and info
?- chess_db_version( 0:3:0, date(2018,3,21) ). true.
The following predicates are exported, but not or incorrectly documented.