Подтвердить что ты не робот

Требования к языку для развития ИИ

Возможный дубликат:
Почему Lisp используется для AI?

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

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

4b9b3361

Ответ 1

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

Это программирование высокого порядка (он же функции как объекты первого класса), который, как правило, является определяющей характеристикой большинства языков AI http://en.wikipedia.org/wiki/Higher-order_programming, что Я вижу. Эта статья является заглушкой, и в ней отсутствует Prolog http://en.wikipedia.org/wiki/Prolog, которая позволяет предикаты высокого порядка.

Но в основном программирование высокого порядка - это идея, что вы можете передавать функцию, как переменную. Удивительно, что многие языки сценариев имеют функции как объекты первого класса. LISP/Пролог являются заданными как языки ИИ. Но некоторые из них могут быть удивлены. Я видел несколько книг AI для Python. Один из них http://www.nltk.org/book. Также я видел некоторые для Ruby и Perl. Если вы больше узнаете о LISP, вы узнаете, что многие его функции похожи на современные языки сценариев. Однако LISP вышел в 1958 году... так что он действительно опередил свое время.

Существуют библиотеки ИИ для Java. А в Java вы можете сортировать хакерские функции как объекты первого класса с использованием методов на классах, это труднее/менее удобно, чем LISP, но возможно. В C и С++ у вас есть указатели на функции, хотя снова они гораздо более беспокоят, чем LISP.

Как только у вас есть функции как объекты первого класса, вы можете запрограммировать гораздо более общий, чем это возможно. Без функций в качестве объектов первого класса вам может потребоваться построить sum(array), product(array) для выполнения различных операций. Но с функциями в качестве объектов первого класса вы можете вычислить accumulate(array, +) и accumulate(array, *). Вы даже можете сделать accumulate(array, getDataElement, operation). Поскольку AI настолько плохо определен, что гибкость - это большая помощь. Теперь вы можете создать гораздо более общий код, который намного проще расширить способами, которые изначально не были задуманы.

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Edit:

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

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

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

Ответ 5

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

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

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

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

Ответ 7

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

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


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

В разделе "Как делать самые простые вещи самым сложным способом" ) я имею в виду, что изучение и обучение, а также академические цели и методы/методы/методология R & D не совпадают с целями (коммерческого) развития,

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

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

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

Собираемся ли здесь разработать какое-то предложение спецификации?

Ответ 8

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