[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00699]



------------------------- infoseek ML Sponsor --------------------------
┏━┳━┳━┳≪資格の大原 合格Web 税理士講座 ≫━┳━┳━┳━┳━┓
┃大┃原┃税┃理┃士┃講┃座┃!┃合┃格┃者┃の┃84┃%┃が┃受┃講┃
┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛
★パソコンさえあれば自宅で学べるのが合格Web!24時間いつでも何度でも受講
┗ http://www1.ibc.ne.jp/ad/ibc0088.html 
------------------------------------------------------------------------



おひさしぶりです。
鈴木@名古屋です。


25回議事録のフォローになってないフォローです。
問題4.76と4.79は未解決です。

問題 4.71

違いは stream-append,interleave 各々の第2引数が
delayされたものが入ってきているかどうかの差.
つまり,simple-query の場合は apply-rules の中
disjoin の場合は 再帰呼出の disjoin の中
がstream-append, interleave する前に呼び出される.

(assert! (know tom mike))
(assert! (know mary jane))
(assert! (know ichiro taro))

(assert! (rule (endless-loop ?x) (endless-loop ?x)))
(assert! (rule (know ?x ?y) (endless-loop 100)))

上記のようにした場合,元の場合は結果が(一部)印字されるが,
Louisの場合は全く結果が印字されない.

問題 4.72

(assert! (man 1ro))
(assert! (man 2ro))
(assert! (man 3ro))
(assert! (man 4ro))
(assert! (man 5ro))

(assert! (woman 1ko))
(assert! (woman 2ko))
(assert! (woman 3ko))
(assert! (woman 4ko))
(assert! (woman 5ko))

(assert! (rule (man ?x) (endless-loop ?x)))
(assert! (rule (woman ?x) (endless-loop ?x)))
(assert! (rule (endless-loop ?x) (endless-loop ?x)))
(assert! (rule (human ?x)
  (or (man ?x)
      (woman ?x))))

元のプログラム

;;; Query input:
(human ?x)

;;; Query results:
(human 5ro)
(human 5ko)
(human 4ro)
(human 4ko)
(human 3ro)
(human 3ko)
(human 2ro)
(human 2ko)
(human 1ro)

interleave を stream-append にしたプログラム

;;; Query input:
(human ?x)

;;; Query results:
(human 5ro)
(human 4ro)
(human 3ro)
(human 2ro)

まず,assertion の評価が行なわれてから,
(無限ループの) rule の評価が行なわれる.
interleave だと,assertion の評価が
先に行なわれるので結果がより多く出力される.


問題 4.73

いけない flatten-stream

(define (flatten-stream stream)
  (if (stream-null? stream)
      the-empty-stream
      (interleave
       (stream-car stream)
       (flatten-stream (stream-cdr stream)))))

そして interleave の定義(p202)

(define (interleave s1 s2)
  (if (stream-null? s1)
      s2
      (cons-stream
       (stream-car s1)
       (interleave s2 (stream-cdr s1)))))

これを見ればわかるように、
interleave     -> 手続き
cons-stream -> 特殊形式

だから。

問題 4.74

a)

;;元の stream-flatmap
(define (stream-flatmap proc s)
  (flatten-stream (stream-map proc s)))

(define (flatten-stream stream)
  (if (stream-null? stream)
      the-empty-stream
      (interleave-delayed
       (stream-car stream)
       (delay (flatten-stream (stream-cdr stream))))))

;; Alyssa の stream-flatmap
(define (simple-stream-flatmap proc s)
  (simple-flatten (stream-map proc s)))

(define (simple-flatten stream)
  (stream-map
   stream-car
   (stream-filter (lambda (x) (not (stream-null? x)))
		  stream)))

b)
stream-flatmapが使用されている手続きのうち、
simple-stream-flatmap に変更したものには * をつけた.

simple-query
* negate
* lisp-value
* find-assertions
apply-rules

問題にも書かれているとおり、*の関数の戻り値は
the-empty-stream か (singleton-stream frame) のどちらか.
だから、変更を行なっても振舞いは変わらないと思う。

問題 4.75

和田先生が投稿されたものと同じでした。

問題 4.76.

そういえば、p286のfetch-assertionsの定義が気になります。

(define (fetch-assertions pattern frame)
  (if (use-index? pattern)
      (get-indexed-assertions pattern)
      (get-all-assertions)))

frameは全く使われていませんね。
fetch-rulesも然り。



この問題ですが、
lives-nearの場合、

(rule (lives-near ?person-1 ?person-2)
      (and 
       (address ?person-1 (?town . ?rest-1))   ;; (1)
       (address ?person-2 (?town . ?rest-2))   ;; (2)
       (not (same ?person-1 ?person-2))))      ;; (3)

(3)の質問は(1)と(2)のフレームがないと
処理することが出来ないのでこういった場合だけ、
今迄のandを使うようにしなければなりません。

(3)のようなものに対しては
・質問の全部が変数かどうか
・質問が表明であるか
で判断できると思いますが、どういうふうにしたら
いいんでしょうかねえ。

問題 4.77

以下のように conjoin の定義を変更.

(define (conjoin conjuncts frame-stream)
  (if (empty-conjunction? conjuncts)
      frame-stream
      (let ((first (first-conjunct conjuncts))
	    (rest (rest-conjuncts conjuncts)))
	(if (or (eq? (type first) 'not)
		(eq? (type first) 'lisp-value))
	    (qeval first (conjoin rest frame-stream))
	    (conjoin rest (qeval first frame-stream))))))


問題 4.78

とりあえず出来ましたが、ソースコードが長いので省略。
lisp-valueとuniqueの実装は行なっていません。
uniqueを実装するにはamb評価器上の変更も必要になると思うので
結構面倒だと思います。

問題 4.79

未解決

以上です。

鈴木秀直

------------------------------------------------------------------------
       ★今なら登録するだけで現金50万円が当たる!?
  http://research.infoseek.co.jp/research/index.phtml/mail?svx=971122