|
| 1 | + |
| 2 | +import LeanSubst |
| 3 | +import OneSortHomArityGen.Term |
| 4 | + |
| 5 | +namespace OneSortHomArityGen |
| 6 | + |
| 7 | +open LeanSubst |
| 8 | + |
| 9 | +universe u u1 u2 u3 |
| 10 | + |
| 11 | +class Model (D : Sort u) where |
| 12 | + A : D -> D -> D |
| 13 | + Q : (D -> D) -> D |
| 14 | + P : D -- Any model has to know what to do with junk |
| 15 | + |
| 16 | +@[simp] |
| 17 | +def Model.int_term [Model D] (v : Nat -> D) : Term -> D |
| 18 | +| #x => v x |
| 19 | +| .ctor .arr ts => A (int_term v (ts 0)) (int_term v (ts 1)) |
| 20 | +| .bind .all _ t => Q (λ d => int_term (d::v) t) |
| 21 | +| _ => P |
| 22 | + |
| 23 | +@[simp] |
| 24 | +def Model.int_subst [Model D] (v : Nat -> D) (σ : Subst Term) : Nat -> D |
| 25 | +| i => Model.int_term v (σ i) |
| 26 | + |
| 27 | +notation "⟦ " t " ⟧ " v:100 => Model.int_term v t |
| 28 | +notation "⟦ " σ " ⟧ " v:100 => Model.int_subst v σ |
| 29 | + |
| 30 | +theorem Model.rename [Model D] {A : Term} {ξ : Nat -> D} (r : Ren) |
| 31 | + : ⟦ A[r] ⟧ ξ = ⟦ A ⟧ (ξ ∘ r) |
| 32 | +:= by |
| 33 | + induction A generalizing r ξ <;> simp at * |
| 34 | + case ctor v _ ih => |
| 35 | + cases v <;> simp at *; case _ ts => |
| 36 | + generalize Adef : ts 0 = A at * |
| 37 | + generalize Bdef : ts 1 = B at * |
| 38 | + rcases ih with ⟨ih1, ih2⟩; congr 1 |
| 39 | + rw [ih1]; rw [ih2] |
| 40 | + case bind v _ _ ih1 ih2 => |
| 41 | + cases v <;> simp at * |
| 42 | + congr; funext; case _ d => |
| 43 | + replace ih2 := @ih2 (d::ξ) r.lift |
| 44 | + rw [Ren.to_lift (S := Term)] at ih2 |
| 45 | + simp at ih2; rw [ih2]; congr |
| 46 | + funext; case _ i => |
| 47 | + cases i <;> simp [Ren.lift] |
| 48 | + |
| 49 | +@[simp] |
| 50 | +theorem Model.weaken [Model D] {A : Term} {ξ : Nat -> D} |
| 51 | + : ⟦ A[+1] ⟧ (d::ξ) = ⟦ A ⟧ ξ |
| 52 | +:= by |
| 53 | + have lem := Model.rename (A := A) (ξ := d::ξ) (· + 1) |
| 54 | + simp at lem; rw [lem] |
| 55 | + have lem : ((d::ξ) ∘ (· + 1)) = ξ := by |
| 56 | + funext; case _ i => |
| 57 | + cases i <;> simp |
| 58 | + rw [lem] |
| 59 | + |
| 60 | +theorem Model.subst [Model D] {A : Term} {σ : Subst Term} {ξ : Nat -> D} |
| 61 | + : ⟦ A[σ] ⟧ ξ = ⟦ A ⟧ (⟦ σ ⟧ ξ) |
| 62 | +:= by |
| 63 | + induction A generalizing σ ξ <;> simp |
| 64 | + case ctor v _ ih => |
| 65 | + cases v <;> simp |
| 66 | + simp [*] |
| 67 | + case bind v _ _ ih1 ih2 => |
| 68 | + cases v <;> simp |
| 69 | + congr; funext; case _ d => |
| 70 | + replace ih2 := @ih2 σ.lift (d::ξ) |
| 71 | + simp at ih2; rw [ih2]; congr |
| 72 | + funext; case _ i => |
| 73 | + cases i <;> simp [Subst.compose] |
| 74 | + case _ i => |
| 75 | + generalize σ i = z |
| 76 | + cases z <;> simp |
| 77 | + |
| 78 | +@[simp] |
| 79 | +theorem Model.beta [Model D] {A B : Term} {ξ : Nat -> D} |
| 80 | + : ⟦ A[su B::+0] ⟧ ξ = ⟦ A ⟧ (⟦ B ⟧ ξ :: ξ) |
| 81 | +:= by |
| 82 | + rw [Model.subst]; congr |
| 83 | + funext; case _ i => |
| 84 | + cases i <;> simp |
| 85 | + |
| 86 | +end OneSortHomArityGen |
0 commit comments