Рекомендации по реализации Ocaml для алгоритма на множествах - PullRequest
1 голос
/ 07 декабря 2009

У меня проблемы с преобразованием следующего алгоритма в ocaml. Для реализации этого алгоритма я использовал Set.Make(String) Функтор, в действительности, есть и две функции. Может ли кто-нибудь дать мне помощь в коде percise в ocaml для следующего

Это на самом деле Алгоритм для живых переменных [PDF] ..Помощь будет принята с благодарностью

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 Ответ

4 голосов
/ 08 декабря 2009
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 строк, верно? А как функции in и out выглядят для меня как массивы? Помимо этих недостатков, я рассмотрю некоторые общие правила, которым я следовал.

Мне пришлось перевести ряд численных методов в алгоритмах C и Fortran на функциональные языки, и у меня есть несколько советов для вас.

0) Определите используемые типы данных. Это действительно поможет вам в следующем шаге (спойлер: поиск функциональных конструкций). Зная типы данных, вы сможете более точно определить функциональные конструкции, которые вы в конечном итоге примените.

1) Ищите функциональные конструкции. фолд, рекурсия и карты, и когда их использовать. Например, for all predecessors m - это сгиб (не уверен, что он будет сгибаться по дереву или списку, но, тем не менее, сгиб). Циклы While являются хорошим местом для рекурсии - но не беспокойтесь о том, чтобы сделать это хвостовым вызовом, вы можете изменить параметры позже, чтобы соответствовать этим требованиям. Не беспокойтесь о чистоте на 100%. Удалите достаточно нечистых конструкций (ссылок или массивов), чтобы получить представление о алгоритме функциональным образом.

2) Напишите любую часть алгоритма, которую вы можете. Оставьте функции пустыми, добавьте фиктивные значения и просто реализуйте то, что знаете, - тогда вы сможете задавать ТАК более качественные, более информированные вопросы.

3) Переписать это. Есть большая вероятность, что вы пропустили некоторые функциональные конструкции или использовали массив или ссылку, где теперь вы понимаете, что можете использовать список или набор или передавая аккумулятор. Возможно, вы определили список, но позже вы понимаете, что не можете получить к нему произвольный доступ (ну, это было бы довольно вредно), или его нужно перемещать вперед и назад (хорошее место для молнии). В любом случае, когда вы, наконец, получите это, вы будете знать, и у вас должна быть огромная ухабистая улыбка на лице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...