2025 年度「プログラミング言語論 Ⅰ」テスト

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

問題

以下の問に答えよ。

Ⅰ. (Haskell の式)

提出ファイル名: Toi1.hs

以下の問で使用する関数 take, from, iterate, zipWith, map は、講義プリントに定義されている通りの関数である。

例えば  take 6 (iterate (1 +) 1) の評価の結果は、 [1,2,3,4,5,6] である。

これらの関数を使って評価結果がそれぞれ次の値になるような Haskell の式を考えよ。ただし 1, 3, 99 のような数値定数は 各問で 4 箇所までしか使用することができないとする。

  1.   [1,-2,4,-8,16,-32]
  2.   [2,4,10,28,82,244] (= [1 + 1, 3 + 1, 9 + 1, 27 + 1, 81 + 1, 243 + 1])
  3.   [2,4,7,12,21,38] (= [1 + 1, 2 + 2, 3 + 4, 4 + 8, 5 + 16, 6 + 32])

評価結果が次の値になるような、リストの内包表記を用いた Haskell の式を考えよ。 ただし 1, 3, 99 のような数値定数は各問で 4 箇所までしか使用することができないとする。 なお \(m\) から \(n\) まで(ただし \(m \le n\))の整数のリストは、 [m..n] という式で得ることができる。例えば、[1..5] は [1,2,3,4,5] である。

  1.   [1,2,3,2,4,6,3,6,9,4,8,12]
解答ファイルのテンプレート
answer1 = …
answer2 = …
answer3 = …
answer4 = …

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

  1. 再帰的な関数定義:
    提出ファイル名: Foo.hs

    引数として与えられる整数のリストの要素のなかで、 正の偶数の最大値を返す関数

    を定義せよ。ただし、正の偶数が含まれていないときは 1 を返すようにせよ。

    例えば、foo [2,1,2,-3,7,12] は 12 であり、 foo [-2,3,5,-1,15] は 1 であり、 foo [6,3,2,4,-12,-6,9] は 6 である。

    この問では map, filter, foldl, foldr などのリストに関するライブラリ関数や内包表記を使わず、 if 〜 then 〜 else 〜 式、算術演算子、 論理演算子、比較演算子、パターンマッチング、ガード、再帰のみを使って定義せよ。

    また、Haskell で“余り”を表す算術演算子 は `mod` である。例えば (-7) `mod` 4(あるい は mod (-7) 4)の値は 1 である。 あるいは odd, even という関数を使っても良い。

  2. リスト内表表記:
    提出ファイル名: Bar.hs

    正の整数 \(n\) を引数として受け、 \(0 < y \le x\) かつ \(xy \le n^2 \) となる 整数の組 \((x,y)\)を列挙する関数

    を(リストの内包表記を用いて)定義せよ。

    例えば、bar 2 は [(1,1),(2,1),(2,2),(3,1),(4,1)]、 bar 3 は [(1,1),(2,1),(2,2),(3,1),(3,2),(3,3),(4,1),(4,2),(5,1),(6,1),(7,1),(8,1),(9,1)] で、 bar 4 は [(1,1),(2,1),(2,2),(3,1),(3,2),(3,3),(4,1),(4,2),(4,3),(4,4),(5,1),(5,2),(5,3),(6,1),(6,2),(7,1),(7,2),(8,1),(8,2),(9,1),(10,1),(11,1),(12,1),(13,1),(14,1),(15,1),(16,1)] となる。
    (リストの要素の順番はこの通りでなくても良い。)

    なお \(m\) から \(n\) まで(ただし \(m \le n\))の整数のリストは、 [m..n] という式で得ることができる。例えば、[1..5] は [1,2,3,4,5] である。


Koji Kagawa