有限域的有限图模型替换。我要么模拟对具有无限域的替换的操作,要么找到一种合适的方式来表示具有无限域的替换。例如,考虑对替换的限制操作:
因为限制操作适用于可能无限集中的所有变量,所以像有限映射这样的数据类型不能“期待”在添加新绑定时预期限制。当然,使用具有无限域的有限映射会导致不确定。有没有办法模拟诸如使用有限映射的限制之类的操作,或者是否允许人们轻易地对它们进行限制等操作的替换表示?我觉得我忽略了一个明显的解决方案 - 例如,利用懒惰的评估或功能替代。
修改
供参考,这是一个使用有限图的天真解决方案。每次限制操作应用于替换σ和表达式e时,找到 e 的自由变量的集合FV( e )。对于σ域中的每个变量x n ,如果x n ∈FV( e )则设置σ'(x n )= x n 。返回σ'。如果x n ∉om(σ'),假设σ'(x n )= x n 。
编辑:这是我忽略的明显解决方案。
答案 0 :(得分:4)
嗯,最直接的替换模型本身就是一个函数。
newtype Subst = Subst { apply :: Var -> Expr }
singleton :: Var -> Expr -> Subst
singleton v e = Subst (\v' -> if v == v' then e else Var v')
-- etc.
对于实施语言的第一步,这可能是有限地图崩溃时我会使用的。它并不快(当n是域的大小时需要O(n)时间),但它很简单。保持封装,以便以后更换。
如果你开始被O(n)时间击中,那么你可以切换到特里。 data-inttrie被专门编写为行为就像整数上的函数一样,但允许在单个点进行有效修改(正如人们希望用替换函数)。如果你的变量由整数唯一标识,你可以直接使用它,否则你可以模拟字符串的样式或你正在使用的任何东西。
但对我来说,你需要“向前看”似乎也很奇怪。在我的语言实现中,我从未需要这个;如果你向一个受限制的替换添加一个新的绑定,那么不的限制是否适用于新的绑定(如果确实如此,那么语义将是错误的)。有限的地图已经完成了所有情况下的技巧,当我没有做一些非常奇怪的事情时(那些通常不会出来)。