Advertisement
Guest User

Untitled

a guest
Mar 27th, 2023
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. inductive Expr : Type where
  2. | var (name : String) : Expr
  3. | number (num : Nat) : Expr
  4. | plus : Expr → Expr → Expr
  5.  
  6. inductive Ty where
  7. | number
  8.  
  9. inductive Typing : Expr → Ty → Type where
  10. | var (name : String) : Typing (Expr.var name) Ty.number
  11. | number (num : Nat) : Typing (Expr.number num) Ty.number
  12. | plus {e₁ e₂ : Expr} : Typing e₁ Ty.number → Typing e₂ Ty.number → Typing (Expr.plus e₁ e₂) Ty.number
  13.  
  14. inductive Value : {e : Expr} → {τ : Ty} → (Typing e τ) → Type where
  15. | number {num : Nat} : Value (Typing.number num)
  16.  
  17. mutual
  18.  
  19. inductive Normal : {e : Expr} → {τ : Ty} → (Typing e τ) → Type where
  20. | neutral {e : Expr} {τ : Ty} {t : Typing e τ} : Neutral t → Normal t
  21. | number (num : Nat) : Normal (Typing.number num)
  22.  
  23. inductive Neutral : {e : Expr} → {τ : Ty} → (Typing e τ) → Type where
  24. | var (name : String) : Neutral (Typing.var name)
  25. | plus₁ {e₁ e₂ : Expr} {t₁ : Typing e₁ Ty.number} {t₂ : Typing e₂ Ty.number} : Neutral t₁ → Normal t₂ → Neutral (Typing.plus t₁ t₂)
  26. | plus₂ {e₁ e₂ : Expr} {t₁ : Typing e₁ Ty.number} {t₂ : Typing e₂ Ty.number} : Value t₁ → Neutral t₂ → Neutral (Typing.plus t₁ t₂)
  27.  
  28. end
  29.  
  30. inductive Transition : {e₁ e₂ : Expr} → {τ : Ty} → (Typing e₁ τ) → (Typing e₂ τ) → Type where
  31. | ξ_plus₁
  32. {e₁ e₁' e₂ : Expr} {t₁ : Typing e₁ Ty.number} {t₁' : Typing e₁' Ty.number} {t₂ : Typing e₂ Ty.number} :
  33. Transition t₁ t₁' →
  34. Transition (Typing.plus t₁ t₂) (Typing.plus t₁' t₂)
  35.  
  36. | ξ_plus₂
  37. {e₁ e₂ e₂' : Expr} {t₁ : Typing e₁ Ty.number} {t₂ : Typing e₂ Ty.number} {t₂' : Typing e₂' Ty.number} :
  38. Normal t₁ →
  39. Transition t₂ t₂' →
  40. Transition (Typing.plus t₁ t₂) (Typing.plus t₁ t₂')
  41.  
  42. | β_plus
  43. {num₁ num₂ : Nat} :
  44. Normal (Typing.number num₁) →
  45. Normal (Typing.number num₂) →
  46. Transition (Typing.plus (Typing.number num₁) (Typing.number num₂)) (Typing.number (num₁ + num₂))
  47.  
  48. def Value.does_not_reduce
  49. {e₁ e₂ : Expr} {τ : Ty} {t₁ : Typing e₁ τ} {t₂ : Typing e₂ τ} :
  50. Value t₁ → Transition t₁ t₂ → Empty
  51. | .number, tr => nomatch tr
  52.  
  53. mutual
  54.  
  55. private theorem normal_does_not_reduce
  56. {e₁ e₂ : Expr} {τ : Ty} {t₁ : Typing e₁ τ} {t₂ : Typing e₂ τ} :
  57. Normal t₁ → Transition t₁ t₂ → Empty
  58. | .neutral neut, tr => neutral_does_not_reduce neut tr
  59.  
  60. private theorem neutral_does_not_reduce
  61. {e₁ e₂ : Expr} {τ : Ty} {t₁ : Typing e₁ τ} {t₂ : Typing e₂ τ} :
  62. Neutral t₁ → Transition t₁ t₂ → Empty
  63. | .plus₁ neut₁ _, .ξ_plus₁ tr₁ => neutral_does_not_reduce neut₁ tr₁
  64. | .plus₁ _ norm₂, .ξ_plus₂ _ tr₂ => normal_does_not_reduce norm₂ tr₂
  65. | .plus₂ v₁ neut₂, .ξ_plus₁ tr₁ => v₁.does_not_reduce tr₁
  66. | .plus₂ v₁ neut₂, .ξ_plus₂ norm₁ tr₂ => neutral_does_not_reduce neut₂ tr₂
  67.  
  68. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement