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

Prolog jargon: id(X,X). fact or rule?

在 Prolog 中,这是明确的事实:

foo(bar).

这是明确的规则:

foo(X) :- bar(X).

但是如果子句既有非单例变量又没有 :- 例如

identity(X,X).

或者更现实一点,比如

my_member(X, [X|_]).

自从我学习 Prolog 以来,我一直在调用这些规则,但现在我已经尝试检查以确保 100% 确定,我似乎找不到任何来源比我在前两个例子。

规则也是如此:

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

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

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

描述对象及其关系是用子句完成的。子句分为三种类型:事实、规则和查询。

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

male(john).
father_of(adam, cain).

结合事实,我们可以定义对象之间的新关系。这是通过 rule 完成的,它由两部分组成:条件部分(也称为规则主体)和结论(也称为规则头部)。事实表示明确为真的关系,而规则表示只有在某些条件为真时才为真的关系。这些条件也是对象之间的关系。在句法上,规则的头部与主体用颈部运算符 (:-) 分开,可以读作 if。规则的条件,如果有多个,用逗号分隔,可以读作and。示例:

father_of(X,Y) :-
    parent(X,Y),
    male(X).

总而言之,规则和事实是从句。规则的形式为 Head :- Body.,事实的形式为 Head. 谓词是由名称和参数数量定义的关系,同一个谓词可以有多个事实或规则。最终:

father_of/2 is a predicate named father_of with arity 2

father_of(adam, cain). is a fact

father_of(adam, abel). is another fact

father_of(A,B) :- parent(A,B), male(A). is a rule

有时术语本身会导致实际 Prolog 系统根本没有的问题。在常用术语和标准术语中,identity(X,X).my_member(X, [X|_]). 都是事实。但是,最好在这看起来合适时使用子句。

不安源于此类案例所暗示的一组解决方案。事实上,这两个例子都有无限的解决方案。否则,基本事实只是分别描述一种解决方案。仅坚持基本事实,可以简化 bottom-up 解释。

那么条款a :- true.是事实还是规则呢?它使用 rule-atom。但 body 是真的。 3.72 中的注释将 (:-)/2 排除为事实的主要函子。好吧,所有这些都清楚地表明这里的术语有点太细了。

所以,尽可能坚持从句。