Joh*_*all 5 terminology prolog
我想知道这些术语之间的区别:
在Prolog.
如果我写:brother(john, jack).
这是事实吗?还是谓词?
要解决您给出的示例:
brother(john, jack).
^ ^ ^
functor | |
argument |
argument
\________ ________/
\/
fact/predicate
Run Code Online (Sandbox Code Playgroud)
brother/2是一个谓词和一个事实(参见3. GuyCoder引用标准中的3.72事实),因为你可以把它写成一个包含单个目标的主体的子句true:
brother(john, jack) :- % <- head of the clause
true. % <- body of the clause
Run Code Online (Sandbox Code Playgroud)
brother你的例子中的谓词有两个参数,因此arity 2被称为brother/2(参见@ GuyCoder帖子中的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
Run Code Online (Sandbox Code Playgroud)
......然后上述定义构成规则,因为该条款的主体不是目标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 /
Run Code Online (Sandbox Code Playgroud)
规则的头部后面:-是一个指向规则头部的蕴涵箭头,目标由,逻辑AND(连接)分开.因此,规则的主体由单个目标或目标的结合组成,规则的主体意味着规则的头部.因此,您可以将上面的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
Run Code Online (Sandbox Code Playgroud)
如果使用变量发出查询,则会获得使谓词为真而不是答案的所述变量的替换true,例如:
?- brother(X,Y).
X = john, % these substitutions for X and Y
Y = jack. % map to true
Run Code Online (Sandbox Code Playgroud)
最后一点:在谈论Prolog时,术语谓词和关系通常可以互换使用,考虑将谓词编写为描述关系是非常有帮助的(参见上面brother_of/2定义中的注释).因此,对于上述查询,也可以说:关系brother(john,jack) 成立.这种关系brother(john,jason) 并不成立.这种关系brother(X,Y) 适用于替代 X=john 和 Y=jack.
从
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事实:一个子句,其主体是目标 true。
注意 - Prolog 文本中的事实可以用主函子既不是 也不(:-)/1是 的项来表示(:-)/2。
3.77 functor:一个标识符和一个元数。
3.81 goal:要执行的谓词(参见正文、查询和 7.7.3)。
3.84 (规则的)中心词:根据上下文区分的谓词。
3.88标识符:用于表示原子、函子名称或谓词名称的基本非结构化对象。
3.129谓词:与元数一起的标识符。
3.133 predicate 谓词:具有 N 个参数和 N 个参数序列的谓词。
3.143查询:作为交互输入提供给顶层的目标。
3.154规则:主体不是目标 true 的子句。在执行期间,如果主体对于某些替换为真,则头部对于该替换也为真。在 Prolog 文本中,规则由一个术语表示,该术语的主要函子是(:-)/2第一个参数转换为头部,第二个参数转换为主体。
brother(john, jack).事实也是如此。