時代に追いつく
N-Prologは1980年代のRUN/PROLOGのコードがそのまま動くことを目標につくりました。当時のPrologコードを楽しむ程度のつもりだったのです。しかし、欲がでてきました。RUN/PROLOG互換は堅持しつつもモダンな機能をかなり追加しましたのでご紹介します。
CLPFD
1980年代にはなかったものでその後に発達したものとして制約論理プログラミングがあります。このうち整数の範囲で動作するCLPFD機能を追加しました。下記はCLPFDで記述した9queensです。
nqueens(Queens) :-
length(Queens, 9),
Queens ins 1..9,
all_different(Queens),
safe(Queens),
label(Queens).
safe([]).
safe([Q|Rest]) :-
safe(Rest),
no_attack(Q, Rest, 1).
no_attack(_, [], _).
no_attack(Q, [Q2|Rest], Dist) :-
Q #\= Q2 + Dist,
Q #\= Q2 - Dist,
Dist1 #= Dist + 1,
no_attack(Q, Rest, Dist1).
素朴なアルゴリズムでありSWI-Prologのような最新のアルゴリズムは採用していません。それでもPrologインタプリタで実行した程度の速度は出せるようにまでなりました。
TCLTKライブラリ
GUIを使えればゲームを作るなど応用範囲が広がるだろうと考えてTCLTKライブラリを追加しました。N-PrologのC言語埋め込み機能を活用しています。下記はこれを利用したシェルピンスキー図形です。
OenGL
あわせてOpenGLライブラリも追加しました。
HTTPS
ChatGPTとAPIを開始て通信するにはHTTPSも必要ということでしたのでcurlを利用してHTTPSライブラリを作りました。
% curl test
:- use_module(json).
foo(T) :-
create_client_curl(C, "https://httpbin.org/post"),
set_curl_option(C, method(post)),
send_curl(C, "hello=world"),
recv_curl(C, R),
string_term(R,J),
term_json(T,J),
write(R),nl,
close_curl(C).
JSONライブラリ
ChatGPTとやりとりするにはデータとしてJSONを使うということがわかりましたのでPrologのパーサを流用して即席にJSONライブラリを作りました。下記hHTTPSでやりとりしたデータであるJSONをProlog述語に変換している例です。
N-Prolog Ver 4.08
?- [-'./tests/curl.pl'].
yes
?- foo(X).
{
"args": {},
"data": "",
"files": {},
"form": {
"hello": "world"
},
"headers": {
"Accept": "*/*",
"Content-Length": "11",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1–680dcaa7–6a263f1233844c2c69d17b9f"
},
"json": null,
"origin": "XXX.XXX.XXX.XXX",
"url": "https://httpbin.org/post"
}
X = [args='{}',data="",files='{}',form=hello=world,headers=
['Accept'='*/*','Content-Length'='11',
'Content-Type'='application/x-www-form-urlencoded',
'Host'='httpbin.org',=,
'X-Amzn-Trace-Id','Root=1–680dcaa7–6a263f1233844c2c69d17b9f'],
json=null,origin='xxx.xxx.xxx.xxx',=,url,'https://httpbin.org/post'] .
yes
?-
テンソルフローとの接続
ニューロシンボリックに興味があった私はN-Prologとテンソルフローとの接続を試みました。Pythonを介して接続するのが楽なのでPythonとプロセス間通信をするライブラリを作りました。下記はテンソルフローと通信をしている様子です。
知的な遊び道具
Prologは私にとって知的な遊び道具です。これだけ機能拡張すれば遊ぶには困らないかなと思っています。いずれの機能もまだまだ開発途上です。使いつつ改良を予定しております。よかったら遊んでみてください。N-Prologはオープンソースです。下記にて公開しています。