0

言語の標準的な表現を持つと便利なことがよくあります (私の場合、それらは通常ドメイン固有の言語です)。ただし、関連する言語の表現力には厳密な制限があり、その言語の任意のプログラムに対して標準形式を決定および/または作成できるかどうかを決定するものだと思います。残念ながら、これについて読んだことを(漠然と)思い出した参考文献を見つけることができませんでした.

一方では、言語の正規表現を作成することは、多くのハード グラフの問題 (例: グラフ同形性) に匹敵する複雑さであると合理的に思われますが、他方では、iirc、gcc、yhc、および ghc などのコンパイラは中間表現を使用します。さまざまな形式(アセンブリ、JavaScriptなど)で出力を生成するため、これは少なくともいくつかの形式では解決済みの問題です。

特定の言語の正規形を決定/生成できるのはいつですか? (その言語はどの程度表現力があり、言語の表現力は正規形の有用性にどのように影響しますか?) 可能であれば、参照または証明を提供してください。

編集:たとえば、正規言語(例:正規表現の「純粋な」形式)は、チューリング完全言語が表現できるのと同じ多くのことを表現できません。つまり、通常の言語で Web サーバーを作成することはできませんが、ラムダ計算を使用すると作成できます)。私の質問は理論的な可能性に関するもので、複雑性理論に関連する具体的な答えがあります。別のシステムに送信する必要がある DSL がある場合、送信する前にそのコードの標準的な形式を生成すると、2 つの異なるシステムで使用される独立した表現が分離されるため、多くの場合有益です。 でも、それがP空間完全、またはチューリング完全言語を標準形式に変換するためのNP完全である場合、標準形式を構築しようとして時間を無駄にすべきではありません-それを行う別の方法を見つけるか、削減します多項式時間で正規化できる言語の複雑さ。

4

2 に答える 2

1

「標準表現」とは、次のことを意味すると思います。同じ入力で「同じことをする」場合は、プログラムPQを 同等に呼び出します。「同じことをする」とは、プログラムの出力が同じであり、両方のプログラムが有限時間後に停止するか、両方が無限ループに入ることを意味します。この同値関係は、すべてのプログラムのセットで同値類を定義します。プログラムPの「標準表現」は、同じ同値類に属するプログラムP'であり、同じ同値類のすべてのメンバーが同じ標準表現を持っている必要があります。

チューリング完全言語の場合、チューリング計算可能な正規表現を使用すると、停止問題を次のように解決できます。まず、無限ループで構成されるプログラムを作成し、その正規表現Qを見つけます。次に、任意の入力プログラムPについて、最初にそれを機械的にプログラムP 0に変換します。このプログラムは、出力を生成しないことを除いて同じことを行い、次にこのプログラムの正規表現P0 'を見つけます。結果がQの場合、 P 0は停止しないため、Pも停止しないことがわかります。それ以外の場合、P 0は停止し、Pも停止します。

さらに楽しくするには、彼が「エレガントな」プログラムと呼んでいるものに関するグレゴリー・チャイティンの作品のいくつかを読んでください。

于 2008-10-09T20:57:20.550 に答える
0

アセンブリ言語にコンパイルすることは、実用的な方法で標準的な形式に変換することとして分類できるように私には思えます。

于 2008-10-09T17:15:40.607 に答える