主流になりつつある、KVS(key value store)方式のデータベースの一つRedisのインターフェースです。
        インターフェースソースは次にあります。READMEもご参照ください。
        ${AZProlog}/share/azprolog/system/ext/redis
      
      
また、コンパイルされたダイナミックローディングライブラリは次です。
        ${AZProlog}/lib/azprolog/ext/redis.so
Redisを使ったサンプルプログラムは次にあります。
        ${AZProlog}/share/azprolog/sample/ext/redis.pl 
 <64bit Windows> https://github.com/malkia/ufo/tree/master/bin/Windows/x64
        <32bit Windows> https://github.com/malkia/ufo/tree/master/bin/Windows/x86 
 次のサイトより、hiredisのWindows版をダウンロードする(32bit,64bitとも同じ)。
        https://github.com/texnician/hiredis-win32
 前記ダウンロードしたhiredisのインクルードファイルとライブラリを任意の場所にコピーする。
        ここでは、C:¥redis を例としてあげる。
        このなかに、include と lib のディレクトリを作成する。
 [インクルードファイル]
        2.でダウンロードしたredisソース内の "hiredis.h" 及び "adapters" をディレクトリごと include にコピー。
 [ライブラリ]
        1.でダウンロードしたライブラリ "hiredis.lib" を lib にコピー。
        <ディレクトリ構成:例>
        
      
C:¥redis¥include¥hiredis.h
        |    |
        |    ¥adapters
        |
        ¥lib¥hiredis.lib
 [ダイナミックリンクライブラリ]
        1.でダウンロードしたダイナミックリンクライブラリ(hiredis.dll)を C:Windows¥System32や%AZProlog%¥binなど
        パスが設定されているディレクトリにコピーする。
 本ディレクトリにあるMakefileを環境に合わせ書き換える。現在の内容は、前記<例>にそった場所が書かれている
        nmakeを実行し、nmake installでインストールする。
次のサイトより、Redis-Server をダウンロード、インストールする(32bit,64bit別のインストーラファイルがある)。
https://github.com/rgl/redis/downloads
[コントロールパネル]->[システムとセキュリティ]->[管理ツール]->[サービス] からRedis Server の開始をおこなう。
> cd %AZProlog%sampleext
> prolog -s redis.pl
| ?- t.
:
(メッセージ表示)
:
      最後にOKが表示されれば正常終了です。
$ sudo apt-get install redis-server $ sudo apt-get install libhiredis-dev
AZ-Prolog のインストールにおいては、AZ-Prolog パッケージの解凍ディレクトリで次のコマンドを 投入します。
$ sudo make install_hiredis
または、websocket 、AZ-Prologのパッケージも同時にインストールするには
$ sudo make install_full
AZ-Prolog を立ち上げ、前記サンプルプログラムを読み込み、述語「t/0」を質問します。
$ prolog -s /usr/local/share/azprolog/sample/ext/redis.pl
| ?- t.
$ sudo port install redis
AZ-Prolog のインストールにおいては、AZ-Prolog パッケージの解凍ディレクトリで次のコマンドを投入します。
$ sudo make install_hiredis
または、websocket 、AZ-Prologのパッケージも同時にインストールするには
$ sudo make install_full
redis_connect(+ADDRESS, +PORT, +TIMEOUT, -CONTEXT)
| ADDRESS | 接続先IPアドレス/名前 | 
| PORT | 接続先ポート番号 | 
| TIMEOUT | 試行終了時間(msec.) | 
| CONTEXT | 接続コンテキスト | 
redisサーバに接続し、コンテキストを返す。
redis_free_context(+CONTEXT)
| CONTEXT | 接続コンテキスト | 
コンテキストを開放する。
redis_is_disconnected(+CONTEXT)
| CONTEXT | 接続コンテキスト | 
 サーバが切断したかを調べる。
        サーバから切断していれば成功、していなければ失敗する。
        【重要】
        この述語は、redis_commandを実行して、失敗した後で呼ばなければ意味がない。(正しい結果にならない) 
redis_command(+CONTEXT, +COMMAND, -RETURN_TYPE, -RETURN_VALUE)
| CONTEXT | 接続コンテキスト | 
| COMMAND | 実行コマンド | 
| RETURN_TYPE | 結果値の型 | 
| RETURN_VALUE | 結果値 | 
        指定したコマンドを実行する。
        コマンドはアトム、文字列、リストのどれかで指定する。
        アトム、文字列で指定した場合には、空白文字はredisコマンドと引数の間の区切り文字として認識される。(キー、値の中に空白を含めることができない。)
        リスト(要素がアトムまたは文字列)で指定した場合には、アトム、文字列の中の空白はキー/値の一部分と見做される。(区切り文字のつもりでキー/値の前後に空白をつけるべきではない。)
        
      
| 例 | ||
|---|---|---|
| redis_REPLY_STRING | string | "abc" | 
| redis_REPLY_ARRAY | list of value | ["200", "300", "aaa"] | 
| redis_REPLY_INTEGER | integer | 7 | 
| redis_REPLY_NIL | [] | [] | 
| redis_REPLY_STATUS | string | "OK" | 
| redis_REPLY_ERROR | string | "ERR wrong number of arguments for 'hgetall' command" | 
      
redis_command_hate_integer(+CONTEXT, +COMMAND, -RETURN_TYPE, -RETURN_VALUE)
| CONTEXT | 接続コンテキスト | 
| COMMAND | 実行コマンド | 
| RETURN_TYPE | 結果値の型 | 
| RETURN_VALUE | 結果値 | 
 redis_command/4 と殆ど同じ。
        違いは、redis_REPLY_INTEGER型の値を返さない。(整数の場合には文字列にして返す)
redis_version(-VERSION)
| VERSION | バージョン情報を示すアトム | 
<例>
'redis-ext: 0.5, hiredis: 0.10.1'
 
 redis_command_to_term(+CONTEXT, +COMMAND, -RETURN_TYPE, -RETURN_VALUE)
        
        
redis_command/4同様、指定したコマンドを実行しますが、getでのRETURN_VALUEを項として読み込みます。
s_constraints_modeがonの場合で読み込み項の変数に制約マクロ記述がある場合、読み込み時、該当変数に制約を付与します。
読み込み時、正しい項でない場合、アトムで返します。
<例>
:- dlib_require(redis).
test(X,V2):-
	redis_connect('127.0.0.1',6379,3000,C),
	   s_constraints_mode(Def,off),
             redis_command(C,[set,mykey,X],A,B),          writeq(A=B),nl,
             redis_command(C,[get,mykey],T0,V0),          writeq(T0=V0),nl,
             redis_command_to_term(C,[get,mykey],T1,V1),  writeq(T1=V1),nl,
	   s_constraints_mode(_,on),
             redis_command_to_term(C,[get,mykey],T2,V2),  writeq(T2=V2),nl,
	   s_constraints_mode(_,Def),
	redis_free_context(C).
% 制約マクロ付き項をSetし、Getする
| ?-test(a(X#(Y is X+3),Y),L),L=a(10,P).
redis_REPLY_STATUS=[79,75]
redis_REPLY_STRING=[97,40,88,95,50,54,35,89,95,50,56,32,105,115,32,88,95,50,54,43,51,44,89,95,50,56,41]
redis_REPLY_STRING=a(X_26_187#(Y_28_189 is X_26_187+3),Y_28_189)
redis_REPLY_STRING=a(_210,Y_28_208)
X       = X_26,
Y       = Y_28,
L       = a(10,13),
P       = 13
yes
% 項に変換できないデータはアトムでGetする
| ?-test('a(X',S).
redis_REPLY_STATUS=[79,75]
redis_REPLY_STRING=[97,40,88]
redis_REPLY_STRING='a(X'
redis_REPLY_STRING='a(X'
S       = 'a(X'
yes