2015-03-24 2 views
2

Так как многоходовых дерева может быть определена как рекурсивный тип:структурной индукция для многоходовых (Rose) дерев

data RoseTree a = Node {leaf :: a, subTrees :: [RoseTree a]} 

является ли соответствующим принципом для осуществления структурной индукции по этому типу?

+1

Вы имеете в виду «Складные» и «Траверсируемые»? Используя '-XDeriveFunctor',' DeriveFoldable', 'DeriveTraversable' и' import Data.Foldable' и 'import Data.Traversable', вы можете' выводить (Functor, Foldable, Traversable) 'на' RoseTree', чтобы получить общую 'fold' и «пройти» для него. – bheklilr

+0

Спасибо. Я действительно задавался вопросом о структурах (как описано в http://en.wikipedia.org/wiki/Structural_induction), вместо того, чтобы делать что-либо с самими деревьями. –

+0

@RichAshworth Я нахожу ваш вопрос непонятным. Если вам не интересно объявлять экземпляр 'Foldable' или' Traversable' для вашего дерева, и все, что вам нужно, - это рассуждать о (абстрактной) структуре данных, зачем показывать его реализацию Haskell? – Jubobs

ответ

3

Чтобы указать, что свойство P справедливо для всех (*) выросли деревья, вы должны доказать, что

  • если l :: [RoseTree] список розовых деревьев, элементы которых удовлетворяют P и x :: a произвольно, то Note x l удовлетворяет P

часть о P холдинга на элементах l является гипотеза индукции, которую вы можете использовать, чтобы доказать P(Node x l).

Здесь нет явного базового аргумента: это потому, что нет явного конструктора базового аргумента. Тем не менее, Node x [] действует как неявный базовый регистр для деревьев, и действительно, когда l пуст, мы получаем неявный базовый случай для индукции. Конкретно, гипотеза «все элементы l удовлетворяют P» становится незаменимой, когда l пуст, поэтому мы получаем P(Node x []) из принципа индукции выше.

(*) Точнее, этот принцип доказывает P для каждого дерева с высокой глубиной. Если вам действительно нужно рассматривать бесконечно-глубинные (например, круговые деревья), вам нужна монетация.

+0

Не могли бы вы указать мне на объяснение монеты? Или объясните сами? – dfeuer

+0

@dfeuer Тема довольно широкая. Чтобы получить обзор, вы можете проверить википедию на это, corecursion, (Knaster-) теорему Тарского, наибольшие неподвижные точки и конечные коалгебры. Кроме того, односторонность между процессами в алгебре процессов является типичным понятием, которое включает доказательства путем coinduction. В конкретном контексте функционального программирования и codata, я думаю, его можно использовать, но я не могу указать на типичный пример. – chi

+1

@dfeuer Блестящая бумага Энди 1994 года - это каноническая ссылка на совместную индукцию в FP, и она очень читаема: http://marcellodesales-cs-research.googlecode.com/svn/trunk/ms-cs-ufcg-brazil /functional-programming/docs/gordon94tutorial.pdf Обратите внимание, что в контексте Haskell это в основном сводится к доказательству P (нижнего), поскольку данные и кодовые данные в Haskell одинаковы. –