Comment detail

与えた条件を満たす候補 (Nested Flatten)
Schemeの解答がなかったので投稿
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
(use srfi-1)
(use util.match)
(use util.combinations)

(define (solve expr)
  (define (op-apply expr stack)
    (match expr
     (()
      (car stack))
     (('not rest ...)
      (op-apply rest (cons (not (car stack)) (cdr stack))))
     ((op 'not rest ...)
      (op-apply (cons op rest) (list* (car stack) (not (cadr stack)) (cddr stack))))
     (('and rest ...)
      (op-apply rest (cons (and (car stack) (cadr stack)) (cddr stack))))
     (('or rest ...)
      (op-apply rest (cons (or (car stack) (cadr stack)) (cddr stack))))))
  (filter (cut op-apply expr <>) (cartesian-product (make-list 4 '(#t #f)))))
すみません、使い方を書き忘れましたが、こんな感じで使います
gosh> (print (solve '(and or not and)))
((#t #t #t #t) (#t #t #f #t) (#t #f #f #t) (#f #t #f #t) (#f #f #f #t))
手抜きをしてパラメータ(x1, x2, x3, x4)の個数が4個限定だったのを修正しました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
(use srfi-1)
(use util.match)
(use util.combinations)

(define (solve expr)
  (define (op-apply expr stack)
    (match expr
     (()
      (car stack))
     (('not rest ...)
      (op-apply rest (cons (not (car stack)) (cdr stack))))
     ((op 'not rest ...)
      (op-apply (cons op rest) (list* (car stack) (not (cadr stack)) (cddr stack))))
     (('and rest ...)
      (op-apply rest (cons (and (car stack) (cadr stack)) (cddr stack))))
     (('or rest ...)
      (op-apply rest (cons (or (car stack) (cadr stack)) (cddr stack))))))
  (filter (cut op-apply expr <>)
          (cartesian-product (make-list
                              (+ (length (filter (cut memq <> '(and or)) expr)) 1)
                              '(#t #f)))))

Index

Feed

Other

Link

Pathtraq

loading...