東北大学 工学研究科 電気・情報系 2018年3月実施 専門科目 問題5 計算機2
Author
祭音Myyura (co-authored with GPT 5.6 SOL)
Description
日本語版
以下の手続き型プログラミング言語を考える。
Px::=x=x−x∣[P;P]∣w[x]P::=a∣b
ここで、P および x はプログラムおよび変数をそれぞれ表す非終端記号であり、a,b,w,=,−,[,;,] は終端記号である。変数 a と b は整数の値を保持する。変数の初期値はプログラムの外から実行前に与えられる。各構文の意味は以下の通りである。x1=x2−x3 は、x2 の値から x3 の値を引いた数で x1 の値を置き換える。[P1;P2] は、P1 と P2 をこの順に続けて実行する。w[x]P は、x の値が 0 以下になるまで P の実行を繰り返す。
A および B を変数の値に関する条件とする。P の実行前に A が成り立つならば P が停止したときに B が成り立つことを {A}P{B} と書く。以下の規則の組み合わせのみから {A}P{B} が得られることを ⊢{A}P{B} と書く。
規則 1 P が x1=x2−x3 という形のとき、B に現れる全ての x1 を式 x2−x3 に置き換えて得られた条件が A と文字通り一致するならば、{A}P{B} である。
規則 2 P が [P1;P2] という形のとき、ある条件 C が存在し {A}P1{C} かつ {C}P2{B} ならば、{A}P{B} である。
規則 3 P が w[x]P′ という形のとき、{A かつ x>0}P′{A} ならば、{A}P{A かつ x≤0} である。
規則 4 ある条件 C,D が存在し、C は A の必要条件、D は B の十分条件であるとき、{C}P{D} ならば、{A}P{B} である。
例えば、⊢{a≥0}w[a][a=a−a]{a=0} である。なぜならば、
- {a−a≥0}a=a−a{a≥0}(規則 1)
- {a≥0 かつ a>0}a=a−a{a≥0}(規則 4)
- {a≥0}w[a][a=a−a]{a≥0 かつ a≤0}(規則 3)
- {a≥0}w[a][a=a−a]{a=0}(規則 4)
だからである。
F をプログラム w[a][a=b−a;b=b−a] とする。以下の問に答えよ。
(1) F の構文木を、F の全ての終端記号が葉として現れる木構造として図示せよ。
(2) 初期値を (a,b)=(23,41) として F を実行し、F が停止したときの a と b の値を求めよ。
(3) ⊢{ある整数 i が存在し、i≥0 かつ (ba)=(0111)i(10)}F{b=1} を示せ。
(4) a および b の任意の初期値に対して F が停止するかどうか判定せよ。その根拠を示せ。
题目描述
命令式语言的语法为
P::=x=x−x∣[P;P]∣w[x]P,x::=a∣b.
变量 a,b 存放整数。赋值 x1=x2−x3 以右边计算值替换 x1;[P1;P2] 顺序执行;w[x]P 在 x>0 时反复执行 P,直到 x≤0。
Hoare 三元组 {A}P{B} 表示:若执行前满足 A,则程序终止时满足 B。符号 ⊢ 表示仅由以下规则可导出:
- 赋值规则:若 A 正好是将 B 中 x1 替换为 x2−x3 后的命题,则 ⊢{A}x1=x2−x3{B}。
- 顺序规则:从 ⊢{A}P1{C} 与 ⊢{C}P2{B} 得 ⊢{A}[P1;P2]{B}。
- 循环规则:从 ⊢{A∧x>0}P{A} 得 ⊢{A}w[x]P{A∧x≤0}。
- 后果规则:若 A⇒C,D⇒B 且 ⊢{C}P{D},则 ⊢{A}P{B}。
令 F=w[a][a=b−a;b=b−a]。
- 画语法树,使全部终结符出现在叶子上。
- 初值 (a,b)=(23,41) 时执行程序,求终止值。
- 证明
⊢{∃i∈Z≥0, (ba)=(0111)i(10)}F{b=1}.
- 对任意整数初值,F 是否都终止?说明理由。
Kai
(1)
(2)
注意第二次赋值使用更新后的 a,因此每轮映射为 (a,b)↦(b−a,a)。
(23,41)→(18,23)→(5,18)→(13,5)→(−8,13).
此时 a≤0,所以 (a,b)=(−8,13)。
(3)
令 M=(0111),I(a,b) 表示题设前置条件。Mi(0,1)T=(Fi,Fi+1)T,其中 F0=0,F1=1;故 I∧a>0 蕴含 i≥1。
循环体对应矩阵 M−1=(−1110),于是
I(a,b)∧a>0 ⟹ I(b−a,a).
取中间断言 J(a,b)=I(a,b−a)。由两次赋值规则,
⊢{I(b−a,a)} a=b−a {J(a,b)},
⊢{J(a,b)} b=b−a {I(a,b)}.
应用后果规则与顺序规则,得到 ⊢{I∧a>0}[a=b−a;b=b−a]{I}。由循环规则,退出时满足 I∧a≤0;而 Fi>0 对 i≥1 成立,故只能 i=0,于是 (a,b)=(0,1)。最后用后果规则即得所证三元组。
(4)
对所有整数初值都终止。若初始 a≤0,立即退出。若反设无限执行,记各轮起始值为 an,bn,则所有 an 为正整数,且
an+1=bn−an,bn+1=an,an+2=an−an+1>0.
因此 an+1<an,构成无限严格递减的正整数序列,矛盾。