| key0.dentry?, ∀ key0. key0 ∈ ks0 → key0.dentry?, ∀ key. key.dentry? → (key = dentrykey(m, str) ∨ key ∈ ks0 ↔ mklink(key.ino, key.name) = mklink(m, str) ∨ mklink(key.ino, key.name) ∈ ls0), ∀ ls1, ks. # ls1 < #(ls0 ++ mklink(m, str)) → (∀ key. key ∈ ks → key.dentry?) ∧ (∀ key. key.dentry? → (key ∈ ks ↔ mklink(key.ino, key.name) ∈ ls1)) → # ks = # ls1 ⊦ # ks0 = # ls0, key0 ∈ ks0 ↔ mklink(key0.ino, key0.name) ∈ ls0, dentrykey(m, str) ∈ ks0, mklink(m, str) ∈ ls0 |
key0 = dentrykey(m0, str0), key0.dentry?, ∀ key. key.dentry? → (key = dentrykey(m, str) ∨ key ∈ ks0 ↔ mklink(key.ino, key.name) = mklink(m, str) ∨ mklink(key.ino, key.name) ∈ ls0), ∀ key0. key0 ∈ ks0 → key0.dentry?, ∀ ls1, ks. # ls1 < #(ls0 ++ mklink(m, str)) → (∀ key. key ∈ ks → key.dentry?) ∧ (∀ key. key.dentry? → (key ∈ ks ↔ mklink(key.ino, key.name) ∈ ls1)) → # ks = # ls1 ⊦ # ks0 = # ls0, key0 ∈ ks0 ↔ mklink(m0, str0) ∈ ls0, mklink(m, str) ∈ ls0, dentrykey(m, str) ∈ ks0
Used simplifier rules: ⊦ key.dentry? → (m = key.ino ∧ str = key.name ↔ key = dentrykey(m, str)); (elim) Used terms: key0, m0, str0