質問
私の理論計算言語のクラスは、この学校の宿題を実施する作品のコードを語ることのみを算のためのフロー制御ない場合は諸表これは主に証明できる書チューリング-完全な言語だけがループを実行します。
人が理解できる言語の文法、言語の規則:
S -> S;S | while C do S od | id := E
E -> E + T | T | E - T
T -> T * F | F | F / T
F -> id | cons | (E)
C -> E = E | E > E | E < E | E >= E | E <= E | E != E | C and C | C or C | not(C)
このコピーからクラス注っせいにしない場合は何かが欠落しくは正しくない。
作品のコードを実施するこ
if d = 0 do
x := 1
else
x := a / d
止したい場合は見ていて気分が良いものを書を使用した言語上記の規則がある。その他、見ていて気分が良いものを書でも言語だ。ですが注意!
- ない場合は諸表のその他の種類のフロー制御以外をタイルです。
- ない不正な行為が発覚した場合:文法に関しては上記を含まないダイレクトに結ぶ諸表に戻諸表または例外をスローしました。んで使用します。
私は私の作品のコードを書くこと(い投稿を証明することなどを見せてくれteh codezにしました。私はちょっと奇妙などの誰もができるものです。
解決 2
ここに私のコードです:
continue := True
while d = 0 and continue do
x := 1
continue := False
od
while d != 0 and continue do
x := a/d
continue := False
od
他のヒント
これは、単一のwhileループで行うことができますが、それはそれは明らかではありません。
while d == 0 do
d := 1;
a := 1
od
x := a / d;
説明、D = 0の場合、dは1になり、また、1になりこれがループを終了する。
は、現在、X dが0である場合、/ dは1と評価されるため、微細である/ dに設定されている。
この作品は、でしょうか?
td := d
x := 1
while td != 0 do
x := a / d
td := 0
od
チューリング完全であることを、あなたは選択と反復の両方をサポートする必要があります。ループは明らかに反復しながら。選択は全くそうでない場合は、条件が真であるならば、それは一回のループを通過することによって達成することができ、。
だから、最悪の場合、あなたはこれらの技術を適用することによって、ために必要なすべてを行うことができます。私はいくつかの複雑な制御フローはいえ、高速醜いなるだろう想像します。 : - )
trueまたはfalseの枝の詳細を使用しなくても、と述語を繰り返すことなくます:
statementIncomplete := True
while d = 0 and statementIncomplete do
x := 1
statementIncomplete := False
od
while statementIncomplete do
x := a/d
statementIncomplete := False
od
この拡大 Eamonの回答.
の意味の if <condition> then <stmt> else <stmt> fi
は次の通りです:
- 評価
<condition>
; - 場合はtrue、実行の間
then
やelse
; - その実行の間
else
やfi
.
の意味の while <condition> do <stmt> od
は次の通りです:
- 評価
<condition>
; - falseの場合、
while
算を行い実行; - その実行の間
do
やod
, することを目while
決ます。
表現 if A then B else C
面 while
, を行なわなければならない次の変換:
ましょう gensymN
する名前を使用しないその他の変数発光します以下のコード
gensymN := 0;
while gensymN = 0 and A do B; gensymN = 1; od;
while gensymN = 0 do C; gensymN = 1; od
の意味のこのプログラム:
- 割り当て0
gensymN
. - 評価
gensymN = 0 and A
(trueA
はtrue) - Trueにするととします。
- 実行
B
- 実行
gensymN = 1
- 評価
gensymN = 0 and A
(false) - 評価
gensymN = 0
(false)
- 実行
- else if
gensymN = 0 and A
したがfalseの場合):- 評価
gensymN = 0
(true) - 実行
C
- 実行
gensymN := 1
- 評価
gensymN = 0
(false)
- 評価
の観点から、以下の構造上の
- (有効評価
A
; - Trueにすると、それが実行
B
, 除C
. - ほか
A
,B
やC
, プログラム(フラグメントのみfiddlesとgensymN
, ない現在の入力プログラム。
そのためこのプログラムと同じ意味として
if A then B else C fi; gensymN := 1
一脚注:の場合 A
がtrueの場合を評価し、評価するのでは再び除 and
は短絡).の場合の言語での保管boolean値を割り当に変数をひきりのダミー変数とい dummy := A; <insert the above program here, with dummy instead of A>
.その評価 dummy
基本的にだけます。場合に評価する真偽値表現できない副作用防止の評価を必要としない正;のではない)きました。
取り上記のとして"ソフト証明"のprovisos当社が前項のことは正しい 全般 翻訳 if
へ while
.の一般セットす(=Eamon)の回答のほか等につき独自の検証を行った。