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

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

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

23
Jon Smock 6 Авг 2009 в 17:11

13 ответов

Лучший ответ

А как насчет декларативного программирования? Выдержка из статьи в Википедии (выделено мной):

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

30
Karl Voigtland 6 Авг 2009 в 13:17

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

14
Savvas Dalkitsis 6 Авг 2009 в 14:44

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

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

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

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

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

12
Thomas 5 Май 2012 в 10:11

Эти языки обычно называются языками программирования 5-го поколения. В статье Википедии есть несколько примеров, на которые я ссылаюсь.

5
Ionuț G. Stan 6 Авг 2009 в 13:18

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

4
nightingale2k1 6 Авг 2009 в 13:17

Я бы тоже сказал Objective Caml (OCaml) ...

2
Thomas 5 Май 2012 в 10:12

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

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

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

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

1
Gordon Potter 6 Авг 2009 в 15:35

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

1
David Plumpton 11 Авг 2009 в 02:29

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

0
tinyd 6 Авг 2009 в 13:40

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

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

0
Ray 6 Авг 2009 в 13:46

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

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

0
Jon Smock 7 Авг 2009 в 14:15

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

0
outis 11 Авг 2009 в 02:43

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

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

0
quillbreaker 6 Авг 2009 в 14:13