comb.agda 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. module comb where
  2. infixr 50 _⟶_
  3. data Ty : Set where
  4. ι : Ty
  5. _⟶_ : Ty -> Ty -> Ty
  6. data Tm : Ty -> Set where
  7. K : {σ τ : Ty} -> Tm (σ ⟶ τ ⟶ σ)
  8. S : {σ τ ρ : Ty} -> Tm ((σ ⟶ τ ⟶ ρ) ⟶ (σ ⟶ τ) ⟶ σ ⟶ ρ)
  9. _$_ : {σ τ : Ty} -> Tm (σ ⟶ τ) -> Tm σ -> Tm τ
  10. data Nf : Ty -> Set where
  11. Kⁿ : {σ τ : Ty} -> Nf (σ ⟶ τ ⟶ σ)
  12. Kⁿ¹ : {σ τ : Ty} -> Nf σ -> Nf (τ ⟶ σ)
  13. Sⁿ : {σ τ ρ : Ty} -> Nf ((σ ⟶ τ ⟶ ρ) ⟶ (σ ⟶ τ) ⟶ σ ⟶ ρ)
  14. Sⁿ¹ : {σ τ ρ : Ty} -> Nf (σ ⟶ τ ⟶ ρ) -> Nf ((σ ⟶ τ) ⟶ σ ⟶ ρ)
  15. Sⁿ² : {σ τ ρ : Ty} -> Nf (σ ⟶ τ ⟶ ρ) -> Nf (σ ⟶ τ) -> Nf (σ ⟶ ρ)
  16. _$$_ : {σ τ : Ty} -> Nf (σ ⟶ τ) -> Nf σ -> Nf τ
  17. Kⁿ $$ x = Kⁿ¹ x
  18. Kⁿ¹ x $$ y = x
  19. Sⁿ $$ x = Sⁿ¹ x
  20. Sⁿ¹ x $$ y = Sⁿ² x y
  21. Sⁿ² x y $$ z = (x $$ z) $$ (y $$ z)
  22. nf : {σ : Ty} -> Tm σ -> Nf σ
  23. nf K = Kⁿ
  24. nf S = Sⁿ
  25. nf (t $ u) = nf t $$ nf u
  26. data _$ⁿ_⇓_ : {σ τ : Ty} -> Nf (σ ⟶ τ) -> Nf σ -> Nf τ -> Set where
  27. rKⁿ : {σ τ : Ty} -> {x : Nf σ} -> Kⁿ {σ} {τ} $ⁿ x ⇓ Kⁿ¹ x
  28. rKⁿ¹ : {σ τ : Ty} -> {x : Nf σ} -> {y : Nf τ} -> Kⁿ¹ x $ⁿ y ⇓ x
  29. rSⁿ : {σ τ ρ : Ty} -> {x : Nf (σ ⟶ τ ⟶ ρ)} -> Sⁿ $ⁿ x ⇓ Sⁿ¹ x
  30. rSⁿ¹ : {σ τ ρ : Ty} -> {x : Nf (σ ⟶ τ ⟶ ρ)} -> {y : Nf (σ ⟶ τ)} ->
  31. Sⁿ¹ x $ⁿ y ⇓ Sⁿ² x y
  32. rSⁿ² : {σ τ ρ : Ty} -> {x : Nf (σ ⟶ τ ⟶ ρ)} -> {y : Nf (σ ⟶ τ)} ->
  33. {z : Nf σ} -> {u : Nf (τ ⟶ ρ)} -> x $ⁿ z ⇓ u -> {v : Nf τ} ->
  34. y $ⁿ z ⇓ v -> {w : Nf ρ} -> u $ⁿ v ⇓ w -> Sⁿ² x y $ⁿ z ⇓ w
  35. data _⇓_ : {σ : Ty} -> Tm σ -> Nf σ -> Set where
  36. rK : {σ τ : Ty} -> K {σ} {τ} ⇓ Kⁿ
  37. rS : {σ τ ρ : Ty} -> S {σ} {τ} {ρ} ⇓ Sⁿ
  38. r$ : {σ τ : Ty} -> {t : Tm (σ ⟶ τ)} -> {f : Nf (σ ⟶ τ)} -> t ⇓ f ->
  39. {u : Tm σ} -> {a : Nf σ} -> u ⇓ a -> {v : Nf τ} -> f $ⁿ a ⇓ v ->
  40. t $ u ⇓ v
  41. data _==_ {A : Set}(a : A) : {B : Set} -> (b : B) -> Set where
  42. refl : a == a
  43. data Σ {A : Set}(B : A -> Set) : Set where
  44. sig : (a : A) -> (b : B a) -> Σ B
  45. σ₀ : {A : Set} -> {B : A -> Set} -> Σ B -> A
  46. σ₀ (sig x _) = x
  47. σ₁ : {A : Set} -> {B : A -> Set} -> (s : Σ B) -> B (σ₀ s)
  48. σ₁ (sig _ y) = y
  49. _$$⁼_&_ : {σ τ : Ty} -> (f : Nf (σ ⟶ τ)) -> (a : Nf σ) -> {n : Nf τ} ->
  50. f $ⁿ a ⇓ n -> Σ \(n' : Nf τ) -> n' == n
  51. Kⁿ $$⁼ x & rKⁿ = sig (Kⁿ¹ x) refl
  52. Kⁿ¹ x $$⁼ y & rKⁿ¹ = sig x refl
  53. Sⁿ $$⁼ x & rSⁿ = sig (Sⁿ¹ x) refl
  54. Sⁿ¹ x $$⁼ y & rSⁿ¹ = sig (Sⁿ² x y) refl
  55. Sⁿ² x y $$⁼ z & (rSⁿ² p q r) with x $$⁼ z & p | y $$⁼ z & q
  56. Sⁿ² x y $$⁼ z & (rSⁿ² p q r) | sig u refl | sig v refl with u $$⁼ v & r
  57. Sⁿ² x y $$⁼ z & (rSⁿ² p q r) | sig u refl | sig v refl | sig w refl =
  58. sig w refl
  59. nf⁼ : {σ : Ty} -> (t : Tm σ) -> {n : Nf σ} -> t ⇓ n ->
  60. Σ \(n' : Nf σ) -> n' == n
  61. nf⁼ K rK = sig Kⁿ refl
  62. nf⁼ S rS = sig Sⁿ refl
  63. nf⁼ (t $ u) (r$ p q r) with nf⁼ t p | nf⁼ u q
  64. nf⁼ (t $ u) (r$ p q r) | sig f refl | sig a refl with f $$⁼ a & r
  65. nf⁼ (t $ u) (r$ p q r) | sig f refl | sig a refl | sig v refl =
  66. sig v refl
  67. proof : {σ : Ty} -> (t : Tm σ) -> Σ \(n : Nf σ) -> t ⇓ n
  68. proof = {! !}
  69. nf⇓ : {σ : Ty} -> Tm σ -> Nf σ
  70. nf⇓ t = σ₀ (nf⁼ t (σ₁ (proof t)))