火曜日, 5月 13, 2025
ホームニューステックニュースN-Prolog のモダン化 #Prolog - Qiita

N-Prolog のモダン化 #Prolog – Qiita



N-Prolog のモダン化 #Prolog - Qiita

N-Prologは1980年代のRUN/PROLOGのコードがそのまま動くことを目標につくりました。当時のPrologコードを楽しむ程度のつもりだったのです。しかし、欲がでてきました。RUN/PROLOG互換は堅持しつつもモダンな機能をかなり追加しましたのでご紹介します。

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

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

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

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

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

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).


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はオープンソースです。下記にて公開しています。



フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 2

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -

インモビ転職