| ⊦ pfxclosed(trlp) → pfxclosed(lift(trlp)) |
pfxclosed(trlp), ¬ pfxclosed(lift(trlp)) ⊦
| pfxclosed(trlp), ¬ pfxclosed(lift(trlp)) ⊦ |
⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1))
¬ pfxclosed(lift(trlp)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used terms: trlp
| ⊦ pfxclosed(trlp) ↔ (∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1)) |
| ¬ pfxclosed(lift(trlp)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
⊦ pfxclosed(trp) ↔ (∀ σ1, σ2, α1, α2. trp(σ2, α2) ∧ σ1 ⊑ σ2 ∧ α1 ⊑ α2 ∧ # σ1 = # α1 + ⌜1⌝ ∧ # σ2 = # α2 + ⌜1⌝ → trp(σ1, α1))
∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∃ σ1, σ2, α1, α2. ¬(lift(trlp)(σ2, α2) ∧ σ1 ⊑ σ2 ∧ α1 ⊑ α2 ∧ # σ1 = # α1 + ⌜1⌝ ∧ # σ2 = # α2 + ⌜1⌝ → lift(trlp)(σ1, α1)) ⊦
Used terms: lift(trlp)
| ⊦ pfxclosed(trp) ↔ (∀ σ1, σ2, α1, α2. trp(σ2, α2) ∧ σ1 ⊑ σ2 ∧ α1 ⊑ α2 ∧ # σ1 = # α1 + ⌜1⌝ ∧ # σ2 = # α2 + ⌜1⌝ → trp(σ1, α1)) |
| ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∃ σ1, σ2, α1, α2. ¬(lift(trlp)(σ2, α2) ∧ σ1 ⊑ σ2 ∧ α1 ⊑ α2 ∧ # σ1 = # α1 + ⌜1⌝ ∧ # σ2 = # α2 + ⌜1⌝ → lift(trlp)(σ1, α1)) ⊦ |
# σ1 = # α1 + ⌜1⌝ , # σ2 = # α2 + ⌜1⌝ , lift(trlp)(σ2, α2), σ1 ⊑ σ2, α1 ⊑ α2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
| # σ1 = # α1 + ⌜1⌝ , # σ2 = # α2 + ⌜1⌝ , lift(trlp)(σ2, α2), σ1 ⊑ σ2, α1 ⊑ α2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = # α2 + ⌜1⌝ , # σ1 = # α1 + ⌜1⌝ , α1 = ⌜al⌝ , lift(trlp)(σ2, α2), α1 ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
# σ2 = # α2 + ⌜1⌝ , # σ1 = # α1 + ⌜1⌝ , α1 = ⌜af⌝ , lift(trlp)(σ2, α2), α1 ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝;
| # σ2 = # α2 + ⌜1⌝ , # σ1 = # α1 + ⌜1⌝ , α1 = ⌜al⌝ , lift(trlp)(σ2, α2), α1 ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = # α2 + ⌜1⌝ , # σ1 = ⌜# al⌝ + ⌜1⌝ , lift(trlp)(σ2, α2), σ1 ⊑ σ2, ⌜al⌝ ⊑ α2, ¬ lift(trlp)(σ1, ⌜al⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s)
| # σ2 = # α2 + ⌜1⌝ , # σ1 = ⌜# al⌝ + ⌜1⌝ , lift(trlp)(σ2, α2), σ1 ⊑ σ2, ⌜al⌝ ⊑ α2, ¬ lift(trlp)(σ1, ⌜al⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ1 = ⌜# al⌝ + ⌜1⌝ , # σ2 = # α2 + ⌜1⌝ , σ1 = ⌜sl⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜al⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜nf⌝ = ∞; (s) ⊦ ⌜m⌝ + n∞ = ∞ ↔ n∞ = ∞; (s) ⊦ ⌜n⌝ ≠ ∞; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf
| # σ1 = ⌜# al⌝ + ⌜1⌝ , # σ2 = # α2 + ⌜1⌝ , σ1 = ⌜sl⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜al⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, lift(trlp)(σ2, α2), ⌜sl⌝ ⊑ σ2, ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: lift-trp-fin: ⊦ lift(trlp)(⌜sl⌝ , ⌜al⌝ ) ↔ trlp(sl, al); add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ + ⌜m⌝ = ⌜n0⌝ ↔ n + m = n0; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s)
| # σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, lift(trlp)(σ2, α2), ⌜sl⌝ ⊑ σ2, ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, σ2 = ⌜sl0⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ σ2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
# σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, σ2 = ⌜sf⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ σ2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝;
| # σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, σ2 = ⌜sl0⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ σ2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al + 1 = # sl, ⌜# sl0⌝ = # α2 + ⌜1⌝ , lift(trlp)(⌜sl0⌝ , α2), ⌜al⌝ ⊑ α2, sl ⊑ sl0, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ ⌜x⌝ ⊑ ⌜y⌝ ↔ x ⊑ y; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s)
| # al + 1 = # sl, ⌜# sl0⌝ = # α2 + ⌜1⌝ , lift(trlp)(⌜sl0⌝ , α2), ⌜al⌝ ⊑ α2, sl ⊑ sl0, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al + 1 = # sl, α2 = ⌜al0⌝ , ⌜# sl0⌝ = # α2 + ⌜1⌝ , lift(trlp)(⌜sl0⌝ , α2), sl ⊑ sl0, ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜nf⌝ = ∞; (s) ⊦ ⌜m⌝ + ∞ = ∞; (s) add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf ⊦ ⌜n⌝ ≠ ∞; (s)
| # al + 1 = # sl, α2 = ⌜al0⌝ , ⌜# sl0⌝ = # α2 + ⌜1⌝ , lift(trlp)(⌜sl0⌝ , α2), sl ⊑ sl0, ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al + 1 = # sl, # al0 + 1 = # sl0, trlp(sl0, al0), al ⊑ al0, sl ⊑ sl0, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: lift-trp-fin: ⊦ lift(trlp)(⌜sl⌝ , ⌜al⌝ ) ↔ trlp(sl, al); ⊦ ⌜x⌝ ⊑ ⌜y⌝ ↔ x ⊑ y; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ + ⌜m⌝ = ⌜n0⌝ ↔ n + m = n0; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s)
| # al + 1 = # sl, # al0 + 1 = # sl0, trlp(sl0, al0), al ⊑ al0, sl ⊑ sl0, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
Used terms: sl, sl0, al, al0
| # σ2 = # α2 + ⌜1⌝ , # al + 1 = # sl, σ2 = ⌜sf⌝ , lift(trlp)(σ2, α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ σ2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# α2 = ∞, # al + 1 = # sl, lift(trlp)(⌜sf⌝ , α2), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜m⌝ + n∞ = ∞ ↔ n∞ = ∞; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| # α2 = ∞, # al + 1 = # sl, lift(trlp)(⌜sf⌝ , α2), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ α2, ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# α2 = ∞, # al + 1 = # sl, α2 = ⌜af⌝ , lift(trlp)(⌜sf⌝ , α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜n⌝ ≠ ∞; (s)
| # α2 = ∞, # al + 1 = # sl, α2 = ⌜af⌝ , lift(trlp)(⌜sf⌝ , α2), ⌜al⌝ ⊑ α2, ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al + 1 = # sl, ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜af⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∀ n. trlp(sf.take(n + 1), af.take(n)) ⊦
Used simplifier rules: lift-trp-inf: ⊦ lift(trlp)(⌜sf⌝ , ⌜af⌝ ) ↔ (∀ n. trlp(sf.take(n + 1), af.take(n))); ⊦ # ⌜nf⌝ = ∞; (s)
| # al + 1 = # sl, ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜af⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∀ n. trlp(sf.take(n + 1), af.take(n)) ⊦ |
# al + 1 = # sl, trlp(sf.take(# al + 1), af.take(# al)), ⌜al⌝ ⊑ ⌜af⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used terms: # al
| # al + 1 = # sl, trlp(sf.take(# al + 1), af.take(# al)), ⌜al⌝ ⊑ ⌜af⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al + 1 = # sl, trlp(sf.take(# sl), af.take(# al)), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜af⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
| # al + 1 = # sl, trlp(sf.take(# sl), af.take(# al)), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜af⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al0 = # al, # al + 1 = # sl, af = (⌜al0⌝ + ⌜nf0⌝ ).f, trlp(sf.take(# sl), al0), ⌜al⌝ ⊑ ⌜af⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ x0 = nf.take(n) ∧ nf0 = nf.drop(n) ↔ nf = (⌜x0⌝ + ⌜nf0⌝ ).f ∧ # x0 = n; (elim) Used terms: af, # al, al0, nf0
| # al0 = # al, # al + 1 = # sl, af = (⌜al0⌝ + ⌜nf0⌝ ).f, trlp(sf.take(# sl), al0), ⌜al⌝ ⊑ ⌜af⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al0 = # al, # al + 1 = # sl, trlp(sf.take(# sl), al0), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ ⌜x + nf⌝ = ⌜x⌝ + ⌜nf⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜x⌝ + ⌜nf⌝ ).f = x + nf; (s)
| # al0 = # al, # al + 1 = # sl, trlp(sf.take(# sl), al0), ⌜sl⌝ ⊑ ⌜sf⌝ , ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# al0 = # al, # sl0 = # sl, # al + 1 = # sl, sf = (⌜sl0⌝ + ⌜sf0⌝ ).f, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ x0 = nf.take(n) ∧ nf0 = nf.drop(n) ↔ nf = (⌜x0⌝ + ⌜nf0⌝ ).f ∧ # x0 = n; (elim) Used terms: sf, # sl, sl0, sf0
| # al0 = # al, # sl0 = # sl, # al + 1 = # sl, sf = (⌜sl0⌝ + ⌜sf0⌝ ).f, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ⌜sl⌝ ⊑ ⌜sf⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# sl0 = # sl, # al0 = # al, # al + 1 = # sl, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ⌜sl⌝ ⊑ ⌜sl0⌝ + ⌜sf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ ⌜x + nf⌝ = ⌜x⌝ + ⌜nf⌝ ; (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜x⌝ + ⌜nf⌝ ).f = x + nf; (s)
| # sl0 = # sl, # al0 = # al, # al + 1 = # sl, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ⌜sl⌝ ⊑ ⌜sl0⌝ + ⌜sf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
# al0 = # al, # sl0 = # sl, # al + 1 = # sl, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∃ σ1. ⌜sl⌝ + σ1 = ⌜sl0⌝ + ⌜sf0⌝ ⊦
Used terms: ⌜sl⌝ , ⌜sl0⌝ + ⌜sf0⌝
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| # al0 = # al, # sl0 = # sl, # al + 1 = # sl, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∃ σ1. ⌜sl⌝ + σ1 = ⌜sl0⌝ + ⌜sf0⌝ ⊦ |
# al0 = # al, # al + 1 = # sl0, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl0, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ # x = # y → (⌜x⌝ + σ = ⌜y⌝ + σ0 ↔ x = y ∧ σ = σ0); (s)
| # al0 = # al, # al + 1 = # sl0, trlp(sl0, al0), ⌜al⌝ ⊑ ⌜al0⌝ + ⌜nf0⌝ , ¬ trlp(sl0, al), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0)
Used simplifier rules: ⊦ # x = # y → (⌜x⌝ + σ = ⌜y⌝ + σ0 ↔ x = y ∧ σ = σ0); (s) append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream Used terms: ⌜al⌝ , ⌜al0⌝ + ⌜nf0⌝
| ⊦ σ ⊑ σ0 ↔ (∃ σ1. σ + σ1 = σ0) |
| # σ2 = # α2 + ⌜1⌝ , # σ1 = # α1 + ⌜1⌝ , α1 = ⌜af⌝ , lift(trlp)(σ2, α2), α1 ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, α1), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = # α2 + ⌜1⌝ , # σ1 = ∞, lift(trlp)(σ2, α2), σ1 ⊑ σ2, ⌜af⌝ ⊑ α2, ¬ lift(trlp)(σ1, ⌜af⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜m⌝ + ∞ = ∞; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| # σ2 = # α2 + ⌜1⌝ , # σ1 = ∞, lift(trlp)(σ2, α2), σ1 ⊑ σ2, ⌜af⌝ ⊑ α2, ¬ lift(trlp)(σ1, ⌜af⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ1 = ∞, # σ2 = # α2 + ⌜1⌝ , α2 = ⌜af0⌝ , lift(trlp)(σ2, α2), ⌜af⌝ ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ¬ ⌜nf⌝ ⊑ ⌜x⌝ ; (s)
| # σ1 = ∞, # σ2 = # α2 + ⌜1⌝ , α2 = ⌜af0⌝ , lift(trlp)(σ2, α2), ⌜af⌝ ⊑ α2, σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ2 = ∞, # σ1 = ∞, lift(trlp)(σ2, ⌜af0⌝ ), σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: ⊦ ⌜nf⌝ ⊑ ⌜nf0⌝ ↔ nf = nf0; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜m⌝ + ∞ = ∞; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| # σ2 = ∞, # σ1 = ∞, lift(trlp)(σ2, ⌜af0⌝ ), σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ1 = ∞, # σ2 = ∞, σ2 = ⌜sf⌝ , lift(trlp)(σ2, ⌜af0⌝ ), σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜n⌝ ≠ ∞; (s)
| # σ1 = ∞, # σ2 = ∞, σ2 = ⌜sf⌝ , lift(trlp)(σ2, ⌜af0⌝ ), σ1 ⊑ σ2, ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
# σ1 = ∞, σ1 ⊑ ⌜sf⌝ , ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∀ n. trlp(sf.take(n + 1), af0.take(n)) ⊦
Used simplifier rules: lift-trp-inf: ⊦ lift(trlp)(⌜sf⌝ , ⌜af⌝ ) ↔ (∀ n. trlp(sf.take(n + 1), af.take(n))); ⊦ # ⌜nf⌝ = ∞; (s)
| # σ1 = ∞, σ1 ⊑ ⌜sf⌝ , ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1), ∀ n. trlp(sf.take(n + 1), af0.take(n)) ⊦ |
# σ1 = ∞, σ1 = ⌜sf0⌝ , σ1 ⊑ ⌜sf⌝ , ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ n. trlp(sf.take(n + 1), af0.take(n)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: Stream[A] freely generated by ⌝, ⌝; ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ ⌜n⌝ ≠ ∞; (s)
| # σ1 = ∞, σ1 = ⌜sf0⌝ , σ1 ⊑ ⌜sf⌝ , ¬ lift(trlp)(σ1, ⌜af0⌝ ), ∀ n. trlp(sf.take(n + 1), af0.take(n)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
¬ trlp(sf.take(n + 1), af0.take(n)), ∀ n. trlp(sf.take(n + 1), af0.take(n)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦
Used simplifier rules: lift-trp-inf: ⊦ lift(trlp)(⌜sf⌝ , ⌜af⌝ ) ↔ (∀ n. trlp(sf.take(n + 1), af.take(n))); ⊦ ⌜nf⌝ ⊑ ⌜nf0⌝ ↔ nf = nf0; (s) ⊦ # ⌜nf⌝ = ∞; (s)
| ¬ trlp(sf.take(n + 1), af0.take(n)), ∀ n. trlp(sf.take(n + 1), af0.take(n)), ∀ sl1, sl2, al1, al2. trlp(sl2, al2) ∧ sl1 ⊑ sl2 ∧ al1 ⊑ al2 ∧ # sl1 = # al1 + 1 ∧ # sl2 = # al2 + 1 → trlp(sl1, al1) ⊦ |
Used terms: n
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.