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

时间:2018-11-12 16:27:42

标签: prolog terminology

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

  1. 事实
  2. 功能键
  3. 谓词。
  4. 规则

在Prolog中。

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

4 个答案:

答案 0 :(得分:6)

要解决您的示例:

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

示例中的谓词brother有两个参数,因此为arity 2,并称为 brother / 2 (请参见@GuyCoder的 3.129谓词发布)。谓词brother / 2的名称或标识符也称为谓词的函子(请参见 3.77 functor ;请注意,3.77和3.129使用相同的定义)。您可以将事实视为一种无需规则即可定义的特殊谓词。

如果您有一些事实parent_of/2male/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规则)。上面的规则包括以下部分:

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 的函数)会很有帮助错误。因此,谓词是关系的特征函数(请参见Predicate (mathematical logic)。由于您可以查询事实并获得true / false作为答案,因此它们构成了谓词。您可以观察到这一点。查询您对brother / 2的定义:

?- brother(john,jack).
true.                      % <- maps to true

?- brother(john,jason).
false.                     % <- maps to false

如果您使用变量发出查询,则会得到使谓词为true的所述变量的替代,而不是答案true,例如:

?- brother(X,Y).
X = john,                  % these substitutions for X and Y
Y = jack.                  % map to true

最后一句话:在谈论Prolog时,谓词 relation 术语经常互换使用,考虑编写谓词很有帮助。 >作为描述关系(请参见上文brother_of / 2定义中的注释)。因此,对于以上查询,也应该这样说:关系brother(john,jack) 成立。关系brother(john,jason) 不成立。关系brother(X,Y) 保留替换项 X=john Y=jack

答案 1 :(得分:3)

来自

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

3.9 arity :复合词的自变量数。从语法上讲,是与函子或谓词关联的非负整数。

3.19 body (目标):目标,通过其上下文区分 规则(请参阅3.154)。

3.32 条款:事实或规则。它包括两个部分:头部, 和一个身体。

3.37 复合项:Ar的函子N,N为正,加上N个参数序列。

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

3.77 functor :标识符和Arity。

3.81 目标:要执行的谓词(请参见 正文,查询和7.7.3)。

3.84 head ((通常)):谓词,按上下文区分。

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

3.129 谓词:标识符和Arity。

3.133 谓词:谓词为N且谓词为a的谓词 N个参数的顺序。

3.143 查询:作为交互式输入提供给目标的目标 顶层。

3.154 规则:一个子句,其主体不是真正的目标。 在执行过程中,如果主体为true,可以进行某些替换, 那么对于替换来说,头部也是正确的。一条规则 在Prolog文本中用以下术语表示: 函子是(:-)/2,其中第一个参数被转换 到头部,第二个参数转换为 身体。

所以brother(john, jack).是事实。

答案 2 :(得分:0)

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

likes(john, mary). 

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

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

事实和规则都是谓语。

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

答案 3 :(得分:0)

术语谓词(或目标目标)之间的差异可能很小。它们看起来相同,并根据上下文进行区分。例如:

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元谓词将 term 作为其第二个自变量,将其解释为谓词。换句话说,函子(名称/名称)是一种术语的骨架。一些元谓词(例如call/1setof/3等)可以将术语(functor / arity)解释为谓词。