シュワルツ(シュウォーツ)変換 (Schwartzian Transform)
コレクションを操作する際に、各要素に変換を行った要素に基づいて操作を行うが、欲しい結果は変換を行った要素のコレクションではなく元の要素のコレクションである場合に利用する。 文字列の配列を大文字・小文字を無視してソートする場合を考える。 # 文字列の配列 ary = ["foo", "Bar", "baz", "HOGE"…続きを読む
コレクションを操作する際に、各要素に変換を行った要素に基づいて操作を行うが、欲しい結果は変換を行った要素のコレクションではなく元の要素のコレクションである場合に利用する。 文字列の配列を大文字・小文字を無視してソートする場合を考える。 # 文字列の配列 ary = ["foo", "Bar", "baz", "HOGE"…続きを読む
問題4.66 (define (accumlation-function-of-sum query frame-stream) (let ((sum 0) ;; アキュムレートの初期値 (query-pattern (cadr query)) ;; 質問パターン (var (car query))) ;; 変数 (stream-for-each (lambda (frame) (let ((val…続きを読む
問題4.65 4.4.1節の wheel 規則 (assert! (rule (wheel ?person) (and (supervisor ?middle-manager ?person) (supervisor ?x ?middle-manager)))) 実行結果 ;;; Query input: (wheel ?who) ;;; Query results: (wheel (Warbuc…続きを読む
問題4.64 ;; 元の outranked-by 規則 (assert! (rule (outranked-by ?staff-person ?boss) (or (supervisor ?staff-person ?boss) (and (supervisor ?staff-person ?middle-maneger) (outranked-by ?middle-maneger ?boss)…続きを読む
問題4.63 Adam の子孫のデータベース (assert! (son Adam Cain)) (assert! (son Cain Enoch)) (assert! (son Enoch Irad)) (assert! (son Irad Mehujael)) (assert! (son Mehujael Methushael)) (assert! (son Methushael Lamech…続きを読む
問題4.62 リストの car が x で、cdr が () の場合 x が最後の要素となる。 任意の x, y, z において、y が最後の要素 z であるならば、(cons x y) の最後の要素は z となる。 (assert! (rule (last-pair (?x . ()) (?x)))) (assert! (rule (last-pair (?x . ?y) ?z) (last-p…続きを読む
問題4.61 最初の規則(rule)だけでは先頭からの2つの要素の隣接関係しか見つけられない。 2番目の規則(rule)によって連続する要素を再帰的に調べていく。 ; 調査対象リストの最初の 1, 2 番目の要素を next-to 関係とする。 (assert! (rule (?x next-to ?y in (?x ?y . ?u)))) ; 調査対象リストの内、2番目の要素以降のリストを調べる…続きを読む
問題4.60 元の lives-near では重複する対が出てくるために結果の組み合わせ数が2倍になる。 (assert! (rule (lives-near ?person-1 ?person-2) (and (address ?person-1 (?town . ?rest-1)) (address ?person-2 (?town . ?rest-2)) (not (same ?person…続きを読む
問題4.59 以下の表明をデータベースに追加する。 (assert! (meeting accounting (Monday 9am))) (assert! (meeting administration (Monday 10am))) (assert! (meeting computer (Wednesday 3pm))) (assert! (meeting administration (Fr…続きを読む
問題4.58 次の規則を定義する。 ある人の部門と、 ある人の supervisor の部門が異なる場合。 ある人は、その部門の big shot (黒幕)である。 (assert! (rule (same ?x ?x))) (assert! (rule (big-shot ?person) (and (job ?person (?section . ?type)) (supervisor ?pe…続きを読む