Рассмотрим эту программу Prolog:
a(1).
b(X) :- X.
Это действительно в SWI Prolog. И следующие запросы дают желаемые (на первый взгляд) результаты без каких-либо предупреждений:
?- b(a(1)).
true
?- b(a(2)).
false
И тогда мне непонятно, почему это разрешено.
Факт a(1).
говорит, что предикат a/1
имеет значение true с аргументом 1
.
Запрос b(a(1))
спрашивает, является ли предикат b/1
истинным со значением a(1)
function . Когда этот запрос разрешен, a(1)
проверяется как предикат , однако он был взят из контекста аргумента предиката, который должен допускать только терминов .
Такие разные понятияздесь перепутались. У нас есть предикаты, которые могут быть истинными или ложными в зависимости от их аргументов. И у нас есть символические функции, которые являются некоторыми абстрактными (символическими) значениями, определенными функтором и аргументами. Функция не обязательно возвращает истину или ложь, это может быть совершенно другой домен. Единственное действие с функцией здесь может заключаться в использовании его в качестве термина в предикатах для указания некоторых правил и фактов о его значении.
Для меня это выглядит так, как будто правило b(X) :- X.
не должно быть компилируемым, поскольку переменная X впервые использоваласьв контексте термина, а затем в контексте предиката. Вероятно, переменные вообще не должны быть разрешены в контексте предиката.
Разве это не фундаментальное несоответствие проекта с математической точки зрения?