2

私は、意図的に (設計により) 同じコードを 2 回評価できない (つまり、ループできない) 専用の「プログラミング言語」を作成しました。基本的に、フローチャートの各要素が同じデータセットに対して異なるテストを実行する条件である、フローチャートのようなプロセスを説明するために作られています (変更することはできません)。ブランチは分割およびマージできますが、循環することはありません。フローチャートはそれ自体にループバックできません。分岐の最後に到達すると、現在の状態が返され、プログラムが終了します。

書き留めると、典型的なプログラムは表面的には純粋関数型言語のプログラムに似ていますが、再帰の形式が許可されておらず、関数が何も返すことができないという点が異なります。関数を終了する唯一の方法は、別の関数を呼び出すか、現在の状態を返す一般的な exit ステートメントを呼び出すことです。同様の効果は、構造化プログラミング言語を使用してすべてのループ ステートメントを削除するか、「非構造化」プログラミング言語を使用して、コード内で逆方向に進む goto または jmp ステートメントを禁止することによっても実現できます。

ここで私の質問は次のとおりです。そのような言語を簡潔かつ正確に説明する方法はありますか? 私は正式な CS のバックグラウンドがなく、オートマトン理論や形式言語理論に関する記事を理解するのが難しいので、少し途方に暮れています。私は自分の言語がチューリング完全ではないことを知っており、苦労して、自分の言語がおそらく「通常の言語」(つまり、読み取り専用のチューリング マシンによって評価できる言語) として分類できることを確信することができました。もっと具体的な用語はありますか?

一般的なプログラミングの概念に精通しているが、正式な CS のバックグラウンドを持っていない聴衆にとって、用語が直感的に理解できる場合はボーナス ポイントです。また、そのような言語を評価する特定の種類の機械または自動機械があれば、ボーナス ポイントも得られます。そうそう、データ ストリームを評価しているわけではないことに注意してください。すべての要素は、入力データの完全なセットに (読み取り専用で) アクセスできます。:)

4

2 に答える 2

1

あなたの言語は、星のない言語を正確にエンコードするのに十分強力だと思います。これは、Kleene スターを含む式がない正規言語のサブセットです。つまり、連結と論理和の下で閉じられるのは、空の文字列、null セット、および個々の文字の言語です。これは、有向サイクルを持たない DFA によって受け入れられる言語のセットに相当します。

あなたの言語についての説明があれば、ここで証明を試みることができますが、私はあなたの言語に完全にアクセスできないため、正確に正しく機能するかどうかはわかりません. 私が行っている仮定は次のとおりです。

  1. 関数が返されることはありません。関数が呼び出されると、制御フローが呼び出し元に返されることはありません。
  2. すべての呼び出しは静的に解決されます (つまり、ソース コードを見て、各関数とそれが呼び出す一連の関数のグラフを作成できます)。つまり、関数ポインタはありません。
  3. コール グラフは非循環的です。任意の関数 A および B に対して、次のいずれかが成り立ちます: A が B を推移的に呼び出す、B が A を推移的に呼び出す、または A も B も推移的に相互に呼び出しません。
  4. より一般的には、制御フロー グラフは非循環的です。式が評価されると、二度と評価されません。これにより、上記を一般化して、関数が他の関数を呼び出すと考える代わりに、プログラムを、すべてが互いに DAG として呼び出す一連のステートメントと考えることができます。
  5. あなたの入力は、各文字が一度だけスキャンされ、指定された順序でスキャンされる文字列です (フローチャートをモデル化しようとしているという事実を考えると、これは妥当と思われます)。

これらの仮定を考えると、言語にスターがない場合、プログラムがその言語を受け入れるという証拠がここにあります。

星のない言語がある場合、それを受け入れるプログラムが言語にあることを証明するには、その言語の最小状態 DFA を構築することから始めます。スターのない言語はループがなく、入力を 1 回だけスキャンするため、DFA から自分の言語でプログラムを簡単に作成できるはずです。特に、s入力の次のシンボルに基づいて他の状態への一連の遷移がある状態が与えられた場合、入力の次の文字を見て、遷移先の状態をエンコードする関数を呼び出す関数を作成できます。DFA には指示されたサイクルがないため、関数呼び出しには指示されたサイクルがなく、各ステートメントは 1 回だけ実行されます。これで、(∀ R. は星のない言語 → ∃ それを受け入れるあなたの言語のプログラム) ができました。

含意の逆方向を証明するために、基本的にこの構造を逆にして、プログラムに対応するサイクルのない ε-NFA を作成します。この NFA のサブセット構築を行って DFA に縮小しても、サイクルは導入されないため、スターのない言語が得られます。構造は次のとおりです。プログラム内の各ステートメント s iに対して、状態 q iを作成します。そのステートメントから 1 ホップ離れた、プログラム内の他のステートメントに対応する各状態への遷移を伴います。これらの状態への遷移は、各決定を行うために消費された入力の記号でラベル付けされます。遷移が入力を消費せずに発生した場合は ε です。これは、(∀ はあなたの言語で P をプログラムし、 &exists; あなたの言語で受け入れられる文字列だけを受け入れるスターのない言語 R が存在する) ことを示しています。

まとめると、これはあなたのプログラムが星のない言語と同じように力を持っていることを示しています。

もちろん、あなたのプログラムができることについて私が立てた仮定は、あまりにも限定的かもしれません。入力シーケンスへのランダムアクセスがあるかもしれませんが、これは上記の構造を変更することで処理できると思います。実行中にサイクルが発生する可能性がある場合、この構造全体が壊れます。でも、たとえ私が間違っていたとしても、これについて考えるのはとても楽しかったし、楽しい夜をありがとう. :-)

お役に立てれば!

于 2011-02-01T05:37:12.283 に答える
0

この質問はやや古いことは知っていますが、後世のために、探しているフレーズは「決定木」です。詳細については、 http://en.wikipedia.org/wiki/Decision_tree_modelを参照してください。これはあなたが行ったことを正確に捉えており、起動するのにかなりわかりやすい名前が付いていると思います!

于 2011-02-10T19:51:08.777 に答える