| # A = # A0, j = m + 1, i + 1 < # A0, perm(A[j, y][j + 1, x], A0), sorted(A, 0, j), sorted(A, j + 2, i + 2), i ≤ # A0, j ≤ i, j ≤ # A0, j ≠ i → x < A[j + 2], j ≠ i → ¬ A[j + 2] < A[m] ⊦ j = 0, x < A[m], x < y, sorted(A[j + 1, x], j + 1, i + 2) ∧ ¬ x < A[j + 1, x][m] ∧ perm(A[j + 1, x][j, y], A0) |
# A = # A0, m < # A0, m < i, i + 1 < # A0, perm(A[m + 1, y][2 + m, x], A0), sorted(A, 0, m + 1), sorted(A, 3 + m, i + 2), i ≤ # A0, m + 1 ≠ i → x < A[3 + m], m + 1 ≠ i → ¬ A[3 + m] < A[m] ⊦ x < A[m], x < y, sorted(A[2 + m, x], 2 + m, i + 2) ∧ perm(A[2 + m, x][m + 1, y], A0)
Used simplifier rules: n ≥ m, m ≤ # ar ⊦ sorted(ar, n, m); (s)% ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)% ⊦ n ≥ m ↔ m ≤ n; (s)% ⊦ m < n → n ≠ 0; (s)%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%sorted-merge: m > n0 ⊦ sorted(A, n, m) ∧ sorted(A, n0, m0) → sorted(A, n, m0); (forward) from specification oarray-sorted%n < n0 ⊦ (* n) ≠ m0 + (* n0); (s)% ⊦ 0 < m ↔ m ≠ 0; (s)% ⊦ m > n ↔ n < m; (s)%m ≠ n ⊦ ar[m, a][n] = ar[n]; (s)% ⊦ m = m + n ↔ n = 0; (s)% ⊦ m + 1 ≤ n ↔ m < n; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + 1 ≠ 0; (s)