| ⊦ (∀ fid. ∀ tree0, tree1. fnode(fid) = tree0 ∧ (∀ p. (p ∈ tree0 ↔ p ∈ tree1) ∧ (p ∈ tree0 → (tree0[p].dir? ↔ tree1[p].dir?) ∧ (tree0[p].dir? ⊃ tree0[p].meta = tree1[p].meta;tree0[p].fid = tree1[p].fid))) → tree0 = tree1) ∧ (∀ md, sdt. (∀ str. str ∈ sdt → (∀ tree0, tree1. sdt[str] = tree0 ∧ (∀ p. (p ∈ tree0 ↔ p ∈ tree1) ∧ (p ∈ tree0 → (tree0[p].dir? ↔ tree1[p].dir?) ∧ (tree0[p].dir? ⊃ tree0[p].meta = tree1[p].meta;tree0[p].fid = tree1[p].fid))) → tree0 = tree1)) → (∀ tree0, tree1. dnode(md, sdt) = tree0 ∧ (∀ p. (p ∈ tree0 ↔ p ∈ tree1) ∧ (p ∈ tree0 → (tree0[p].dir? ↔ tree1[p].dir?) ∧ (tree0[p].dir? ⊃ tree0[p].meta = tree1[p].meta;tree0[p].fid = tree1[p].fid))) → tree0 = tree1)) |
⊦ p ∈ fnode(fid) ↔ p = ε
⊦ ε ∈ tree
⊦ tree[ε] = tree
⊦ ¬ fnode(fid).dir?
⊦ fnode(fid).fid = fid
⊦ (fnode(fid) = tree ∧ (∀ p. (p ∈ tree0 → p = ε) ∧ (p = ε → ¬ tree0.dir? ∧ fid = tree0.fid)) → fnode(fid) = tree0) ∧ ( (∀ str. str ∈ sdt → (∀ tree2. (∀ p. (p ∈ sdt[str] ↔ p ∈ tree2) ∧ ( p ∈ sdt[str] → (sdt[str][p].dir? ↔ tree2[p].dir?) ∧ (sdt[str][p].dir? ⊃ sdt[str][p].meta = tree2[p].meta;sdt[str][p].fid = tree2[p].fid))) → sdt[str] = tree2)) → dnode(md, sdt) = tree1 ∧ (∀ p. (p ∈ dnode(md, sdt) ↔ p ∈ tree2) ∧ ( p ∈ dnode(md, sdt) → (dnode(md, sdt)[p].dir? ↔ tree2[p].dir?) ∧ (dnode(md, sdt)[p].dir? ⊃ dnode(md, sdt)[p].meta = tree2[p].meta;dnode(md, sdt)[p].fid = tree2[p].fid))) → dnode(md, sdt) = tree2)
Used simplifier rules: fnode-notin: ⊦ p ∈ fnode(fid) ↔ p = ε;%nil-in: ⊦ ε ∈ tree;%nil-at: ⊦ tree[ε] = tree;%isfnode: ⊦ ¬ fnode(fid).dir?;%fid: ⊦ fnode(fid).fid = fid;