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

18
задан Community 23 May 2017 в 12:14
поделиться

8 ответов

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

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

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

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

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

И Lambda (теперь находящаяся повсюду) становится способом сэкономить на вводе текста, так что вам не нужно определять каждую функцию. В предыдущем примере вместо того, чтобы делать getDataElement (arrayelement) {return arrayelement.GPA} где-нибудь, вы можете просто сказать накопить (массив, лямбда-элемент: 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, теперь подумайте о своем собственном языке для определения графических интерфейсов). В целом, языки LISP по-прежнему предлагают способы абстракции, которых все еще не догнали основные языки. Конечно, вы можете определить свой собственный компилятор для C и добавить все нужные языковые конструкции, но на самом деле никто этого не делает. В LISP программист может легко сделать это с помощью макросов. Кроме того, LISP скомпилирован и, по мнению экспертов по языкам программирования, более эффективен, чем Perl, Python и Ruby в целом.

Пролог - это, по сути, логический язык, созданный для представления фактов и правил. Что такое экспертные системы, как не собрание правил и фактов. Поскольку в Prolog очень удобно представлять набор правил, существует очевидная синергия с экспертными системами.

Теперь я думаю, что использование LISP / Prolog для каждой проблемы ИИ не является обязательным.Фактически, просто посмотрите на множество библиотек машинного обучения / интеллектуального анализа данных, доступных для Java. Однако когда вы создаете прототип новой системы или экспериментируете, потому что не знаете, что делаете, гораздо проще сделать это с помощью языка сценариев, чем со статически типизированным языком.LISP был одним из первых языков, в котором были все эти функции, которые мы принимаем как должное. По сути, сначала вообще не было конкуренции.

Также в академических кругах, похоже, очень нравятся функциональные языки. Так что не повредит, что LISP работает. Хотя теперь у вас есть ML, Haskell, OCaml и т. Д. На этом фронте (некоторые из этих языков поддерживают несколько парадигм ...).

10
ответ дан 30 November 2019 в 09:11
поделиться

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

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

Редактировать:

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

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

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

1
ответ дан 30 November 2019 в 09:11
поделиться

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

0
ответ дан 30 November 2019 в 09:11
поделиться

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

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

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

2
ответ дан 30 November 2019 в 09:11
поделиться

Что вы подразумеваете под "ИИ"? Эта область настолько широка, что на этот вопрос невозможно ответить. Какие приложения вы рассматриваете?

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

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

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

1
ответ дан 30 November 2019 в 09:11
поделиться

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

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


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

Под («как делать самые простые вещи сложнее всего») я имею в виду, что учеба и обучение, а также академические цели / методы / подходы / методология НИОКР не совпадают с целями (коммерческого) развития.

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

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

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

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

0
ответ дан 30 November 2019 в 09:11
поделиться

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

0
ответ дан 30 November 2019 в 09:11
поделиться

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

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

3
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: