Prolog 中如何表示谓词逻辑?

Posted

技术标签:

【中文标题】Prolog 中如何表示谓词逻辑?【英文标题】:How is predicate logic represented in Prolog? 【发布时间】:2020-10-18 13:21:20 【问题描述】:

可能是一个奇怪而广泛的问题,而不是一个 100% 的编程问题,但我希望这没问题。我最近讨论过,Prolog 中的许多程序不遵循严格的谓词逻辑(弗雷格的),但通常是“面向对象”的,我正试图掌握。

我知道 Prolog 是基于一阶谓词逻辑,尤其是 Horn 从句,并且它们是一种特殊形式的先决条件。单独出现的事实和规则只是从句,但只要我添加多个出现,它们就会成为谓词。

一般来说,一阶谓词逻辑的量词是如何表示并与 fact 、 rule 、 predicate 或 Prolog 概念相关的?函子表达什么以及与谓词逻辑相关的参数是什么。谓词逻辑和一阶谓词逻辑在 Prolog 中是如何体现的,prolog 把它们的概念放在哪里?例如如何在谓词逻辑和一阶谓词逻辑中定义点、线和垂直线。

我如何在谓词逻辑和一阶谓词逻辑中表述这一点,它们之间的语义和逻辑区别是什么

vertical(line).
line(vertical).

或者在这个例子中是一条线和一个点。点和线不是谓词逻辑吗? 对我来说,它是“point(X) 所有点的集合”,当我选择一个具体点时,“存在一个点 (110, 12)。”

point(X,Y).
line(point(W,X), point(Y,Z)).

vertical(line(point(X,Y), point(X,Z))).
horizontal(line(point(X,Y), point(Z,Y))).

任何信息都有帮助!非常感谢,H

【问题讨论】:

【参考方案1】:

Programming in Prolog W.Clocksin 和 C.Mellish 的一章专门解释 Prolog 与逻辑的关系。从那里引用

如果我们想讨论 Prolog 与逻辑的关系,我们必须首先确定我们的 逻辑上的意思。逻辑最初被设计为一种表示形式的方式 论据,以便可以以正式的方式检查它们是否 是有效的。因此,我们可以使用逻辑来表达命题、命题之间的关系以及如何从其他命题中有效地推断一些命题。特别的 我们将在这里讨论的逻辑形式称为谓词演算。我们 在这里只能说几句。有很多很好的基础 逻辑介绍,您可以参考背景阅读。

如果我们想表达关于世界的命题,我们必须能够描述 其中涉及的对象。在谓词演算中,我们用 条款。术语是以下形式之一:

一个常量符号。这是一个代表单个个体或概念的符号。 我们可以将其视为 Prolog 原子,我们将使用 Prolog 语法。所以 希腊语、agatha 和和平是永恒的象征。 一个变量符号。这是一个我们可能想要代表不同的符号 不同时期的个人。变量实际上只是结合引入 与量词,这将在下面讨论。我们可以将它们视为 Prolog 变量并将使用 Prolog 语法。因此XManGreek 是可变的 符号。 复合词。复合术语由一个功能符号,一起 以一组有序的术语作为其参数。这个想法是化合物 术语表示依赖于所代表的个人的一些个人 论据。功能符号表示第一个如何依赖于第二个。例如,我们可以有一个代表以下概念的函数符号 “距离”和两个论点。在这种情况下,复合术语代表 参数表示的对象之间的距离。我们可以想到一个 复合术语作为 Prolog 结构,函数符号作为函子。 我们将使用 Prolog 语法编写谓词演算复合项,所以 例如,wife(henry) 可能意味着亨利的妻子,distance(point1, X) 可能意味着某个特定点和某个其他地方之间的距离 被指定,classes(mary, dayafter(W)) 可能表示 Mary 的类 后天授课W 待指定。

因此,在谓词演算中,表示对象的方式就像在 Prolog 中可用的方式一样。

似乎不适合把整章都放在这里……在附录 B 中还有一个程序,解释性很强,它可以将WFFs 自动翻译成子句。

这本书可读性很强,可惜不在Free Prolog Programming Books部分的标题中。

【讨论】:

平装本 @ 70 美元 Springer ...嘶嘶声.... 我想知道是否会有市场让 Manning.com 以低价形式出版一本新书。 (Manning.com 书籍的唯一问题是它们让我厌烦至死,因为它们太慢了,但我离题了) @DavidTonhofer:这本书是经典之作,版权服务于它们的目的......但是已经将近 40 年前,制作死树副本以在学生之间分享是很常见的......现在,我想我是从谷歌搜索中找到的,指出this pdf @DavidTonhofer cf。 en.wikipedia.org/wiki/Library_Genesisen.wikipedia.org/wiki/Sci-Hub 当然还有en.wikipedia.org/wiki/…【参考方案2】:

我知道 Prolog 是基于一阶谓词逻辑,尤其是 Horn 子句,并且它们是一种特殊形式的先决条件。

从某种意义上说,倒置的“自决方式”:

a :- b

你想显示“a true”,而要这样做,你必须显示“b true”

如果单独出现的事实和规则只是从句,但只要我添加多个出现,它们就会成为谓词。

不,它们都是谓词。 “谓词”是一个对象/代理/程序/柏拉图现象,它表示(客观地)“事物”之间存在某种“关系”,您可以向 Prolog 处理器询问该关系。但是,所有这些都没有直接的含义,它是“通过字符串与字符串相关的字符串”。毕竟,我们正在使用语法机器(即计算机)。

输入这个逻辑程序:

p(x,y).   % Predicate p/2 states that there is a relationship p between x and y

现在,您可以查询数据库以了解程序在说什么:

?- p(x,y).
true.        % a p relationship exists (fact, but could also be rule)

?- p(x,A).
A = y.       % the thing related to x via p is y

?- p(A,y). 
A = x.       % the thing related to x via p is y

?- p(A,B).
A = x,       % things related via p are x and y
B = y.

?- p(c,d).   
false.       % not REALLY "false" but "as far as I can tell, there
             % is no relationship p between c and d"

注意“假”的解释,这不是经典逻辑的“强假”。尽管传统上说 Prolog 在经典逻辑中工作,但事实并非如此:

来自“具有强否定的逻辑编程”(David Pearce,Gerd Wagner,FU 柏林,1991 年),出现在 Springer LNAI 475:逻辑编程的扩展,国际研讨会 Tübingen,FRG,12 月 8 日–10, 1989 诉讼):

根据标准观点,逻辑程序是一组明确的 Horn 子句。因此,逻辑程序被视为经典逻辑框架内的句法限制的一阶理论。相应地,逻辑程序的证明论被认为是经典解析的专门版本,称为SLD解析。然而,这种观点忽略了这样一个事实,即程序子句 a_0

应该清楚的是,为了解释 Prolog 的演绎机制,不必参考 SLD 解析的间接方法,该方法检查 相反的可反驳性。将 Prolog 的证明过程视为一种自然演绎当然更自然,例如在 [Hallnäs & Schroeder-Heister 1987] 和 [Miller 1989] 中。这也更符合 Prolog 程序员的直觉。由于 Prolog 是范式,逻辑编程语义应该以它为出发点。

现在:

一阶谓词逻辑的量词是如何表示和关联的 到事实、规则、谓词或一般的 Prolog 概念?

说来话长。请注意,Prolog 主要是关于“使用逻辑编程”,是关于“使用逻辑建模”。对于可以使用显式枚举解决的问题,这两个方面当然可以很好地重叠,但是 Prolog 并不是为指定描述所寻求解决方案的一般 FOL 约束而设计的。事实上,某些 FOL 约束无法表示,而其他约束必须转换为机器可接受的名义上等价的表达式。查找“skolemization”。例如:https://www.cs.toronto.edu/~sheila/384/w11/Lectures/csc384w11-KR-tutorial.pdf

另一方面,Prolog 提供了“元谓词”,它通过调用其他谓词来生成解决方案,因此它正在涉足二阶逻辑。必须如此 - 没有人可以在 FOL 沙漠中长期生存。

函子表达什么

什么都没有。它只代表它自己。纯语法。查找“Herbrand Universe”。

如何在谓词逻辑和一阶谓词逻辑中表述这一点 之间的语义和逻辑区别是什么

vertical(line).
line(vertical).

是你赋予verticalline 意义。所以,感情。你想要一条“垂直线”,所以你会说,“事物”是“线”,“垂直”是“线”的一个属性。所以vertical(line) 听起来很合适。或者attribute(line,vertical)。视情况而定。

这里:

point(X,Y).
line(point(W,X), point(Y,Z)).

你必须方面:

谓词表达“关系”。 “函数符号”用于构造“具有结构的事物”:您可以在节点上形成函数符号,在叶子上形成整数/字符串/变量的事物树。这些被称为“术语”。但是术语可以作为谓词或事物出现,这取决于上下文,它非常灵活。例如,您可以使用另一个 Prolog 程序构建一个 Prolog 程序。

point(X,Y)
line(point(W,X), point(Y,Z))

这些是术语!

如果你把它输入到文件program.pl:

point_on_line(point(X,Y),line(point(W,X), point(Y,Z))).

术语显示为与谓词point_on_line/2 相关的“事物”。整行本身就是一个术语。

如果你把它输入到文件program.pl:

point(X,Y).
line(point(W,X), point(Y,Z)).

术语显示为“谓词”,point 既显示为谓词 point/2,又显示为谓词 line/2 正在谈论的“事物”。

这实际上是一个庞大的主题,需要一些时间来适应它,而不仅仅是函数式编程。我在 uni 上过一些 Prolog 和 Logic 课程,但 20 年后我发现我在很多方面都严重误解了。

【讨论】:

不仅是 Prolog 的一个很好的介绍:plato.stanford.edu/entries/reasoning-automated 很好的研究(+1)。我知道函子没有隐含的含义,但是它们作为“关系标识符”的明显作用应该更清楚地表达出来,特别是复合词在作为谓词时所扮演的不同角色。一个heavy reading 声明Categories are them selves structured objects; functors are the structure-preserving mappings between categories @CapelliC 这不是繁重的阅读 - 这是好的阅读。但是我们这里不是在谈论两件事吗:一方面是范畴论的functors,另一方面是Prolog 的functors。我不认为他们是相关的。到底是谁创造了这个词汇?在 ISO 术语中,“函子”是"An identifier together with an arity"。这只是概念性的——一对东西。不涉及映射。 @DavidTonhofer 非常感谢,很好的回答。需要解决这个问题,但已经纠正了我对谓词的误解。 @CarstenH 在 COVID-19 插曲期间,我还整理了一些笔记,不得不不断纠正我的误解:here。转到带有 Markus Triska 的 Youtube 讲座链接的“Prolog 的力量”部分。此外,Frank Pfenning 有 300 页的课程材料,这是真正的交易:15-819K。有趣的是,逻辑显然是逻辑,但仍然很难获得基本概念(为什么允许这个公式?它有什么意义?解释是什么?这有关系吗?等等)

以上是关于Prolog 中如何表示谓词逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

Prolog中的“逻辑纯度”是啥意思?

Prolog:如何删除谓词中的对称值

如何将prolog谓词转换为JSON?

Prolog 箭头运算符

如何将用户输入转换为 gnu prolog 中的可重用谓词?

Prolog 中的谓词控制