Guest User

Untitled

a guest
Jul 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. module Simple-list-solver where
  2.  
  3. open import Level using (Level; _⊔_; Lift; lift; lower)
  4.  
  5. open import Data.Nat
  6. open import Data.Fin using (Fin; zero; suc; inject+)
  7. open import Data.List
  8. open import Data.List.Properties
  9. open import Data.Product
  10. open import Data.Vec using(Vec; []; _∷_; lookup)
  11.  
  12. open import Data.Nat.Properties.Simple
  13. import Data.Vec.Properties as V
  14.  
  15. open import Relation.Binary.PropositionalEquality using (_≡_; refl; trans; sym; cong; cong₂; subst)
  16. open Relation.Binary.PropositionalEquality.≡-Reasoning
  17.  
  18. data AutoExpr : ℕ → Set where
  19. bla : AutoExpr 1
  20. id : AutoExpr 0
  21. _⊕_ : ∀ {n m} → AutoExpr n → AutoExpr m → AutoExpr (n + m)
  22.  
  23. infixr 5 _⊕_
  24. infixr 4 _⊜_
  25.  
  26. _⊜_ : ∀ {n} → AutoExpr n → AutoExpr n → AutoExpr n × AutoExpr n
  27. e₁ ⊜ e₂ = e₁ , e₂
  28.  
  29. ⟦_⟧_ : ∀ {n a} {A : Set a} → (e : AutoExpr n) → Vec (List A) n → List A
  30. ⟦ bla ⟧ (x ∷ []) = x
  31. ⟦ id ⟧ [] = []
  32. ⟦ _⊕_ {n} e₁ e₂ ⟧ ρ with Data.Vec.splitAt n ρ
  33. ⟦ e₁ ⊕ e₂ ⟧ ρ | ρ₁ , ρ₂ , _ = ⟦ e₁ ⟧ ρ₁ ++ ⟦ e₂ ⟧ ρ₂
  34.  
  35. infixl 9 ⟦_⟧_
  36.  
  37. -- -- "Normalise"
  38. flatten : ∀ {n a} {A : Set a} → Vec (List A) n → List A
  39. flatten [] = []
  40. flatten (x ∷ v) = x ++ flatten v
  41.  
  42. flatten-++ : ∀ {n m a} {A : Set a}
  43. → (xs : Vec (List A) n)
  44. → (ys : Vec (List A) m)
  45. → (zs : Vec (List A) (n + m))
  46. → xs Data.Vec.++ ys ≡ zs
  47. → flatten xs ++ flatten ys ≡ flatten zs
  48. flatten-++ [] ys zs eq = cong flatten eq
  49. flatten-++ (x ∷ xs) ys (z ∷ zs) eq = begin
  50. (x ++ flatten xs) ++ flatten ys ≡⟨ ++-assoc x (flatten xs) (flatten ys) ⟩
  51. x ++ flatten xs ++ flatten ys ≡⟨ cong₂ _++_ (V.∷-injectiveˡ eq) (flatten-++ xs ys zs (V.∷-injectiveʳ eq)) ⟩
  52. z ++ flatten zs ∎
  53.  
  54. lemma : ∀ {n a} {A : Set a}
  55. → (e : AutoExpr n)
  56. → (ρ : Vec (List A) n)
  57. → ⟦ e ⟧ ρ ≡ flatten ρ
  58. lemma bla (x ∷ []) = sym (++-identityʳ x)
  59. lemma id [] = refl
  60. lemma (_⊕_ {n} e₁ e₂) ρ with Data.Vec.splitAt n ρ
  61. ... | ρ₁ , ρ₂ , ρ-assoc with lemma e₁ ρ₁ | lemma e₂ ρ₂
  62. ... | eq₁ | eq₂ = begin
  63. ⟦ e₁ ⟧ ρ₁ ++ ⟦ e₂ ⟧ ρ₂ ≡⟨ cong₂ _++_ eq₁ eq₂ ⟩
  64. flatten ρ₁ ++ flatten ρ₂ ≡⟨ flatten-++ ρ₁ ρ₂ ρ (sym ρ-assoc) ⟩
  65. flatten ρ ∎
  66.  
  67. implication : ∀ {a n} {A : Set a}
  68. → (e₁ : AutoExpr n)
  69. → (e₂ : AutoExpr n)
  70. → (ρ : Vec (List A) n)
  71. → ⟦ e₁ ⟧ ρ ≡ ⟦ e₂ ⟧ ρ
  72. implication e₁ e₂ ρ with lemma e₁ ρ | lemma e₂ ρ
  73. ... | l | k = trans l (sym k)
  74.  
  75. list-solve-type : ∀ {a} {A : Set a} (n : ℕ)
  76. → (Vec (List A) n → Set a)
  77. → Set a
  78. list-solve-type zero f = f []
  79. list-solve-type {A = A} (suc n) f =
  80. (xs : List A) → list-solve-type n (λ vs → f (xs ∷ vs))
  81.  
  82. list-solve-impl : ∀ {a} {A : Set a} (n : ℕ)
  83. → (f : Vec (List A) n → Set a)
  84. → (g : (ρ : Vec (List A) n) → f ρ)
  85. → list-solve-type {A = A} n (λ ρ → f ρ)
  86. list-solve-impl zero f g = g []
  87. list-solve-impl(suc n) f g = λ xs → list-solve-impl n
  88. (λ vs → f (xs ∷ vs)) (λ vs → g (xs ∷ vs))
  89.  
  90. list-solve : ∀ {a n} {A : Set a}
  91. → (es : AutoExpr n × AutoExpr n)
  92. → list-solve-type {A = A} n (λ ρ → ⟦ proj₁ es ⟧ ρ ≡ ⟦ proj₂ es ⟧ ρ)
  93. list-solve {n = n} (e₁ , e₂ ) = list-solve-impl n _ λ ρ → implication e₁ e₂ ρ
  94.  
  95. -- DEMOS
  96. --------------
  97.  
  98. private
  99. ++-assoc-again : ∀ {a} → {A : Set a}
  100. → (xs : List A)
  101. → (ys : List A)
  102. → (zs : List A)
  103. → xs ++ ys ++ zs ≡ (xs ++ ys) ++ zs
  104. ++-assoc-again = list-solve
  105. (bla ⊕ bla ⊕ bla ⊜ (bla ⊕ bla) ⊕ bla)
  106.  
  107. crazier : ∀ {a} → {A : Set a}
  108. → (xs : List A)
  109. → (ys : List A)
  110. → (zs : List A)
  111. → (ws : List A)
  112. → xs ++ (ys ++ zs) ++ ws ≡ (xs ++ ys) ++ (zs ++ ws)
  113. crazier = list-solve
  114. (bla ⊕ (bla ⊕ bla) ⊕ bla ⊜ (bla ⊕ bla) ⊕ (bla ⊕ bla))
Add Comment
Please, Sign In to add comment