2009-12-07 2 views
1
나는 밖으로 난에 Set.Make(String) 펑 actualy 사용이 알고리즘을 구현하기 위해 OCaml의에서 다음 너 한테을 변환하는 데 문제가

은 하나가OCaml의 구현 조언

다음 나에게 OCaml의에서 percise 코드 도움을 줄 수있는이 개 기능은

실제로 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

세트는'팝 '을 지원하지 않습니다. Caml로 번역하기 전에 의사 코드에서 어떤 데이터 구조가 'w'인지 먼저 이해해야합니다. –

+0

팝업을 알고 Queue 모듈을 사용할 것입니다. 내가 고민하는 모든 것은 논리의 변환이다. 그래서 내가 논리로 변환하는 것을 도울 수 있다면 감사 할 것이다. –

답변

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) 다시 작성하십시오. 일부 기능적 구성을 놓치거나 배열이나 참조를 사용했을 가능성이 있습니다. 목록 또는 세트를 사용하거나 누적기를 전달할 수 있다는 것을 알았습니다. 당신은 목록을 정의했을지 모르지만, 나중에 무작위로 접근 할 수 없다는 것을 깨닫거나 (잘, 그것은 매우 해로울 것입니다), 또는 앞뒤로 (지퍼를위한 좋은 곳으로) 지나갈 필요가 있습니다. 어쨌든, 마침내 당신이 알게 될 때, 당신은 당신의 얼굴에 거대한 귀에 대고 미소를 지어야합니다.