Есть ли способ перевести строки таблицы базы данных в факты Пролога? - PullRequest
2 голосов
/ 17 ноября 2011

Проведя некоторое исследование, я был поражен способностью Пролога выражать запросы очень простым способом, почти как словесно говорить машине, что делать. Это произошло потому, что мне стало скучно с Propel и PHP на работе.

Итак, мне интересно, есть ли способ перевести строки таблицы базы данных (например, Postgres) в факты Пролога. Таким образом, я мог бы перестать использовать так много скучных объединений и использовать ORM, и вместо этого написать что-то вроде этого, чтобы получить то, что я хочу:

mantenedora_ies(ID_MANTENEDORA, ID_IES) :- 
  papel_pessoa(ID_PAPEL_MANTENEDORA, ID_MANTENEDORA, 1),
  papel_pessoa(ID_PAPEL_IES, ID_IES, 6),
  relacionamento_pessoa(_, ID_PAPEL_IES, ID_PAPEL_MANTENEDORA, 3).

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

Было бы здорово, если бы что-то подобное можно было сделать в PHP. Кто-нибудь знает что-нибудь подобное?

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

Существует компилятор Draxler Prolog to SQL , который переводит некоторый шаблон (например, соединение, которое вы написали) в более подробные объединения SQL.Вы можете найти в соответствующей статье ( преобразователь пролога в SQL ) дополнительную информацию.

Но учтите, что у Пролога есть и свои недостатки, особенно в отношении агрегатов.Без библиотеки получать суммы, считать и тому подобное не очень легко.И такие библиотеки не так распространены и просты в использовании.

Я думаю, вы могли бы попытаться специализировать интерфейс PHP DB для эквиойнов, используя встроенные функции, которые позволяют сократить текст запроса (когда это приводит кболее читаемый код).Работая в SWI-Prolog / ODBC, где (как и в PHP) вам нужно сочинять SQL, я очень старался работать таким образом, чтобы обрабатывать что-то очень похожее на то, что вы показали в другом посте.

ДругойПодход, который я нашел полезным: я написал парсер для подмножества SQL, используемого интерфейсом резервного копирования MySQL (на самом деле PHPMyAdmin).Поэтому обычно я локально сбрасываю базу данных своей CMS, загружаю ее память, применяю то, что мне нужно, вычисляя и записываю (или применяю) операторы вставки / обновления / удаления, а затем загружаю их.Это может быть сделано из-за ограниченного размера БД, которая помещается в памяти.Я разработал и теперь управляю этой небольшой электронной коммерцией с помощью этого наивного подхода.

Написание Пролога на PHP должно быть не слишком сложным: я бы попытался изменитьсуществующий интерфейс, например, Adminer , который уже предлагает выбор среди основных форматов сериализации.

1 голос
/ 18 ноября 2011

Я могу придумать несколько подходов к этому -

  1. При инициализации вызовите метод, который выполняет выборку, выбирает все данные из таблицы и записывает их в базу данных. Сделайте это для каждого БД. Вам нужно будет объявить форму каждой строки следующим образом: - динамический ies_row / 4 и т. Д.

  2. Вы можете изменить load_files, переопределив user: prolog_load_files. От этого занятия вы могли бы что-то похожее на # 1. Это имеет преимущество в виде вызова load_files. http://www.swi -prolog.org / pldoc / man? Предикат = prolog_load_file% 2F2 ... В этой документации упоминается библиотека (http_load), но я нигде не могу ее найти (меня это недавно интересовало)!

1 голос
/ 17 ноября 2011

проверить интерфейс ODBC swi-prolog (может быть, есть что-то эквивалентное и для других реализаций пролога)

http://www.swi -prolog.org / pldoc / doc_for? Объект = раздел% 280,% 270% 27, SWI% 28% 27 / DOC / пакеты / odbc.html% 27% 29% 29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...