2009-08-06 2 views
21

Существуют ли языки программирования, предназначенные для определения решения данной проблемы вместо определения инструкций по ее решению? Таким образом, можно определить, как должно выглядеть решение или конечный результат, и интерпретатор языка определит, как достичь этого результата. Глядя на list of programming languages, я не уверен, как начать изучать это.Языки программирования, которые определяют проблему вместо решения?

Лучшие примеры, которые я могу сейчас представить, чтобы помочь проиллюстрировать то, что я пытаюсь спросить, - это SQL и MapReduce, хотя это оба типа мини-языков, предназначенных для извлечения данных. Но при написании операторов SQL или MapReduce вы определяете конечный результат, и БД решает наилучший курс действий для достижения конечного набора результатов.

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

+0

Возблагодарите мой вопрос, пожелайте мне ответа! –

+0

Звучит как другая идея при переносе проблемы ко мне, так же, как и в спецификации языка. Если вы создаете что-то вроде этого, вы либо теряете много энергии (SQL и MapReduce являются узкоспециализированными и бесполезными для вещей общего назначения), или вы просто создаете что-то сложное, как то, что вы пытаетесь заменить. – workmad3

+0

@ workmad3: Полностью согласен, что эти типы языков будут либо специализированными, либо слишком смехотворными и излишне сложными для практического использования. Тем не менее, похоже, что для таких языков есть ниши, и мы не узнаем, насколько они жизнеспособны, пока мы не попробуем, верно? –

ответ

30

Что относительно Declarative Programming? Выдержка из статьи википедии (курсив):

В информатике декларативного программирования это парадигма программирования , что выражает логику вычисления без описания его потока управления. Многие языки , применяющие эту попытку стиля для минимизировать или устранить побочные эффекты, описания того, что программа должна выполнить, а не описывают, как идти о выполнении его.Этот отличается от программирования , который требует явно заданного алгоритма .

+0

А, это тот термин, в котором мне нужен ха-ха. Я ненавижу, когда вы даже не знаете, что нужно искать/спрашивать. Также «декларативное программирование стало особенно интересным в последнее время, поскольку оно может значительно упростить создание параллельных программ» - похоже, что я не одинок! –

+0

+1 - Именно то, что я собирался предложить – Draemon

14

Ближе всего вы можете добраться до чего-то подобного с логическим языком, таким как Prolog. На этих языках вы моделируете логику проблемы, но опять же это не волшебство.

+1

Да, трудно представить, что это будет/может выглядеть практически, из-за волшебного фактора. Сколько магии слишком много? Однако Пролог выглядит как отличный пример. –

+0

Это именно тот пример, о котором я подумал, когда прочитал вопрос. После использования Пролога какое-то время вы также понимаете, почему эта парадигма эмулируется так редко. – Beska

12

Это звучит как описание декларативного языка (в частности, язык логического программирования), наиболее известным примером которого является Prolog. Я даже не знаю, является ли Prolog параллелизуемым.

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

Если вы можете определить свою проблему с точки зрения логической формулы, вы можете на нее набросить SAT-решатель, но обратите внимание, что проблема 3SAT (назначение переменных Boolean для трех переменных) NP-complete, младший брат порядка-логики, проблема квантифицированной булевой формулы (которая использует квантор существования, а также квантор универсальности), является PSPACE-полной.

Есть несколько очень хороших теоретических теоретиков, написанных на OCaml и других языках FP; here - это целая куча.

И, конечно, всегда существует линейное программирование с помощью симплекс-метода.

+1

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

+0

Awesome. Я использовал его только на однопроцессорных машинах, и даже это не очень. Спасибо за данные! –

3

Позвольте мне ответить ... может быть Prolog может ответить на ваши потребности.

4

Эти языки обычно называются 5th generation programming languages. Есть несколько примеров в записи Wikipedia, с которой я связан.

+0

Насколько распространен «общ», когда я никогда не слышал о языках программирования, классифицированных в этом значении «поколение»? – erjiang

0

Существуют различные механизмы правил на основе Java, которые разрешают декларативное программирование - Drools - это тот, с которым я играл, и это кажется довольно интересным.

0

Много языков определяют больше проблем, чем решений (не принимайте это всерьез).

На серьезной ноте: еще один голос за Пролог и различные виды DSL, предназначенные для декларативного.

0

Я помню что-то читал о вычислении, используя ДНК, когда был в колледже. Вы бы поставили сегменты ДНК в решение, представляющее сегменты проблемы, и определите его таким образом, чтобы, если ДНК подходит друг к другу, это правильное решение. Затем вы позволяете свойствам химических веществ решить проблему для вас и искать готовые нити, которые представляют собой решение. Это похоже на то, о чем вы говорите.

Я не помню, было ли это теоретическим или было сделано.

+0

Если вы можете найти его, это было бы невероятно интересно прочитать. –

+0

Сотрясаясь, я думаю, что, возможно, я был повешен до этой лекции. Я не могу найти ссылки на использование реальной ДНК для расчета. – quillbreaker

+0

Ищите «биологические вычисления» или «биокомпьютеры». http://news.nationalgeographic.com/news/2003/02/0224_030224_DNAcomputer.html http://en.wikipedia.org/wiki/Biocomputers – outis

1

Это может показаться легкомысленным, но в некотором смысле это то, что такое stackoverflow. Вы объявляете проблему и/или предполагаемый результат, и сообщество предоставляет решение, обычно в коде.

Кажется очень трудно моделировать динамические открытые системы вплоть до конечного числа решений. Я думаю, что есть причина, по которой большинство языков программирования являются обязательными. Не говоря уже о массивных проблемах P = NP, скрывающихся в темноте, которые затрудняли бы создание такой системы.

Хотя было бы интересно, если бы существовала формальная структура, которая могла бы использовать человеческий вклад, чтобы «хруст числа» и обеспечить решение, возможно, обязательное генерирование кода. Интернет и поисковые системы Google являются своего рода инструментом, но очень примитивны.

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

0

LINQ также может считаться еще одним декларативным DSL (утверждая, что он слишком похож на SQL). Опять же, вы заявляете, как выглядит ваше решение, и LINQ решает, как его найти.

Красота этих языков заключается в том, что вокруг них могут возникать проекты, такие как PLINQ (который я только что нашел). Check out this video with the PLINQ developers (прямая ссылка WMV) о том, как они распараллеливают поиск решений без изменения языка LINQ (много).

1

Lisp. Существует так много систем Лиспа, которые определены в терминах правил, а не императивных команд. Google ahoy ...

0

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

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