我开始学习Prolog并想知道SQL语言的理论差异.
例如:
两者都是声明性语言
都支持事实驱动的知识库
两者都支持问题式数据检索
两者都支持功能依赖
更常见的一点是什么?有什么显着的差异?
这里的大多数(早期)答案反映了这样一个事实,即大多数人不知道SQL是什么(它是关系微积分的实现)或者它意味着什么(它是谓词逻辑的一种形式).以下陈述适用于Prolog和SQL:
它们都是逻辑驱动的
他们可以存储,表达和使用关系(Prolog中的逻辑关系)
它们既可以存储也可以表达复杂的逻辑条件
它们都有事实(SQL中的数据),可以从这些事实中得出结论
他们都有疑问,这实际上意味着同样的事情
他们都有数据(Prolog中的事实)并且使用它们类似
它们都是编程语言
它们都是图灵完备的(虽然在两者中都很难访问它)
等等..
通常,人们不了解它们之间的这些等价:
"事实"和"数据"是一回事.这完全出自Codd的原始论文.
关系理论中的"关系"与SQL中的"表"相同,与谓词逻辑中的关系或关系函数相同,与集合论中的元组集相同.
SQL中的别名表表达式(即视图等)与Prolog中的规则相同.
那他们的差异是什么?虽然它们在相同的概念领域中运作,但它们的重点在于完全不同的方向.在Prolog术语中,SQL主要是事实和关系(集)引擎,而Prolog主要是规则和推理引擎.每个人都可以在有限的范围内完成另一个,但即使复杂性增加很少,也变得越来越困难.例如,您可以在SQL中进行推理,但它几乎完全是手动的,而不像Prolog的自动前向推理.是的,您可以在Prolog中存储数据(事实),但它根本不是为SQL"存储,检索,预测和减少数千个并发用户的数万行"而设计的.
此外,SQL主要是服务器语言范例,而Prolog主要是客户端语言范例.
你是对的: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之间的任何理论联系都必然是后验的,并且隐含在它们都基于一阶谓词演算(又名一阶逻辑)的事实中.
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,但我不能在工作中使用它.人生是不公平的 :)
我眼中的主要区别在于SQL从表中检索行 - 即,从与证明过滤条件相对应的有限实例化对象集中检索行.另一方面,Prolog理论上为您提供满足条件的所有可实例化对象.而在Prolog中,您也可以从有限集中检索实体,在SQL中,您无法从理论上无限集中获取所有值.
当你开始使用它们时,我认为有许多不同之处.请记住,由于术语的变化,过去被称为同一事物的事物现在意味着非常不同的事情.
非常广泛的差异概述.
SQL语句针对关系数据库和查询(请求)来自该数据库的数据,对该数据的更改以及结果在语言中准确表达,而在Prolog中,您定义事实,逻辑引擎根据现有数据生成新事实事实.通过评估创建新数据(事实).
它们都使用称为查询的东西(但它们的工作方式完全不同)并且它们都有数据(但使用的方式不同.)
SQL和Prolog的用例也完全不同.在Prolog中存储地址列表永远不会有意义,而这正是SQL的目的.
简单地说,SQL用于访问数据存储,Prolog是表达式求值器.