プログラムが何かをすることによって誘導を証明するには?
-
13-09-2019 - |
質問
Iは、オペランドとオペレータはポストフィックス表記で書かれた文字の配列を読み取り、コンピュータプログラムを有します。プログラムは、次に示すようなアレイは、スタックを使用して結果を出し動作をスキャン
get next char in array until there are no more
if char is operand
push operand into stack
if char is operator
a = pop from stack
b = pop from stack
perform operation using a and b as arguments
push result
result = pop from stack
どのように私はこのプログラムが正しく任意の後置式を評価することを誘導することによって証明するのですか? (Javaでの練習4.16アルゴリズム(Sedgewick 2003)から取られた)
解決
私はあなたに対してアルゴリズムを証明する必要がある表現はよく分かりません。彼らは典型的なRPN式のように見える場合でも、あなたは次のようなものを確立する必要があります:
1) algoritm works for 2 operands (and one operator) and algorithm works for 3 operands (and 2 operators) ==> that would be your base case 2) if algorithm works for n operands (and n-1 operators) then it would have to work for n+1 operands. ==> that would be the inductive part of the proof
幸運; - )
証明に関する心を取り、またその時々の名前を混乱。 の誘導の場合には証拠1はまだ時々、の演繹のロジックが、その後、これらの事実やルールによって、何か(いくつかの事実や、いくつかのルール)「を把握」することが期待されています誘導を購入し、より広範な真実を構成まとめます。つまり:ベースケースが真として確立され、もう1つはXが「N」の場合についても同様だったならば、Xはまた、「N + 1」の場合に当てはまるだろうことを証明したので、我々はすべてのを試してみる必要がないので、大きな数、あるいは無限)できた場合、
バックスタックベースの式の評価に...最後にひとつのヒント(あなたが情報にオーバーつもりな感触だキャプテンとSegfaultの優れた説明にaddtionで...)。
The RPN expressions are such that: - they have one fewer operator than operand - they never provide an operator when the stack has fewer than 2 operands in it (if they didn;t this would be the equivalent of an unbalanced parenthesis situation in a plain expression, i.e. a invalid expression).
式が有効であると仮定すると(したがって、早すぎる、あまりにも多くのオペレータを提供していません)、オペランド/演算子は、アルゴリズムに供給される順序は重要ではありません。彼らは常に安定したsitutationでシステムを残します: - いずれか1つの余分スタック上のオペランド(ただし、1つの余分のオペランドが最終的に来るという知識)とか - 1つの少ないスタック上のオペランド(まだ来て、オペランドの数も1つ少ない知識)と
だから、順序は重要ではありません。
他のヒント
あなたは誘導が何であるかを知っていますか?あなたは、一般的に、アルゴリズムがどのように動作するかを見ていますか? (場合でも、あなたはまだそれを証明することはできません?)
あなたの帰納法の仮定は、N番目の文字を処理した後、スタックが「正しい」である、と言うべきです。フルRPNの表現のための「正しい」スタックは、ただ一つの要素(答えを)持っています。部分RPNの発現のために、スタックにはいくつかの要素があります。
あなたの証明がスタックにの部分のRPN式をオンパーサとしてこのアルゴリズム(マイナススタックラインからの結果=ポップ)を考えると、それが正しいスタックにそれらを回すことを証明するために、その後でます。
これは、RPNの表現のあなたの定義を見て、そこから逆方向に動作するように役立つかもしれません。