Являются ли современные компиляторы / интерпретаторы 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, и он тоже отменил отслеживание чего-то, что ближе к функциональному программированию. Для того, чтобы знать, какие части программы могут безопасно выполняться одновременно, требуется руководство пользователя.