Structral Facts in Datalog: 一种更加理想的Datalog Syntax

什么是Datalog

datalog是一种用于描述形如:
u ⇐ p ∧ q ∧ … ∧ t
的逻辑关系的一种一阶逻辑的声明式查询语言。这种形式的逻辑表达式也被称为Horn Clause。读作:谓词u成立,如果条件p ∧ q ∧ … ∧ t成立。

使用Datalog我们可以比较清晰的表达一些 基于传递闭包的表达式, 比如图。

.decl edge(x:number, y:number)

.decl path(x:number, y:number)
.output

edge(1,2).
edge(2,3).
edge(3,4).
path(x, y) :- edge(x, y).
path(x, y) :- path(x, z), edge(z, y).

其中:-就是, ,就是。edge关系是我们程序的输入,也被称为facts
path(1,4)就可以输出所有1到4之间的路径。
基本的语法就这么简单。 当然大多数的datalog实现都会加入\neg\vee之类的逻辑符号, 当然这其中特别是not和一般理解上的not式不一样。 具体的可以参考Alice书,其中详细介绍了分层取反和普通的取反有什么的区别。 我后面应该也会开一些文章讲这个。 目前我们自己的datalog实现中也正在实现相关的部分。

为什么使用Datalog

因为研究的原因, 我也开始接触一些logic programming 和datalog。Datalog 从分类上来说是属于prolog的一个子集,相当于在prolog上增加了一些限制。这些限制也使得整个语言不再是图灵完备的, 它只能用于描述能够在P时间内停机的问题。但是这种限制也在有一些领域内确能够着实帮上不少忙, 省去了一些证明的功夫。比如数据库,程序分析,条件约束求解。 因为他的规则上有比较多的限制,实际上datalog engine 的实现可以做到速度极其的快, (配合一些高效的数据结构)。 目前主流的datalog engine是logicblox和souffle。当然你可以使用Z3和其他的条件约束求解器去实现相似的效果,但是从benchmark上看差距巨大。

在程序分析的算法中(特别是采用constrain 描述的时候), 很多的时候我们都是对一些句法结构的幂集进行操作, 并且计算他的不动点, 这些算法一定都是能够停机。 而Datalog语言的特点正好能够比较好的适应这一点。目前的程序分析框架也有一些选择了使用Datalog比如Doop。

Datalog的输入Facts

因为最早Datalog是一种给数据库设计的查询语言,所以他写的时候很多思路也是和数据库一样的,比如一个lambda表达式\lambda x.x我们必须想象成每一个组成部分是数据库中的一张表。然后可以用如下的方式来把这个lambda表达式描述成一个Fact。作为我们datalog程序的输入。

.decl formalArg(id: number, name: symbol)
.decl var(id: number, name: symbol)
.decl abstraction(id: number, arg: number, body: number)
var(1, "x").
formalArg(0, "x").
abstraction(2, 0, 1).

在最上层的语法结构lambda abstraction当中我们可以近似的看作arg和body都是两个外键,他们连向两个属于其他relation表。 这就相当于把原本结构化的AST给彻底flatten了。

我们在从AST生成facts的时候也要非常小心这一点。

一种更加理想的输入

flatten的facts很难阅读,同时也不符合AST的直觉。flatten还有一个很大的问题是在于不容易肉眼去看出一些type问题没比如上面的程序中,abstraction(2, 1, 0).依然可以是一个合法的输入,只是可能在后面的计算中推不出有意义的Facts, 但是毕竟人脑不是数据库。。。直接看就很难受。在程序分析中我们会大量的和IR的AST打交道, flatten style会让我们的处理变得不那么直观。在看doop的实现过程中我也感受到了这一点。 一种更加理想的输入facts应当至少是如下的。 使用s-expression来表达AST是一种比较舒服的方式。

(app (lambda (arg "x") (app (var "x") (var "x")))
     (lambda (arg "y") (app (var "y") (var "y"))))

然而目前的Datalog Engine 并没有支持这样的,我的导师和我们团队正在设计的slog会支持这种方式。在slog中我们可以更加舒服的去实现对facts的操作,比如如下是求值的relation。 我觉得会比souffle等其他的主流datalog实现要来的好一些。

;; calculate value
(eval ?(var x) (var x))

(eval ?(lambda x body) (lambda x body))

[(eval ?(app (lambda (arg x) body)
            ar)
      body-p-val)
<--
(eval ar ar-val)
(subst x ar-val body body-p)
(eval body-p body-p-val)]

[(eval ?(app fn ar) (app fn-val ar-val))
<--
(eval fn fn-val)
(eval ar ar-val)]

Reference

Alice Book

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354