Guest User

Untitled

a guest
Jul 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. module Reassoc where
  2.  
  3. open import Data.List
  4. open import Data.Product
  5.  
  6. open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; cong; subst)
  7. open Relation.Binary.PropositionalEquality.≡-Reasoning
  8.  
  9. -- List lemmas
  10.  
  11. xs++[]≡xs : ∀ {a} → {A : Set a}
  12. → (xs : List A)
  13. → xs ++ [] ≡ xs
  14. xs++[]≡xs [] = refl
  15. xs++[]≡xs (x ∷ xs) = cong (_∷_ x) (xs++[]≡xs xs)
  16.  
  17. ++-assoc : ∀ {a} → {A : Set a}
  18. → (xs : List A)
  19. → (ys : List A)
  20. → (zs : List A)
  21. → xs ++ ys ++ zs ≡ (xs ++ ys) ++ zs
  22. ++-assoc [] ys zs = refl
  23. ++-assoc (x ∷ xs) ys zs = cong (_∷_ x) (++-assoc xs ys zs)
  24.  
  25. -- Syntax
  26. data L {a} {A : Set a} : List A → Set a where
  27. nil : L []
  28. app : (xs : List A) → ∀ {ys zs} → L ys → xs ++ ys ≡ zs → L zs
  29.  
  30. eval-L : ∀ {a} {A : Set a} {xs : List A} → L xs → Σ (List A) λ xs' → xs' ≡ xs
  31. eval-L nil = [] , refl
  32. eval-L (app xs l p) with eval-L l
  33. ... | ys , q = xs ++ ys , (begin
  34. xs ++ ys ≡⟨ cong (λ ys' → xs ++ ys') q ⟩
  35. xs ++ _ ≡⟨ p ⟩
  36. _ ∎)
  37.  
  38. l : ∀ {a} → {A : Set a} → (xs : List A) → L xs
  39. l xs = app xs nil (xs++[]≡xs xs)
  40.  
  41. infixr 5 _<>_
  42. _<>_ : ∀ {a} {A : Set a} {xs ys : List A} → L xs → L ys → L (xs ++ ys)
  43. nil <> zs = zs
  44. _<>_ {ys = ws} (app xs {ys = ys} {zs = zs} ys' p) ws' =
  45. app xs {ys = ys ++ ws} (ys' <> ws') (begin
  46. xs ++ ys ++ ws ≡⟨ ++-assoc xs ys ws ⟩
  47. (xs ++ ys) ++ ws ≡⟨ cong (λ zs' → zs' ++ ws) p ⟩
  48. zs ++ ws ∎)
  49.  
  50. solve : ∀ {a} {A : Set a} {xs ys : List A}
  51. → (xs' : L xs)
  52. → (ys' : L ys)
  53. → (proj₁ (eval-L xs') ≡ proj₁ (eval-L ys'))
  54. → xs ≡ ys
  55. solve {xs = xs} {ys = ys} xs' ys' s = begin
  56. xs ≡⟨ sym (proj₂ (eval-L xs')) ⟩
  57. proj₁ (eval-L xs') ≡⟨ s ⟩
  58. proj₁ (eval-L ys') ≡⟨ proj₂ (eval-L ys') ⟩
  59. ys ∎
  60. where
  61. xsp = eval-L xs'
  62.  
  63. -- DEMOS
  64. --------------
  65.  
  66. ++-assoc-again : ∀ {a} → {A : Set a}
  67. → (xs : List A)
  68. → (ys : List A)
  69. → (zs : List A)
  70. → xs ++ ys ++ zs ≡ (xs ++ ys) ++ zs
  71. ++-assoc-again xs ys zs = solve
  72. (l xs <> l ys <> l zs)
  73. ((l xs <> l ys) <> l zs)
  74. refl
  75.  
  76. crazier : ∀ {a} → {A : Set a}
  77. → (xs : List A)
  78. → (ys : List A)
  79. → (zs : List A)
  80. → (ws : List A)
  81. → xs ++ (ys ++ zs) ++ ws ≡ (xs ++ ys) ++ (zs ++ ws)
  82. crazier xs ys zs ws = solve
  83. (l xs <> (l ys <> l zs) <> l ws)
  84. ((l xs <> l ys) <> (l zs <> l ws))
  85. refl
  86.  
  87. import Data.List.Properties
  88. module List-solver = Data.List.Properties.List-solver
  89. open List-solver using (_⊕_; _⊜_)
  90.  
  91. crazier-again : ∀ {a} → {A : Set a}
  92. → (xs : List A)
  93. → (ys : List A)
  94. → (zs : List A)
  95. → (ws : List A)
  96. → xs ++ (ys ++ zs) ++ ws ≡ (xs ++ ys) ++ (zs ++ ws)
  97. crazier-again = List-solver.solve 4
  98. (λ xs ys zs ws → xs ⊕ (ys ⊕ zs) ⊕ ws ⊜ (xs ⊕ ys) ⊕ (zs ⊕ ws))
  99. refl
Add Comment
Please, Sign In to add comment