Prolog 中的仿函数、事实、谓词和规则之间有什么区别?
What's the difference between functor, a fact, a predicate and a rule in Prolog?
我想知道这些术语之间的区别:
- 事实
- 函子
- 谓词。
- 规则
在序言中。
如果我写:brother(john, jack).
这是事实吗?还是谓词?
事实是对问题域做出声明性陈述的谓词表达式。
likes(john, mary).
规则是谓词表达式,它使用逻辑蕴涵(:-)来描述事实之间的关系。规则可以是
left :- right.
friends(X,Y) :- likes(X,Y),likes(Y,X).
事实和规则都是谓词。
所以对于你的问题,brother(john, jack)是事实
来自
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 fact: 正文为目标的子句。
注 - 在 Prolog 文本中,一个事实可以用一个术语来表示
其主函子既不是 (:-)/1
也不是 (:-)/2
.
3.77 functor: 标识符和元数。
3.81 goal:要执行的断言(见
正文、查询和 7.7.3).
3.84 head (of a rule): 谓词,以上下文区分。
3.88 标识符:一个基本的非结构化对象,用于表示原子、函子名称或谓词名称。
3.129 predicate: 标识符和元数。
3.133 predication: 一个有元数 N 和 a 的谓词
N 个参数的序列。
3.143 查询:作为交互式输入给出的目标
顶级。
3.154 rule:正文不是目标的子句。
在执行期间,如果主体对于某些替换为真,
那么 head 也适用于该替换。一个规则
在 Prolog 文本中由一个术语表示,该术语的主体
仿函数是 (:-)/2
其中第一个参数被转换
到头部,第二个参数被转换为
正文。
所以brother(john, jack).
是事实。
解决你给出的例子:
brother(john, jack).
^ ^ ^
functor | |
argument |
argument
\________ ________/
\/
fact/predicate
brother/2
也是一个谓词和一个事实(请参阅@GuyCoder 对标准的引用中的 3.72 fact),因为您可以将它写成一个子句由单个目标组成的正文 true
:
brother(john, jack) :- % <- head of the clause
true. % <- body of the clause
您的示例中的谓词 brother
有两个参数,因此元数为 2,被称为 brother/2(请参阅 @GuyCoder 的 post 中的 3.129 谓词 )。谓词的名称或标识符 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规则)。上述规则由以下部分组成:
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[=79= 的函数] 或 false。所以谓词是关系的特征函数(参见Predicate (mathematical logic)。由于你可以查询事实并得到true
/false
作为答案,它们构成谓词。你可以观察到这一点当你查询你对 brother/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
最后一句话:在谈论 Prolog 时,术语 predicate 和 relation 经常互换使用,考虑一下很有帮助将谓词写成描述关系(参见上面brother_of/2定义中的注释)。因此,对于上述查询,也可以说:关系 brother(john,jack)
成立 。关系 brother(john,jason)
不成立 。 brother(X,Y)
关系适用于替换 X=john
和 Y=jack
.
term 和 predicate(或 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
meta-predicate 将 term 作为其第二个参数,它解释为谓词.换句话说,函子(name/arity)是一种术语的骨架;某些 meta-predicate(例如 call/1
、setof/3
等)可以将术语 (functor/arity) 解释为谓词。
我想知道这些术语之间的区别:
- 事实
- 函子
- 谓词。
- 规则
在序言中。
如果我写:brother(john, jack).
这是事实吗?还是谓词?
事实是对问题域做出声明性陈述的谓词表达式。
likes(john, mary).
规则是谓词表达式,它使用逻辑蕴涵(:-)来描述事实之间的关系。规则可以是
left :- right.
friends(X,Y) :- likes(X,Y),likes(Y,X).
事实和规则都是谓词。
所以对于你的问题,brother(john, jack)是事实
来自
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 fact: 正文为目标的子句。
注 - 在 Prolog 文本中,一个事实可以用一个术语来表示
其主函子既不是 (:-)/1
也不是 (:-)/2
.
3.77 functor: 标识符和元数。
3.81 goal:要执行的断言(见 正文、查询和 7.7.3).
3.84 head (of a rule): 谓词,以上下文区分。
3.88 标识符:一个基本的非结构化对象,用于表示原子、函子名称或谓词名称。
3.129 predicate: 标识符和元数。
3.133 predication: 一个有元数 N 和 a 的谓词 N 个参数的序列。
3.143 查询:作为交互式输入给出的目标 顶级。
3.154 rule:正文不是目标的子句。
在执行期间,如果主体对于某些替换为真,
那么 head 也适用于该替换。一个规则
在 Prolog 文本中由一个术语表示,该术语的主体
仿函数是 (:-)/2
其中第一个参数被转换
到头部,第二个参数被转换为
正文。
所以brother(john, jack).
是事实。
解决你给出的例子:
brother(john, jack).
^ ^ ^
functor | |
argument |
argument
\________ ________/
\/
fact/predicate
brother/2
也是一个谓词和一个事实(请参阅@GuyCoder 对标准的引用中的 3.72 fact),因为您可以将它写成一个子句由单个目标组成的正文 true
:
brother(john, jack) :- % <- head of the clause
true. % <- body of the clause
您的示例中的谓词 brother
有两个参数,因此元数为 2,被称为 brother/2(请参阅 @GuyCoder 的 post 中的 3.129 谓词 )。谓词的名称或标识符 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规则)。上述规则由以下部分组成:
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[=79= 的函数] 或 false。所以谓词是关系的特征函数(参见Predicate (mathematical logic)。由于你可以查询事实并得到true
/false
作为答案,它们构成谓词。你可以观察到这一点当你查询你对 brother/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
最后一句话:在谈论 Prolog 时,术语 predicate 和 relation 经常互换使用,考虑一下很有帮助将谓词写成描述关系(参见上面brother_of/2定义中的注释)。因此,对于上述查询,也可以说:关系 brother(john,jack)
成立 。关系 brother(john,jason)
不成立 。 brother(X,Y)
关系适用于替换 X=john
和 Y=jack
.
term 和 predicate(或 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
meta-predicate 将 term 作为其第二个参数,它解释为谓词.换句话说,函子(name/arity)是一种术语的骨架;某些 meta-predicate(例如 call/1
、setof/3
等)可以将术语 (functor/arity) 解释为谓词。