| tree = dnode(md, sdt), ((abs(tree, ino0) * D))(dirs), p0 ∈ tree[str '], str ' ∈ tree, ∀ tree, ino0, D, dirs. ((abs(tree, ino0) * D))(dirs) ∧ p0 ∈ tree → (∃ ino. (((abs|(tree, ino0, p0, ino) * abs(tree[p0], ino)) * D))(dirs)) ⊦ ∃ ino. (((abs|(tree, ino0, str ' + p0, ino) * abs(tree[str ' + p0], ino)) * D))(dirs) |
⊦ abs(dnode(md, sdt), ino) = _∃(λ ad. ino => ad * abs(sdt, ad.entries) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ )
⊦ abs|(dnode(md, sdt), ino, str ' + p, ino0) = _∃(λ ad. ino => ad * abs|(sdt, ad.entries, str ' + p, ino0) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ )
⊦ abs|(sdt, entries, str ' + p, ino0) = (⌜str ∈ entries⌝ ∧ abs|(sdt[str], entries[str], p, ino0) * abs(sdt -- str, entries -- str))
⊦ str ∈ sdt ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdi
⊦ str ∈ sdi ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdt
ad.size = # ad.entries, (((ino0 => ad * abs(sdt, ad.entries)) * D))(dirs), str ∈ ad.entries, p0 ∈ sdt[str], str ∈ sdt, ∀ tree, ino0, D, dirs. ((abs(tree, ino0) * D))(dirs) ∧ p0 ∈ tree → (∃ ino. (((abs|(tree, ino0, p0, ino) * abs(tree[p0], ino)) * D))(dirs)) ⊦ ∃ ino, ad0. str ∈ ad0.entries ∧ ad0.meta = ad.meta ∧ ad0.size = # ad0.entries ∧ (((((abs|(sdt[str], ad0.entries[str], p0, ino) * abs(sdt -- str, ad0.entries -- str)) * ino0 => ad0) * abs(sdt[str][p0], ino)) * D))(dirs)
Used simplifier rules: abs-dnode: ⊦ abs(dnode(md, sdt), ino) = _∃ (λ ad. ino => ad * abs(sdt, ad.entries) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ );%absc-dnode-rec: ⊦ abs|(dnode(md, sdt), ino, str ' + p, ino0) = _∃ (λ ad. ino => ad * abs|(sdt, ad.entries, str ' + p, ino0) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ );%absc-entries: ⊦ abs|(sdt, entries, str ' + p, ino0) = ( ⌜str ∈ entries⌝ ∧ abs|(sdt[str], entries[str], p, ino0) * abs(sdt -- str, entries -- str));%entries-dom2: ⊦ str ∈ sdt ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdi;%entries-dom1: ⊦ str ∈ sdi ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdt;% ⊦ str ∈ sdt → dnode(md, sdt)[str ' + p] = sdt[str][p]; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ ⌜bv⌝ (dirs) ↔ bv; (s)% ⊦ ((D ∧ D0))(dirs) ↔ D(dirs) ∧ D0(dirs); (s)%sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap]%sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]%and-com: ⊦ (D ∧ D0) = (D0 ∧ D); from specification heap-sep[dir-heap]%and-ass: ⊦ ((D ∧ D0) ∧ D1) = (D ∧ D0 ∧ D1); from specification heap-sep[dir-heap]% ⊦ (⌜bv⌝ ∧ D) * D0 = (⌜bv⌝ ∧ D * D0); (s)% ⊦ ((_∃ adD * D))(dirs) ↔ (∃ ad. ((adD(ad) * D))(dirs)); (s)%str ∈ sdt ⊦ dnode(md, sdt)[str '] = sdt[str]; (s)% ⊦ str ' ∈ dnode(md, sdt) ↔ str ∈ sdt; (s)