プログラミング言語論・第 2 回レポート

問題

  1. (問 5.1.10) プリント p.31の deleteの定義では、 (delete 4 '(1 4 4 7))(1 4 7)になってしまう。 (delete 4 '(1 4 4 7))(1 7)になるように、 deleteを定義しなおせ。 4がいくつあろうが、対応できるようにすること。

  2. (問 5.1.12)2つのリスト xsysを受取り、 xsの順番を逆にしたリストを ysの先頭に付け加える関数 rev-appendを定義せよ。例えば、(rev-append '(1 2 3 4) '(5 6 7 8))(4 3 2 1 5 6 7 8)となる。

  3. (問 6.1.2) 任意の述語とリストを受取り、リストの中で述語を満たす最初の要素を返す関数 findを定義せよ。例えば、 (find odd? '(2 4 5 3 0))は 5、 (find even? '(2 4 5 3 0))は 2となる。 (述語を満たす要素が見つからない場合は考慮しなくて良い。)

  4. 初項 a と正の数 n を受取り、次の漸化式、

    で定義される数列について、第 n 項までの和を求める関数 foo を定義せよ。さらに第 n 項までのうち値が偶数の項(偶数番目ではないのみの和を求める関数 barを定義せよ。ただし、
    はガウス記号(つまり ...を越えない最大の整数)とする。 iterate2, filter, sumなどの関数、 および lambda式を用いること。

  5. 例題 5.1.8(p.31)の insertと同等の関数を p.12で定義した構造体、 関数を用いて、C言語で定義せよ。さらに、新しい要素以外に対しては、 新しい consセルを作らず、既存の consセルを書き換えるバージョンも定義せよ。

    プログラム全体はおそらくこんな感じ
    #include <stdio.h>
    #include <stdlib.h>
    
    /* p.12の定義をここに挿入 */
    
    /* insertの定義 をここに挿入 */
    
    int main(int argc, char** argv) {
      list xs = cons(1, cons(4, cons(7, cons(10, NULL))));
      xs = insert(atoi(argv[1]), xs);
    
      printf("result: ")
      for(; xs; xs=cdr(xs)) {
       printf("%d ", car(xs));
      }
      putchar('\n');
    }
    
以上の問題をすべて解いてください。

提出要領


Koji Kagawa (kagawa@eng.?????)