Насколько параллелен Пролог? - PullRequest
19 голосов
/ 29 июля 2011

Я не могу найти какую-либо информацию об этом онлайн ... Я также новичок в Прологе ...

Мне кажется, что Пролог может быть очень параллельным, возможно, пытаетсямного возможностей одновременно, когда пытаешься соответствовать правилу.Являются ли современные компиляторы / интерпретаторы Prolog по своей природе * параллельными?Какие?Параллелизм включен по умолчанию?Нужно ли мне его как-то включить?

* Меня не интересует многопоточность, просто присущий параллелизм.

Ответы [ 6 ]

12 голосов
/ 30 июля 2011

Являются ли современные компиляторы / интерпретаторы Prolog по своей природе * параллельными? Какие? Параллелизм включен по умолчанию?

Нет. Параллельное логическое программирование было основной целью компьютерной программы 5-го поколения в Японии в 1980-х годах; ожидалось, что варианты Prolog будут «легко» распараллелены на массивно параллельном оборудовании. Усилия в значительной степени провалились, потому что автоматический параллелизм просто не прост. Сегодня компиляторы Prolog, как правило, предлагают вместо этого библиотеки потоков, где программа должна контролировать количество параллелизма вручную.

Чтобы понять, почему распараллеливание Prolog так же сложно, как и любого другого языка, рассмотрим две основные структуры управления, которые предлагает язык: конъюнкция (AND, последовательное выполнение) и дизъюнкция (OR, выбор с возвратом назад). Допустим, у вас есть конструкция AND, такая как

p(X) :- q(X), r(X).

, и вы захотите запустить q(X) и r(X) параллельно. Затем, что произойдет, если q частично объединит X, скажем, связав его с f(Y). r должен знать об этом связывании, поэтому либо вы должны сообщить об этом, либо вы должны дождаться завершения обоих соединений; тогда, возможно, вы потеряли время, если один из них потерпит неудачу, если только вы снова не попросите их связаться для синхронизации. Это дает накладные расходы и трудно получить права. Теперь для ИЛИ:

p(X) :- q(X).
p(X) :- r(X).

Здесь есть конечное число вариантов (Пролог, конечно, допускает бесконечно много вариантов), поэтому вы захотите запустить их оба параллельно. Но тогда, что если кто-то добьется успеха? Другая ветвь вычисления должна быть приостановлена ​​, а ее состояние сохранено . Сколько из этих состояний вы собираетесь сохранить одновременно? Сколько бы ни было процессоров, кажется разумным, но тогда вы должны позаботиться о том, чтобы вычисления не создавали состояния, которые не помещаются в памяти. Это означает, что вам нужно угадать, насколько велико состояние вычислений, что Prolog скрывает от вас, поскольку он абстрагируется от таких деталей реализации, как процессоры и память; это не C.

Другими словами, автоматическое распараллеливание является сложным . Компьютерный проект 5-го поколения позволил обойти некоторые проблемы, разработав языки commit-choice , то есть диалекты прологов без возврата. При этом они резко изменили язык. Следует отметить, что параллельный язык Erlang - это ответвление Prolog, и он тоже отменил отслеживание чего-то, что ближе к функциональному программированию. Для того, чтобы знать, какие части программы могут безопасно выполняться одновременно, требуется руководство пользователя.

12 голосов
/ 29 июля 2011

Теоретически это кажется привлекательным, но есть различные проблемы, которые делают такую ​​реализацию неуместной.

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

  • нереляционные языковые элементы, такие как оператор cut, могут быть осмысленно использованы только тогда, когда вы можете полагаться на такиепорядки выполнения, т. е. они стали бы непригодными для использования в параллельном интерпретаторе, если не было изобретено очень сложное отслеживание зависимостей.

  • все существующие решения для распараллеливания влекут за собой, по крайней мере, некоторые издержки производительности для межпотоковой связи.

  • Пролог обычно используется для высокоуровневых, глубоко рекурсивных задач, таких как обход графов, доказательство теорем и т. Д. Распараллеливание на современных машинах может (в идеале) достичь ускорения n для некоторой постояннойn, но он не может превратить нежизнеспособный метод рекурсивного решения в жизнеспособный, потому что для этого потребуется экспоненциальное ускорение.Напротив, числовые задачи, которые обычно решают программисты на Fortran и C, обычно имеют высокую, но вполне ограниченную стоимость вычислений;стоит распараллелить усилия, чтобы превратить 10-часовую работу в 1-часовую.Напротив, превращение программы, которая может смотреть примерно на 6 шагов вперед, в программу, которая может (в среднем) смотреть на 6,5 шага вперед, просто не столь убедительна.

10 голосов
/ 31 июля 2011

В Прологе есть два понятия параллелизма.Один связан с многопоточностью , другой - с приостановленными целями .Я не уверен, что вы хотите знать.Итак, сначала я немного подробнее расскажу о многопоточности:

Сегодня широко распространенная система Prolog может быть разграничена независимо от того, многопоточная она или нет.В многопоточной системе Prolog вы можете создавать несколько потоков, которые работают одновременно в одной базе знаний.Это создает некоторые проблемы для consult и динамических предикатов, которые решаются этими системами Prolog.

Список многопоточных систем Prolog можно найти здесь:

Операционная система иВеб-функции

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

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

Некоторые существующие уровни даже допускают парадигмы высокоуровневого распараллеливания независимым от системы Prolog способом.Например, в Logtalk есть некоторые конструкции, которые отображаются на различные целевые системы Prolog.

Теперь давайте обратимся к приостановленным целям .Из более старых систем Prolog (начиная с Prolog II , 1982, фактически) мы знаем директивы freeze / 2 или блокирующие директивы.Эти конструкции заставляют цель не расширяться существующими предложениями, а ставить ее в спящий список.Цель может позже проснуться.Поскольку выполнение цели не является немедленным, а только после ее пробуждения, приостановленные цели иногда рассматриваются как одновременные цели, но лучшим понятием для этой формы параллелизма могут быть сопрограммы.

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

Обзор систем Prolog

С наилучшими пожеланиями

3 голосов
/ 29 июля 2011

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

2 голосов
/ 23 декабря 2016

В 80-х / 90-х годах была большая надежда воплотить параллелизм в язык (тем самым сделав его «изначально» параллельным), особенно в контексте проекта пятого поколения.Даже специальные аппаратные конструкции были изучены для реализации «машины параллельного вывода» (PIM) (аналогично специальному оборудованию для машин LISP в лагере «функционального программирования»).Аппаратные усилия были заброшены из-за постоянного улучшения готовых процессоров, а программные усилия были прекращены из-за чрезмерной сложности компилятора, отсутствия спроса на сложные для реализации высокоуровневые функции и вероятного отсутствия отдачи: параллелизм, который выглядит прозрачным иэлегантное использование на уровне языка обычно означает дорогостоящее межпроцессное взаимодействие и блокировку транзакций "под капотом".

Хорошее прочтение об этом:

"Развитие параллельного логического программированияLanguages ​​"

, Evan Tick, March 1994. Появилось в" Журнале логического программирования, специальный выпуск десятой годовщины, 1995 ".Ссылочный файл Postscript завершен, в отличие от PDF, который вы получаете в Elsevier.

Автор говорит:

Существует два основных взгляда на параллельное логическое программирование и его развитие в прошлом.несколько лет [т.е. 1990-94].Большая часть литературы по логическому программированию рассматривает параллельные языки логического программирования как производную или вариант логических программ, т. Е. Главное отличие заключается в широком использовании недетерминированности «не волнует», а не недетерминированности «не знаю».Отсюда и название совершенный выбор или CC языков.Второе мнение состоит в том, что параллельные логические программы являются параллельными, реагирующими программами, мало чем отличающимися от других «традиционных» параллельных языков, таких как «C» с явной передачей сообщений, в том смысле, что процедуры - это процессы, которые обмениваются данными через потоки данных, чтобы постепенно генерировать ответы.Циник мог бы сказать, что у первого взгляда больше академического богатства, тогда как у второго взгляда больше практической ценности связей с общественностью.

Эта статья представляет собой обзор методов реализации параллельных логических языков программирования, и поэтому полное раскрытие обоих этих представлений не особенно актуально.Вместо этого будет достаточно краткого обзора базовой семантики языка и того, как они соотносятся с фундаментальными парадигмами программирования на различных языках в семье.Не будет предпринято никаких попыток охватить многие возможные парадигмы программирования;ни семантических нюансов, ни истории семьи.(...).

Главное, на что я хочу обратить внимание в этой статье, - это то, что языки логического программирования с параллельным развитием развивались с момента их появления, около десяти лет назад, из-за следующего tatonnement :

  • Разработчики систем и разработчики компиляторов могли предоставлять только определенные ограниченные возможности в надежной среде;эффективные реализации.Это заставило рынок принять эти ограниченные языки как, в некотором неформальном смысле, стандарты де-факто.
  • Программисты осознали, что определенные, более выразительные языковые функции не были критически важны для написания приложений, и не требовали ихвключение.

Таким образом, моя позиция в этой статье будет третьей точкой зрения: как изначально богатые языки постепенно потеряли свои «зубы», стали слабее, но более практичными и достигли более высокой производительности.

История развития начинается с Concurrent Prolog (глубокие охранники, атомарное объединение; аннотированные переменные только для чтения для синхронизации) и после серии сокращений (например: GHC (синхронизация сопоставления входов), Parlog (безопасный)), FCP (плоский), Fleng (без охраны), Janus (ограниченная связь), Strand (назначение, а не объединение выходов)) и на данный момент заканчивается PCN (плоские защитные устройства, неатомарная синхронизация сопоставления входов с назначениями иявно определенные изменяемые переменные).Эта и другая терминология будет определяться по мере продвижения статьи.

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

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

ECLiPSe-CLP, язык, "в значительной степени обратно совместимый с Prolog", поддерживает OR-параллелизм, хотя "эта функциональность в настоящее время не поддерживается активно из-за других приоритетов".

[1,2] документ OR- (и AND-) параллелизм в ECLiPSe-CLP.

Однако я пытался заставить его работать некоторое время, используя код из репозитория ECLiPSe-CLP, но я не получил его.

...