プログラムを書くプログラムを書く

"Hello world tester"プログラムが決定不能な問題であることは、理論上のコンピュータサイエンスでよく知られています(ここでは、 hello world tester
私の質問は、入力としてプログラムが与えられて以来、私たちはプログラムが何をするかを言い表すことができません、逆の問題を解決することができます:
入力と出力のセットを指定すると、与えられた入力と出力の間に1対1のマッピングを実現するプログラムを記述するプログラムを記述するアルゴリズムがあります。
私はメタプログラミングについて知っていますが、私の質問は理論的な興味です。一般的なケースに適用できるもの。

0
「プログラムが何をすべきかを考えて、プログラムを書いてください。何?
追加された 著者 Amy,
これは完全に別の質問です。
追加された 著者 SLaks,
それはまだあいまいです。あなたの質問に対する答えは、ロジックのない巨大な switch ブロックです。ジェネレータにサンプルを入力できますか?
追加された 著者 SLaks,
私は問題文を編集しました。
追加された 著者 bashrc,
質問をもう一度見て(すでに回答を投稿した後)、私はまだそれが漠然としていると思います。残りの主な問題は、これらの入出力ペアをどのように表現するかということです。この表現が有限集合のみを許すなら、私の答えは正しいですが、より一般的な前置詞を使う方法があれば、そのようなメタプログラムは不可能です。簡単な証明: 'hello world'を出力する場合、入力のペアをプログラムxとし、出力を真とする。リンクに示されているように、このようなプログラムは存在することができないので、そのようなプログラムを生成するアルゴリズムも存在しない可能性がある。
追加された 著者 LiKao,

6 答え

あなたの質問はあいまいに表現されています。

「プログラムが何をすべきか」をどのように指定しますか?
プログラムの機能の正確で完全な、機械で判読可能な仕様は、すでにプログラムです。

したがって、あなたの質問に対する答えはコンパイラです。



さて、入力と出力のサンプルに基づいて関数を見つける方法を尋ねています。
それは私が答えることができない統計分析に関する質問です。

2
追加された
私はあなたが何を意味するか分かりません。
追加された 著者 SLaks,
正確に言えば、より高いレバー言語を書くたびに、私たちが出力として持っていたいものをコンピュータに伝えることに近づき、コンパイラはそれをバイナリアセンブリ言語としてレンダリングします。
追加された 著者 Godwin,
私がばかげていると申し訳ありませんが、コンパイラはあらかじめ定義された入力セットでのみ動作します(すべての言語で動作するジェネリックコンパイラはまだありません)
追加された 著者 bashrc,

このような騒ぎでは、非常に注意する必要があります。命題 P(x)が成立する a プログラム x を明確に区別していないか、命題 P(x)を保持する>プログラム x P(x)が保持するプログラムの集合が有限である限り、その正確さの証明が常に存在する(この証明は知られていないかもしれないが)。

この時点で、あなたはまた、知られていることも知られているプログラムと、すべての可能性を完全に列挙することによってのみ存在することが示されるプログラムとを区別しなければなりません。例を見てみましょう:

10のプログラムを取ります。これは入力がなく、終了したり終了したりすることなく "hello world"を生成します。次に、これらのプログラムのうち正確にどのプログラムが正しいかを判断するプログラムがあります。これらのプログラムを(x_1、...、x_10)と呼ぶことができます。プログラム x_j (X_0、...、X_ {2 ^ 10)) X_i iの2進表現におけるj番目のビットがセットされているならば、/ code>。これらのプログラムのうちの1つは、10個の x_i のすべてを正しく決定するものでなければなりません。100個の X_j 正しいもの(この時点でのメタ問題)。

これは、プログラムと入出力ペアの有限集合を考慮すると、常に完全な列挙に解くことができ、すべての停止 - 問題のタイプのパラドックスが即座に消滅することを示しています。あなたのケースでは、各入力のための生成されたプログラムのセットはサイズ1であり、入出力ペアのセットは(メタプログラムに供給する必要があるので)有限のサイズです。したがって、完全な列挙はあなたの問題を非常に簡単に解決し、修正されたプログラムの正確さとメタプログラムの正確さの両方を簡単に証明することもできます。

注意:生成されたプログラムのセットは無限であるため、無限集合のプログラムに対して P(x)を証明できる数少ないケースの1つです(実際には P(x 、入力、出力))。これは、無限である集合が、このタイプの逆説が現れるのに必要な条件ではなく、十分な条件であることを示している。

2
追加された

入力シーケンスを与えられて学習し、適切な出力シーケンスを生成するために自身を更新するステートマシンを生成したいと思うように思えます。あなたの出力シーケンスが同じ入力シーケンスに対して常に同じであると仮定すると、それは簡単に書くことができるはずです。時刻に応じて出力を変更するなど、出力が確定的でない場合、状態マシンを自動的に生成することはできません。

1
追加された

「1対1マッピング」の意味に依存します。 (また、私は "入力"と "出力"と思います)。

私の推測では、与えられた任意のプログラムの入力と出力の例を考えれば、同等のプログラムを書くためのアルゴリズムを考案できますか?そうであれば、答えはいいえです。たとえば、入力/出力が1/1,2/2,3/3,4/4のプログラムを持つことができますが、次の入力値が5の場合、出力は3782になります。与えられた一連の結果から、次の結果が何であるかを知る。

1
追加された

あなたは入力と出力がどのように提示されているかを言わなかったので、質問は不明です。有限リストの場合、答えはこのPythonコードのように "yes"です:

def f(input,output):
    print "def g():"
    print "    x = {" + ",".join(repr(x) + ":" + repr(y) for x,y in zip(input,output)) + "}"
    print "    print x[raw_input()]"


>>> f(['2','3','4'],['a','b','x'])
def g():
    x = {'2':'a','3':'b','4':'x'}
    print x[raw_input()]
>>> def g():
...     x = {'2':'a','3':'b','4':'x'}
...     print x[raw_input()]
... 
>>> g()
3
b

無限のセットのためにどのようにそれらを提示するつもりですか?小さな入力サンプルしか表示されない場合、これはアルゴリズム全体を指定するものではありません。最適なフィットを見つけることは決めることができません。 「魔法のブラックボックス」を持っている場合は、連続した数多くのマッピングがありますが、数え切れないほどのプログラムしかないので、不可能です。

1
追加された

私はSLaksに同意すると思うが、別の角度からものを取って、コンパイラは何をするのだろうか?

(編集:SLaksが本来の答えを編集したのは本質的に「あなたがID機能を記述しているのを見る」)。

これは、プログラムの意図された動作を記述する1つのソース言語のプログラムを取り、その動作を示すターゲット言語で別のプログラムを「書き込む」。

これをプロセスの細分化のようなものとして考えることもできます。抽象的な仕様では、「より具体的な」具体的な実装(具体的には、非決定的ではない、通常は実装)への洗練マッピングを構築できます。

しかし、あなたの質問に基づいて、あなたが意味するものがあればそれがどれであるかを知ることは本当に非常に困難です。

0
追加された