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
排除为事实的主要函子。好吧,所有这些都清楚地表明这里的术语有点太细了。
所以,尽可能坚持从句。
在 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
排除为事实的主要函子。好吧,所有这些都清楚地表明这里的术语有点太细了。
所以,尽可能坚持从句。