Чтобы указать, что свойство 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
для каждого дерева с высокой глубиной. Если вам действительно нужно рассматривать бесконечно-глубинные (например, круговые деревья), вам нужна монетация.
Вы имеете в виду «Складные» и «Траверсируемые»? Используя '-XDeriveFunctor',' DeriveFoldable', 'DeriveTraversable' и' import Data.Foldable' и 'import Data.Traversable', вы можете' выводить (Functor, Foldable, Traversable) 'на' RoseTree', чтобы получить общую 'fold' и «пройти» для него. – bheklilr
Спасибо. Я действительно задавался вопросом о структурах (как описано в http://en.wikipedia.org/wiki/Structural_induction), вместо того, чтобы делать что-либо с самими деревьями. –
@RichAshworth Я нахожу ваш вопрос непонятным. Если вам не интересно объявлять экземпляр 'Foldable' или' Traversable' для вашего дерева, и все, что вам нужно, - это рассуждать о (абстрактной) структуре данных, зачем показывать его реализацию Haskell? – Jubobs