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

问题描述 投票:5回答:4

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

  1. 事实
  2. 函子
  3. 谓语。
  4. 规则

在Prolog。

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

prolog terminology
4个回答
4
投票

ISO/IEC 13211-1 First edition 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目标:要执行的预测(参见正文,查询和7.7.3)。

3.84头(规则):预测,以其背景来区分。

3.88 identifier:用于表示原子,仿函数名称或谓词名称的基本非结构化对象。

3.129谓词:一个标识符和一个arity。

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

3.143 query:作为顶层的交互式输入给出的目标。

3.154 rule:一个主体不是目标的子句。在执行期间,如果正文对于某些替换是正确的,则对于该替换,头部也是如此。规则在Prolog文本中由一个术语表示,该术语的主要仿函数是(:-)/2,其中第一个参数转换为头部,第二个参数转换为正文。

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


7
投票

要解决您给出的示例:

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

brother/2也是一个谓词和事实(参见3. 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仿函数;请注意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  /

规则的头部后面是:-,这是一个指向规则头部的蕴涵箭头,目标由,分隔,这是一个逻辑AND(连接)。因此,规则的主体由单个目标或目标的结合组成,规则的主体意味着规则的头部。因此,您可以将上面的brother_of / 2定义读作逻辑公式:

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

如果您来自数学逻辑,您可能会发现将谓词定义为布尔值函数(即将其参数映射为true或false的函数)会很有帮助。所以谓词是关系的特征函数(参见Predicate (mathematical logic)。因为你可以查询事实并得到true / false作为答案,它们构成谓词。当你查询兄弟/ 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时,术语谓词和关系通常可以互换使用,考虑将谓词编写为描述关系是非常有帮助的(参见上面brother_of / 2定义中的注释)。因此,对于上述查询,也可以说:brother(john,jack)的关系成立。 brother(john,jason)的关系不成立。 brother(X,Y)关系适用于替换X=johnY=jack


0
投票

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

likes(john, mary). 

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

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

事实和规则都是谓词。

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


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元谓词将一个术语作为其第二个参数,它将其解释为谓词。换句话说,仿函数(name / arity)是一种术语的骨架;一些元谓词(例如,call/1setof/3等)可以将术语(functor / arity)解释为谓词。

© www.soinside.com 2019 - 2024. All rights reserved.