1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

N-Prolog のモダン化

Last updated at Posted at 2025-05-10

時代に追いつく

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インタプリタで実行した程度の速度は出せるようにまでなりました。

bandicam 2025-05-10 16-53-04-907.jpg

TCLTKライブラリ

GUIを使えればゲームを作るなど応用範囲が広がるだろうと考えてTCLTKライブラリを追加しました。N-PrologのC言語埋め込み機能を活用しています。下記はこれを利用したシェルピンスキー図形です。

bandicam 2025-05-10 16-56-15-014.jpg

OenGL

あわせてOpenGLライブラリも追加しました。

bandicam 2025-05-10 16-57-48-979.jpg

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とプロセス間通信をするライブラリを作りました。下記はテンソルフローと通信をしている様子です。

bandicam 2025-05-10 17-05-39-222.jpg

知的な遊び道具

Prologは私にとって知的な遊び道具です。これだけ機能拡張すれば遊ぶには困らないかなと思っています。いずれの機能もまだまだ開発途上です。使いつつ改良を予定しております。よかったら遊んでみてください。N-Prologはオープンソースです。下記にて公開しています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?