| ((ino0 => mkdir(# entries, md, m0, m1, entries) * abs(sdt, entries)))(dirs), str ∈ entries, p0 ∈ sdt[str], ∀ tree, ino0, dirs. abs(tree, ino0)(dirs) ∧ p0 ∈ tree → (∃ ino. ((abs(tree[p0], ino) * (abs(tree[p0], ino) -* abs(tree, ino0))))(dirs)), ∃ tree, sdt0. sdt = sdt0[str, tree] ∧ ¬ str ∈ sdt0 ⊦ ∃ ino. (( abs(sdt[str][p0], ino) * (abs(sdt[str][p0], ino) -* _∃(λ ad0. ino0 => ad0 * abs(sdt, ad0.entries) ∧ ⌜ad0.meta = md⌝ ∧ ⌜ad0.size = # ad0.entries⌝ ))) )(dirs) |
⊦ ¬ name ∈ sdt → abs(sdt[name, tree], entries) = (⌜name ∈ entries⌝ ∧ abs(tree, entries[name]) * abs(sdt, entries -- name))
(((abs(tree, entries[str]) * abs(sdt0, entries -- str)) * ino0 => mkdir(# entries, md, m0, m1, entries)))(dirs), p0 ∈ tree, str ∈ entries, ∀ tree, ino0, dirs. abs(tree, ino0)(dirs) ∧ p0 ∈ tree → (∃ ino. ((abs(tree[p0], ino) * (abs(tree[p0], ino) -* abs(tree, ino0))))(dirs)) ⊦ str ∈ sdt0, ∃ ino. (( abs(tree[p0], ino) * ( abs(tree[p0], ino) -* _∃ (λ ad. (⌜str ∈ ad.entries⌝ ∧ (abs(tree, ad.entries[str]) * abs(sdt0, ad.entries -- str)) * ino0 => ad) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ ))) )(dirs)
Used simplifier rules: abs-rec: ⊦ ¬ name ∈ sdt → abs(sdt[name, tree], entries) = ( ⌜name ∈ entries⌝ ∧ abs(tree, entries[name]) * abs(sdt, entries -- name));% ⊦ true(dirs); (s)% ⊦ ⌜true⌝ = true; (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)% ⊦ sdt[str, tree][str] = tree; (s)