Языки программирования, которые определяют проблему вместо решения? - PullRequest
22 голосов
/ 06 августа 2009

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

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

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

Ответы [ 13 ]

30 голосов
/ 06 августа 2009

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

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

14 голосов
/ 06 августа 2009

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

12 голосов
/ 06 августа 2009

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

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

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

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

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

5 голосов
/ 06 августа 2009

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

4 голосов
/ 06 августа 2009

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

2 голосов
/ 06 августа 2009

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

1 голос
/ 11 августа 2009

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

1 голос
/ 06 августа 2009

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

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

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

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

0 голосов
/ 11 августа 2009

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

0 голосов
/ 07 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...