Ответ в теме: Отличия базы данных SQL от Prolog

#2173

SQL — язык запросов к базе данных, как и Prolog, он является декларативным. SQL-базы данных, как и любая другая база данных позволяет хранить данные и осуществлять доступ к ним, это определяет наличие схожих черт между ними. И SQL и Prolog являются полными по Тьюрингу языками программирования, т.е. на них теоретически может быть решена любая задача. На прологе могут быть выражены реляционные зависимости, которые лежат в основе реляционных СУБД, к которым относятся SQL-базы.

При таком сравнении наверное можно рассматривать факты Prolog — как данные базы данных, представление (вид, view) SQL-базы — как правила Prolog. Отношение (relation) базы данных SQL, очень грубо понимаемое как таблица может быть представлено в Prolog в виде кортежей. Но мне эти «сходства и аналогии», кажутся притянутыми за уши.

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

Ключевое различие в самой модели вычислений, т.к. данные — это все-таки не факты. В теории БД по Кодду порядок данных в базе не имеет значения, программист не должен рассчитывать на какой-то определенный порядок выборки данных из базы. Факты пролога обрабатываются в определенном порядке, вы можете управлять положением добавляемых данных — функция asserta выполняет вставку в начало, а assertz — в конец.

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

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

В целом, такое сравнение не совсем корректно, т.к. в Prolog может использоваться внешняя БД, основанная на цепочках (chains). Такая база имеет гораздо больше общего с традиционными БД. Кроме того, имеется замечательный Datalog, который нередко описывается в книжках по базам данных недалеко от SQL, но он имеет очень много общего с языком Prolog.

С другой стороны, я разрабатываю небольшой проект на Prolog и активно пользуюсь внутренней базой данных (только для хранения фактов), при этом мне было очень удобно реализовать специальные функции для вставки и удаления в базу, которые выполняют что-то типа контроля целостности, т.е. возможно эмулировать нечто похожее на привычные всем БД на Prolog. В моем проекте это было очень удобно, но я не уверен что это также эффективно, как и SQL для хранения большого количества данных — у меня данных не может быть много, иначе я бы был вынужден использовать Chains-DB.