Я застрял на этом некоторое время. я пробовал и у меня не получается. Я думал, что понял, но тот факт, что это не работает, сбивает с толку. Я должен получить 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, которым я должен следовать в этом домашнем задании:
(and x nil) => nil;
(and nil x) => nil;
(and x 1) => x;
(and 1 x) => x;
Я проверил это, выполнив
(simplify (car(cdr(cdr x))))
и я добавил счетчики, чтобы увидеть, зацикливается ли он, но это не так. Так что я предполагаю, что это как-то связано с рекурсивными вызовами функций, которые находятся внутри операторов if в первом блоке кода. Любые объяснения относительно того, почему будут очень признательны.