Может ли AND / OR использовать рекурсивную функцию, чтобы получить значение и использовать его в Common Lisp? - PullRequest
0 голосов
/ 16 марта 2012

Я застрял на этом некоторое время.Я пытался, и я не получаю это.Я думал, что получаю, но тот факт, что это не работает, сбивает с толку.Я должен получить 1, но продолжать получать ноль.Цель состоит в том, чтобы упростить выражение, используя правила (которые я добавил ниже).Моя проблема:

(defun simplify (main-list)
  (setq count 1)

  (if (and (eq t (atom (car (cdr main-list))))
           (eq t (atom (car (cdr (cdr main-list))))))
      (print "this says that the 2 ands are cons cells"))

  (if (and (eq nil (cdr main-list))
           (eq t (atom (car main-list))))
      (print "reached end of file, going back now"))

  (if (eq 'and (car main-list))
      (progn
        (if (and (eq t (atom (car (cdr main-list))))
                 (eq nil (atom (car (cdr (cdr main-list))))))
            (if (or (eq nil (car (cdr main-list)))
                    (simplify (car (cdr (cdr main-list)))))
                nil
                (if (eq 1 (car (cdr main-list)))
                    (simplify (car (cdr (cdr main-list))))
                    (if (eq 1 (simplify (car (cdr (cdr main-list)))))))))

        (if (and (eq t (atom (car (cdr main-list))))
                 (eq t (atom (car (cdr (cdr main-list))))))
            (if (or (eq nil (car (cdr main-list)))
                    (eq nil (car (cdr (cdr main-list)))))
                nil
                (if (eq 1 (car (cdr main-list)))
                    (car (cdr (cdr main-list)))
                    (if (eq 1 (car (cdr (cdr main-list))))
                        (car (cdr main-list)))))))))

Список, который я использую:

(and 1 (and 1 1))

Это простая версия того, что я пытаюсь выполнить, но я решаю это шаг за шагом.время, так как я совершенно новый для языка.Вот правила для И, которому я должен следовать для этой Домашней работы:

(and x nil) => nil; 
(and nil x) => nil;
(and x 1) => x; 
(and 1 x) => x;

Я проверил это, выполнив

(simplify (car(cdr(cdr x))))

, и я добавил подсчеты, чтобы увидеть, является ли его циклическое, но это не так.Так что я думаю, что это как-то связано с рекурсивными вызовами функций, которые находятся внутри операторов if в первом блоке кода.Любые объяснения того, почему это будет с благодарностью.

1 Ответ

0 голосов
/ 21 марта 2012
(defun simplify (expression)
  (if (consp expression)
      (destructuring-bind (op arg1 arg2)
          expression
        (ecase op
          (and (cond ((or (null arg1) (null arg2))
                      nil)
                     ((eql 1 arg1)
                      (simplify arg2))
                     ((eql 1 arg2)
                      (simplify arg1))))))
    expression))
...