Чтобы обратиться к вашему данному примеру:
brother(john, jack).
^ ^ ^
functor | |
argument |
argument
\________ ________/
\/
fact/predicate
brother/2
также является предикатом И фактом (см. 3,72 факта в цитате @ GuyCoder из стандарта), поскольку вы можете написать его как предложение с телом, состоящим из единственной цели true
brother(john, jack) :- % <- head of the clause
true. % <- body of the clause
Предикат brother
в вашем примере имеет два аргумента, поэтому arity 2 и упоминается как brother / 2 (см. 3.129 предикат в посте @ GuyCoder). Имя или идентификатор предиката brother / 2 также называют функтором предиката (см. 3.77 функтор ; обратите внимание, что 3.77 и 3.129 используют одно и то же определение). Вы можете думать о факте как о особом предикате, который вы можете определить без правил.
Если у вас были некоторые факты parent_of/2
и male/2
и вы на их основе определили предикат brother_of/2
, например ...
brother_of(X,Y) :- % X is brother of Y if
dif(X,Y), % X and Y are different AND
male(X), % X is male AND
parent_of(P,X), % X has a parent P AND
parent_of(P,Y). % Y has the same parent P
... тогда приведенное выше определение представляет собой правило, поскольку тело предложения не является целью true
(см. 3.154 rule ). Вышеуказанное правило состоит из следующих частей:
brother_of(X,Y) :- % head of the rule
dif(X,Y), % goal \
male(X), % goal \ body of
parent_of(P,X), % goal / the rule
parent_of(P,Y). % goal /
За заголовком правила следует :-
, который является имплицитной стрелкой, указывающей на заголовок правила, а цели разделяются ,
, который является логическим И (соединением). Таким образом, тело правила состоит из единственной цели или совокупности целей, а тело правила подразумевает главу правила. Следовательно, вы можете прочитать приведенное выше определение brother_of / 2 в виде логической формулы:
brother_of(X,Y)
← dif(X,Y)
∧ male(X)
∧ parent_of(P,X)
∧ parent_of(P,Y)
Если вы исходите из математической логики, вам может быть полезно вспомнить, что предикат определен как логическая функция, то есть функция, которая сопоставляет свои аргументы с true или false . Таким образом, предикат является характеристической функцией отношения (см. Предикат (математическая логика) . Поскольку вы можете запрашивать факты и получать true
/ false
в качестве ответа, они составляют предикаты. Вы можете наблюдать это когда вы запрашиваете определение брата / 2:
?- brother(john,jack).
true. % <- maps to true
?- brother(john,jason).
false. % <- maps to false
Если вы выполняете запросы с переменными, вы получаете замены для указанных переменных, которые делают предикат истинным вместо ответа true
, например ::
?- brother(X,Y).
X = john, % these substitutions for X and Y
Y = jack. % map to true
Последнее замечание: при разговоре о Прологе термины предикат и отношение часто используются взаимозаменяемо, и весьма полезно думать о написании предикатов как описание отношений (см. Комментарии в определении brother_of / 2 выше). Следовательно, для вышеупомянутых запросов также уместно сказать: отношение brother(john,jack)
имеет значение . Отношение brother(john,jason)
не имеет отношения . Соотношение brother(X,Y)
справедливо для замен X=john
и Y=jack
.