Я нахожусь в курсе искусственного интеллекта, и нам была дана программа для написания. Программа, по-видимому, проста, и все остальные ученики сделали это в java. Однако я знаю, что это можно сделать в LISP с меньшим количеством работы. Что ж. Меньше печатать. Но я читал о LISP уже неделю, и я поражен этим. Я полна решимости узнать больше и использовать LISP намного больше, чем просто этот класс. Мне 23 года, и я изучаю язык, образованный в 1958 году. Это романтично. Я получаю много удовольствия, избегая моей мыши, как чума.Emacs LISP - DeMorgan'ify a list
Пример, который он дает, рассказывает всю программу. Он отмечает, что он использует рекурсию, а не прог. Я понимаю, что это значит, по крайней мере.
(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 (огромная подставка для меня).
Скажите мне, что у меня есть подделка, и направляйте меня.
Вы говорите «DeMorgan-ify»; это точка только для распределения «не» над внутренним «или» или «и»? –
Основываясь на его выходе, это то, что кажется. Например, «и» и «или» могут просто быть «foo» и «bar». Логика, похоже, не играет никакой роли. – kaleoh
Работа с искусственным интеллектом заставляет меня думать об использовании предикатов, я имею в виду, что ваша программа должна сначала изучить некоторые знания (например, как интерпретировать разные операторы в соответствии с законами ДеМоргана), а затем она может оценить все ваше выражение, используя его базу знаний (т.е. привязка предикатов на лету) - см. пример предикатов ниже – floppy12