LISPと人工知能について
1956年に作られた初期の関数型プログラミングであるIPL(Information Processing Language)は、1930年代にチャーチとクリーニによって提案された「ラムダ計算」や再帰関数(帰納関数)をベースとして作られている。それらを受けて、1958年にジョン・マッカーシーによる研究からLISPが生まれている。このLISPは「list processor」に由来して命名されたもので、プログラムそのものがリストで構成され、データもコードもリストとして操作されることに因んでいる。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”では、プログラム自体がデータとして扱われ、他のプログラムによって操作される。これにより、プログラムをより柔軟に、動的に、抽象的に扱うことが可能となる。
技術トピック
プログラミングを行うためには、それぞれの言語に合わせた開発環境を作る必要がある。ここでは、本ブログに述べているPython、Clojure、C、Java、R、LISP、Prolog、Javascript、PHPそれぞのケースでの具体的な開発環境の立ち上げについて述べている。個々の言語では、開発を容易にするためのプラットフォームが準備されており、それらを用いると容易な環境設定が可能となるが、ここでは最もシンプルなケースでのものを中心に述べている。
人工知能技術のためのプログラミング言語であるLISPの参考図書「実用Common Lisp」より。読書メモを記載する。
chatGPTを用いると、以下に示す様に様々な代数の問題を解かせることができる。これらは、単純に答えを出すだけでなく、様々な公式を応用した解法を示してくれるため、万能のAIが出来ているかのような錯覚を受ける。
しかしながら、実際に計算を行ってみるとchatGPTが示してくれた答えが間違っている場合があることに気づく。これは、chatGPTが、あくまでも膨大な学習データを元に、次に何の文字が現れるかを推定しているだけで、本質的な計算を行っていないためである。
- Land of Lisp 読書メモ
- 初めてのLISP関数型プログラミング 読書メモ
人工知能技術のためのプログラミング言語であるLISPの参考図書「初めてのLisp関数プログラミング」より。読書メモを記載する。
Lispは近年、
ElizaはMITのJoseph Weizenbaumにより開発され、1966年に発表された「古典的な」AIシステムとなる。これは、1956年にHerbert Simonにより発表された一般解決機(GPS:General Problem Solver)の次に古いのとなる。
ELIZAは、英語による入出力を特徴とする最初の自然言語処理のプログラムの一つであり、その名前は戯曲「ピグマリオン」の女主人公に因んでつけられた。Weizenbaumは発表した序文の中でElizaに対して詩情に満ちた言葉で以下のように述べている。
- 一般問題解決器と適用事例、LISPとPythonによる実装例
一般問題解決器は、具体的には、問題の記述や制約条件を入力として受け取り、最適な解や有効な解を見つけるためのアルゴリズムを実行する動作をとる。これらのアルゴリズムは、問題の性質や制約に応じて異なり、一般的な問題解決手法では、数値最適化、制約充足、機械学習、探索アルゴリズムなど様々なものがある。ここでは、このGPSに関して、LISPとPythonによる実装例について述べている。
- STUDENT(代数の文章題を解くプログラム)
- 制約充足による線画のラベル付け
- LISPによるエキスパートシステム
- 探索とオセロゲーム
- The Little Schemer LISPの派生語であるSchemaによる関数型言語の教科書
schema(LISPの派生語)による関数型プログラミングに関する図書であり、続編となる「The Seasoned Schemer」がある。さらに以前「Clojure core.logicとminiKanren」で述べたロジックプログラミングのDSLであるminiKanrenの解説図書である「The Reasoned Schemer」に続く。
内容としては、再帰と無名関数、λ関数にYコンビネーターそして簡単なインタープリタへと続く。
コンピュータについて考えることは、人間の心ができる最もエキサイティングなことの一つである」という考え方は、『The Little Schemer』(旧称『The Little LISPer』)とその新しい姉妹編である『The Seasoned Schemer』を、LISPに関する他の書籍とは一線を画すものにしています。抽象的な概念をユーモラスで理解しやすい方法で提示しているため、著者のテーマに対する熱意が伝わってきます。この本を読めば、コンピュータとは何かを知りたいと思っている人に、新しい思考の扉を開くことができるでしょう。
The Reasoned Schemer』の目的は、関数型プログラマーが論理的に考え、論理型プログラマーが機能的に考えるのを助けることです。The Reasoned Schemer』の著者は、論理プログラミングは関数型プログラミングを自然に拡張したものであると考え、関数型言語であるSchemeを論理的な構造で拡張することで、双方のスタイルの利点を組み合わせていることを示しています。この拡張は、論理プログラミング言語Prologのアイデアのほとんどを内包しています。
小出誠二さんによるブログ「セマンティックウェブダイアリー」でのGPSについてのブログ記事。
Lispを使った様々な開発をおこなっているブログ。SeleniumとLISPを使ったブラウザ上での自動検索や、タブローの実装、さまざまな言語でのLisp処理系の試作とベンチマーク等が行われている。
コメント
[…] ClojureScriptは、プログラミング言語のClojureからJavaScriptに変換するコンパイラーで、Clojureの持つ動的型付けや汎用の関数型言語で、変更不可な(immutable)データ構造に対応する特徴を持つ。ClojureScriptはLisp系のプログラミング言語なので、コードはデータとして扱われ、マクロが使えるのでメタプログラミングが可能となる。ほかのLisp系言語とは違いClojureは変更不可の(immutable)データ構造に対応しており、副作用の管理がしやすくなっている。List特有の括弧の使い方をはじめ、他の言語に比べて取っ付きにくく見える構文だが、構文の簡潔さと抽象化能力により、高度な抽象化が必要な場面に強力なツールとなる。ClojureScriptはコードの最適化にGoogle Closureを使用しているため、既存のJavaScriptライブラリーと互換性がある。 […]
[…] 次回は具体的な言語の一例として、現在に蘇ったLISP言語であるClojureについて述べてみたい。 […]
[…] Clojureは、Rich Hickeyにより作られ2007年に登場した比較的新しい言語である。新しいとは言っても、言語自体は1958年に登場したLISP言語の方言の一つであり、またJVMの上で動作してレガシーなプログラミング言語であるJAVAのコードをそのまま利用できるという古い顔と新しい顔を併せ持つ言語となっている。 […]
[…] (LISP)の構文では(+ 1 1)と表現する。templateコードの中で現れる(ns […]
[…] これを言語の世界に適用すると、記号の集合と生成規則(文法)を定義して、文字列(言葉)を生成することになる。実際のプログラミング言語の例では、例えばLISP言語において、Y Combinatorを創立したことでも有名なポール・グレアムによる古典「onLISP」の中で、少数の関数(単語)をベースに残り全ての関数(LISPにおけるプログラミング言語)が構築できることが述べられている。 […]
[…] これに対して、LISPやClojure等の関数型言語に代表される明確な世界観を持った作られた言語で構成されたコードは同様の美しさを持っているではないかと思う。例えばClojurを作ったRich Hickeyのプレゼンテーション「Simple Made Easy」の中では新しいプログラミング言語を作る目的として、「ひとつのものに、複数のことがらを混ぜ込まない」シンプルな関数を組み合わせることで、複雑な機能を実現していくものを提供するという事が述べられている。この話をまさにカディングスキーによる「造形理論」のプログラミング版そのものであり、バウハウスの絵画が美しいものであると同様に、これらのコードも美しいものであると言う事が言えるのではないだろうか。 […]
[…] Prologは、Lispと並ぶシンボリック人工知能プログラミング用の2つの古典言語の1つとなる。言語の特徴としては宣言型言語であることで、この「宣言型プログラミング言語」とは、対象の定義 =「何(What)を得たいか」を宣言してプログラムを構成し、逆に一般的な手続き型言語が持つ、それを得る過程・手続き・アルゴリズム =「どうやって(How)得るか」を記述しない[1][2]ものとなる。ここで「何を得たいか」という宣言は、出力を得る方法ではなく出力の性質・あるべき状態に対する記述となり、最終的な実現手続きはそれらが別途持つ処理系・ランタイム・フレームワーク等に委譲する形となる。 […]
[…] はじめてのLISP関数型プログラミングより […]
[…] 1956年に作られた初期の関数型プログラミングであるIPL(Information Processing Language)は、1930年代にチャーチとクリーニによって提案された「ラムダ計算」や再帰関数(帰納関数)をベースとして作られている。それらを受けて、1958年にジョン・マッカーシーによる研究からLISPが生まれている。このLISPは「list processor」に由来して命名されたもので、プログラムそのものがリストで構成され、データもコードもリストとして操作されることに因んでいる。LISPはその後多くの言語として生まれ変わりながら、現在でも利用されている。 […]
[…] 上記の項目を考慮した上で構築されたLispで記述されたコードを示す。 […]
[…] 人工知能技術のためのプログラミング言語であるLISPの参考図書「実用Common Lisp」より。読書メモを記載する。 […]
[…] 人工知能技術のためのプログラミング言語であるLISPの参考図書「初めてのLisp関数プログラミング」より。読書メモほ記載する。 […]
[…] コードとしては、以下のようなLISPライクなものとなる。 […]
[…] データとプログラムの垣根を無くす関数型言語であるLISPについて | Deus Ex Machina より: 2021年10月18日 6:17 AM […]
[…] データとプログラムの垣根を無くす関数型言語であるLISPについて | Deus Ex Machina より: 2021年10月18日 6:21 AM […]
[…] 年に登場した比較的新しい言語である。新しいとは言っても、言語自体は1958年に登場したLISP言語の方言の一つであり、またJVMの上で動作してレガシーなプログラミング言語であるJAVAの […]
[…] 人工知能技術 機械学習技術 トピックモデル オントロジー技術 デジタルトランスフォーメーション 自然言語処理技術 知識情報処理 Clojureと関数型プログラミング Pythonと機械学習、PHPとウェブフレームワーク Prologと知識情報処理 LISPと人工知能技術 R言語と機械学習、C/C++と各種機械学習アルゴリズム Javascriptによるフロントエンド開発 CSSによるウェブデザイン […]
[…] スパースモデリング 確率的生成モデル サポートベクトルマシン LISP Prolog […]
[…] Twitter Facebook はてブ Pocket LINE コピー 2024.06.01 プログラミング LISP Clojure 人工知能 life tips & 雑記 禅の歴史と思想 旅と歴史 […]
[…] Twitter Facebook はてブ Pocket LINE コピー 2024.07.28 プログラミング LISP Clojure 人工知能 life tips & 雑記 禅の歴史と思想 旅と歴史 […]