Достаточно ли односторонней унификации для журнала данных?

#prolog #unification #datalog

#prolog #унификация #журнал данных

Вопрос:

Datalog легко идентифицируется с подмножеством Prolog, которое не использует символы функций, а только константы и переменные. Но чистый журнал данных, который не использует отрицание, имеет дополнительное ограничение (*):

  1. Каждый факт обоснован.
  2. Каждая переменная в заголовке правила также встречается в теле правила.

Можем ли мы заключить, что односторонней унификации достаточно для ответа на запросы иерархического журнала данных? Или есть примеры, наглядные в SWI-Prolog 8.3.19, который имеет (=>)/2 для одностороннего

unfication, которые являются чистым журналом данных, но не выполняются с односторонним объединением?

(*)
Что вы всегда хотели знать о Datalog
Ceri и др. — 1989
https://www.researchgate.net/publication/3296132

Ответ №1:

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

 p(a).

?- p(X).
X = a
 

Если мы возьмем факт Пролога P как P :- true , перепишите факт через (=>)/2 в P => true . Эта штука больше не работает, продемонстрировано в SWI-Prolog 8.3.19:

 p(a) => true.

?- p(X).
ERROR: No rule matches p(_2556)
 

Даже Picat был обеспокоен этой проблемой и изначально имел специальную обработку фактов. В недавнем выпуске v3 Picat даже были повторно введены предложения Horn.