Prolog术语:id(X,X)。事实还是规则?

Prolog术语:id(X,X)。事实还是规则?,prolog,terminology,iso-prolog,Prolog,Terminology,Iso Prolog,在序言中,这无疑是一个事实: foo(bar). 这无疑是一条规则: foo(X) :- bar(X). 但是一个既有非单例变量又没有:-的子句呢 identity(X,X). 或者更现实一些,比如 my_member(X, [X|_]). 自从我学习Prolog以来,我一直在调用这些规则,但现在我已经尝试检查以100%确定,我似乎找不到任何比前两个示例中的规则更具区别的来源 规则也是如此: 定义可变逻辑关系的子句,即不总是成功的子句 定义谓词(也可能是谓词与自身)之间关系的子句 事实

在序言中,这无疑是一个事实:

foo(bar).
这无疑是一条规则:

foo(X) :- bar(X).
但是一个既有非单例变量又没有:-的子句呢

identity(X,X).
或者更现实一些,比如

my_member(X, [X|_]).
自从我学习Prolog以来,我一直在调用这些规则,但现在我已经尝试检查以100%确定,我似乎找不到任何比前两个示例中的规则更具区别的来源

规则也是如此:

  • 定义可变逻辑关系的子句,即不总是成功的子句
  • 定义谓词(也可能是谓词与自身)之间关系的子句

事实是,关于Prolog的术语存在争议,但我将尝试做一个简短的回顾,希望能得出一些答案

一般来说,Prolog程序由对象和对象之间的关系组成

关系称为谓词,对象称为谓词的参数。参数的数量是谓词的arity

使用子句描述对象及其关系。子句有三种类型:事实、规则和查询

事实表示对象之间的关系。这种关系无疑是正确的。从语法上讲,事实由描述关系的名称、括号中的一个或多个逗号分隔的对象以及句点组成。例如:

male(john).
father_of(adam, cain).
father_of(X,Y) :-
    parent(X,Y),
    male(X).
结合事实,我们可以定义对象之间的新关系。这是通过规则来完成的,该规则由两部分组成:条件部分(也称为规则主体)和结论部分(也称为规则主体)。事实表示明确为真的关系,而规则表示只有在某些条件为真时才为真的关系。这些条件也是对象之间的关系。从语法上讲,规则的头部通过颈部操作符(:-)与身体分离,颈部操作符可以被理解为。如果规则的条件不止一个,则用逗号分隔,逗号可以理解为和。例如:

male(john).
father_of(adam, cain).
father_of(X,Y) :-
    parent(X,Y),
    male(X).
总之,规则和事实是条款。规则的形式为
Head:-Body.
而事实的形式为
Head.
谓词是由名称和参数数量定义的关系,同一谓词可以有多个事实或规则。最终:

father\u of/2是一个名为father\u of of的谓词,带arity 2

(亚当、该隐)的父亲。
是事实

(亚当、亚伯)之父。
是另一个事实

父亲(A,B):-父母(A,B),男性(A)。是一条规则


有时术语本身会导致实际的Prolog系统根本没有的问题。在通用术语和标准术语中,
identity(X,X)。
my_成员(X[X|u])。
都是事实。然而,当这似乎合适时,最好使用子句

这种不安源于此类案例所隐含的一系列解决方案。事实上,这两个例子都有无穷多个解。否则,基本事实只描述了每个解决方案。只坚持基本事实,简化了自下而上的解释

那么,关于a:-真的子句呢。这是事实还是规则?它使用原子规则。但它的身体是真实的。3.72中的注释将
(:-)/2
排除为事实的主要函子。所有这些都清楚地表明,术语在这里有点过于细粒度


所以,请尽可能地坚持这一条款。

我认为这些都是事实。特别是因为这个来源:说规则的形式是<代码>…:-,您的
标识(X,X)
不遵循该模式。事实是一个始终为真的规则的语法糖,即
标识(X,X)。
标识(X,X)相同:-true
。谓词(也可以称为过程)是具有相同functor和arity的子句的集合。@closer:这是一个完美的谓词question@GuyCoder啊。你在那里的答案可能包含了这里的答案,但它有点深藏其中。SO的思想是给出明确的答案。@GYCODE:有关object的类似用法,请参见3.12、3.88、3.200。
:-
的阅读方式不是假设且仅当。当只有一条规则时,你最多只能这样做。我记得Clocksin和Mellish也谈到了对象之间的关系。@false Clocksin和Mellish的“Prolog编程”确实是我短语“Prolog程序由对象和对象之间的关系组成”的来源。他们实际上声明“Prolog是一种计算机编程语言,用于解决涉及对象和对象之间关系的问题”。在示例中使用一些非虚假事实如何?父亲(X,Y)和下面多余的父亲(Z,W)都没有多大意义。(顺便说一句,一个更好的名字,比如
father\u of
,也可以改善你的答案)。所以为什么不考虑一些基本事实,比如:
亚当,该隐的父亲。(亚当、亚伯)之父。(亚当、赛斯)之父。(塞斯,伊诺斯)的父亲。
?完全正确;此外,
identity(X,X)。
相当于
identity(X,Y):-X=Y。