Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.76 KB | None | 0 0
  1. Solve-Aux {
  2. /* В начале системы уравнение вида T E : Lt Le */
  3. (e.UsedVars) (e.Contrs) ((t.Pt e.Pe) ':' (t.Ht e.He)) e.Equations (e.Assigns)
  4. , <IsTerm t.Ht> : True
  5. , <IsTerm t.Pt> : True
  6. = <Solve-TermEquation
  7. (e.UsedVars)
  8. t.Pt t.Ht
  9. (e.Contrs) ((e.Pe) ':' (e.He)) e.Equations (e.Assigns)
  10. > : {
  11. Success e.PRTC = <Solve-Aux e.PRTC>;
  12. Failure =
  13. };
  14.  
  15. /* В начале системы уравнение вида E T: Le Lt */
  16. (e.UsedVars) (e.Contrs) ((e.Pe t.Pt) ':' (e.He t.Ht)) e.Equations (e.Assigns)
  17. , <IsTerm t.Ht> : True
  18. , <IsTerm t.Pt> : True
  19. = <Solve-TermEquation
  20. (e.UsedVars)
  21. t.Pt t.Ht
  22. (e.Contrs) ((e.Pe) ':' (e.He)) e.Equations (e.Assigns)
  23. > : {
  24. Success e.PRTC = <Solve-Aux e.PRTC>;
  25. Failure =
  26. };
  27.  
  28. /* Уравнения вида e.x E : Lt Le
  29. Разделяем на две независимые системы
  30. e.x -> empty
  31. e.x -> t.N e.N+1
  32. */
  33. (e.UsedVars) (e.Contrs) ((t.Pt e.Pe) ':' (t.Ht e.He))
  34. e.Equations (e.Assigns)
  35. , <IsTerm t.Ht> : True
  36. , t.Pt : (TkVariable 'e' e.Index)
  37. = <NewVarName (e.UsedVars) 't' 0 ()> : (e.UsedVars^) 't' e.tIdx
  38. = <NewVarName (e.UsedVars) 'e' 0 ()> : (e.UsedVars^) 'e' e.eIdx
  39. = <AddContraction
  40. (t.Pt ':' )
  41. (e.Contrs)
  42. ((e.Pe) ':' (t.Ht e.He)) e.Equations
  43. (e.Assigns)
  44. > : e.Branch1
  45. = <AddContraction
  46. (t.Pt ':' (TkVariable 't' e.tIdx) (TkVariable 'e' e.eIdx))
  47. (e.Contrs)
  48. ((t.Pt e.Pe) ':' (t.Ht e.He)) e.Equations
  49. (e.Assigns)
  50. >: e.Branch2
  51. = <Solve-Aux
  52. (e.UsedVars)
  53. e.Branch1
  54. >
  55. <Solve-Aux
  56. (e.UsedVars)
  57. e.Branch2
  58. >;
  59.  
  60. /* Уравнения вида E e.x : Le Lt
  61. Разделяем на две независимые системы
  62. e.x -> empty
  63. e.x -> e.N+1 t.N
  64. */
  65. (e.UsedVars) (e.Contrs) ((e.Pe t.Pt) ':' (e.He t.Ht))
  66. e.Equations (e.Assigns)
  67. , <IsTerm t.Ht> : True
  68. , t.Pt : (TkVariable 'e' e.Index)
  69. = <NewVarName (e.UsedVars) 't' 0 ()> : (e.UsedVars^) 't' e.tIdx
  70. = <NewVarName (e.UsedVars) 'e' 0 ()> : (e.UsedVars^) 'e' e.eIdx
  71. = <AddContraction
  72. (t.Pt ':' )
  73. (e.Contrs)
  74. ((e.Pe) ':' (e.He t.Ht)) e.Equations
  75. (e.Assigns)
  76. > : e.Branch1
  77. = <AddContraction
  78. (t.Pt ':' (TkVariable 'e' e.eIdx) (TkVariable 't' e.tIdx))
  79. (e.Contrs)
  80. ((e.Pe t.Pt) ':' (e.He t.Ht)) e.Equations
  81. (e.Assigns)
  82. >: e.Branch2
  83. = <Solve-Aux
  84. (e.UsedVars)
  85. e.Branch1
  86. >
  87.  
  88. <Solve-Aux
  89. (e.UsedVars)
  90. e.Branch2
  91. >;
  92.  
  93. /* Если уравнение имеет вид Expr: e.x, добавляем присванивание
  94. вида Expr <- e.x */
  95. (e.UsedVars) (e.Contrs) ((e.Pe) ':' ((TkVariable 'e' e.Idx)))
  96. e.Equations (e.Assigns)
  97. = <Solve-Aux
  98. (e.UsedVars)
  99. (e.Contrs)
  100. e.Equations
  101. (e.Assigns (e.Pe ':' (TkVariable 'e' e.Idx)))
  102. >;
  103.  
  104. /* Если уравнение имеет вид empty: Lt Le, ничего не возвращаем */
  105. (e.UsedVars) (e.Contrs) (() ':' (t.Ht e.He)) e.Equations (e.Assigns)
  106. , <IsTerm t.Ht>: True = ;
  107.  
  108. /* Если уравнение имеет вид e.i* : empty, возвращаем результат,
  109. предварительно добавив пустые сужения
  110. */
  111. (e.UsedVars) (e.Contrs) ((e.Pt) ':' ()) e.Equations (e.Assigns)
  112. , <IsFreeVariableSeq e.Pt> : True
  113. , <Map
  114. {
  115. t.Free = (t.Free ':' )
  116. }
  117. e.Pt
  118. > : e.NewContrs
  119. = <Solve-Aux
  120. (e.UsedVars)
  121. <AddContractions
  122. (e.NewContrs)
  123. (e.Contrs)
  124. e.Equations
  125. (e.Assigns)
  126. >
  127. >;
  128.  
  129. (e.UsedVars) (e.Contrs) (() ':' ()) e.Equations (e.Assigns) =
  130. <Solve-Aux (e.UsedVars) (e.Contrs) e.Equations (e.Assigns)>;
  131.  
  132. (e.UsedVars) (e.Contrs) (e.Assigns) = <Prout 'CONTRS:' e.Contrs 'ASGNS:' e.Assigns> <Solution-PostProcess (e.Contrs) (e.Assigns)>;
  133.  
  134. e.Other = Undefined
  135. }
  136.  
  137.  
  138. /*
  139. Решает уравнение вида P:H для термов
  140.  
  141. <Solve-TermEquation (e.UsedVars) t.Symbol1 t.Symbol2 e.PRTC>
  142. == t.Result
  143.  
  144. t.Result ::= Success t.PRTC | Failure
  145. e.PRTC :: = (t.Contrs*) t.Equations* (t.Assigns*)
  146.  
  147. PRTC - partially resolved term clash
  148. */
  149.  
  150. Solve-TermEquation {
  151. /* H является символом */
  152. (e.UsedVars) t.Symbol t.Symbol e.PRTC
  153. , t.Symbol : (Symbol s.Type e.Info)
  154. = Success (e.UsedVars) e.PRTC
  155. /* нет подстановок, нет сужений */;
  156.  
  157. /* P - символ, H - s-переменная */
  158. (e.UsedVars) t.Symbol t.Svar (e.Contrs) e.Equations (e.Assigns)
  159. , t.Symbol t.Svar
  160. : (Symbol s.Type e.Info) (TkVariable 's' e.Hindex)
  161. = Success
  162. (e.UsedVars)
  163. (e.Contrs) e.Equations
  164. (e.Assigns (t.Symbol ':' t.Svar));
  165.  
  166. /* P - s-переменная, H - s-переменная */
  167. (e.UsedVars) t.PSvar t.HSvar (e.Contrs) e.Equations (e.Assigns)
  168. , t.PSvar t.HSvar
  169. : (TkVariable 's' e.Pindex) (TkVariable 's' e.Hindex)
  170. = Success
  171. (e.UsedVars)
  172. (e.Contrs)
  173. e.Equations
  174. (e.Assigns (t.PSvar ':' t.HSvar));
  175.  
  176.  
  177. /* P - s-переменная, H - символ */
  178. (e.UsedVars) t.Svar t.Symbol (e.Contrs) e.Equations (e.Assigns)
  179. , t.Svar : (TkVariable 's' e.Pindex)
  180. , <IsSVarSubset t.Symbol> : True
  181. = Success
  182. (e.UsedVars)
  183. <AddContraction
  184. (t.Svar ':' t.Symbol)
  185. (e.Contrs)
  186. e.Equations
  187. (e.Assigns)
  188. >;
  189.  
  190. /* P - терм, H - t-переменная */
  191. (e.UsedVars) t.PVar t.HVar (e.Contrs) e.Equations (e.Assigns)
  192. , t.HVar: (TkVariable 't' e.Tindex)
  193. = Success
  194. (e.UsedVars)
  195. (e.Contrs)
  196. e.Equations
  197. (e.Assigns (t.PVar':'(TkVariable 't' e.Tindex)));
  198.  
  199. /* P - t-переменная, H - скобочный терм */
  200. (e.UsedVars) t.PTvar (Brackets e.HBody) (e.Contrs) e.Equations (e.Assigns)
  201. , t.PTvar : (TkVariable 't' e.Pindex)
  202. = <NewVarName (e.UsedVars) 'e' 0 ()>
  203. : t.NewVars e.NewIndex
  204. = Success
  205. t.NewVars
  206. <AddContraction
  207. (t.PTvar ':' (Brackets (TkVariable 'e' e.NewIndex)))
  208. (e.Contrs)
  209. e.Equations (((TkVariable 'e' e.NewIndex)) ':' (e.HBody))
  210. (e.Assigns)
  211. >;
  212.  
  213. /* P - t-переменная, H - символ */
  214. (e.UsedVars) t.PTvar t.Symbol (e.Contrs) e.Equations (e.Assigns)
  215. , t.PTvar t.Symbol
  216. : (TkVariable 't' e.Pindex) (Symbol s.Type e.Info)
  217. = Success
  218. (e.UsedVars)
  219. <AddContraction
  220. (t.PTvar ':' t.Symbol)
  221. (e.Contrs)
  222. e.Equations
  223. (e.Assigns)
  224. >;
  225.  
  226. /* P - t-переменная, H - s-переменная */
  227. (e.UsedVars) t.PTvar t.HSvar (e.Contrs) e.Equations (e.Assigns)
  228. , t.PTvar t.HSvar
  229. : (TkVariable 't' e.Pindex) (TkVariable 's' e.Hindex)
  230. = Success
  231. (e.UsedVars)
  232. <AddContraction
  233. (t.PTvar ':' t.HSvar)
  234. (e.Contrs)
  235. e.Equations
  236. (e.Assigns)
  237. >;
  238.  
  239. /* H является (H′) */
  240. (e.UsedVars)
  241. (Brackets e.TBody)(Brackets e.HBody)
  242. (e.Contrs) e.Equations (e.Assigns)
  243. = Success
  244. (e.UsedVars)
  245. (e.Contrs) e.Equations ((e.TBody) ':' (e.HBody))
  246. (e.Assigns);
  247.  
  248. /* H является [H′] */
  249. (e.UsedVars)
  250. (ADT-Brackets (e.Name) e.TBody)(ADT-Brackets (e.Name) e.HBody)
  251. (e.Contrs) e.Equations (e.Assigns)
  252. = Success
  253. (e.UsedVars)
  254. (e.Contrs) e.Equations ((e.TBody) ':' (e.HBody)) (e.Assigns);
  255.  
  256. e.Other = Failure
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement