LISPと人工知能

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 機械学習 自然言語処理技術 推論技術 セマンティックウェブ技術 深層学習技術 オンライン学習 強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術 プログラミング スパースモデリング 確率的生成モデル サポートベクトルマシン 本ブログのナビ

LISPと人工知能

イントロダクション

1956年に作られた初期の関数型プログラミングであるIPL(Information Processing Language)は、1930年代にチャーチとクリーニによって提案された「ラムダ計算」や再帰関数(帰納関数)をベースとして作られている。それらを受けて、1958年にジョン・マッカーシーによる研究からLISPが生まれている。このLISPは「list processor」に由来して命名されたもので、プログラムそのものがリストで構成され、データもコードもリストとして操作されることに因んでいる。LISPはその後多くの言語として生まれ変わりながら、現在でも利用されている。

はじめのLISP関数型プログミング ラムダ計算からリファクタリングまでより

LISPを生み出したMacCarthyは、関数自体を操作でき、同時に論理思考の言語を用いることで人工知能が構成されると考えていた。当初のLISPでは前者の関数を操作できる手続き型言語として作り上げられた。

LISPは当初は、今日の二進木構造の源であるconsセルとして、car、cdr、cpr、cir、csr、ctrなどの当時のハードウェアアーキテクチャに依存したフィールドを持っていて、明快な二進木構造でなかった。これら機械依存の構造から高級言語への抽象化が進み、プログラムは数学の関数表示に近いM式、データあるいはプログラムの内部構造はS式で表されるようになり、更にシンプルな形へと進化する中でM式は排除され、プログラムもデータもS式で書かれるようになった。

ここでS式の構造は、実験言語を作るときに表層的な違いしか持たらさない「文法設計」に悩まず、言語の意味論に本質的に単刀直入に迫ることを容易にしている。記号構造を表すための最低の文法規則しかもたないことは、意味論的に無色透明であり、S式の上にほとんどありとあらゆる言語意味論を簡単に載せることができ、S式に慣れて仕舞えば、プログラミング言語の本質に単刀直入に入ることができることを意味するのである。

上記に述べたものを、老子の第42章にある「道は一を生じ、一は二を生じ、二は三を生じ、三は万物を生ず。..」に対応させると「道はnilを生ず、nilはアトムを生じ、アトムはS式を生じ、S式は万物を生ず」と置き換えることができるのではないかと思う。

このようにLISPのプログラムの表現に使われるS式は、そのままLISPが扱うデータの表現方式となる。これは、プログラムとデータが同じ形式で表現される(program as data)と言い換えることもできる。このことは、プログラムとして書かれたS式をそのまま処理対象のデータとして扱えるという意味と、データであったS式を(突然)プログラムとして解釈することができるという意味の両方を表している。

program as dataの特徴を持った最初の言語は機械語となる。機械語プログラムには自分自身を書き換えることによってサブルーチン呼び出しを実現させるものもあった。それ以外にも、トリッキーなプログラム書き換えを行なって命令数を減らしたり、複雑な動きをさせるテクニックなどもある。

また、Program as dataは高級言語においてvon Neumannのプログラム蓄積方式の本当の意味を忠実に反映した概念であるとも言える。von Neumannのボトルネックという、チューリング賞受賞講演でのJohn Backusの批判は、プログラム空間とデータ空間がCPUに対してパスを共有してしまうことによってアクセスの隘路が生じるという指摘だったが、それはプログラム蓄積方式の本質に対する批判にはならない。

von Neumannはゲーテルの不完全性定理の証明を知っており、自己増殖オートマトンを考えていたことからも分かる通り、program as dataの原理によって、プログラムとデータが相互に立場を変えることが本質だと読んでいたものとなる。

またprogram as dataは直接・間接に言語自身を拡張するのにも役立つ。

LISPの自己拡張性の意義は、その抽象化能力の高さにある。新しい関数やマクロの定義はそのまま言語の抽象語彙や構造を増やす。言語の骨格を変えないで、概念の抽象化がどんどん進むものとなる。

以下の項目について述べている。

概要

Code as Dataの概要とアルゴリズム及び実装例について

Code as Dataの概要とアルゴリズム及び実装例について“Code as Data”は、プログラムのコード自体をデータとして扱う考え方やアプローチを指し、プログラムをデータ構造として操作し、分析、変換、処理することを可能にする方法となる。通常、プログラムはある入力を受け取り、それに対して特定の手順やアルゴリズムを実行し、結果を出力する。一方で、”Code as Data”では、プログラム自体がデータとして扱われ、他のプログラムによって操作される。これにより、プログラムをより柔軟に、動的に、抽象的に扱うことが可能となる。

技術トピック

各種言語でのコード開発環境の作り方

各種言語でのコード開発環境の作り方。プログラミングを行うためには、それぞれの言語に合わせた開発環境を作る必要がある。ここでは、本ブログに述べているPython、Clojure、C、Java、R、LISP、Prolog、Javascript、PHPそれぞのケースでの具体的な開発環境の立ち上げについて述べている。個々の言語では、開発を容易にするためのプラットフォームが準備されており、それらを用いると容易な環境設定が可能となるが、ここでは最もシンプルなケースでのものを中心に述べている。

実用Common LISP 読書メモ

実用Common LISP 読書メモ。人工知能技術のためのプログラミング言語であるLISPの参考図書「実用Common Lisp」より。読書メモを記載する。

代数の文章題を解くプログラムに関する考察

代数の文章題を解くプログラムに関する考察。chatGPTを用いると、以下に示す様に様々な代数の問題を解かせることができる。これらは、単純に答えを出すだけでなく、様々な公式を応用した解法を示してくれるため、万能のAIが出来ているかのような錯覚を受ける。

しかしながら、実際に計算を行ってみるとchatGPTが示してくれた答えが間違っている場合があることに気づく。これは、chatGPTが、あくまでも膨大な学習データを元に、次に何の文字が現れるかを推定しているだけで、本質的な計算を行っていないためである。

Land of Lisp 読書メモ

Land of Lisp 読書メモ

初めてのLISP関数型プログラミング 読書メモ

初めてのLISP関数型プログラミング 読書メモ。人工知能技術のためのプログラミング言語であるLISPの参考図書「初めてのLisp関数プログラミング」より。読書メモを記載する。

on lisp 無償公開されている日本語訳

on lisp 無償公開されている日本語訳。Lispは近年、強力で実用的なプログラミング言語として見直されている。本書の原書である”On Lisp”は、Lispの強力さの源であるマクロのプログラミングを徹底的に解説する名著である。 本書は、野田開氏が著者Paul Graham氏の許諾を得て訳し、インターネットで公開していた日本語訳となる

LISPによるElizaの実装

LISPによるElizaの実装ElizaはMITのJoseph Weizenbaumにより開発され、1966年に発表された「古典的な」AIシステムとなる。これは、1956年にHerbert Simonにより発表された一般解決機(GPS:General Problem Solver)の次に古いのとなる。

ELIZAは、英語による入出力を特徴とする最初の自然言語処理のプログラムの一つであり、その名前は戯曲「ピグマリオン」の女主人公に因んでつけられた。Weizenbaumは発表した序文の中でElizaに対して詩情に満ちた言葉で以下のように述べている。

一般問題解決器と適用事例、LISPとPythonによる実装例

一般問題解決器と適用事例、LISPとPythonによる実装例一般問題解決器は、具体的には、問題の記述や制約条件を入力として受け取り、最適な解や有効な解を見つけるためのアルゴリズムを実行する動作をとる。これらのアルゴリズムは、問題の性質や制約に応じて異なり、一般的な問題解決手法では、数値最適化、制約充足、機械学習、探索アルゴリズムなど様々なものがある。ここでは、このGPSに関して、LISPとPythonによる実装例について述べている。

STUDENT(代数の文章題を解くプログラム)

STUDENT(代数の文章題を解くプログラム)

制約充足による線画のラベル付け

制約充足による線画のラベル付け

LISPによるエキスパートシステム

LISPによるエキスパートシステム

探索とオセロゲーム

探索とオセロゲーム

The Little Schemer LISPの派生語であるSchemaによる関数型言語の教科書

The Little Schemer LISPの派生語であるSchemaによる関数型言語の教科書。schema(LISPの派生語)による関数型プログラミングに関する図書であり、続編となる「The Seasoned Schemer」がある。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続く。

内容としては、再帰と無名関数、λ関数にYコンビネーターそして簡単なインタープリタへと続く。

The Seasoned Schemer The Little Schemerの続編

The Seasoned Schemer The Little Schemerの続編。コンピュータについて考えることは、人間の心ができる最もエキサイティングなことの一つである」という考え方は、『The Little Schemer』(旧称『The Little LISPer』)とその新しい姉妹編である『The Seasoned Schemer』を、LISPに関する他の書籍とは一線を画すものにしています。抽象的な概念をユーモラスで理解しやすい方法で提示しているため、著者のテーマに対する熱意が伝わってきます。この本を読めば、コンピュータとは何かを知りたいと思っている人に、新しい思考の扉を開くことができるでしょう。

The Reasoned Schemer Schemaによる論理プログミングDSL(miniKanren)

The Reasoned Schemer Schemaによる論理プログミングDSL(miniKanren)。The Reasoned Schemer』の目的は、関数型プログラマーが論理的に考え、論理型プログラマーが機能的に考えるのを助けることです。The Reasoned Schemer』の著者は、論理プログラミングは関数型プログラミングを自然に拡張したものであると考え、関数型言語であるSchemeを論理的な構造で拡張することで、双方のスタイルの利点を組み合わせていることを示しています。この拡張は、論理プログラミング言語Prologのアイデアのほとんどを内包しています。

General Problem Solver(一般問題解決器)について – セマンティックウェブダイアリー

General Problem Solver(一般問題解決器)について – セマンティックウェブダイアリー。小出誠二さんによるブログ「セマンティックウェブダイアリー」でのGPSについてのブログ記事。

リリカルLISP開発日記

リリカルLISP開発日記Lispを使った様々な開発をおこなっているブログ。SeleniumとLISPを使ったブラウザ上での自動検索や、タブローの実装、さまざまな言語でのLisp処理系の試作とベンチマーク等が行われている。

タイトルとURLをコピーしました