whileループの小さなステップの操作セマンティクスで状態が変更されないのはなぜですか?


9

通常、whileループの構造的操作セマンティクス表現では、プログラムの状態は変化しません。

(whileBdoS,σ)(ifBthenS;(whileBdoS)elseSKIP,σ)

私にとって、これは直感的ではありません。状態が変化しない場合(つまり、メモリのステータスが同じままである場合)、は引き続きtrueであり、プログラムは終了しません。B

このルールで州が変わらない理由を誰か説明できますか?


これは、副作用がないと仮定できる場合にのみ正しいことに注意してください。これは、ほとんどのプログラミング言語では当てはまりません。B
ラファエル

回答:


10

プログラミング言語のセマンティクスでは、プログラムの状態の概念は漠然とした哲学的概念ではなく、非常に正確な数学的概念です。この小さなステップの操作セマンティクスの状態 は部分関数ですs

s:VarZ

変数の値を記録します。だから場合、変数 xの値は vです。sx=vxvです。状態は、実際に発生する変数の値を記録することだけが意味があるため、必ずしも部分的な関数です。

展開する公理

whilebdoS,sifbthenS;whilebdoSelse skip,s

単純に、whileループを展開して条件付きステートメントにします。条件付きステートメントの1つには、ループが含まれています。このため、変数が値を変更することはありません。このため、状態は変化しません。


10

状態は次の還元ステップで変化する可能性があります。

while B do S,σif B then (S; while B do S) else skip,σ

-ループによってガード(先行される)SSの計算は、状態Bf a l s eと評価できるように状態を変更する場合があります。whileSSBfalse


つまり、これは、状態の変化を、具体的なプログラムでSを潜在的に削減できる他のルールで表現する必要があることを意味します。
El Marce

@ElMarceはい。簡単な例を試してみることをお勧めします。例:、これがどのように機能するかを確認してください。x:=2; while x>0 do x:=x1
Martin Berger、

9

状態は、Bをループの1回の反復を実行するかどうかを決定するときに考慮しても変化しませんが、後で本体Sを実行するときに変化する可能性があります。したがって、次にBを検討するときに、σの変化が生じる可能性があります。σBSBσ


この説明は本質的には正しいものの、状態とは何であるか(変数の値を示す関数)や状態の変化が何を意味するか(つまり、少なくとも1つの変数の値が変化すること)については言及していません。
HansHüttel、2016年

確かに、それは私の答えの目的のためにどのような状態であるか、またはそれらがどのように実装されるかは無関係です。説明は関係ありません。さらに、「状態は実際に関数である」と言うのは実際には間違っています。他の可能なモデルがあります。また、数学モデルとハードウェアの動作を混同しないようにしましょう。
Andrej Bauer

しかし、問題は、状態の概念が明確に定義されている特定の小さなステップの運用セマンティクスに関係しています。
HansHüttel、2016年

そうではないと私は言ったことがありません。私の説明は、状態がどのようにモデル化されているかについて明示的に言及されていないため、あなたの発言は不要だと言っています。おそらく、OPが状態が変数から値へのマップであることを認識していないことを検出しました。あなたにいいです、あなたはあなたの答えを受け入れてもらいました、そして私はしませんでした。おめでとう。なぜあなたが私にあなたの答えの方法を強制しているのかは、私の理解を超えています。なぜあなたは私の答えをあなたのようにする必要性を正確に感じますか?私の答えは、あなたが必要だと思う発言がなければ意味があります。たぶん誰かが私の答えを探しに来るでしょう。
Andrej Bauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.