だめな子

だめな子ですが頑張って成長してゆくのです。

Schemeで非決定性探索 深さ優先探索と幅優先探索

MacBook Air買いました!(挨拶

で、LLFutureんとき買ったOn Lispをがんばってしこしこ読んだらマクロのありがたさが少しわかったような
  ↓
でもSchemeってtraditional macroないんだよね... aifもかけやしねぇ
  ↓
syntax-caseで外の環境の変数とか補足できるよ!aifかけるよ!これは勝つる!!
  ↓
...あれ、使い方全然わかんない...←今ここ

それはそれとして、On Lispに乗ってる幅優先探索ってなんか思った通りの動作をしてくれない気がするんだけど...
見つかる解は浅いところのがちゃんと見つかるっぽいんだけど検索順路が深さ優先探索と同じ順序で探索していくのがなんかこー微妙な気持ち
どうすればいいんだ!!

深さ優先探索

SCHEME:
  1. ;;depth first search
  2. (define depth-fail #f)
  3. (define (depth-choose . args)
  4.   (if (null? args)
  5.       (depth-fail)
  6.       (let ((fail0 depth-fail))
  7.     (call/cc
  8.      (lambda (cc)
  9.        (set! depth-fail
  10.          (lambda ()
  11.            (set! depth-fail fail0)
  12.            (cc (apply depth-choose (cdr args)))))
  13.        (cc (car args)))))))
  14.  
  15. (call/cc
  16.  (lambda (cc)
  17.    (set! depth-fail
  18.      (lambda ()
  19.        (cc 'fail)))))

幅優先探索

SCHEME:
  1. ;;width first search
  2. (define width-fail #f)
  3. (define *search-path* '())
  4. (define (width-choose . args)
  5.   (call/cc
  6.    (lambda (cc)
  7.      (set! *search-path*
  8.        (append *search-path*
  9.            (map
  10.             (lambda (arg)
  11.               (lambda () (cc arg)))
  12.             args)))
  13.      (width-fail))))
  14.  
  15. (call/cc
  16.  (lambda (cc)
  17.    (set! width-fail
  18.      (lambda ()
  19.        (if (null? *search-path*)
  20.            (cc 'fail)
  21.            (let ((path (car *search-path*)))
  22.          (set! *search-path* (cdr *search-path*))
  23.          (path)))))))

SCHEME:
  1. ;;sample code
  2. (define choose width-choose)
  3. (define-syntax fail
  4.   (syntax-rules ()
  5.     ((_) (width-fail))))
  6. ;(define choose depth-choose)
  7. ;(define-syntax fail
  8. ;  (syntax-rules ()
  9. ;    ((_) (depth-fail))))
  10.  
  11. (let* ((a (choose 1 2 3 4 5 6))
  12.        (b (choose 1 2 3 4 5 6))
  13.        (c (choose 1 2 3 4 5 6)))
  14.   (if (and (odd? a) (even? b) (odd? c))
  15.       (print a " " b " " c)
  16.       (fail))
  17.   (fail))

途中(define fail depth-fail)とかやっててあれー?動かないなーとかむーむーうなってたのは内緒(しかも結構長時間

RSS 2.0 | Trackback | Comment

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>