Logica:现代逻辑编程

2021-04-14 18:55:47

我们呈现Logica,这是一种新颖的开源逻辑编程语言。 Yedalog的继任者(谷歌早些时候在谷歌开发的语言)是一种类似数据记录逻辑编程语言。 Logica代码编译为SQL并在Google BueQuery上运行(对于PostgreSQL和SQLite的实验支持),但它更简洁并支持SQL缺乏的清洁和可重复使用的抽象机制。它支持模块和导入,它可以从交互式Python笔记本使用,它甚至可以通过自然和简单地测试您的查询。他们说,“数据是新的油”,并且SQL是迄今为止与数据一起使用的语言弗朗卡。当SQL(或“结构化英国查询语言”时,它在第一个名为第一个名为20世纪70年代而发明的时候,其作者可能无法想象它将达到半个世纪以后的人气。如今,系统从小型智能手表应用程序到企业IT解决方案,使用SQL读取和写入数据。即使是您使用的浏览器,现在可以阅读此帖子可能具有其内置的SQL数据库。尽管采用了广泛的采用,但SQL并非完美。构建英语单词的长链(通常资本化以保持70年代的老式COBOL Spirity的陈述!)可以非常详细 - 跨越数百行的单个查询是常规发生。但是,SQL的主要缺陷位于其对抽象的非常有限的支持下。良好的编程是创建可以测试的小型,可理解的可重复使用的逻辑逻辑,该逻辑可以被测试,给定名称,并组织成稍后可以用于构造更有用的逻辑的包。 SQL抵制此工作流程。虽然您可以将某些重复计算封装到视图和功能中,但是对实现的语法和支持可能会有所不同,但程序包和导入的概念通常是不存在的,而且更高级别的构造(例如,将函数传递给函数)是不可能的。这种固有的抵抗逻辑分解成咬合尺寸的块是导致了重要的,冗长的查询,副本粘贴的代码块,最终,不知情,联合国结构化(注意讽刺)SQL CodeBases。为了使事情更糟糕,SQL代码很少测试,因为“测试SQL查询”听起来与大多数工程师的声音相当疏远。因此,已经开发了许多替代查询语言和库。其中,基于逻辑编程的系统可能最接近解决SQL的限制。逻辑编程语言通过使用数学命题逻辑而不是自然语语言的语法来解决SQL的问题。正式逻辑的语言是由数学家设计的,专门制作复杂陈述的表达更容易,并且适合这个目的比自然语言更好。 Logica进一步扩展了古典逻辑编程语法,最特别是聚合,因此名称,它代表让我们看看它是如何工作的。 SQL与关系运行,这是一组行。在逻辑编程中,关系的模拟是谓词。虽然谓词是一系列行,但我们认为它是逻辑条件,它描述了关系的行。这里是一个简单谓词的定义:定义声明条件MagicNumber(x)必须按住x,当x正是2,3或5时必须保持。这意味着,如果我们要查询此谓词(即请求满足它的X的所有值),输出应该是单个列x和行2,3和5的“关系”。SQL等价物将是:

不是列出单个值,我们可以通过在x上编码逻辑条件来定义谓词,如下所示:

现在,这是魔法开始的地方。首先,数据库中的任何表都已经是谓词,因此以下定义:

定义谓词的MagicComment,它确切地说是那些注释_Text值,它存在于评论表中,其中user_id == 5.在SQL中,这将读取:

如果我们用MagicNumber中的谓词替换“user_id == 5”,请遵守会发生什么(x:user_id):

在这里,我们查询其ID是我们刚刚定义的“魔号”之一的用户的评论。请注意我们如何轻松地重复使用先前定义的代码,而无需复制任何内容。我们现在可以将MagicNumber解压缩到公共模块并在需要它的地方导入它:

作为最后的示例,让我们在一个uniftest的查询中嘲笑评论表。

如果我们在此查询MagicComment谓词,则不会尝试阅读数据库中的注释表。相反,它将使用我们刚定的谓词,从而让我们通过测试输出来验证其正确性(它必须包含两行“逻辑”和“编程”)。观察许多良好的编程实践的自然和摩擦力如何成为Logica,并将其与您必须做的事情进行比较,以实现使用裸机的达到相同的方式。

Logica还有更多的东西,所以请确保你给它一个尝试,你会喜欢它!从本教程开始学习Logica。即使您在下一个项目中没有结束使用它,也会学习一种新的强大语言,可能会向一般数据处理和计算的新想法和观点敞开心扉。上面的简单示例仅是一个小型样本,即如何在复杂查询中逐渐超过SQL。特别是,我们甚至没有触及本文中的聚合主题。对于所有此此,请参阅Logica开源存储库的示例部分。我们也希望有些读者考虑为Logica开发提供贡献。这就是开源是什么!由Konstantin Trettyakov和Evgeny Skvortsov - Logica开源项目