跳到主要内容

東北大学 工学研究科 電気・情報系 2016年8月実施 専門科目 問題5 計算機2

Author

祭音Myyura (co-authored with GPT 5.6 SOL)

Description

日本語版

Fig. 5(a) の構文を持つプログラミング言語を考える。f(x1,,xk)=ef(x_1,\ldots,x_k)=e によって定義されている関数呼出式 f(e1,,ek)f(e_1,\ldots,e_k) の評価方法として,以下の 22 つの戦略を考える。

  • 戦略 1:まず各 eie_i,ただし 1ik1\le i\le k,を評価し,その値を xix_i とする。そして,関数の本体 ee を評価する。
  • 戦略 2:e1,,eke_1,\ldots,e_k は評価せずに,関数の本体 ee 中の各 xix_i,ただし 1ik1\le i\le k,の全ての出現を eie_i で置き換えた式 ee' を求める。そして,その式 ee' を評価する。

ただし,いずれの戦略においてもその他の式の評価方法は以下の通りである。

評価方法
nn評価結果は nn となる。
(e1+e2)(e_1+e_2)まず e1e_1e2e_2 を評価し,その結果をそれぞれ n1n_1n2n_2 とする。すると全体の式の評価結果は n1+n2n_1+n_2 となる。
(e1e2)(e_1-e_2)まず e1e_1e2e_2 を評価し,その結果をそれぞれ n1n_1n2n_2 とする。すると全体の式は評価結果は n1n2n_1-n_2 となる。
(ifz e1 then e2 else e3)(\mathrm{ifz}\ e_1\ \mathrm{then}\ e_2\ \mathrm{else}\ e_3)まず e1e_1 を評価する。その評価結果が 00 であれば e2e_2 を評価し,そうでなければ e3e_3 を評価する。

たとえば,Fig. 5(b) のプログラムで定義された関数の下で,式 f(1)f(1) は戦略 11 の下では

f(1)g(1,1)g(0,2)2f(1)\to g(1,1)\to g(0,2)\to2

と評価され,戦略 22 の下では

f(1)g(1,1)g(11,1+1)1+12f(1)\to g(1,1)\to g(1-1,1+1)\to1+1\to2

と評価される。このプログラムに関する以下の問に答えよ。

(1) 戦略 11 の下で f(2)f(2) および f(3)f(3) を評価せよ。評価の過程も示せ。

(2) 戦略 11 の下で,式 ee の評価で実行される加算の回数を #add1(e)\#\operatorname{add1}(e) とおく。非負整数 nn に対し #add1(f(n))\#\operatorname{add1}(f(n))nn を用いて表せ。

(3) 戦略 22 の下で f(2)f(2) を評価せよ。評価の過程も示せ。さらに,そのときに実行される加算の回数を数えよ。

(4) 戦略 22 の下で,式 ee の評価で実行される加算の回数を #add2(e)\#\operatorname{add2}(e) とおく。非負整数 nn に対し #add2(f(n))\#\operatorname{add2}(f(n))nn を用いて表せ。

(5) あるプログラムの下の式 ee で,#add1(e)>#add2(e)\#\operatorname{add1}(e)>\#\operatorname{add2}(e) となるものが存在するか否かを判定し,その根拠を示せ。

Fig. 5(a)

プログラム
p ::= d1 ... dn
関数定義
d ::= f(x1,...,xn) = e

e ::= n (整数定数)
| x (変数)
| (e1 - e2) (整数減算)
| (e1 + e2) (整数加算)
| f(e1,...,en) (関数呼出し)
| (ifz e1 then e2 else e3) (条件分岐)

関数定義 “f(x1,,xn)=ef(x_1,\ldots,x_n)=e” において,ee 中に出現する変数の集合は {x1,,xn}\{x_1,\ldots,x_n\} の部分集合であるとする。

Fig. 5(b)

f(x)   = g(x, 1)
g(x,y) = (ifz x then y else g((x - 1), (y + y)))

题目描述

语言表达式包括整数、变量、加减法、函数调用和条件式 ifz e1 then e2 else e3;条件值为零时求值 e2,否则求值 e3。两种函数调用策略为:

  • 策略 1:先求实参值,再代入形参求值函数体。
  • 策略 2:将未经求值的实参表达式代入函数体中对应变量的每次出现,再求值所得表达式;不共享重复求值结果。

考虑程序

f(x) = g(x, 1)
g(x, y) = ifz x then y else g(x - 1, y + y)
  1. 用策略 1 计算 f(2),f(3)f(2),f(3),给出过程。
  2. #add1(e)\#add_1(e) 表示策略 1 计算 ee 时执行的加法次数。对 n0n\ge0#add1(f(n))\#add_1(f(n))
  3. 用策略 2 计算 f(2)f(2),并给出加法次数。
  4. n0n\ge0 求策略 2 的加法次数 #add2(f(n))\#add_2(f(n))
  5. 是否存在某程序及表达式 ee,使 #add1(e)>#add2(e)\#add_1(e)>\#add_2(e)?说明理由。

Kai

(1)

f(2)g(2,1)g(1,2)g(0,4)4,f(2)\to g(2,1)\to g(1,2)\to g(0,4)\to\boxed4,
f(3)g(3,1)g(2,2)g(1,4)g(0,8)8.f(3)\to g(3,1)\to g(2,2)\to g(1,4)\to g(0,8)\to\boxed8.

(2)

每次递归先计算一次 y+yy+y,共递归 nn 次,所以

#add1(f(n))=n.\boxed{\#add_1(f(n))=n.}

(3)

策略 2 延迟实参求值,得到

f(2)g(2,1)g(21,1+1)g((21)1,(1+1)+(1+1)).f(2)\to g(2,1)\to g(2-1,1+1) \to g((2-1)-1,(1+1)+(1+1)).

末次条件求值为零,返回并计算 (1+1)+(1+1)=4(1+1)+(1+1)=4,共执行 3\boxed3 次加法。

(4)

Y0=1,Yk+1=Yk+YkY_0=1,Y_{k+1}=Y_k+Y_k。返回的表达式为 YnY_n,它是含 2n2^n 个叶子的满二叉加法树。因此

A0=0,An+1=2An+1,#add2(f(n))=2n1.A_0=0,\quad A_{n+1}=2A_n+1,\qquad \boxed{\#add_2(f(n))=2^n-1.}

条件中只有减法,不增加此计数。

(5)

存在。例如定义 h(x)=0h(x)=0,取 e=h(1+1)e=h(1+1)。策略 1 先计算实参,执行一次加法;策略 2 中形参在函数体中未出现,不计算实参。因此

#add1(e)=1>0=#add2(e).\boxed{\#add_1(e)=1>0=\#add_2(e).}