В целом я бы сказал, что главное, что я вижу в языках, «предпочитаемых» для ИИ, заключается в том, что они имеют программирование высокого порядка и множество инструментов для абстракции.
Это программирование высокого порядка (он же функции как объекты первого класса), который, как правило, является определяющей характеристикой большинства языков AI http://en.wikipedia.org/wiki/Higher-order_programming, которые я вижу. Эта статья является заглушкой, и она оставляет вне Prolog http://en.wikipedia.org/wiki/Prolog, что позволяет «предикаты» высокого порядка.
Но в основном программирование высокого порядка - это идея о том, что вы можете передавать функцию как переменную. Удивительно, что многие языки сценариев имеют функции как объекты первого класса. LISP/Prolog являются языками AI. Но некоторые из них могут быть удивлены. Я видел несколько книг AI для Python. Один из них - http://www.nltk.org/book. Также я видел некоторые для Ruby и Perl. Если вы больше узнаете о LISP, вы узнаете, что многие его функции похожи на современные языки сценариев. Однако LISP вышел в 1958 году ... так что он действительно опередил свое время.
Существуют библиотеки ИИ для Java. И в Java вы можете сортировать функции взлома как объекты первого класса с использованием методов в классах, это сложнее/менее удобно, чем LISP, но возможно. В C и C++ у вас есть указатели на функции, хотя снова они гораздо более беспокоят, чем LISP.
Как только у вас есть функции в качестве объектов первого класса, вы можете программировать гораздо более общее, чем это возможно. Без функций в качестве объектов первого класса вам может потребоваться построить sum(array)
, product(array)
для выполнения различных операций. Но с функциями как объекты первого класса вы можете вычислить accumulate(array, +)
и accumulate(array, *)
. Вы могли бы даже сделать accumulate(array, getDataElement, operation)
. Поскольку AI настолько плохо определен, что гибкость - это большая помощь. Теперь вы можете создать гораздо более общий код, который намного проще расширить способами, которые изначально не были задуманы.
И Лямбда (теперь находящаяся повсюду) становится способом сохранения ввода, так что вам не нужно определять каждую функцию. В предыдущем примере вместо того, чтобы делать getDataElement(arrayelement) { return arrayelement.GPA }
, вы можете просто сказать accumulate(array, lambda element: return element.GPA, +)
. Таким образом, вам не нужно загрязнять пространство имен с помощью множества функций, которые вызывается только один или два раза.
Если вы вернетесь в прошлое до 1958 года, в основном вашими выборами были LISP, Fortran или Assembly. По сравнению с Fortran LISP был гораздо более гибким (к сожалению, менее эффективным) и предлагал гораздо лучшие средства абстракции. В дополнение к функциям как объекты первого класса, он также имел динамическую типизацию, сборку мусора и т. Д. (Например, любой язык сценариев). Теперь есть больше вариантов использования в качестве языка, хотя LISP выиграл от того, чтобы быть первым и стать языком, который каждый из них использовал для ИИ. Теперь посмотрим на Ruby/Python/Perl/JavaScript/Java/C#/и даже самый последний предлагаемый стандарт для C, вы начинаете видеть функции от прошивки LISP (map/reduce, lambdas, сбор мусора и т. Д.). LISP опередила свое время в 1950-х годах.
Даже сейчас LISP по-прежнему поддерживает несколько тузов в отверстии на большинстве соревнований. Макросистемы в LISP действительно продвинуты. В C вы можете расширить язык с помощью вызовов библиотеки или простых макросов (в основном, для замены текста). В LISP вы можете определить новые языковые элементы (подумайте о своей собственной инструкции if, теперь подумайте о своем собственном языке для определения GUI).В целом языки LISP по-прежнему предлагают способы абстракции, которые не распространяются на основные языки. Конечно, вы можете определить свой собственный компилятор для C и добавить все нужные вам конструкции языка, но никто этого не делает. В LISP программист может легко справиться с помощью макросов. Кроме того, LISP скомпилирован и для перестрелки на языке программирования, он более эффективен, чем Perl, Python и Ruby в целом.
Пролог в основном является логическим языком, предназначенным для представления фактов и правил. Что такое экспертные системы, но коллекции правил и фактов. Поскольку в Prolog очень удобно представлять кучу правил, существует очевидная синергия с экспертными системами.
Теперь я думаю, что использование LISP/Prolog для каждой проблемы с ИИ не является данным. На самом деле просто посмотрите на множество библиотек машинного обучения/интеллектуального анализа данных, доступных для Java. Однако, когда вы прототипируете новую систему или экспериментируете, потому что вы не знаете, что делаете, проще сделать это с помощью языка сценариев, чем статически типизированный. LISP был самым ранним языком, чтобы иметь все эти функции, которые мы считаем само собой разумеющимися. Поначалу вообще не было конкуренции.
Также в целом академические круги, похоже, очень любят функциональные языки. Поэтому не больно, что LISP является функциональным. Хотя теперь у вас есть ML, Haskell, OCaml и т. Д. На этом фронте (некоторые из этих языков поддерживают несколько парадигм ...).
У этого вопроса есть несколько отличных ответов: http://stackoverflow.com/questions/130475/why-is-lisp-used-for-ai – Isaac
Из числа избранных (один из которых мой) вы могли бы сказать многие разработчики задаются вопросом об отношениях. Тем не менее, ответ может быть нелегким, и это может не произойти быстро. Я настоятельно рекомендую вам быстро не закрывать вопрос. Вот несколько советов о том, как привлечь внимание к вашему вопросу: [http://meta.stackexchange.com/questions/7046/how-to-get-attention-for-your-old-unanswered-questions]. Я уверен, что если вы дадите ему достаточно времени, здесь появятся отличные ответы. –