| dirs[p_ino] = mkdir(m, md, n0, n1, entries), p_ino ∈ dirs, str0 ∈ (subdirs(p_ino, dirs) \ (str ∈ entries ∧ entries[str] ∈ dirs ⊃ ∅ ++ str;∅)) ∪ (ino ∈ dirs ⊃ ∅ ++ str;∅), str ∈ entries, entries[str] ∈ dirs ⊦ #(subdirs(p_ino, dirs) \ (∅ ++ str)) = 0, subdirs(p_ino, dirs) \ (str ∈ entries ∧ entries[str] ∈ dirs ⊃ ∅ ++ str;∅) = ∅, str0 = str, str0 ∈ (ino ∈ dirs ⊃ subdirs(p_ino, dirs) ++ str;(str ∈ entries ∧ entries[str] ∈ dirs ⊃ subdirs(p_ino, dirs) -- str;subdirs(p_ino, dirs))) |
dirs[p_ino] = mkdir(m, md, n0, n1, entries), str0 ∈ (subdirs(p_ino, dirs) -- str) ∪ (ino ∈ dirs ⊃ ∅ ++ str;∅), str ∈ entries, entries[str] ∈ dirs, p_ino ∈ dirs ⊦ # subdirs(p_ino, dirs) = 0, #(subdirs(p_ino, dirs) -- str) = 0, str0 = str, subdirs(p_ino, dirs) = ∅ ++ str, subdirs(p_ino, dirs) = ∅, str0 ∈ (ino ∈ dirs ⊃ subdirs(p_ino, dirs) ++ str;subdirs(p_ino, dirs) -- str)
Used simplifier rules: subdirs: ⊦ str ∈ subdirs(ino, dirs) ↔ ino ∈ dirs ∧ str ∈ dirs[ino].entries ∧ dirs[ino].entries[str] ∈ dirs;% ⊦ ∅ ≠ strings ++ str; (s)% ⊦ (strings -- str) ++ str = strings ++ str; (s)% ⊦ (strings ++ str) ∪ strings0 = (strings ∪ strings0) ++ str; (s)% ⊦ str ≠ str0 → (str ∈ strings -- str0 ↔ str ∈ strings); (ss)% ⊦ str ∈ strings -- str0 ↔ str ≠ str0 ∧ str ∈ strings; (s)%unc: ⊦ strings ∪ strings0 = strings0 ∪ strings; from specification set-union[dir-entries]%una: ⊦ (strings ∪ strings0) ∪ strings1 = strings ∪ strings0 ∪ strings1; from specification set-union[dir-entries]% ⊦ strings ∪ ∅ = strings; (s)%size-zero-01: ⊦ strings ≠ ∅ → # strings ≠ 0; (forward) from specification set-basic[dir-entries]%size-zero: ⊦ # strings ≠ 0 → strings ≠ ∅; (forward) from specification set-basic[dir-entries]%ne-01: ⊦ str ∈ strings → strings ≠ ∅; (forward) from specification set-basic[dir-entries]% ⊦ strings -- str = ∅ ↔ strings = ∅ ∨ strings = ∅ ++ str; (ws)% ⊦ strings \ ∅ = strings; (s)% ⊦ strings \ (strings0 ++ str) = (strings \ strings0) -- str; (s)