Почему предикаты и функции явно не разделены в Прологе? - PullRequest
0 голосов
/ 07 ноября 2019

Рассмотрим эту программу 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 впервые использоваласьв контексте термина, а затем в контексте предиката. Вероятно, переменные вообще не должны быть разрешены в контексте предиката.

Разве это не фундаментальное несоответствие проекта с математической точки зрения?

...