Prolog行话:id(X,X). 事实还是规则?



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

foo(bar).

这无疑是一条规则:

foo(X) :- bar(X).

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

identity(X,X).

或者更现实的东西

my_member(X, [X|_]).

自从我学习Prolog以来,我一直在调用这些规则,但是现在我试图检查以100%确定,我似乎找不到任何来源比我在前两个示例中的区别更强。

规则也是如此:

  • 定义变量逻辑关系的子句,即不会总是成功的子句。
  • 定义谓词
  • (或可能是谓词和自身(之间关系的子句。

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

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

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

所以,尽可能多地坚持条款。

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

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

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

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

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

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

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

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

总之,规则和事实就是条款。规则具有形式Head :- Body.,事实具有形式Head.谓词是由名称和参数数定义的关系,同一谓词可以有多个事实或规则。最终:

father_of/2是名为 father_of 的谓词,具有 arity 2

father_of(亚当,该隐(。事实

father_of(亚当,亚伯(是另一个事实

father_of(A,B( :- 父母(A,B(,男性(A(。

最新更新