| ((abs(tree, ino) * abs(sdt0, entries0) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])))(dirs2 ∪ dirs ∪ dirs1), ((ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]) * abs(sdt0, entries0)))(dirs1), ((abs(tree[p0], ino1) -* abs(tree, ino)))(dirs), abs(tree, ino)(dirs2 ∪ dirs), abs(tree[p0], ino1)(dirs2), abs(tree[p0], ino1)(dirs0), p0 ∈ tree, dirs1 ⊥ dirs2, dirs2 ⊥ dirs, dirs1 ⊥ dirs, dirs0 ⊥ dirs ∪ dirs1 ⊦ str ∈ entries0, str ∈ sdt0, str ∈ mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).entries ∧ (( ( abs(tree, mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).entries[str]) * abs(sdt0, mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).entries -- str)) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])) )(dirs0 ∪ dirs ∪ dirs1) ∧ mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).meta = md ∧ mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).size = # mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]).entries |
⊦ ((abs(sdt, sdi) * D))(dirs) ∧ ¬ str ∈ sdt → sdi -- str = sdi
((ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]) * abs(sdt0, entries0)))(dirs1), ((abs(tree, ino) * abs(sdt0, entries0) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])))(dirs2 ∪ dirs ∪ dirs1), ((abs(tree[p0], ino1) -* abs(tree, ino)))(dirs), abs(tree[p0], ino1)(dirs0), abs(tree[p0], ino1)(dirs2), abs(tree, ino)(dirs2 ∪ dirs), p0 ∈ tree, dirs0 ⊥ dirs ∪ dirs1, dirs1 ⊥ dirs, dirs2 ⊥ dirs, dirs1 ⊥ dirs2 ⊦ (((abs(tree, ino) * abs(sdt0, entries0)) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])))(dirs0 ∪ dirs ∪ dirs1), str ∈ sdt0, str ∈ entries0
Used simplifier rules: entries-del: ⊦ ((abs(sdt, sdi) * D))(dirs) ∧ ¬ str ∈ sdt → sdi -- str = sdi;%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ ¬ str ∈ entries → # entries[str, ino] = # entries + 1; (s)% ⊦ mkdir(m, md, m0, m1, entries).size = m; (s)% ⊦ mkdir(m, md, m0, m1, entries).meta = md; (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]% ⊦ entries[str, ino] -- str = entries -- str; (s)% ⊦ entries[str, ino][str] = ino; (s)% ⊦ str ∈ entries[str, ino]; (s)% ⊦ mkdir(m, md, m0, m1, entries).entries = entries; (s)