---
title: Rose-Tree
---
```racket=
(define-type (tree 'a)
(leaf)
(node [elem : 'a]
[left : (tree 'a)]
[right : (tree 'a)]))
(define (flatten-aux [t : (tree 'a)] [l : (Listof 'a)]) : (Listof 'a)
(type-case (tree 'a) t
[(leaf) l]
[(node e t1 t2)
(flatten-aux t1
(cons e (flatten-aux t2 l)))]))
(define (flatten [t : (tree 'a)])
(flatten-aux t '[]))
(define-type (rose-tree 'a)
(rose-node [elem : 'a]
[children : (Listof (rose-tree 'a))]))
```
1) Sformuluj zasade indukcji strukturalnej dla typu danych rose-tree
2) Udowodnij ze
(∀ T : Type),
(∀ t : tree T),
(∀ l : Listof T),
(flatten-aux t l) ≡ (append (flatten-aux t '[]) l)
3) Udowodnij prawo fuzji dla foldr'a tzn
(∀ A : Type),
(∀ B : Type),
(∀ C : Type),
(∀ f : B -> C),
(∀ g : A -> B -> B),
(∀ h : A -> C -> C),
(∀ b : B)
[(f (g x y)) ≡ (h x (f y))] =>
[(∀ xs : Listof A) (f (foldr g b xs)) ≡ (foldr h (f b) xs)]
1.
Niech P bedzie wlasnosc RoseTree, a Q wlasnoscia list drzew t.ze
- ∀ x mamy P((elem))
- ∀ wartosci xs, jesli zachodzi Q(xs) dla dowolnej listy xs ⟹ P((children xs))
- zachodzi Q(empty)
- Dla dowolnych t ts jesli P(t) ∧ Q(ts) ⟹ Q(cons t ts)
2. Udowodnij ze
(∀ T : Type),
(∀ t : tree T),
(∀ l : Listof T),
(flatten-aux t l) ≡ (append (flatten-aux t '[]) l)
#### P(t) := (flatten-aux t l) ≡ (append (flatten-aux t '[]) l)
Niech P bedzie dla typy Tree:
Niech P bedzie wlasnoscia drzew t.ze:
- P((leaf))
- Dla dowolnych wartosci l x r, jesli P(l) i P(r), to P((node l x r))
Wowczas zachodzi P(t) dla ∀ t
Baza:
P((leaf))
L = (flatten-aux (leaf) l) = l
P = (append (flatten-aux (leaf) '[]) l) = (append '() l) = l
L $\equiv$ P
Krok ind.
Zalozenie:
IHt1 : $\forall$ l : (flatten-aux t1 l) ≡ (append (flatten-aux t1 '[]) l)
IHt2 : $\forall$ l : (flatten-aux t2 l) ≡ (append (flatten-aux t2 '[]) l)
Teza: Dla każdej listy l: P((node t1 x t2))
D-d:
Biorę dowolną liste l
P((node t1 x t2)) = (flatten-aux (node t1 x t2) l) ≡ (append (flatten-aux (node t1 x t2) '[]) l)
L = (flatten-aux (node t1 x t2) l) ≡
≡ (flatten-aux t1 (cons x (flatten-aux t2 l))) ≡ IHt1
≡ (append (flatten-aux t1 null) (cons x (flatten-aux t2 l))) = IHt2
≡ (append (flatten-aux t1 null) (cons x (append (flatten-aux t2 null) l)))
P = (append (flatten-aux (node t1 x t2) '[]) l)
≡ (append (flatten-aux t1 (cons x (flatten-aux t2 '[]))) l) ≡ (z lematu Magic)
≡ (append (flatten-aux t1 null) (append (cons x (flatten-aux t2 null)) l)) (z def append'aa)
≡ (append (flatten-aux t1 null) (cons x (append (flatten-aux t2 null) l))) ≡ L
Lemat Magic:
H := (flatten-aux t1 (cons x (flatten-aux t2 '[])))
= (append (flatten-aux t1 null) (cons x (flatten-aux t2 null)))
Korzystając z IHt1 (widać)