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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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