一言で言えば:どのようなあなたの先生は、おそらく意味することの意味があるということwhile
の意味は、一方で、かなりのほとんどの言語でも同じであるfor
(以下の説明を参照)を大幅に変更されることがあります。したがって、抽象言語に依存しない証明はを使用した方が信頼性が高くwhile
なりfor
ますが、ループを使用した証明for
は多くの言語のループのセマンティクスと一致しない可能性があることに注意する必要があります。
あなたの質問は十分正確ではありません(それはあなたのせいではないかもしれません)。
重要なのは、afaikには、公式でISOでサポートされている標準、またはその他の方法で公式に受け入れられているfor
and while
ループの参照定義がないということ
です。定義はプログラミング言語に依存します。
したがって、それぞれが何を実行できるかを正確に定義する前に、それらの同等性に関する一般的な説明を行うことはできません。より正確に言えば、それは他の回答で使用される主要な議論の1つであるためです(そして、この議論は以下で役立つでしょう)。
for
and while
ループの相互翻訳について
要約:それはプログラミング言語に依存しますが、無限ループとそれを抜け出す方法を1つ持つことができる限り、常に可能です。
しかし、特定のプログラミング言語に対してそのようなステートメントを作成することができ、答えは言語の機能に依存します。
これはまた、一般的な証明はなく、プログラミング言語ごとに1つしかないことも意味します。
一般的に当てはまることの1つは、whileループがforループの終了条件テストを実行し、ループに入る前に割り当てを使用して制御変数の初期化を実行し、増分を実行できるため、ループがループをwhile
模倣for
できることですループ本体の終わりにあるので、
for i from 1 by 2 to 10 do { xxx }
なる
i=1
while i≤11 do { xxx; i←i+2 }
これは多かれ少なかれほとんどの言語で機能しますが、見た目ほど明白ではなく、心配する必要のある「詳細」がたくさんあるかもしれません。
たとえば、多くの言語では、for
ループは3つの引数(初期値、増分、および最終値)を厳密な引数として評価し、ループに入る前に一度評価されますが、他の人はサンク引数として各ターンで再評価されるか、またはおそらく最初に必要なときにのみ評価される遅延引数として。
もう1つのポイントは、インクリメント変数が
for
ループに対してローカルであるか、ループが出現する関数のローカル変数である必要があることです。
そのような問題に応じて、a for
からaへの変換はwhile
大きく異なりますが、通常はそれを実現することが可能です。
同じことが逆に当てはまり、while
aがfor
ループに変換されます。
最初の問題は、while
ループが常に各ターンで終了条件を再評価することです。ただし、一部のfor
ループは、制御変数とループエントリで計算された固定値との比較を除いて、各ターンで再評価される条件を提供しません。次に、任意の条件でループから抜け出す他の手段がない限り、変換は不可能です。
これは、さまざまなデバイスで実現可能です。通常、条件をテストする条件ステートメントで始まり、次に、ループ終了ステートメント、戻りステートメント(ループを関数にカプセル化した後)、gotoステートメントによって、ジャンプアウトが実装されます。または例外の発生。
言い換えれば、それは再び言語に、そしておそらく言語の微妙な特徴に非常に依存しています。
これは、@ milleniumbugによって回答されたように、for
loppは本質的にwhile
ループとインクリメントされた制御変数の追加の部分であるため、言語Cでの相互翻訳は簡単です。
しかし、これは必ずしも他の言語に当てはまるわけではなく、おそらく同じようには当てはまりません。
そうは言っても、必要なのは1つの無限ループだけなので、プログラミング言語は通常、これらのループの1つだけでチューリングパワーを備えているはずです。したがって、永遠にループする方法があり、停止する可能性がある限り、他の構成要素を模倣できると確信できますが、必ずしも簡単ではありません。
証明について
要約:(言語の奇妙な特徴がない限り)証明はどちらか一方の方がかなり難しいと主張する理由は私にはわかりません。
おそらく誤解があるか、先生が他のことを考えていました。
正式なセマンティクスは、プログラミング言語で定義されたさまざまな種類のループに対して定義でき、プロパティの証明に使用できます。
言語によっては、プログラムに関する正式な証明の実施が場合によってはより複雑になる場合があります。しかし、それは言語に依存します。
ある構成の方が他の構成よりも証明が大幅に困難になる理由は想像できません。for
それは、Cのように、で行われている全て提供できるので、ループはより複雑かもしれwhile
プラス他のものを。しかし、それをで行った場合while
、他の形式でエキストラを追加する必要があります。
単一の無限ループの可能性がある限り、相互翻訳可能性の正式な一般論を使用できます。ただし、関係する構造は証明で処理したくないものであり、少なくとも実際には不公平な声明であるため、これを行うことは控えます。
しかし、上記の議論に続いて、翻訳可能性の難しさはfor
、言語間のループの大きな変動性に起因することがわかりました。したがって、おそらく正しい答えである次の結論:
先生の発言を理解する1つの可能性は、while
ループのセマンティクスはすべてのプログラミング言語でほとんど同じである一方で、for
ループの構文とセマンティクスは言語によって大幅に異なる可能性があることです。したがって、言語に依存しないセマンティクスを持つwhile
ループで一般的な「抽象的な」証明を作成することは可能ですがfor
、これは、構文やセマンティクスが言語から言語に大きく変化するループでは不可能です。しかし、これは、両方のセマンティクスが正確に定義されている場合、特定の言語内では適用されません。
私の最善の提案は、先生が正確に何を意味しているか、先生に例を示すことができるかどうかを先生に尋ねることです。誤解や誤解はよくある出来事です。
for
するwhile
というこの根拠は、単に意味がありません。あるかもしれませんが、これはそうではありません。