Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. module ModalRewriter where
  2. open BaseDefinitions.Product
  3. open BaseDefinitions.Sum
  4. open BaseDefinitions.Bool
  5. open BaseDefinitions.Equality.Definition
  6. open Equality.Properties
  7. open BaseDefinitions.List
  8. open Containers.List.Operations
  9. open BaseDefinitions.Nat
  10. open BaseDefinitions.Vector
  11. open BaseDefinitions.Unit
  12. open Functions.Composition.Definition
  13. open Boolean.Operations
  14. open Boolean.Complex
  15. open Boolean.Conversions
  16. open BaseDefinitions.BaseTypes.Fin
  17. open BaseArithmetic
  18. open BaseArithmetic.Operations
  19. open BaseArithmetic.Results hiding (_+_)
  20. open Containers.Maybe.Definition
  21. open Containers.Maybe.BooleanPredicates
  22. open Containers.Maybe.Complex
  23. open Containers.List.BooleanPredicates
  24. open Containers.Vector.BooleanPredicates
  25. open Containers.BinTree
  26. open Character
  27. open String
  28.  
  29. -- rule = pair(input-pattern , output-pattern)
  30. -- ruleset = list of rules
  31. -- pick applicable rule
  32. -- queue semantics
  33. -- list of tokens
  34. -- parse string
  35. --
  36.  
  37. data Token : Set where
  38. const : String → Token
  39. var : Nat → Token
  40.  
  41. TokenEq : Token → Token → Bool
  42. TokenEq (const c) (const d) = StringEq c d
  43. TokenEq (const c) x = false
  44. TokenEq (var v) (var w) = NatEq v w
  45. TokenEq (var v) x = false
  46.  
  47. data AST : Set where
  48. token : Token → AST
  49. term : List AST → AST
  50.  
  51. TermEqHelper : List AST → List AST → Bool
  52. TermEqHelper [] [] = true
  53. TermEqHelper (a ∷ as) [] = false
  54. TermEqHelper [] (b ∷ bs) = false
  55. TermEqHelper ((token t) ∷ rest) ((token u) ∷ rest2) = TokenEq t u
  56. TermEqHelper ((token t) ∷ rest) (x ∷ rest2) = false
  57. TermEqHelper ((term as) ∷ rest) ((term bs) ∷ rest2) = (TermEqHelper as bs) and (TermEqHelper rest rest2)
  58. TermEqHelper ((term as) ∷ rest) (x ∷ rest2) = false
  59.  
  60. TermEq : AST → AST → Bool
  61. TermEq x y = TermEqHelper [ x ] [ y ]
  62.  
  63. data AST₂ : Nat → Set where
  64. token : Token → AST₂ 0
  65. term : {n : Nat} → List (AST₂ n) → AST₂ (suc n)
  66.  
  67. data AST₃ : Nat → Set where
  68. token : {n : Nat} → Token → AST₃ n
  69. term : {n : Nat} → List (AST₃ n) → AST₃ (suc n)
  70.  
  71. addToken' : {n : Nat} → List Char → List AST → List AST
  72. addToken' [] ast = ast
  73. addToken' t ast = ast ++ [ token (const t) ]
  74.  
  75. addToken : {n : Nat} → List Char → Vector (List AST) (suc n) → Vector (List AST) (suc n)
  76. addToken [] ast = ast
  77. addToken t (ast ∷ asts) = (ast ++ [ token (const t) ]) ∷ asts
  78.  
  79. merge : { n : Nat} → Vector (List AST) (suc (suc n)) → Vector (List AST) (suc n)
  80. merge {n} (ast₁ ∷ ast₂ ∷ asts) = (ast₂ ++ [ term ast₁ ]) ∷ asts
  81.  
  82. VecFirst : {A : Set} {n : Nat} → Vector A (suc n) → A
  83. VecFirst (a ∷ as) = a
  84.  
  85. getTerm : Vector (List AST) 1 → AST
  86. getTerm ast = term (VecFirst ast)
  87.  
  88. parseState : Nat → Set
  89. parseState n = List Char × Vector (List AST) (suc n)
  90.  
  91. emptyState : parseState 0
  92. emptyState = ([] , ([] ∷ []))
  93.  
  94. doLPAREN : {n : Nat} → parseState n → Maybe (parseState (suc n))
  95. doLPAREN (t , ast) = Just ([] , ([] ∷ (addToken t ast)))
  96.  
  97. doRPAREN2 : {n : Nat} → parseState (suc n) → parseState n
  98. doRPAREN2 {n} (t , ast) = [] , (merge (addToken t ast))
  99.  
  100. doRPAREN : {n : Nat} → parseState n → Maybe (parseState (n - 1))
  101. doRPAREN {0} s = Nothing
  102. doRPAREN {suc n} s = coerce (Just (doRPAREN-sub s)) (cong (λ q → Maybe (parseState q)) (n=n-0 n))
  103. where
  104. doRPAREN-sub : {m : Nat} → parseState (suc m) → parseState m
  105. doRPAREN-sub (t , ast) = [] , (merge (addToken t ast))
  106.  
  107. doSPACE : {n : Nat} → parseState n → Maybe (parseState n)
  108. doSPACE (t , ast) = Just ([] , (addToken t ast))
  109.  
  110. doCHAR : {n : Nat} → Char → parseState n → Maybe (parseState n)
  111. doCHAR c (t , ast) = Just ((t ++ [ c ]) , ast)
  112.  
  113.  
  114.  
  115.  
  116. -- not the best parser
  117. -- put them in in reverse order and then just reverse once
  118. parse : {n : Nat} → List Char → parseState n → Maybe AST
  119. parse {0} [] ([] , ([] ∷ [])) = Nothing
  120. parse {0} [] (t , ast) = Just (getTerm (addToken t ast))
  121. parse {(suc n)} [] state = Nothing
  122. parse {n} (c ∷ x) state =
  123. dite
  124. (checkMaybe (π₂ nextState))
  125. (λ p → (parse x (extractMaybe (π₂ nextState) p)))
  126. (λ p → Nothing)
  127. where
  128. nextState : ∃ m ∈ Nat , (Maybe (parseState m))
  129. nextState =
  130. if (CharEq c LPAREN) then ((1 + n) , (doLPAREN state))
  131. else (if (CharEq c RPAREN) then ((n - 1) , (doRPAREN state))
  132. else (if (CharEq c SPACE ) then (n , (doSPACE state))
  133. else (n , (doCHAR c state))
  134. ))
  135.  
  136.  
  137. parseInput : List Char → Maybe AST
  138. parseInput s = parse s emptyState
  139.  
  140.  
  141.  
  142. -- disjoint-set roots either: point to some term, or point back to themselves
  143. -- could alternatively have the vars themselves be trees as in unifying-variables
  144. -- this is really the underlying data-structure that union-find exploits;
  145. find-check : {A : Set} {n : Nat} → Vector Bool n → (A ∨ (Vector Bool n)) → Bool
  146. find-check v (inl a) = true
  147. find-check v (inr w) = VectorEq BoolEq v w
  148.  
  149. {-
  150. find-helper2 : {A : Set} {n : Nat} → Vector Bool n → (A ∨ (Vector Bool n)) →
  151. -}
  152.  
  153. find-checkLemma : {A : Set} {n : Nat} → (v : Vector Bool n) → (p : (A ∨ (Vector Bool n))) → (find-check v p) ≡ false → ∃ w ∈ (Vector Bool n) , (p ≡ (inr w))
  154. find-checkLemma {A} {n} v (inl a) ()
  155. find-checkLemma {A} {n} v (inr w) p = w , refl
  156.  
  157.  
  158. find-checkLemma2 : {A : Set} {n : Nat} → (v : Vector Bool n) → (s : (BinTree (A ∨ (Vector Bool n)) n)) → (find-check v (retrieve s v)) ≡ false → ∃ w ∈ (Vector Bool n) , ((retrieve s v) ≡ (inr w))
  159. find-checkLemma2 {A} {n} v s p = find-checkLemma v (retrieve s v) p
  160.  
  161. check-inl : {A B : Set} → A ∨ B → Bool
  162. check-inl (inl a) = true
  163. check-inl (inr b) = false
  164.  
  165. check-inr : {A B : Set} → A ∨ B → Bool
  166. check-inr (inl a) = false
  167. check-inr (inr b) = true
  168.  
  169. extract-inl : {A B : Set} → (p : A ∨ B) → (check-inl p) ≡ true → A
  170. extract-inl (inl a) p = a
  171. extract-inl (inr b) ()
  172.  
  173. extract-inr : {A B : Set} → (p : A ∨ B) → (check-inr p) ≡ true → B
  174. extract-inr (inl a) ()
  175. extract-inr (inr b) p = b
  176.  
  177.  
  178. find-helper : {A : Set} {n : Nat} → BinTree (A ∨ (Vector Bool n)) n → Vector Bool n → List (Vector Bool n) → Nat → Maybe ((Vector Bool n) × (List (Vector Bool n)))
  179. find-helper s v l 0 = Nothing
  180. find-helper s v l (suc n) =
  181. -- check if the retrieved node is a root (constant or self-pointing var), otherwise retrieve again
  182. dite (find-check v (retrieve s v))
  183. (λ p → (Just (v , l)))
  184. (λ p → (find-helper s (π₁ (find-checkLemma2 v s p)) (v ∷ l) n))
  185.  
  186. binTree-find : {A : Set} {n : Nat} → BinTree (A ∨ (Vector Bool n)) n → Vector Bool n → Maybe ((Vector Bool n) × (List (Vector Bool n)))
  187. binTree-find {A} {n} s v = find-helper s v [] (2 ^ n)
  188.  
  189. union-helper : {A : Set} {n : Nat} (f : A → A → A) → (a b : A ∨ (Vector Bool n)) → A ∨ (Vector Bool n)
  190. union-helper {A} f (inl a) (inl b) = inl (f a b)
  191. union-helper {A} f (inl a) (inr w) = inl a
  192. union-helper {A} f (inr v) (inl b) = inl b
  193. union-helper {A} f (inr v) (inr w) = inr v
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement