【问题标题】:Prolog jargon: id(X,X). fact or rule?Prolog 术语:id(X,X)。事实还是规则?
【发布时间】:2020-02-15 19:04:18
【问题描述】:

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

foo(bar).

这是一个明确的规则:

foo(X) :- bar(X).

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

identity(X,X).

或者更实际的类似

my_member(X, [X|_]).

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

这是一个规则:

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

【问题讨论】:

  • 我会说这些都是事实。特别是因为这个来源:cs.trincoll.edu/~ram/cpsc352/notes/prolog/factsrules.html 说规则具有 ... :- ... 的形式,你的 identity(X, X) 不遵循这种模式。
  • 一个事实是始终为真规则的语法糖,即identity(X,X).identity(X,X) :- true 相同。谓词(也可以称为过程)是具有相同函子和元数的子句的集合。
  • @closer:这是一个完美的问题
  • @GuyCoder,啊。你那里的答案可能包含这里的答案,但它有点深埋在里面。 SO 的想法是给出明确的答案。

标签: prolog terminology iso-prolog


【解决方案1】:

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

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

那么a :- true. 子句是事实还是规则呢?它使用规则原子。但它的身体是真实的。 3.72 中的注释不包括 (:-)/2 作为事实的主要函子。嗯,所有这些都清楚地表明这里的术语有点过于细化了。

所以,尽可能坚持从句。

【讨论】:

  • 完全正确;此外,identity(X,X). 等价于identity(X,Y) :- X=Y.
【解决方案2】:

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

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

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

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

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

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

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

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

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

father_of/2 是一个名为father_of的谓词,元数为2

father_of(adam, 该隐)。 是事实

father_of(adam, abel)。 是另一个事实

father_of(A,B) :- parent(A,B), male(A)。 是一个规则

【讨论】:

  • @GuyCode:有关对象的类似用途,请参见 3.12、3.88、3.200。
  • :- 不会被读取为当且仅当。当只有一条规则时,您最多可以这样做。
  • 我记得 Clocksin 和 Mellish 也谈到了对象之间的关系。
  • @false Clocksin & Mellish 的“Prolog 编程”确实是我的短语“Prolog 程序由对象及其之间的关系组成”的来源。他们实际上声明“Prolog 是一种计算机编程语言,用于解决涉及对象和对象之间关系的问题”。
  • 在示例中使用一些非虚假事实怎么样? father(X,Y). 和以下多余的 father(Z,W) 都没有多大意义。 (顺便说一句,像father_of 这样更好的名字也可以改善你的答案)。那么为什么不采取一些基本事实,例如:father_of(adam, cain). father_of(adam, abel). father_of(adam, seth). father_of(seth, enosh).
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多