Каковы примеры символического программирования? - PullRequest
4 голосов
/ 21 сентября 2010

Я должен сделать семестр проекта в моем классе символического программирования. Но я не совсем уверен, каким будет хороший / законный проект. Кто-нибудь может привести примеры символического программирования? Просто любые общие идеи, потому что сейчас я склоняюсь к пошаговой файтингу (в основном в стиле jrpg), но я действительно не хочу делать игру.

Ответы [ 3 ]

4 голосов
/ 21 сентября 2010

Книга Питера Норвига «Парадигмы программирования искусственного интеллекта, примеры из практики Common Lisp» полезна в этом контексте.

Книга подробно описывает символическое программирование ИИ на Common Lisp.

Примеры в области компьютерной алгебры, решения математических задач, игры, реализации компилятора и т. Д.

Скоро будет еще одна забавная книга: Страна Лисп Конрада Барского.

Как правило, существует множество возможных применений символического программирования:

  • ответ на естественный язык
  • создание истории на естественном языке
  • планирование в логистике
  • компьютерная алгебра
  • диагностика неисправностей технических систем
  • описание каталогов вещей и соответствия
  • игра в игру
  • сцена с пониманием
  • Конфигурация технических вещей
3 голосов
/ 21 сентября 2010

Простой арифметический интерпретатор в Схема , который принимает список символов в качестве ввода:

(define (symbolic-arith lst)
  (case (car lst)
    ((add) (+ (cadr lst) (caddr lst)))
    ((sub) (- (cadr lst) (caddr lst)))
    ((mult) (* (cadr lst) (caddr lst)))
    ((div) (/ (cadr lst) (caddr lst)))
    (else (error "unknown operator"))))

Тестовый прогон:

> (symbolic-arith '(add 2 43))
=> 45
> (symbolic-arith '(sub 10 43))
=> -33
> (symbolic-arith '(mu 50 43))
unknown operator
> (symbolic-arith '(mult 50 43))
=> 2150

Это показывает основную идею мета-циклических интерпретаторов. Лисп в маленьких кусочках - лучшее место, чтобы узнать о таких переводчиках.

Еще один простой пример, где списки символов используются для реализации хранилища данных значения ключа:

> (define person (list (cons 'name 'mat) (cons 'age 20)))
> person
=> ((name . mat) (age . 20))    
> (assoc 'name person)
=> (name . mat)
> (assoc 'age person)
=> (age . 20)

Если вы новичок в Lisp, Common Lisp: Нежное введение в символические вычисления - хорошее место для начала.

2 голосов
/ 21 сентября 2010

Это не просто попытка украсть репутацию Кена. Я не помню, какова была первоначальная мотивация Маккарти для создания Lisp. Но это, безусловно, подходит для компьютерной алгебры, включая дифференцирование и интеграцию.

Причина, по которой я публикуюсь, заключается в том, что автоматическое дифференцирование используется для обозначения чего-то иного, чем дифференциация символических выражений. Используется для обозначения написания функции, которая вычисляет производную другой функции. Например, для данной программы на Фортране, которая вычисляет f(x), инструмент автоматического дифференцирования напишет функцию на Фортране, которая вычисляет f'(x). Конечно, одна из техник состоит в том, чтобы попытаться преобразовать программу в символьное выражение, затем использовать символьное дифференцирование, а затем снова преобразовать полученное выражение в программу.

Первым из них является хорошее упражнение в символьных вычислениях, хотя оно настолько хорошо проработано, что не может быть хорошим выбором для курсовой работы. Второй - активный фронт исследований, и ОП должен быть осторожен, чтобы не откусить больше, чем он может жевать. Однако даже ограниченная реализация будет интересной и сложной задачей.

...