Представление кода алгебраически

У меня есть много маленьких алгоритмов, которые я хотел бы описать в газете. Они относительно коротки, и кратки. Однако вместо того, чтобы писать им в псевдокоде (а-ля Cormen или даже Knuth), я хотел бы записать алгебраическое представление их (больше линейного и лучшего ЛАТЕКСНОГО рендеринга). Однако я не могу найти ресурсы относительно лучшей нотации для этого, если существует что-нибудь: например, как я представляю цикл? Если? Добавление кортежа к списку?

Какой-либо из Вас встретился с этой проблемой и так или иначе решил ее?

Спасибо.

Править: Спасибо, люди. Я думаю, что сделал плохое задание при формулировке вопроса. Здесь идет снова, надеясь, что я делаю это более ясным: какова общая нотация для разговора о циклах и если затем пункты в математической нотации? Например, я могу использовать $acc \leftarrow acc \cup \langle i,i+1 \rangle$ представить "добавить" метод списка.

5
задан Dervin Thunk 28 January 2010 в 20:06
поделиться

8 ответов

Я вижу, если-выражения в математическом обозначении довольно часто. Обычная вещь для цикла является соотношение рецидивов или эквивалентно, функция определена рекурсивно.

Вот как функция функция Ackermann определяется в Wikipedia, например:

A(m, n) = n+1 if m=0; A(m-1, 1) if m>0 and n=0; and A(m-1, A(m, n-1)) if m>0 and n>0.

эта картина приглашается, потому что оно чувствует математическую в аромате, и все же вы могли бы явно вводить его почти точно так же, как написано и имеют выполнение. Не всегда возможно достичь этого.

Другие математические обозначения, которые соответствуют петлям, включают σ-нотацию для суммирования и Обозначение установленного строителя .

Я надеюсь, что это отвечает на ваш вопрос! Но если ваша цель - описать, как что-то сделано и у кого-то понимают, я думаю, что это, вероятно, ошибка предположить, что математики предпочли бы видеть уравнения. Я не думаю, что они взаимозаменяемые инструменты (несмотря на то, что вытесняет эквивалентность). Если ваш алгоритм включает в себя союзные структуры данных, процедурный код, вероятно, будет лучше, чем уравнения для объяснения его.

7
ответ дан 18 December 2019 в 07:54
поделиться

Я скопирую кнуту. Немногие знают, как общаться лучше, чем он в настройке компьютерных наук.

2
ответ дан 18 December 2019 в 07:54
поделиться

Вы можете взглянуть на Haskell. Haskell Formatats Хорошо в LaTex, имеет хороший алгебраический синтаксис, и вы даже можете компилировать файл латекса с Haskell в нем, при условии, что код завернут в \ Begin {Code} и \ end {код } . Смотрите здесь: http://www.haskell.org/haskellwiki/literate_programming . Вероятно, есть грамотные инструменты программирования для других языков.

1
ответ дан 18 December 2019 в 07:54
поделиться

Могу ли я предложить: проект mono и Монодевосло как бесплатная альтернатива Visual Studio. Вы можете запустить монодепов на Windows, Mac и Linux!

-121--4096783-

Lisp начался как математическая обозначение вычислительной модели, чтобы преподаватель был бы лучшим инструментом, чем Turgines Machines. Оказывается, оказывается, что он может быть реализован в сборке - таким образом, Lisp, язык программирования родился.

Но я не думаю, что это действительно то, что вы ищете, поскольку вычислительная модель, которую Lisp описывает, не имеет петлей: вместо этого используется рекурсия. Синтаксис получает от алгебры, где брекеты обозначают оценку - это и заменитель - результат. Действительно, модель вычислений Лисски в основном замена - какая алгебра по существу.

Действительно, большинство функциональных языков, таких как Lisp, Haskell и Erlang, получены из математики. Haskell на самом деле является результатом доказательства того, что лямбда-исчисление может использоваться для реализации систем типа. Таким образом, Haskell, как Лисс родился из чистой математики. Но опять же, синтаксис не то, к чему вы, вероятно, привыкли.

Вы, безусловно, можете объяснить синтаксис Lisp и Haskell к математикам, и они будут относиться к нему как «игра». Языковые конструкции, такие как петли, рекурсия и условные условия, могут быть доказаны из правил игры, а не вслепую, как на других языках. Это приведет вас к сферам комбинационеры, другой отделения математики. Действительно, в комбинатине, даже концепция чисел может быть извлечена из правил игры, а не в родной части языка (церковные цифры Google).

Так что посмотрите на Lisp / схему, Erlang и Haskell, если хотите. Erlang особенно имеет синтаксис рядом с тем, что вы хотите:

add(a,b) -> a + b

, но моя рекомендация - писать в C-похожий псевдокод. Это своего рода самый низкий общий знаменатель в языках программирования. Имеет синтаксис, который довольно легко понять и чистить. И функциональный синтаксис даже вытекает из функций в математике. Помните f (x) ?

Как плюс математики используются для написания C, статистики используются для записи C (хотя обычно они предпочитают R), используются физики для записи C, программисты используются по крайней мере, глядя на C (я знаю несколько, кто никогда не трогал в).

На самом деле, царапать это. Вы упоминаете, что ваша целевая аудитория статистики. Написать в R

1
ответ дан 18 December 2019 в 07:54
поделиться

APL ? Единственная проблема в том, что немногие люди могут прочитать его.

-1
ответ дан 18 December 2019 в 07:54
поделиться

Что-то вроде этого сайт описывает?

0
ответ дан 18 December 2019 в 07:54
поделиться

Версия генератора нерекурсивного решения @ unutbu, запрошенная @ Andrew в комментарии:

def genflat(l, ltypes=collections.Sequence):
    l = list(l)
    i = 0
    while i < len(l):
        while isinstance(l[i], ltypes):
            if not l[i]:
                l.pop(i)
                i -= 1
                break
            else:
                l[i:i + 1] = l[i]
        yield l[i]
        i += 1

немного упрощенная версия этого генератора:

def genflat(l, ltypes=collections.Sequence):
    l = list(l)
    while l:
        while l and isinstance(l[0], ltypes):
            l[0:1] = l[0]
        if l: yield l.pop(0)
-121--1810323-

Simple Regex:

\w +

Это соответствует последовательности символов «word». Это почти то, что вы хотите.

Это несколько более точно:

\w (? < !\d) [\w '-] *

Он соответствует любому количеству символов слова, гарантируя, что первый символ не является цифрой.

Вот мои совпадения:

1 ЛОЛОЛОЛ
2 ВЫ
3 БЫЛО
4 PWN3D
5 einszwei
6 drei

Это больше похоже на это.

EDIT:
Причина отрицательного обзора заключается в том, что некоторые ароматизаторы regex поддерживают символы Юникода. При использовании [a-zA-Z] будет пропущено несколько желательных символов «слова». Разрешение \w и запрет \d включает в себя все символы Юникода, которые могли бы начать слово в любом блоке текста.

EDIT 2:
Я нашел более сжатый способ получить эффект отрицательного lookbehind: Double negative character class с единственным отрицательным исключением.

[^\W\d] [\w '-] * (? < =\w)

Это то же самое, что и выше, за исключением того, что это также гарантирует, что слово заканчивается символом слова. И, наконец, есть:

[^\W\d] (\w | [- '] {1,2} (? =\w)) *

Обеспечение наличия не более двух несловосочетаний в строке. Она совпадает со словами, но не со словами, что имеет смысл. Если вы хотите, чтобы он соответствовал «word--up», но не «word---up», вы можете изменить 2 на 3 .

-121--2669374-

Символ для общих контуров не существует; обычно используется оператор суммирования . «if» представляется с помощью последствий , и для «добавления кортежа в список» используется объединение .

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

Подумайте об этом: когда вы читаете математический учебник по алгоритму Евклида для GCD, или сито Эратосфена, как это написано? Обычно сам алгоритм находится в прозе, в то время как доказательством алгоритма является то, где лежат математические символы.

2
ответ дан 18 December 2019 в 07:54
поделиться

Не делайте этого. Вы отклоняетесь от того, что люди ожидают увидеть, когда они читают газету о алгоритмах. Вы должны следовать ожидаемым практикам; Ваши идеи с большей вероятностью привлеките внимание, что они заслуживают. Когда в Риме делают как римляне.

Код форматирования (или псевдокод, как это может быть) в латексированной бумаге очень легко. См., Например, код форматирования в LaTex .

8
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: