| Type | Arity |
|---|---|
| fmaptree | 2 |
| Constant | Type |
| FTNode | :β -> (α |-> (α, β) fmaptree) -> (α, β) fmaptree |
| apply_path | :α list -> (α, β) fmaptree -> (α, β) fmaptree option |
| construct | :α -> (β |-> (β list -> α option)) -> β list -> α option |
| fmtreerec | :(β -> (γ |-> α) -> (γ |-> (γ, β) fmaptree) -> α) -> (γ, β) fmaptree -> α |
| fromF | :('key list -> 'value option) -> ('key, 'value) fmaptree |
| fupd_at_path | :α list -> ((α, β) fmaptree -> (α, β) fmaptree option) -> (α, β) fmaptree -> (α, β) fmaptree option |
| item | :(α, β) fmaptree -> β |
| map | :(α, β) fmaptree -> (α |-> (α, β) fmaptree) |
| relrec | :(α -> (β |-> γ) -> (β |-> (β, α) fmaptree) -> γ) -> (β, α) fmaptree -> γ -> bool |
| toF | :('key, 'value) fmaptree -> 'key list -> 'value option |
| update_at_path | :α list -> β -> (α, β) fmaptree -> (α, β) fmaptree option |
| wf | :(β list -> α option) -> bool |
⊢ ∀a kfm kl.
construct a kfm kl =
case kl of
[] => SOME a
| h::t => if h ∈ FDOM kfm then kfm ' h t else NONE
⊢ wf =
(λa0.
∀wf'.
(∀a0.
(∃a fm. a0 = construct a fm ∧ ∀k. k ∈ FDOM fm ⇒ wf' (fm ' k)) ⇒
wf' a0) ⇒
wf' a0)
⊢ ∃rep. TYPE_DEFINITION wf rep
⊢ (∀a. fromF (toF a) = a) ∧ ∀r. wf r ⇔ toF (fromF r) = r
⊢ ∀i fm. FTNode i fm = fromF (construct i (toF o_f fm))
⊢ ∀ft. ft = FTNode (item ft) (map ft)
⊢ (∀ft. apply_path [] ft = SOME ft) ∧
∀h t ft.
apply_path (h::t) ft =
if h ∈ FDOM (map ft) then apply_path t (map ft ' h) else NONE
⊢ (∀a ft. update_at_path [] a ft = SOME (FTNode a (map ft))) ∧
∀h t a ft.
update_at_path (h::t) a ft =
if h ∈ FDOM (map ft) then
case update_at_path t a (map ft ' h) of
NONE => NONE
| SOME ft' => SOME (FTNode (item ft) (map ft |+ (h,ft'))) else NONE
⊢ (∀f ft. fupd_at_path [] f ft = f ft) ∧
∀h t f ft.
fupd_at_path (h::t) f ft =
if h ∈ FDOM (map ft) then
case fupd_at_path t f (map ft ' h) of
NONE => NONE
| SOME ft' => SOME (FTNode (item ft) (map ft |+ (h,ft'))) else NONE
⊢ relrec =
(λh a0 a1.
∀relrec'.
(∀a0 a1.
(∃i fm rfm.
a0 = FTNode i fm ∧ a1 = h i rfm fm ∧ FDOM rfm = FDOM fm ∧
∀d. d ∈ FDOM fm ⇒ relrec' (fm ' d) (rfm ' d)) ⇒
relrec' a0 a1) ⇒
relrec' a0 a1)
⊢ ∀h ft. fmtreerec h ft = @r. relrec h ft r
⊢ ∀a fm. (∀k. k ∈ FDOM fm ⇒ wf (fm ' k)) ⇒ wf (construct a fm)
⊢ ∀wf'.
(∀a fm. (∀k. k ∈ FDOM fm ⇒ wf' (fm ' k)) ⇒ wf' (construct a fm)) ⇒
∀a0. wf a0 ⇒ wf' a0
⊢ ∀wf'.
(∀a fm.
(∀k. k ∈ FDOM fm ⇒ wf (fm ' k) ∧ wf' (fm ' k)) ⇒
wf' (construct a fm)) ⇒
∀a0. wf a0 ⇒ wf' a0
⊢ ∀a0. wf a0 ⇔ ∃a fm. a0 = construct a fm ∧ ∀k. k ∈ FDOM fm ⇒ wf (fm ' k)
⊢ FTNode i1 f1 = FTNode i2 f2 ⇔ i1 = i2 ∧ f1 = f2
⊢ ∀ft. ∃i fm. ft = FTNode i fm
⊢ item (FTNode i fm) = i
⊢ map (FTNode i fm) = fm
⊢ ∀P. (∀a fm. (∀k. k ∈ FDOM fm ⇒ P (fm ' k)) ⇒ P (FTNode a fm)) ⇒ ∀ft. P ft
⊢ ∀ft. FINITE {p | ∃ft'. apply_path p ft = SOME ft'}
⊢ ∀ft x p.
apply_path (p ++ [x]) ft =
case apply_path p ft of NONE => NONE | SOME ft' => FLOOKUP (map ft') x
⊢ ∀h i fm rfm.
FDOM rfm = FDOM fm ∧ (∀d. d ∈ FDOM fm ⇒ relrec h (fm ' d) (rfm ' d)) ⇒
relrec h (FTNode i fm) (h i rfm fm)
⊢ ∀h relrec'.
(∀i fm rfm.
FDOM rfm = FDOM fm ∧ (∀d. d ∈ FDOM fm ⇒ relrec' (fm ' d) (rfm ' d)) ⇒
relrec' (FTNode i fm) (h i rfm fm)) ⇒
∀a0 a1. relrec h a0 a1 ⇒ relrec' a0 a1
⊢ ∀h relrec'.
(∀i fm rfm.
FDOM rfm = FDOM fm ∧
(∀d.
d ∈ FDOM fm ⇒
relrec h (fm ' d) (rfm ' d) ∧ relrec' (fm ' d) (rfm ' d)) ⇒
relrec' (FTNode i fm) (h i rfm fm)) ⇒
∀a0 a1. relrec h a0 a1 ⇒ relrec' a0 a1
⊢ ∀h a0 a1.
relrec h a0 a1 ⇔
∃i fm rfm.
a0 = FTNode i fm ∧ a1 = h i rfm fm ∧ FDOM rfm = FDOM fm ∧
∀d. d ∈ FDOM fm ⇒ relrec h (fm ' d) (rfm ' d)
⊢ fmtreerec h (FTNode i fm) = h i (fmtreerec h o_f fm) fm
⊢ ∀h. ∃f. ∀i fm. f (FTNode i fm) = h i fm (f o_f fm)