Схема: удалить элементы из вложенного списка - PullRequest
0 голосов
/ 12 февраля 2011

Учитывая формулу высказывания, я. е. ((a and (b implies c) or (d and (e implies f)))), Мне нужно написать функцию Scheme для удаления связующих элементов, and, implies, or. Возвращение функции содержит все переменные в формуле. Например, (a b c d e f).

Я не уверен, с чего начать, потому что я не уверен, как проникнуть во вложенные списки и удалить и cons определенные переменные и связки.

1 Ответ

1 голос
/ 12 февраля 2011

Я бы запустил что-то вроде следующего:

(define somelist
  (list 'a 'and (list 'b 'implies 'c) 
        'or (list 'd 'and (list 'e 'implies 'f))))

(define (remove-vars xs ys)
  (let ((xs-f (flatten xs)))
    (filter-two xs-f ys)))

(define (filter-two xs ys)
  (foldr (lambda(y acc)
           (filter (lambda(x) (not (eq? x y))) acc))
         xs
         ys))

Тест:

> (remove-vars somelist (list 'and 'or 'implies))
(a b c d e f)
> (remove-vars somelist (list 'and 'or))
(a b implies c d e implies f)

ОБНОВЛЕНИЕ : ОК, @ karategeek6 сообщил, что у него нет flatten и filter в его интерпретаторе Scheme, и я не уверен, что у вас есть, поэтому давайте реализуем их вручную потому что в R ^ 6RS нет filter и flatten:

(define (my-flatten xs)
  (foldr
   (lambda(x acc)
     (if (list? x)
         (append (my-flatten x) acc)
         (cons x acc)))
   (list)
   xs))

(define (my-filter pred xs)
  (let recur ((xs xs)
              (acc (list)))
    (if (empty? xs)
        (reverse acc)
        (if (pred (car xs))
            (recur (cdr xs) (cons (car xs) acc))
            (recur (cdr xs) acc)))))

Измените remove-vars и filter-two соответствующим образом:

(define (remove-vars xs ys)
  (let ((xs-f (my-flatten xs)))
    (filter-two xs-f ys)))

(define (filter-two xs ys)
  (foldr (lambda(y acc)
           (my-filter (lambda(x) (not (eq? x y))) acc))
         xs
         ys))

Вы должны получить тот же вывод, что и в предыдущих версиях описанных выше процедур.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...