当前位置:  开发笔记 > 编程语言 > 正文

比较SQL和Prolog

如何解决《比较SQL和Prolog》经验,为你挑选了5个好方法。

我开始学习Prolog并想知道SQL语言的理论差异.

例如:

两者都是声明性语言

都支持事实驱动的知识库

两者都支持问题式数据检索

两者都支持功能依赖

更常见的一点是什么?有什么显着的差异?



1> RBarryYoung..:

这里的大多数(早期)答案反映了这样一个事实,即大多数人不知道SQL是什么(它是关系微积分的实现)或者它意味着什么(它是谓词逻辑的一种形式).以下陈述适用于Prolog和SQL:

它们都是逻辑驱动的

他们可以存储,表达和使用关系(Prolog中的逻辑关系)

它们既可以存储也可以表达复杂的逻辑条件

它们都有事实(SQL中的数据),可以从这些事实中得出结论

他们都有疑问,这实际上意味着同样的事情

他们都有数据(Prolog中的事实)并且使用它们类似

它们都是编程语言

它们都是图灵完备的(虽然在两者中都很难访问它)

等等..

通常,人们不了解它们之间的这些等价:

    "事实"和"数据"是一回事.这完全出自Codd的原始论文.

    关系理论中的"关系"与SQL中的"表"相同,与谓词逻辑中的关系或关系函数相同,与集合论中的元组集相同.

    SQL中的别名表表达式(即视图等)与Prolog中的规则相同.

那他们的差异是什么?虽然它们在相同的概念领域中运作,但它们的重点在于完全不同的方向.在Prolog术语中,SQL主要是事实和关系(集)引擎,而Prolog主要是规则和推理引擎.每个人都可以在有限的范围内完成另一个,但即使复杂性增加很少,也变得越来越困难.例如,您可以在SQL中进行推理,但它几乎完全是手动的,而不像Prolog的自动前向推理.是的,您可以在Prolog中存储数据(事实),但它根本不是为SQL"存储,检索,预测和减少数千个并发用户的数万行"而设计的.

此外,SQL主要是服务器语言范例,而Prolog主要是客户端语言范例.


ALL:一般来说,我认为对于一个对这两种语言不熟悉的问题,例如"这两种语言之间有什么区别"这样的问题,实际上是非常困难的,而且大多数回答往往会导致错误:1)过于狭隘和僵化他们对语言的假设和描述,有效地"打字",或者2)不切实际地模糊和模糊,或者3)在"形式语言理论"意义上过于技术化,这对于一个语言新手很少有用(只是尝试在某个时候获得"功能语言"的良好描述.
@ MaD70:怎么这样,因为我可以用C++实现Prolog(或者就像我在学校那样实现C语言),所以这些点也​​可以说是关于C++的; 但是,为了比较语言以及何时使用它们中的一个或另一个,它们的主要功能是什么,它没有用.@RBarryYoung甚至说"每个人都可以做到另一个,在有限的程度上,但它变得越来越困难......"这清楚地表明,语言根本不同,并且针对不同的任务而设计.找到技术上的相似之处是没有用的,也无助于OP和提问.
Hogan:是的,我的最后一个(完整)段落基本上是我对问题的回答,前面的点列表(和编号点)实际上是对这里其他陈述的回应:也就是说,这些项目不是区分两者的有用方法.最后,我基本同意你的答案和你的意见,尽管我可能在答案的特异性,范围和措辞方面有所不同.
只是试图遵循这个线程给了我逻辑上的新挑战

2> MaD70..:

你是对的:Prolog和SQL在理论上是相关的(你具体询问理论差异).

我想补充一下RBarryYoung的答案,给你一些理解这种联系的提示,这样你就有了学习和理解技术性的起点.

Prolog和SQL共享一个核心:Prolog子集中可表达的每个查询都可以用SQL的子集表示,反之亦然,即这些子集在逻辑上是等价的.

要了解这是如何成真的,您需要检查Prolog和SQL所基于的理论基础:

SQL 1是不同部分的混合,并不总是很好地集成,显然来自关系代数(RA)和元组关系演算(TRC)2以及与逻辑无关的其他部分(即SUM,AVG运算符,ORDER BY等等)上).

RA安全(域独立)TRC的表达能力上是等价的(这被称为Codd定理).

RA相当于安全Datalog的表达能力,没有递归和(分层)否定.

数据记录可以被认为是Prolog 3的"松散子集" ; 一个"松散的子集",意思是Prolog的操作语义有一些复杂性:" 对于这些条款的排序在数据记录中是无关紧要的,而Prolog则依赖于用于计算查询调用结果的子句的顺序 " (引自这里).

当然,这些子集中的某些内容需要更多的翻译工作.

尽管如此,我认为在考虑Prolog-to-SQL翻译时,两个子集的表达能力等效性的主张不仅仅是对图灵等价4的吸引力.

笔记:

1)不幸的是,SQL可以用于RDBMS理论基础(关系代数 - 计算); 例如,SQL表不一定是关系 - 根据RA - 即它们可以没有(主)键,因此允许重复行.这样的表不是集合,而是多元集(也称为包)的元组.在这种情况下,RA的所有理论结果(其中关系是集合)不一定有效.

2)对于从SQL到TRC的转换,请参阅关于SQL转换为元组微积分的注释,也在这里(postscript paper).

3)有关Datalog和Prolog之间差异的更多信息,请参阅您一直想知道的Datalog(并且从不敢问)(pdf文件 - 直接链接到第6页,标题为H. Datalog和Prolog).

4)对于记录:RA(以及它们的等效安全TRC和安全数据记录没有递归)不是故意图灵完成,以避免永无止境的查询.

历史记录: Prolog和Codd的关系代数是在不同的背景下(60年代末70年代末)构思出来的--Colmerauer构思了自然语言处理的Prolog,Codd将RA视为关系DBMS的理论基础.因此,Prolog-Datalog-RA-SQL之间的任何理论联系都必然是后验的,并且隐含在它们都基于一阶谓词演算(又名一阶逻辑)的事实中.



3> 小智..:

Prolog和SQL都基于一阶逻辑,但SQL表是简单的二元关系,而Prolog谓词是Horn子句.

这不是一些模糊的理论观点.SQL二进制关系是事实的陈述,形式如下:

f(A,B,C ... N)

其中f是关系的名称,A ...是其变量.Prolog二元关系是形式的含义:

A < - B,C,D ... N.

A ... N本身就是Horn条款.SQL关系是描述数据的有效方式.Prolog关系描述数据之间的复杂关系,数据本身存储为数据.

重要的是要理解在Prolog中,数据和操作之间没有分离.Prolog事实,规则和查询都是Horn条款,因此数据是大多数大学课程中翻译丢失的内容.Prolog不像C,但用事实代替变量和规则而不是函数.另一方面,SQL很像没有规则或查询的Prolog.

SQL查询也是逻辑谓词,但SQL查询不存储在数据库本身中.相反,它们用于从事实数据库中提取数据集.您可以将查询存储为SQL数据库中的表行,但无法以该形式执行.

Prolog查询与任何其他Prolog谓词一样存储在数据库中,因为它们与任何其他Prolog谓词一样.查询是以下形式的Horn子句:

< - B,C,D ...... N.

所以先例的含义却没有前因,因此总是错误的.事实是Horn条款,具有先例但没有先例,形式如下:

一个< -

总是如此.Prolog通过反驳来证明一个查询:如果它找不到证明它的事实(或规则),它将说明目标是真的,因为查询总是错误的.在这个过程中,一些变量被绑定,因此可以构造结果集,就像SQL对SELECT查询一样.

现代SQL DBMS具有存储过程和流控制语言等功能,因此SQL可用于推理(而不是您希望在SQL中进行推理).Prolog准备好了一个调整到其Horn子句数据库的推理引擎,因为这是一种有效的方法,可以推断出作为二元关系的事实数据库(不,不仅仅因为它很漂亮).

Prolog的homoiconic性质(数据操作是数据)意味着必须将新的新数据添加到数据库中,因此要添加到程序中,因为数据库是程序.因此,每次向其数据库添加新事实(通常使用assert/1)时,必须对整个程序进行反编译.这是一个庞大的PITA并使Prolog在存储大型数据集方面效率低下,尽管没有理由说它必须在数据检索方面效率低下,而Prolog系统将使用与SQL系统相同的算法来实现这一目的.另一方面,SQL非常适合存储和检索.

最后,Prolog有一些SQL没有的功能,即它的超级模式匹配称为统一,否定为失败,以及便于列表处理和语法声明的语法元素(Definite Clause Grammar表示法).这些只是一个快乐的事故,并且大部分被添加到语言中,因为它们在首次创建时很流行(感谢LISP).SQL最近得到了递归查询,因此Prolog不再夸耀它了.

当然还有两种语言都在I/O和数学较弱,但至少你可以做一些Prolog的运算,而不必拉你的头发了所有的方式.

所以,真的,Prolog和SQL与C和Haskell一样多.它们都基于相同的根抽象,一阶逻辑(如C和Haskell都基于代数)但事后很快就会变得非常不同.此外,从语言设计的角度来看,SQL往往会断裂,具有许多不同的语言特征(pedicates,query,data manipulation language ......).Prolog的设计非常一致,因此整个语言实际上只是谓词和一些标点符号.

对我来说,最重要的区别是:我不喜欢SQL,但我必须使用它.我喜欢Prolog,但我不能在工作中使用它.人生是不公平的 :)


该死的好解释!! :)

4> 小智..:

我眼中的主要区别在于SQL从表中检索行 - 即,从与证明过滤条件相对应的有限实例化对象集中检索行.另一方面,Prolog理论上为您提供满足条件的所有可实例化对象.而在Prolog中,您也可以从有限集中检索实体,在SQL中,您无法从理论上无限集中获取所有值.



5> Hogan..:

当你开始使用它们时,我认为有许多不同之处.请记住,由于术语的变化,过去被称为同一事物的事物现在意味着非常不同的事情.

非常广泛的差异概述.

SQL语句针对关系数据库和查询(请求)来自该数据库的数据,对该数据的更改以及结果在语言中准确表达,而在Prolog中,您定义事实,逻辑引擎根据现有数据生成新事实事实.通过评估创建新数据(事实).

它们都使用称为查询的东西(但它们的工作方式完全不同)并且它们都有数据(但使用的方式不同.)

SQL和Prolog的用例也完全不同.在Prolog中存储地址列表永远不会有意义,而这正是SQL的目的.

简单地说,SQL用于访问数据存储,Prolog是表达式求值器.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有