t_wの輪郭

Feedlyでフォローするボタン
述語論理プログラミング言語論理プログラム論理プログラミング論理プログラミング言語
あれ形式言語ってPrologっぽいProlog言語あれprologをクエリをJavaScriptの関数化『法律家のためのコンピュータ利用法: 論理プログラミング入門』SWI-Prolog / npm-swipl-wasmTau Prolog微分可能なProlog論理憲法あれPrologの自動生成あれあれあれあれPrologにはカプセル化がないあれあれあれ『WebAssemblyでProlog』あれあれ『Prologによる解法知識を用いた誤答解説文付き多肢選択問題の生成』Scryer PrologRaftとPrologPrologをwasmに変換する

あれ

2025/1/13 11:12:00

書きかけ&考え中

目的

  1. LLMの推論において、知識に基づく推論をさせて、誤った回答を防ぎたい
  2. LLMの学習を「知識をDBに追加している」と考えたとき、極めて低速であり、「知識の追加」をLLMの外部に置いて高速化したい

道筋

自然言語で記述された文章から「知識」を抽出し、その「知識」をPrologのように機械的に検証できれば、LLMの出力を検証できるはず。
RDBの一つのテーブル(など)で「知識」を表現できれば便利なはず。
「知識」を一つのテーブルに格納するには、固定長のカラムによって「知識」を表現しなければならない。
加えて、固定長のカラムで「知識」を表現できると美しく感じられるので嬉しい。
aRbを出発点とする。


単純な文

"Penguin is bird" という文について考える(正しい英文はPenguin is a birdになるが、簡単のためにaは省略している)。
aのみを主語にすれば、Rb(a)となり、is bird(鳩) となる。
加えてbを主語にすればR(a,b)と表すことができる。すなわち、is(penguin, bird) となる。
さらにRを主語化すればT(a,R,b)と表すことができる。つまり、T(penguin ,is, bird) となる。
この時のTは「真実であると主張すること」としておく。


修飾を持つ文

"Penguin is swimming bird" という文について考える。
先の 単純な文 の結果から拡張すれば、T(penguin, is, swimming bird) となる。
T(penguin, is, swimming bird)がT(penguin ,is, bird)に含まれることは人間には推論可能だが、機械的には推論が難しく、機械的推論可能な形式に変形したい。
そこで、T(penguin, is, swimming bird)のbを分離させ、T(penguin, is, swimming)とT(penguin, is, bird)の二つに分離することを考える。これによって"Penguin is swimming bird"の"is bird"の箇所については"Penguin is bird"から推論可能となった。


複雑な文

"Pressures produced when penguins pooh"という文について考える。

T(pressure, produced, when penguins pooh)

あれ

2024/6/2 14:26:00
  • 課題感
    • Prologだと個体と述語に名前をつけないといけない
    • 「名前」は異なる個体を指示したいにも関わらず衝突する
  • 解決策
    • 単語ベクトルや、文章ベクトルを個体や述語の名前として扱う
  • 余談
    • Prologの演算で得られたベクトルをLLMにぶち込めたら面白そう
    • Prologプログラムの実行で得られたベクトルをNNで自然言語に翻訳できると面白そう

あれ

2024/5/15 7:38:00

Prologだと6行でクイックソートがかけるのヤバすぎる。

qsort([], []).
qsort([X], [X]).
qsort([X | L], L1) :- separate(X, L, UpperList, LowerList), qsort(UpperList, UpperListSorted), qsort(LowerList, LowerListSorted), flatten([LowerListSorted, [X], UpperListSorted], L1).
separate(X, [], [], []).
separate(X, [Y | L], [Y | UpperList], LowerList) :- X =< Y, separate(X ,L, UpperList, LowerList).
separate(X, [Y | L], UpperList, [Y | LowerList]) :- X > Y, separate(X ,L, UpperList, LowerList).

memberを使えばseparateをもう1行減らせそう。と思ったが、上手くいかなかった。

あれ

2024/5/15 1:07:00

Prologだと4行のコードでソート作れるのヤバすぎる。

% 空リストは昇順
ordered([]).
% 要素が一つのリストは昇順
ordered([_]).  
% 先頭2つの要素が昇順 かつ 2番目以降の要素が昇順のリストは昇順
ordered([X, Y|T]) :- X =< Y, ordered([Y|T]).
% 全順列のうち、昇順になっているものは、ソートされている
mysort(L, L1) :- permutation(L, L1), ordered(L1).

あれ

2024/5/14 8:18:00

Prologにニューラルネットワーク述語とかいうのがあってビビる。

あれ

2024/5/8 22:29:00

文章からのPrologプログラムの自動生成を夢見ていたけど、PrologがZen過ぎてキツそう。

あれ

2024/5/8 17:54:00

今日Prologを久々にやってたたんだけど、やっぱりPrologは「Zen」って感じする。

悟ると超短いコードで問題が解けるけど、悟れなければ何も得られない、みたいな。

あれ

2024/3/28 23:30:00

自然言語からPrologのプログラム生成したい

あれ

2023/9/23 12:25:00

わたしの中でProlog(というか述語論理)が復権しそうな気配を見せている。

GraphQL的なAPI記述言語としてなんかこう、、、やってけませんかね。