我正在学习人工智能课程,我们得到了一个程序来编写。该程序显然很简单,所有其他学生都是用 java 完成的。但是我知道它可以在 LISP 中以更少的工作完成。好。少打字。但是我已经读了一周的 LISP 了,我对它感到惊讶。我决心学习更多,并使用 LISP 做更多的事情,而不仅仅是这门课。我今年 23 岁,正在学习一门 1958 年形成的语言。这有点浪漫。避免像瘟疫一样躲避鼠标垫让我很开心。
他给出的例子告诉了整个程序。他指出他使用递归,而不是 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))
我想如果我能处理好这个,我可能会处理剩下的。也许。我做了一个叫做繁荣的函数,上面的语句就是我所说的繁荣列表。
(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
我在最后打印以进行调试。对列表操作数的更改不反映原始 sexp 的更改(对我来说非常失望)。
告诉我我所拥有的是虚假的,并指导我。