同步流语言中的模块化因果关系与控制流分析
1. 同步流语言中的模块化因果关系
在同步流语言里,对于 rec x = t1 and y = t2 的“值”转换函数等价于:
λ(s1, s2).
let yv = Jt2Kv s2 in
let xv = Jt1Kv s1 in
(xv, yv)
在这两种情形下,Lucid Synchrone 的 rec 可以在目标语言中无需递归地表示,并且这种替代表示显然满足归纳不变式。不过,例如在为函数 λf.λg.rec x = f(y) and y = g(x) 生成代码时,还无法确定会应用哪种情况。由于类型方案是多态的,而生成的代码并非如此,如果该函数后续多次被应用,可能需要两种版本的代码。
在相关工作方面,有许多系统旨在验证递归定义的生产率。与本文介绍的系统最接近的一个系统在相关资料中有描述,它是对 Signal 扩展的高阶函数进行因果分析。据我们所知,尽管两个系统中 pre 的规则非常相似,但相关资料中的递归规则似乎是经典规则(即假设 x : τ 能证明 e : τ 等),这意味着非因果程序必须通过系统外部的附加条件排除。本文系统的新颖之处在于这些条件在类型系统内部表达。没有外部附加条件的好处是可以有主类型,并且类型和类型错误更容易打印。
显式处理依赖图(如 Lustre 或相关资料中所做的)比我们的系统更具表达力,但它不是模块化的。当
超级会员免费看
订阅专栏 解锁全文
2498

被折叠的 条评论
为什么被折叠?



