Ex.2.32

うーん。これは単に難しく考え過ぎじゃないかな。
http://d.hatena.ne.jp/yukichanko/20091011/1255280942

#というかerlang liteを支える立役者が弱者とか軽々しく言っちゃいけませぬっ。

ある集合Aのベキ集合をPとすると、Aにある1要素αを足した集合 A'のベキ集合 P'は
 P' = \{A, [(\alpha,x) | x \leftarrow A ]\}
とかなる、というやつ。

(define (subsets s)
  (if (null? s) (list '())
      (let ((rest (subsets (cdr s))))
	(append rest 
                  (map (lambda (lst) (cons (car s) lst)) ; ... (1)
		      rest)))))

要するに、 P'は Pと、Pに要素 αを追加した集合の和集合。(1)のところはαを追加した集合を作ってて、それと rest = Aをくっつけてる。という仕組みっす。
でも実は最初自分で考えてみた時は非情にバカな事を考えていて、こんなにエレガントじゃなかった・・・

(define (dame-subset s) 
  (if (null? s) 'end
       (list (cons (car s) (dame-subset (cdr s)))
	      (dame-subset (cdr s)))))

として2分treeをこさえておいてからトラバースして行って endが出るたびにfinalなリストに足していくという方法。ダサイ過ぎorz
imperativeは面倒なのでカット。