Prolog 中的函子、事实、谓词和规则有什么区别?

What's the difference between functor, a fact, a predicate and a rule in Prolog?

提问人:John Sall 提问时间:11/13/2018 最后编辑:Guy CoderJohn Sall 更新时间:6/13/2019 访问量:3869

问:

我想知道这些术语之间的区别:

  1. 事实
  2. 谓语。
  3. 统治

在 Prolog 中。

如果我写:
这是事实吗?还是谓语?
brother(john, jack).

Prolog 术语

评论

0赞 damianodamiano 11/13/2018
此外,SWI Prolog 有一个带有词汇表的好页面:swi-prolog.org/pldoc/man?section=glossary
2赞 Daniel Lyons 11/14/2018
此 Prolog 术语是否正确?
1赞 Guy Coder 11/14/2018
仅供参考 当 OP 提出这个问题时,定义不在 Prolog 术语是否正确?看到问题后,我用 .因此,对于更新,这是一个重复的问题,但这不是OP的错。functorfunctor

答:

1赞 Richard Ardelean 11/13/2018 #1

事实是一个谓词表达式,它对问题域进行声明性陈述。

likes(john, mary). 

规则是使用逻辑含义 (:-) 来描述事实之间关系的谓词表达式。规则可以是

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

事实和规则都是谓词。

所以对于你的问题,兄弟(约翰,杰克)是事实。

5赞 Guy Coder 11/13/2018 #2

ISO/IEC 13211-1 第一版 1995-06-01
信息技术 - 编程语言 - Prolog -
第 1 部分:
通用核心

3.9 arity:复合项的参数数。在语法上,与函子或谓词关联的非负整数。

3.19 body:一个目标,以其作为一部分的背景来区分 规则(见3.154)。

3.32 条款:事实或规则。它由两部分组成:头部、 和一具尸体。

3.37 复合项:函数 N、N 正的函子,以及 N 个参数的序列。

3.72 事实:正文为目的为真的从句。
注意 - 一个事实可以在 Prolog 文本中用术语表示 其主函子既不是也不是。
(:-)/1(:-)/2

3.77 函子:标识符和 arity。

3.81 目标:将要执行的谓词(见 body、query 和 7.7.3)。

3.84 head (of a rule):谓语,按上下文区分。

3.88 标识符:用于表示原子、函子名称或谓词名称的基本非结构化对象。

3.129 谓语:标识符和arity。

3.133 谓词:具有 arity N 和 a 的谓词 N 个参数的序列。

3.143 查询:作为交互式输入给出的目标 顶级。

3.154 规则:正文不是目的为真的条款。 在执行过程中,如果正文为真,则进行某些替换, 那么头部也适用于该替换。规则 在 Prolog 文本中由一个术语表示,其主体 functor 是转换第一个参数的位置 到头部,第二个参数转换为 身体。(:-)/2

这是事实。brother(john, jack).

评论

1赞 Will Ness 1/27/2019
brother(john, jack).是事实、规则、谓词和复合项,具体取决于上下文。
0赞 false 2/13/2019
这不是对原始问题的回答。列表、统一器等概念与问题完全无关。
0赞 Guy Coder 2/13/2019
@false回滚到原来的答案。
9赞 tas 11/13/2018 #3

要解决给定的示例,请执行以下操作:

brother(john, jack).
   ^      ^     ^
functor   |     |
      argument  |
            argument
\________  ________/
         \/
   fact/predicate

brother/2是一个谓语,也是一个事实(参见 @GuyCoder 引用标准中的 3.72 事实),因为你可以把它写成一个子句,其主体由单个目标组成:true

brother(john, jack) :-  % <- head of the clause
   true.                % <- body of the clause

示例中的谓词有两个参数,因此称为 arity 2,称为 brother/2(参见 @GuyCoder 帖子中的 3.129 谓词)。谓词 brother/2 的名称或标识符也称为谓词的函子(参见 3.77 函子;请注意,3.77 和 3.129 使用相同的定义)。你可以把一个事实看作是一种特殊的谓词,你可以在没有规则的情况下定义它。brother

如果你有一些事实,并基于这些事实定义了一个谓词,例如......parent_of/2male/2brother_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

...那么上述定义就构成了一条规则,因为条款的主体不是目标(见3.154规则)。上述规则由以下部分组成:true

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  /

规则的头部后面跟着一个指向规则头部的隐含箭头,目标之间用逻辑 AND(连词)分隔。因此,规则的主体由单个目标或目标的组合组成,规则的主体意味着规则的头部。因此,您可以将上述 brother_of/2 的定义解读为一个逻辑公式::-,

brother_of(X,Y)← ∧ ∧ ∧dif(X,Y)male(X)parent_of(P,X)parent_of(P,Y)

如果你来自数学逻辑,你可能会发现回想一下谓词被定义为布尔值函数,即将其参数映射到 truefalse 的函数会很有帮助。因此,谓词是关系的特征函数(参见谓词(数理逻辑))。由于您可以查询事实并得到 / 作为答案,因此它们构成了谓词。当您查询 brother/2 的定义时,您可以观察到这一点:truefalse

?- 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

最后一点:在谈论 Prolog 时,术语词和关系经常互换使用,将谓词写成描述关系是很有帮助的(参见上面 brother_of/2 定义中的评论)。因此,对于上述问题,也可以这样说:这种关系成立。这种关系不成立。这种关系适用于替换 brother(john,jack)brother(john,jason)brother(X,Y)X=johnY=jack

评论

0赞 tas 11/14/2018
@GuyCoder:谢谢:-)
0赞 John Sall 11/17/2018
谢谢,这很有帮助。
0赞 Will Ness 1/27/2019
函子/参数不是任何谓词/规则/事实的一部分,而是复合项的一部分。反过来,复合项(通常)用于对谓词/规则/事实进行编码。
3赞 Peter Ludemann 6/13/2019 #4

术语谓词(或目标)之间的区别可能很微妙。它们看起来相同,并按上下文进行区分。例如:

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

谓语有两个子句。谓语称其为,但间接地......元谓词将一个术语作为其第二个参数,并将其解释为谓词。换句话说,函子(name/arity)是一种术语的骨架;一些元谓词(例如,、、等)可以将术语(函子/词)解释为谓词。foo/1foo_results/1setof/3call/1setof/3