В чем разница между функтором, фактом, предикатом и правилом в Прологе? - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы знать разницу между этими терминами:

  1. факты
  2. функтор
  3. предикат.
  4. правило

в прологе.

если я напишу: brother(john, jack).
это факт? или предикат?

Ответы [ 4 ]

0 голосов
/ 12 июня 2019

Разница между сроком и предикатом (или goal ) может быть незначительной.Они выглядят одинаково и различаются по контексту.Например:

foo(1).
foo(2).
foo_results(Results) :- setof(X, foo(X), Results).
?- foo_results(Results).
Results = [1, 2].

Предикат foo/1 имеет два предложения.Предикат foo_results/1 вызывает это, но косвенно ... мета-предикат setof/3 принимает член в качестве второго аргумента, который он интерпретирует как предикат.Другими словами, функтор (имя / арность) является каркасом своего рода термина;некоторые мета-предикаты (например, call/1, setof/3 и т. д.) могут интерпретировать термин (функтор / арность) как предикат.

0 голосов
/ 12 ноября 2018

С

ИСО / МЭК 13211-1 Первое издание 1995-06-01
Информационные технологии. Языки программирования. Пролог -
Часть 1:
ОбщееCore

3.9 arity : Количество аргументов составного термина.Синтаксически, неотрицательное целое число, связанное с функтором или предикатом.

3.19 body : Цель, отличающаяся своим контекстом как частью правила (см. 3.154).

3,32 предложение : факт или правило.Он состоит из двух частей: головы и тела.

3.37 составной член : функтор арности N, N положительный, вместе с последовательностью из N аргументов.

3.72 fact : предложение, тело которого является истинной целью.
ПРИМЕЧАНИЕ. - Факт может быть представлен в тексте Prolog термином, главный функтор которого не является ни (:-)/1, ни (:-)/2.

3.77 функтор : идентификатор вместе с арностью.

3.81 goal : предикат, который должен быть выполнен (см. Тело, запрос и 7.7.3).

3.84 head (правила): Предикация, отличающаяся контекстом.

3.88 идентификатор : базовая неструктурированнаяобъект, используемый для обозначения атома, имени функтора или имени предиката.

3.129 предикат : идентификатор вместе с арностью.

3.133 предикация :Предикат с арностью N и последовательностью из аргументов N.

3.143 query : цель, заданная в виде интерактивного ввода дляверхний уровень.

3.154 rule : предложение, тело которого не является истинной целью.Во время выполнения, если тело является верным для некоторой замены, тогда голова также верна для этой замены.Правило представлено в тексте Пролога термином, главный функтор которого равен (:-)/2, где первый аргумент преобразуется в заголовок, а второй аргумент преобразуется в тело.

Так что brother(john, jack). является фактом.

0 голосов
/ 13 ноября 2018

Чтобы обратиться к вашему данному примеру:

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.

0 голосов
/ 12 ноября 2018

Факт - это предикатное выражение, которое делает декларативное заявление о проблемной области.

likes(john, mary). 

Правило - это выражение предиката, которое использует логическое значение (:-) для описания взаимосвязи между фактами.Правило может быть

left :- right.
friends(X,Y) :- likes(X,Y),likes(Y,X).

И факты, и правила являются предикатами.

Так что по вашему вопросу, брат (Джон, Джек) - это факт.

...