Пролог и SQL основаны на логике первого порядка, но таблицы SQL представляют собой простые бинарные отношения, тогда как предикаты Пролога являются предложениями Хорна.
Это не какой-то неясный теоретический момент. Бинарные отношения SQL являются констатацией факта в форме:
f (A, B, C ... N)
Где f - имя отношения, а A ... N - его переменные. Прологические бинарные отношения являются следствиями вида:
A <- B, C, D ... N </em>
Где A ... N сами по себе являются клаузлами Рога. Отношения SQL - эффективный способ описания данных. Пролог отношения описывают сложные отношения между данными, которые сами хранятся в виде данных.
Важно понимать, что в Прологе нет разделения между данными и операциями. Факты, правила и запросы пролога - все это клаузлы Рога, поэтому данные - это то, что теряется при переводе в большинстве университетских курсов. Пролог не похож на C, но с фактами вместо переменных и правилами вместо функций. С другой стороны, SQL во многом похож на Prolog без правил или запросов.
SQL-запросы также являются логическими предикатами, но SQL-запросы не хранятся в самой базе данных. Скорее они используются для извлечения наборов данных из базы данных фактов. Вы можете сохранить запрос в виде строки таблицы в базе данных SQL, но не сможете выполнить его в этой форме.
Запросы Пролога хранятся в базе данных, как и любой другой предикат Пролога, потому что они похожи на любой другой предикат Пролога. Запросы - это роговые предложения вида:
<- B, C, D ... N </em>
Так что последствия с прецедентом, но без предшествующего, поэтому всегда ложные. Факты являются клаузлами Рога с предшествующим, но не прецедентным, видом:
A <- </em>
Так всегда и правда. Пролог подтверждает запрос путем опровержения: если он не может найти факт (или правило), подтверждающий его, он сообщит, что цель истинна, поскольку запрос всегда ложен. В этом процессе некоторые переменные связываются, поэтому наборы результатов могут быть сконструированы так же, как SQL это делает с запросами SELECT.
Современные СУБД SQL имеют такие функции, как хранимые процедуры и язык управления потоком, поэтому SQL можно использовать для вывода (не то, что вы хотите сделать вывод в SQL). Prolog поставляется с механизмом вывода, настроенным на его базу данных предложений Хорна, потому что это эффективный способ сделать вывод из баз данных фактов, представленных как бинарные отношения (и нет, не только потому, что это красиво).
Гомо-природа Prolog (данные - это операция - данные) означает, что новые новые данные должны быть добавлены в базу данных, следовательно, в программу, потому что база данных - это программа. Таким образом, каждый раз, когда новый факт добавляется в его базу данных (обычно с использованием assert / 1), вся программа должна быть декомпилирована. Это огромный PITA и делает Prolog неэффективным для хранения больших наборов данных, хотя нет никаких причин, по которым он должен быть неэффективным для данных извлечение , и системы Prolog будут использовать для этой цели те же алгоритмы, что и системы SQL. С другой стороны, SQL хорошо подходит как для хранения, так и для извлечения.
Наконец, у Пролога есть несколько функций, которых у SQL просто нет, а именно: супер-сопоставление с паттернами, называемое объединением, отрицание как сбой, и синтаксические элементы, которые облегчают обработку списка и объявление грамматики (нотация грамматики для определенных разделов). Это просто счастливый случай, и в основном они были добавлены к языку, потому что они были в моде во время его создания (благодаря LISP). SQL получил рекурсивные запросы относительно недавно, поэтому Prolog не может этим похвастаться.
И, конечно, оба языка слабы при вводе / выводе и по математике, хотя, по крайней мере, вы можете сделать некоторую арифметику в Прологе, не вырывая свои волосы все .
Итак, действительно, Prolog и SQL так похожи, как C и Haskell. Они оба основаны на одной и той же корневой абстракции, логике первого порядка (как C и Haskell основаны на алгебре), но после этого все очень быстро меняется. Кроме того, с точки зрения языкового дизайна, SQL имеет тенденцию к расколу со многими различными языковыми функциями (педикаты, запросы, язык манипулирования данными ...). Конструкция Пролога чрезвычайно последовательна, так что весь язык на самом деле представляет собой только предикаты и несколько знаков препинания.
Для меня самое важное отличие заключается в следующем: мне не нравится SQL, но я должен с ним работать. Я люблю Пролог, но я не могу использовать его на работе. Жизнь несправедлива:)