2009-12-07 70 views
1
我有在ocaml的转换以下算法中要实现这个算法,我用 Set.Make(String)函子actualy进出问题

2个功能中的任何一个都可以给我在ocaml的percise代码的帮助下对集的算法ocaml的实施意见

这实际上是Algo for Live Variables[PDF] ..Help将大大

for all n, in[n] = out[n] = Ø 
w = { set of all nodes } 
repeat until w empty 
    n = w.pop() 
    out[n] = ∪ n’ ∈ succ [n] in[n’] 
    in[n] = use[n] ∪ (out[n] — def [n]) 
    if change to in[n], 
     for all predecessors m of n, w.push(m) 
end 
+1

集不支持'pop'。您必须首先了解伪代码中的数据结构是否是“w”,然后才能将其转换为Caml。 – 2009-12-07 12:03:41

+0

我知道弹出我将使用队列模块。所有我感到困扰的是逻辑的变形,所以如果你能帮助我将其转化为逻辑,我将会感激 – 2009-12-08 02:26:07

回答

4
for all n, in[n] = out[n] = Ø 
    w = { set of all nodes } 
    repeat until w empty 
    n = w.pop() 
    out[n] = ∪ n’ ∈ succ [n] in[n’] 
    in[n] = use[n] ∪ (out[n] — def [n]) 
    if change to in[n], 
    for all predecessors m of n, w.push(m) 
end 

这是我很难告诉究竟是什么回事赞赏。我认为你的文字有一些对齐问题 - repeat until w empty应该重复下一个5线,对不对?如何进出功能,他们看起来像阵列给我?除了这些不足之外,我会解决一些我遵循的一般规则。

我不得不将C和Fortran算法中的一些数值方法翻译成函数式语言,我对你有一些建议。

0)定义正在使用的数据类型。这将真正帮助你进行下一步(剧透:寻找功能性结构)。一旦你知道了数据类型,你可以更准确地定义你将最终应用的功能结构。

1)寻找功能结构。折叠,递归和地图,以及何时使用它们。例如,for all predecessors m是一个折叠(不确定它是否会折叠树或列表,但无所谓,折叠)。 While循环是一个递归的好地方 - 但不用担心使它成为尾部调用,您可以稍后修改参数以遵守这些要求。不要担心100%纯净。删除足够的不纯的结构(引用或数组)以功能性的方式感受算法。

2)写任何你可以的算法的一部分。将函数留空,添加虚拟值,并只实现你所知道的 - 然后你可以提出更好,更明智的问题。

3)重写它。如果您现在意识到您可以使用列表或设置或通过累加器,您很有可能错过了某些功能性结构或使用了数组或引用。你可能已经定义了一个列表,但后来你意识到你不能随机访问它(对它来说,这会非常不利),或者它需要前后移动(拉链的好地方)。无论哪种方式,当你最终得到它时,你就会知道,而且你的脸上应该有一个巨大的耳朵到耳朵的笑容。