我正在学习人工智能课程,我们被要求编写一个程序。这个程序很简单,其他学生都用Java完成了。但是我知道可以用LISP完成更少的工作。嗯,打字更少。但是我已经读了一周关于LISP的资料,我对它感到惊讶。我决心学习更多,并将LISP用于不止这门课程。我今年23岁,正在学习一种在1958年形成的语言。这有点浪漫。我很享受避免使用鼠标的乐趣。
他给出的例子包含整个程序。他指出使用了递归,而不是prog。至少我理解了这个意思。
他给出的例子包含整个程序。他指出使用了递归,而不是prog。至少我理解了这个意思。
(rewrite '(or a (and b (not (or c d)))))
--> (OR A (AND B (AND (NOT C) (NOT D))))
(rewrite '(and a (or b (not (and c (and d e))))))
--> (AND A (OR B (NOT C) (OR (NOT D) (NOT E)))))
我理解德摩根定律。但是我不知道该如何处理!我的尝试很失败,笔记本上充满了我试图绘制的页面。以下是我对最简单情况的最接近尝试:
(not (or a b))
我认为如果我能处理这个,我就可以很好地处理其他事情。也许吧。我写了一个叫做“boom”的函数,那个上面的语句是我称之为可“boom”的列表。
(defun boom (sexp)
(let ((op (car (car (cdr sexp))))
(operands (cdr (car (cdr sexp))))))
(if (equal op 'and)
(setcar sexp 'or)
(setcar sexp 'and))
(print operands)
(print sexp))
;end boom
我在调试时在结尾处打印输出。 对列表操作数的更改不反映在原始S表达式中(这让我非常失望)。
请告诉我我的方法是错误的,并指导我正确的做法。