2022 年度「プログラミング言語論」期末テスト
「プログラミング言語意味論 テスト」

解答上、その他の注意事項

問題

以下の問に答えよ。

Ⅰ. (記述問題)

  1. (必須)語句: (13 × 2 点)
    提出ファイル名: toi0101a.txt, toi0101b.txt

    プログラミング言語(やその処理系)で用いられる次の 6 つの語句のう 2 つを選択し説明せよ。その際、実際に動作するソースコードなど、 具体的な例を挙げよ。ただし、講義プリントにのっている例 やネットで見つかる例そのままではなくオリジナルの例を考えること。

  2. (ボーナス問題)自由記述: (最高 20点)
    提出ファイル名: toi0102.txt

    最近、人工知能 (AI) の発展が目覚ましく、外国語の翻訳は 10 年前に比べて格段に性能が上がり、実用に耐えるようになった。 囲碁や将棋では AI がプロ棋士より強くなってしまい、プロ棋士が AI を師匠として勉強するのが普通になっている。 プログラミングについても、たとえマイナーなプログラミング言語であっても、少なくとも初級のプログラミングの問題ならば正解できることは珍しくなくなっている。

    このような AI の発展に伴って、今後、プログラミングやプログラミングの教育はどのように変わっていくか(あるいは変わらないか)、大胆に予測してみよ。

問 Ⅱ はペーパー(紙)問題(ラムダ計算)となっている。

問 Ⅱ はペーパー(紙)問題(ラムダ計算)とオンライン問題の選択になっている。

Ⅱ. (Haskell プログラミング問題)

以下の a. b. いずれかを選択して解答せよ。 (両方、解答した場合は、ボーナス点として採点する。)

  1. (選択)IO モナド: (24 点)
    提出ファイル名: Toi02a.hs

    IO モナドを利用して、main 関数を持つ、以下のような Haskell プログラムを作成せよ。

    • 入力文字列中で 'e' または 'E' を 6 個以上含む 行だけを出力する

    ヒント: getContents を、lines, unlines, words, unwords などと組み合せて使う。

    入力例

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
    minim veniam, quis nostrud exercitation ullamco laboris nisi ut
    aliquip ex ea commodo consequat. Duis aute irure dolor in
    reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
    pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
    culpa qui officia deserunt mollit anim id est laborum.
    

    出力例

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
    reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
    
  2. (選択)命令型言語の模倣: (24 点)
    提出ファイル名: Toi02b.hs

    次の C の関数とほぼ同等な Haskell の関数を定義せよ。

    • 「ほぼ」というのは整数の精度などに起因する違いなどは除く、という程度の意味である。

    • Util コンパイラーを使って良い。 その場合は、用いた Util のソースコードも(Haskell ソース中のコメントとして)示すこと。

    • ハンドコーディング(ツールを使わずに自分の手でプログラムを作成すること)しても良い。 モナドを明示的に使わなくてもよい。(この問では“同等”の根拠を記す必要はない。)

    ヒント:

    • C の 「%」演算子に対応する Haskell の演算子は `mod`、 C の「!=」に対応するのは Haskell の「/=」である。 また、Haskell の整数の除算は `div` である。

    • 少なくとも foo 4(値は 3 になる) foo 11(値は 28 になる)foo 27(値は 42 になる) は確認せよ。

戻る


Koji Kagawa