独自のソースコードに関するプログラム推論


15

この質問のインスピレーションは、次の(あいまいな)質問です:独自のソースコードについて推論し、それを変更できるAIを持つためのプログラミング言語/論理的基盤は何ですか?

これはまったく厳密ではないので、ここから具体的な質問を抽出するための私の試みです。私が興味を持っているのは次の2つです。

(A)独自のプログラムをデータ型プログラム(たとえば、AST)として表現および操作できるプログラミング言語P。(必要に応じて、タイプProgramのオブジェクトは、その言語の有効なプログラムのテキストであるStringに変換できます。これは、コンパイラーが行うことの反対です。)

(B)言語Pのプログラムが何をするかを推論する方法。私が考えている2つのレベルは次のとおりです。

  1. Pプログラムの動作をモデル化する別の言語Q(定理証明機能付き)。「プログラムpの実行結果はfooです」などのステートメントを表現および証明できるはずです。
  2. プログラムp:Programが言語P自体で行うことについて推論する方法(つまり、上記のP = Qを使用しています。)

このようなものはどの程度実装されていますか、またはこの方向の進捗はどうですか?実用的な障害は何ですか?質問の当初の意図に照らして、問題を形式化する最良の方法は何ですか?

*

答えが示すように(ありがとう!)、(A)と(B1)の両方を別々に行うことができますが、それらを一緒に行うことはより研究上の質問のようです。

ここに、この問題に関する私の最初の考えがいくつかあります(警告:かなりあいまいです)。Martin Bergerの答えに対する私のコメントも参照してください。

私は、より単純なプログラミング言語ではなく、同じプログラミング言語をモデル化するプログラミング言語に興味があります(上記のP = Q)。これは、「独自のソースコードに関する理由」が可能なプログラムの「概念実証」になります。依存型のプログラミング言語は、その関数の出力について保証することができますが、これは「Hello world!」以外の「独自のソースコードについての推論」としてはカウントされません。裸の文字列を自動的に出力する言語では、クインとしてカウントされます---ある種の引用/自己参照が必要です。ここでの類似物は、プログラムを表すデータ型を持っています。

それはかなり大きなプロジェクトのようです-言語が単純であるほど、その中のすべてを表現することは難しくなります。言語が複雑になるほど、言語をモデル化するためにより多くの作業が必要になります。

再帰定理の精神では、プログラムは独自のソースコードを「取得」し、それを変更することができます(つまり、それ自体の変更バージョンを出力します)。(B2)それから、プログラムは修正されたプログラムについて保証を表明できるべきであると私たちに伝えます(これは再帰できる、つまり将来のすべての修正について何かを表明できるべきですか?)。


1
「プログラムpを実行した結果がfooである」ことを証明するために定理証明者として機能する言語が必要なのはなぜですか?言語は単にpを実行できます!実際、それが起こっていることです。
マーティンバーガー


3
原則として、自分自身でインタープリターを実装できるすべての言語が、必要なことを実行できることに注意してください。より数学的な方法では、再帰定理は計算の十分に強力なモデルを保持します。一部のプログラミング言語では、組み込みが簡単になっています。理由付けも同じです。これらの言語内に推論システムを実装できます。もちろん、プログラムの停止問題など、すべてを推論することは期待できません。
カベ

2
質問はあまり明確ではないと思います。Python、Javaなどのプログラミング言語や、Martinの答えで言及されている言語を見て、質問を明確にして、探しているものが満たされているかどうかを明確にしてください。
カベ

1
「P = Q」に@HoldenLeeとしては、確立された用語は、「異種メタプログラミング」Pに対向している「均質メタプログラミング」である Q.
マーチンバーガー

回答:


14

あなたは2つの異なることについて尋ねていると思います。

  • すべてのプログラムをデータとして表現するプログラミング言語の能力。
  • データとしてのプログラムについての推論。

分析のためには、それらを区別しておくと便利です。前者に焦点を当てます。

データがメタプログラミングホモイコニシティなどの条件の下でプログラムを表現、操作(および実行)するプログラミング言語の能力。

(厄介な)方法で、すべての有名なプログラミング言語はメタプログラミングを行うことができます。つまり、文字列に対して外部プログラム(コンパイラ、リンカなど)を呼び出す機能と共に文字列データ型を使用します。システム最初)。しかし、それはおそらくあなたが言っていることではありません。おそらく素晴らしい構文を心がけています。ほとんどすべての文字列がプログラムを表すわけではないため、文字列はプログラム表現の優れた構文ではありません。つまり、文字列データ型にはプログラム表現メカニズムとして見たときに多くの「ジャンク」が含まれます。さらに悪いことに、文字列演算の代数は、プログラム構築の代数とは本質的に関係がありません。

おそらくあなたが念頭に置いているのは、もっと素晴らしいものです。例えば、もし、その後、プログラムされ P ⟩であるPが、操作および分析のために手でデータとして。これはしばしば引用と呼ばれます。実際には、引用は柔軟性に欠けるため、代わりに準引用を使用します。これは、引用を「埋める」データを提供するプログラムを実行できる「穴」を持つ引用の一般化です。たとえば、IPPP条件を表す準クォートの代わりに、我々は穴を有している状態である [ ]。プログラムの場合は Mのデータに評価さのx > 0 、その後、準引用I F

f[]then7else8+9
[]Mバツ>0データに評価I F
f[M]then7else8+9
fバツ>0then7else8+9

は引用されたプログラム、つまりデータとしてのプログラムを返す通常のプログラム(データとしてのプログラムではないことに注意してください。)これが機能するためには、プログラムを表すデータ型が必要です。通常、そのデータ型はAST(抽象構文ツリー)と呼ばれ、ASTの省略メカニズムとして(準)クォートを見ることができます。M

いくつかのプログラミング言語は、準プログラミングやメタプログラミングのためのその他の機能を提供します。このマクロ機能を備えたLispが、プログラムをデータとして扱うこの機能を開拓しました。おそらく残念なことに、Lispベースのマクロの力は、長い間Lispの最小限の構文に依存していると長い間見られていました。MetaML(1)になって初めて、構文が豊富な最新の言語がメタプログラミングができることが示されました。それ以来、MetaOCaml(2)(MetaMLの子孫、プログラムをデータとして入力する方法の問題を解決するための現在進行中の探求におけるブレークスルーにとって重要)、Template Haskell(3)およびConverge(4)(最初の言語私の意見では、すべての主要なメタプログラミング機能を入手してください)は、さまざまな最新のプログラミング言語がメタプログラミングを収容できることを示しています。私たちが取ることができることを認識することが重要です任意のプログラミング言語メタプログラミング言語にそれを回すと、L m個のP であるLデータとして、自身のプログラムを表す(及び評価)の能力と一緒。LLmpL

データとして与えられた実行中のプログラムの結果を表現するには、(データとして与えられた)プログラムを入力として受け取り、それを実行して結果を返す関数を追加します。例えば、もしPは 17に評価プログラムであり、P の(準)引用バージョンP、すなわちP、データとして、E V LP evalPPPPも返し17ここで微妙なのすべての方法があります私はそのような疑問として、ここでは無視してることをするときevalPメタプログラムされたプログラムが評価されています(コンパイル時と実行時のメタプログラムの区別が生じます)、型の処理または評価の失敗、からPへの移行過程でバインドされた変数と解放された変数の処理P 、またはその逆。PP

二次元については、データとして与えられたプログラムについての推論。プログラムをデータに変換できるとすぐに、それらは「通常の」データであり、データと見なすことができます。Joshuaが指摘したように、依存型や契約、インタラクティブな定理証明、自動化ツールなど、あらゆる種類の証明技術を使用できます。ただし、推論プロセスで言語のセマンティクスを表現する必要があります。その言語が必要に応じてメタプログラミング機能を持っている場合、物事は少しトリッキーになる可能性があり、この方向ではあまり作業が行われていません。また、メタプログラミングに関する推論に関するカリー・ハワードに基づく研究もあります(6、7、8)。これらのロジックベースのアプローチ、また、タイプベースのアプローチ(2)は、将来のすべてのメタプログラミング段階で保持されるプロパティを実際に表現できます。(2)とは別に、これらの論文はいずれも実装されていません。

要約すると、あなたが求めたものは実装されましたが、それは非常に微妙であり、特に型と合理化された推論に関係する未解決の質問がまだあります。


  1. Wタハ。多段プログラミング:その理論と応用

  2. W・タハとMFニールセン。環境分類子

  3. T.シアードとS.ペイトンジョーンズ。Haskellのテンプレートメタプログラミング

  4. L.トラット。動的に型指定されたオブジェクト指向言語でのコンパイル時メタプログラミング

  5. M. Berger、L。Tratt、同種メタプログラミングのプログラムロジック

  6. R. Davies、F。Pfenning、段階的計算のモード解析

  7. R.デイビス、結合時間分析への時相論理アプローチ

  8. 塚田哲也、五十嵐明子。環境分類子の論理的基盤


そのとおりです。プログラミング言語Pは、その言語のプログラムに関する定理/証明を表す言語Qとは異なる場合があります(たとえば、Coqにあります)。私が考えている種類の定理は次のようになります。慎重に設計されたプログラムA_1があるとします。Thm:次のn個ごとに、プログラムA_nは(m_n、A_ {n + 1})を出力します。m_nは整数、A_ {n + 1}は別のプログラム(たとえば、何らかの方法でA_nを変更することによって取得) 、すべてのnについて、m_n> 0です。
ホールデンリー

(これのSFバージョンは、自分自身を修正し続けるプログラムが核ミサイルを発射するボタンを決して押さない、またはプログラムが常に特定の量を最適化するという「証拠」があるということです。)
Holdenリー

これが、プログラムを実行することと、プログラムが出力するものを推論することとを区別したかった理由です-実行せずに、実行する前に何をするかのプロパティを知りたい A_nがA_ {n + 1}を生成するために「ソースコードを変更」できるようにしたい場合、Pには必ずメタプログラミング機能があります(これにより、(5)の位置になります)。
ホールデンリー

私にとっては、P = Qにとって興味深いと思われます。仮に、AはAIプログラムであり、A自体を変更する方法は、独自のコードについて推論することです。たとえば、コードのビットに関する定理を書き留め、それらを証明してから、そのコードを変更するだけです。そして、PはQの能力を持っている必要があるだろうと思われる
ホールデン・リー

@HoldenLee A_nのようなプログラムを作成することは可能です。文字列をプログラムの代表として使用する場合、これは任意の言語で簡単に実行できます。準引用符または同様のものが必要な場合、これはConvergeなどで可能です。構築におけるm_nの役割がわかりません。
マーティンバーガー

6

システム内の4つのステップすべてを実行する現在のシステムはありません。システムを設計する場合、最初の要件の1つはホモイコニック言語です。少なくとも、システムに入ってそれ自体を解釈させ始めるときに機能するように、できるだけ小さなコアプログラミング言語が必要です。したがって、あなたは、Lispで開拓された半円形の通訳が必要です。他の言語もそれを行っていますが、Lispに関する膨大な量の既存の研究があります。

これを行う場合の最初のステップは、Lispなどのホモイコニック言語または実行中のプログラムについて推論できるフレームワークを用意することです。Lispは、言語でメタサーキュラーインタープリターを定義できるか、コードをデータとして扱うことができるという唯一の理由で使用されます。コードをデータとして扱うことが最も重要です。c2 wikiでホモイコニックの意味についての議論が行われています。

たとえば、Lispでは、「プログラム」データ型は有効なLispプログラムです。Lispプログラムをインタプリタに渡し、それが何かを計算します。有効な「プログラム」をプログラムしないと、インタープリターによって拒否されます。

したがって、ホモイコニック言語は3つの要件を満たします。正式なプログラムのアイデアをLispで定義することもできます。

Lisp内でLispをモデル化できますか?はい、これはあなたの能力をテストするために、主にLispプログラミング本の最後の練習として頻繁に行われます。SICP

現時点では、4号は研究上の質問であり、以下はこの質問に答えようとする試みであることがわかったものです。

これを実行しようとするプログラムには多くの種類があると思います。以下は、私が知っているすべてのプログラムです。

  • JSLintは、マシンコードまたは他の言語を使用して明示的にバグを探す静的アナライザーの例です。次に、それを修正するプログラマを要求します。

  • Coqは、プログラミング言語を使用して証明を指定できる環境です。また、問題を解決する方法を提案する戦術もあります。それでも、これは人間が仕事をすることを期待しています。Coqは依存型を使用して動作するため、非常に型理論的です。コンピュータ科学者やホモトピー型理論に取り組んでいる人々の間で非常に人気があります。

  • 一方、ACL2は自動化された定理証明器です。このシステムは、プログラムしたものに基づいてステートメントを証明します。

  • ACL2とCoqには、システムを機械学習システムと接続するソフトウェアプラグインがあります。これらのシステムのトレーニングに使用されるのは、以前に作成されたプログラムです。私の理解から、これらのシステムは、戦術だけでなく、証明開発に役立つ定理を提案する別の機能を追加します。

以下は、あなたの質問が意味するもののより基本的なものです。

  • gccは、optimizngコンパイラの例であり、入力として自分自身を受け取り、最適化されたバージョンを出力できます。ある表現から別の表現にプログラムを変換し、最適化フラグによって速度を向上させるコンパイラーのアイデアは非常によく理解されています。コンパイラをブートストラップし、有効なマシンコードを生成すると、最適化を追加してコンパイラを再コンパイルすることができ、より効率的なバージョンのコンパイラが作成されます。

1
言語を可能な限り最小限にする必要はありません。関連するメタプログラミング機能を任意の言語に追加できます。TahaのMetaMLの研究はこれを示しています。実際、メタプログラミング機能の追加は機械的なものです。
マーティンバーガー

1
また、「4つのステップすべてを実行する現在のシステムがない」ことにも同意しません。質問4では、コードとして指定されたプログラムの実行についてのみ説明します。それは完全に可能です。確かにJavascriptのevalでもできます。
マーティンバーガー

@MartinBergerとは、コアカーネルをできるだけ最小限にすることです。また、システムが#4を行うことを望み始めた場合でも、人間だけでなくコンピューターを使用できるようにトレーニングできるシステムが必要になるため、最小限のシステムと、メタプログラミングテンプレートのようなシステム
ジョシュアハーマン

それは、私たちが何について話しているかによって異なります。元の質問には、それらの2つの詳細が含まれています。1つ目は簡単で、プログラムを実行するだけです。2つ目は、タイピングシステムの回答(2)で(5)として引用したロジックで処理できます。後者はMetaOCamlで実装されています。しかし、さらなる研究の余地があります:(2)も(5)もメタプログラミングの任意の形式を扱うことができず、(2)によって保証されるプロパティは少し弱いです(結局、それは型推論を備えたタイピングシステムです) 。
マーティンバーガー

1
「コアカーネルをできる限り最小限に抑える」ことに関しては、それは必須ではありません。任意の言語に完全なメタプログラミングを追加できます。
マーティンバーガー

5

@ user217281728の答えはと呼ばれる多くの推論とAIに関連したマシンの種類がある言及ゲーデルマシンが

Gödelマシンは、JürgenSchmidhuberによって発明された自己改善型のコンピュータープログラムで、最適な方法で問題を解決します。新しいコードがより最適な戦略を提供することを証明できる場合、独自のコードを書き換える再帰的自己改善プロトコルを使用します。この機械はユルゲンシュミットフーバーによって発明されましたが、数学理論に影響を与えたカートゲーデルにちなんで命名されました。

「Goedel Machines:Profably Optim Self-Improvementsを作成する自己参照型ユニバーサル問題ソルバー」に関するJürgenSchmidhuberの参考文献、(2006)arXiv:cs / 0309048v5

機械の実装方法 メタ学習は、2つのフェーズがあります。

  1. データから学ぶ(レベル1、学ぶ)
  2. 学習したデータを使用してソースコード/アルゴリズムを変更/最適化する(レベル2、学習することを学ぶ)

マシンは自身のソースを変更するため、自己参照型です。つまり、自己変更プロパティを持っています(参照 参照)。

この意味で、厳密な意味で学習アルゴリズム自体を変更できます(最適な自己変更を提供します)。自己参照と決定不能性の問題があり、この場合は次の形式を取ります。

..無制限の計算リソースを持つゲーデルマシンは、有効性を証明できない自己改善を無視する必要があります

自己変更プロパティを持つ他の言語(および関連するインタープリターマシン)は、たとえば LISPです。です。

LISPでは、コードとデータは相互に変更可能であり、ソースコードASTはLISPプログラムでデータとして利用可能であり、データとして変更できます。一方、一部のソースコードでは、データはASTと見なすことができます。

更新

自己参照自己複製、および自己プログラミングを組み合わせた自己プログラミングマシン(など)のような他のマシンもあります

上記の興味深い点の1つは、自己参照はまったく問題はなく自己複製 /自己プログラミングオートマトンに必要な要素であることです。

詳細(およびその他の出版物)については、JP Moulin、CR Biologies 329(2006)を参照してください。

概要

生きているシステムは、予測不可能な環境に適切に対応することができます。この種の自己組織化は、自己プログラミングマシン、つまり自分自身を変更できる組織として動作するようです。これまでに提案された生物の自己組織化のモデルは、微分システムの関数ソリューションまたはオートマトンの遷移関数です。これらの機能は固定されているため、これらのモデルは組織を変更できません。一方、コンピューターサイエンスは、生物の適応システムの特性を備えた多くのモデルを提案していますが、これらのモデルはすべて、目標と結果の比較とプログラマーによるパラメーターの巧妙な選択に依存していますが、プログラマーの意図はありません生命システムの選択も。msp)外部条件が変化し、適応の顕著な特性がある場合。 Msp繰り返しを定義する操作に関係なく、同様のプロパティがあります。これらの結果から、次のような声明を出すことができます。生体システムの適応特性は、書き換えメカニズムが有限状態セットでの決定論的で一定の再発であるという唯一の仮定の下で、外部条件が変化するたびに組織を書き換える能力によって説明できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.