【发布时间】:2014-07-31 20:35:09
【问题描述】:
概念
我正在实现一个解释器,它允许用户定义任意 combinators 并将它们应用于任意术语。例如,用户可以通过输入以下组合子定义来定义Church encoding for pairs:
pair a b c → c a b
true a b → a
first a → a true
然后用户可以输入first (pair a b),按照之前定义的规则逐步缩小:
first (pair a b)
→ pair a b true
→ true a b
→ a
也可以定义其他组合符,例如SKI combinator calculus中使用的那些:
S x y z → x z (y z)
K x y → x
I x → x
身份组合子也可以由I → S S K K或I → S K (K K)或I = S K x根据前两个组合子定义。然后可以通过以下方式定义通用iota combinator:
ι x → x S K
这些例子希望能说明我想要做什么。
实施
我正在尝试使用graph reduction 和graph rewriting 系统来实现这一点。设tree 为由
tree = leaf | (tree tree)
这是一棵二叉树,其中节点可以是叶子(终端节点)或由一对子树组成的分支(内部节点)。分支代表一个术语对另一个术语的应用,而叶子代表组合子和参数。设rule 为由
rule = (tree tree)
这对应于将左树转换为右树 (a → b) 的缩减规则。 rules 的列表可以由
rules = rule | (rule rules)
实际上,当评估一个表达式,如pair a b c → c a b时,解释器构造一个(((pair a) b) c)形式的树对应于左侧,一个((c a) b)形式的树对应于右侧,构造一个对应于rule 的两棵树对(其中a,b,c 以某种方式指定为任意参数,不一定是组合符或终结符号),并将这对树附加到列表rules。当归约first (pair a b) 形式的表达式时,解释器构造相应的树(first ((pair a) b)) 并应用归约规则如下:
(first ((pair a) b))
→ (((pair a) b) true)
→ ((true a) b)
→ a
为此,解释器必须对树及其子树执行模式匹配,“移动”组合子和任意参数以构造对应于规则右侧的新树。 C中树结构的示例实现由
给出struct tree_t {
bool is_leaf;
union {
char* symbol;
struct {
tree_t* left;
tree_t* right;
};
};
};
模式匹配函数可以实现为
bool matches(tree_t* pattern, tree_t* replacement) {
if (pattern -> is_leaf && replacement -> is_leaf)
//do stuff, return a boolean
else if (pattern -> is_leaf && replacement -> is_branch)
//do stuff, return a boolean
else if (pattern -> is_branch && replacement -> is_leaf)
//do stuff, return a boolean
else if (pattern -> is_branch && replacement -> is_branch)
return matches(pattern -> left, replacement -> left) && matches(pattern -> right, replacement -> right);
//The above tests for equality recursively by testing for equality in each subtree.
}
但是,我不确定如何实施此过程的重要细节,包括:
- 将输入树与约简规则的 LHS 树匹配。
- 将输入树转换为归约规则的 RHS 树,保留参数(可能是树叶或树枝)并将它们“移动”到适当的位置。
我相信节点上的模式匹配将涉及检查节点的左孩子和右孩子等等,直到到达终端节点。有谁知道在 C 中实现了类似概念并且我可以从中学习的在线程序或教程?通过这种方法解决问题,我是否走上了正确的道路,还是有更简单的方法?
【问题讨论】:
-
您必须沿着 LHS 分支向下走,直到下一个 LHS 不是“应用”节点。然后对存储在 LHS 中的令牌选择一个操作。您可以在此处查看此类实现的示例:sourceforge.net/projects/dslengine
标签: functional-programming binary-tree interpreter combinators combinatory-logic