2010-08-19 3 views
16

Можно создать дубликат:
Why is Lisp used for AI?Языковые требования для развития ИИ

Что делает язык, подходящий для разработки искусственного интеллекта?

Я слышал, что LISP и Prolog широко используются в этой области. Какие функции делают их пригодными для ИИ?

+3

У этого вопроса есть несколько отличных ответов: http://stackoverflow.com/questions/130475/why-is-lisp-used-for-ai – Isaac

+0

Из числа избранных (один из которых мой) вы могли бы сказать многие разработчики задаются вопросом об отношениях. Тем не менее, ответ может быть нелегким, и это может не произойти быстро. Я настоятельно рекомендую вам быстро не закрывать вопрос. Вот несколько советов о том, как привлечь внимание к вашему вопросу: [http://meta.stackexchange.com/questions/7046/how-to-get-attention-for-your-old-unanswered-questions]. Я уверен, что если вы дадите ему достаточно времени, здесь появятся отличные ответы. –

ответ

8

В целом я бы сказал, что главное, что я вижу в языках, «предпочитаемых» для ИИ, заключается в том, что они имеют программирование высокого порядка и множество инструментов для абстракции.

Это программирование высокого порядка (он же функции как объекты первого класса), который, как правило, является определяющей характеристикой большинства языков 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 и т. Д. На этом фронте (некоторые из этих языков поддерживают несколько парадигм ...).

+1

+1, один nitpick: в C++ вы обычно используете объекты функций (т. Е. Объекты классов, которые перегружают 'operator()'), а не указатели на функции для эмуляции функций первого класса. – missingfaktor

0

Насколько я знаю из LISP это Functional Programming Язык, и с его помощью вы можете создавать программы, которые создают программы. Я не знаю, соответствует ли мой ответ вашим потребностям, см. Выше ссылки для получения дополнительной информации .

0

Языки сам по себе (без библиотек) пригодны/удобных для конкретных областей исследований/исследования и/или обучения/изучения («как сделать простейшие вещи в тяжелейший пути»).
пригодны для коммерческого развития определяется наличием фреймворков, библиотек, средств разработки, сообществ разработчиков, принятия компаниями. Например, в Интернете вы найдете поддержку любой, даже самой экзотической проблемы/областей (включая, конечно, области AI), например, на C#, потому что это мейнстрим.

Кстати, что конкретно представляет собой контекст вопроса? AI - такой широкий термин.


Update:
Oooops, я действительно не ожидал, чтобы привлечь внимание и обсуждение на мой ответ.

В разделе «Как сделать простейшие вещи самым сложным способом») я имею в виду, что учеба и учеба, а также академические цели, методы/подходы/методология D не совпадают с целями (коммерческих) развитие.

В студенческих (или даже академических) проектах можно написать тонны кода, которые, вероятно, потребуют одну строку кода в коммерческом RAD (с использованием компонента/службы/функции структуры или библиотеки).

Потому что ..! ооо! Потому что нет смысла запутывать/развивать любую дискуссию без предварительного согласования общих определений терминов ... которые субъективны и зависят от контекста ... и не так легко сформулировать в общем/абстрактном контексте. И это междисциплинарный вопрос целых областей разных наук

Вопрос широкий (философский) и уклончиво сформулированный ... без начала и конца ... без окончательных ответов без контекста и определений ...

Готовы ли мы разработать здесь специальное предложение?

+0

Что вы подразумеваете под «как сделать самые простые вещи самым трудным способом»? – Ken

1

Функциональные языки программирования легче распараллеливать из-за их безгражданности. Там, похоже, уже есть тема об этом с некоторыми хорошими ответами: Advantages of stateless programming?

Как сказано, как правило, проще создавать программы, которые генерируют программы в LISP из-за простоты языка, но это относится только к определенным областей ИИ, таких как эволюционные вычисления.

Edit:

Хорошо, я попытаюсь объяснить немного о том, почему параллелизм важно AI с использованием символьной AI в качестве примера, как его, вероятно области искусственного интеллекта, который я понимаю лучше. В основном это то, что все использовали в тот же день, когда был изобретен LISP, а гипотеза физического символа, на которой она основана, более или менее одинакова, как вы планируете вычислять и моделировать материал в коде LISP. Эта ссылка немного объясняет это: http://www.cs.st-andrews.ac.uk/~mkw/IC_Group/What_is_Symbolic_AI_full.html

Итак, идея состоит в том, что вы создаете модель своей среды, а затем просматриваете ее, чтобы найти решение. Один из простейших алгоритмов для реализации - это первый поиск по ширине, который является исчерпывающим поиском всех возможных состояний. При создании оптимального результата он обычно не требует много времени. Один из способов его оптимизации - использовать эвристику (пример A *), другой - разделить работу между ЦП.

Из-за безгражданства теоретически любой узел, который вы расширяете в своем поиске, может выполняться в отдельном потоке без сложностей или служебных обязанностей, связанных с блокировкой общих данных. В общем, если предположить, что аппаратное обеспечение может его поддерживать, то чем выше вы можете выполнить параллелизацию задачи, тем быстрее вы получите результат. Примером этого может быть проект folding @ home, который распределяет работу по многим графическим процессорам, чтобы найти оптимальные конфигурации сгибания белка (что может не иметь ничего общего с LISP, но имеет отношение к параллелизму).

+0

Вам нужно объяснить, почему параллелизм важен для ИИ в частности. –

+0

Только что обновил мое сообщение. Надеюсь, это объясняет ситуацию немного лучше. Приветствия. –

+0

Эти функциональные программы без гражданства легко разлагаются, это миф. Это, может быть, «легче», чем что-то еще, но в целом вообще не решает проблемы. –

3

Главной визитной карточкой Лиспа и Пролога в этом конкретном поле является то, что они поддерживают метапрограммирующие концепции, такие как лямбды. Причина, по которой это важно, заключается в том, что она помогает, когда вы хотите перевернуть свой собственный язык программирования на языке программирования, как правило, вы захотите сделать для написания правил экспертной системы.

Чтобы сделать это на языке более высокого уровня, таком как C, обычно лучше всего создать отдельную компилятор или языковую библиотеку для вашего нового (экспертного системного правила), чтобы вы могли писать свои правила в новом язык и ваши действия в C. Это принцип, стоящий за такими вещами, как CLIPS.

1

Что вы подразумеваете под "AI"? Поле настолько широкое, что делает этот вопрос неопровержимым. На каких приложениях вы смотрите?

LISP использовался, потому что он был лучше, чем FORTRAN. Пролог тоже использовался, но об этом никто не помнит. Это было тогда, когда люди полагали, что подход, основанный на символах, - это путь, прежде чем понять, насколько жесткими являются уровни восприятия и выражения.

Но современные «ИИ» (машинное зрение, планировщики, ад, неподготовленная способность Google знать, что вы «значили») выполняются на более эффективных языках программирования, которые более устойчивы для разработки большой команды. Это обычно означает C++ в эти дни - но это не похоже на то, что кто-то думает о C++ как о хорошем языке для ИИ.

Черт, вы можете сделать много того, что было названо «AI» в 70-х годах в MATLAB. До сих пор никто не называл MATLAB «хорошим языком для ИИ», не так ли?

+0

Для меня в прошлом году Google обнаружил сверхъестественную способность сказать «Вы имели в виду {совершенно несвязанный термин}?». – Ken

+0

@ Ken, как и большинство обучающих систем, вероятно, найдена корреляция, которая не соответствует вашим ожиданиям. Это не означает, что корреляции не существует - просто это бессмысленно с вашей точки зрения. Как то, как Cyc когда-то предполагал, что все люди были знамениты, потому что они только заполняли его информацией о знаменитых людях. –

+0

Alex: Корреляция часто является «гораздо более распространенным словом, которое написано аналогичным образом». Google, похоже, полагает, что я ужасный (средний?) Speller/машинист.Я, конечно, считаю, что существует сильная корреляция, но это не значит, что я считаю, что соотношение вообще полезно. К сожалению, Google, похоже, не имеет возможности узнать, что я никогда не принимаю его «опечатки», и что я, как правило, говорю точно, что я имею в виду. – Ken

0

Конструкции, соответствующие шаблону с инстанцированием (или возможность легко создавать код соответствия шаблону), являются большим плюсом. Совпадение шаблонов не является абсолютно необходимым для выполнения A.I., но он может, несомненно, упростить код для многих A.I. задания. Я нахожу это также делает F # удобным языком для A.I.

+0

Почему шаблон соответствует преимуществу для ИИ в частности? Возможно, это преимущество для всех программ, и в этом случае ваш совет действительно «использует самый мощный язык для AI». –

+0

Я согласен, что сопоставление образцов - очень мощная языковая функция в целом, а не только для ИИ. Но для символического ИИ, в частности, который часто связан с частичной инстанцированием, обработкой списков и т. Д., Я думаю, что сопоставление образцов может действительно упростить исходный код. Согласование шаблонов может сделать конструкции символов очевидными в самом коде, то есть код может быть похож на проблему. Для более числовых типов ИИ (например, нейронных сетей) сопоставление образцов является хорошим, но просто в общем. – TechNeilogy

2

Две основные вещи, которые вы хотите, - это возможность делать экспериментальное программирование и возможность делать нетрадиционное программирование.

Когда вы делаете ИИ, вы по определению не знаете, что делаете.(Если бы вы это сделали, это не было бы AI, не так ли?) Это означает, что вам нужен язык, на котором вы можете быстро попробовать и изменить их. Я лично не нашел языка, который мне больше нравится Common Lisp.

Аналогичным образом, вы делаете что-то не совсем обычное. Пролог уже является нетрадиционным языком, и у Lisp есть макросы, которые могут сильно трансформировать язык.

Смежные вопросы