| tree = dnode(md, sdt), ((abs|(tree, ino0, str ' + p0, ino) * abs(tree[str ' + p0], ino) * D))(dirs), p0 ∈ tree[str '], str ' ∈ tree, ∀ tree, ino0, ino, D, dirs. (((abs|(tree, ino0, p0, ino) * abs(tree[p0], ino)) * D))(dirs) ∧ p0 ∈ tree → ((abs(tree, ino0) * D))(dirs) ⊦ ((abs(tree, ino0) * D))(dirs) |
⊦ 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))
⊦ abs(dnode(md, sdt), ino) = _∃(λ ad. ino => ad * abs(sdt, ad.entries) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ )
ad.size = # ad.entries, (((((abs|(sdt[str], ad.entries[str], p0, ino) * abs(sdt -- str, ad.entries -- str)) * ino0 => ad) * abs(sdt[str][p0], ino)) * D))(dirs), str ∈ ad.entries, p0 ∈ sdt[str], str ∈ sdt, ∀ tree, ino0, ino, D, dirs. (((abs|(tree, ino0, p0, ino) * abs(tree[p0], ino)) * D))(dirs) ∧ p0 ∈ tree → ((abs(tree, ino0) * D))(dirs) ⊦ ∃ ad0. ad0.meta = ad.meta ∧ ad0.size = # ad0.entries ∧ (((ino0 => ad0 * abs(sdt, ad0.entries)) * D))(dirs)
Used simplifier rules: 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));%abs-dnode: ⊦ abs(dnode(md, sdt), ino) = _∃ (λ ad. ino => ad * abs(sdt, ad.entries) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ );% ⊦ ⌜bv⌝ (dirs) ↔ bv; (s)% ⊦ ((D ∧ D0))(dirs) ↔ D(dirs) ∧ D0(dirs); (s)% ⊦ ((_∃ adD * D))(dirs) ↔ (∃ ad. ((adD(ad) * D))(dirs)); (s)% ⊦ str ∈ sdt → dnode(md, sdt)[str ' + p] = sdt[str][p]; (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)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]%str ∈ sdt ⊦ dnode(md, sdt)[str '] = sdt[str]; (s)% ⊦ str ' ∈ dnode(md, sdt) ↔ str ∈ sdt; (s)