Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sort"
  6. )
  7.  
  8. /////////////////////
  9. /////// Types ///////
  10. /////////////////////
  11.  
  12. type Vertex struct {
  13. number int
  14. related []*Vertex
  15. signals []string
  16. }
  17.  
  18. type vertexArray []*Vertex
  19.  
  20.  
  21. type DeterministicVertex struct {
  22. number int
  23. elements vertexArray
  24. related []*DeterministicVertex
  25. signals map[*DeterministicVertex][]string
  26. }
  27.  
  28. type detVertexArray []*DeterministicVertex
  29.  
  30. func main() {
  31. var state_count, trans_count int
  32. fmt.Scan(&state_count, &trans_count)
  33.  
  34. var vertices vertexArray
  35. alpha := make([]string, 0)
  36. vertices.declareVertex(state_count)
  37. alpha = vertices.initVertex(trans_count, alpha)
  38.  
  39. final_states := make([]int, state_count)
  40. for i := 0; i < state_count; i++ {
  41. fmt.Scan(&final_states[i])
  42. }
  43.  
  44. var start int
  45. fmt.Scan(&start)
  46.  
  47. det(alpha, vertices, final_states, start)
  48. }
  49.  
  50. func (vertices *vertexArray) declareVertex(state_count int) {
  51. *vertices = make(vertexArray, 0)
  52.  
  53. for i := 0; i < state_count; i++ {
  54. vertex := Vertex{number: i, related: make(vertexArray, 0), signals: make([]string, 0)}
  55. *vertices = append(*vertices, &vertex)
  56. }
  57. }
  58.  
  59. func (vertices vertexArray) initVertex(trans_count int, alpha []string) []string {
  60. for i := 0; i < trans_count; i++ {
  61. var temp1, temp2 int
  62. var label string
  63. fmt.Scan(&temp1, &temp2, &label)
  64. vertices[temp1].related = append(vertices[temp1].related, vertices[temp2])
  65. vertices[temp1].signals = append(vertices[temp1].signals, label)
  66. if !searchLabel(alpha, label) && label != "lambda" {
  67. alpha = append(alpha, label)
  68. }
  69. }
  70. return alpha
  71. }
  72.  
  73. func searchLabel(alpha []string, label string) bool {
  74. for _, str := range alpha {
  75. if str == label {
  76. return true
  77. }
  78. }
  79. return false
  80. }
  81.  
  82. func (dVertices *DeterministicVertex) initDVertex() {
  83. dVertices.signals = make(map[*DeterministicVertex][]string, 0)
  84. dVertices.elements = make([]*Vertex, 0)
  85. dVertices.related = make(detVertexArray, 0)
  86. }
  87.  
  88. func closure(vertices vertexArray)(detVertex *DeterministicVertex) {
  89. detVertex = new(DeterministicVertex)
  90. detVertex.initDVertex()
  91.  
  92. for _, vertex := range vertices {
  93. dfs(vertex, detVertex)
  94. }
  95. return detVertex
  96. }
  97.  
  98. func dfs(vertex *Vertex, detVertex *DeterministicVertex) {
  99. if !detVertex.find(vertex) {
  100. detVertex.elements = append(detVertex.elements, vertex)
  101. for i, rel := range vertex.related {
  102. if vertex.signals[i] == "lambda" {
  103. dfs(rel, detVertex)
  104. }
  105. }
  106. }
  107. }
  108.  
  109. func (detVertex *DeterministicVertex) find(elem *Vertex) bool {
  110. for _, item := range detVertex.elements {
  111. if item.number == elem.number {
  112. return true
  113. }
  114. }
  115. return false
  116. }
  117.  
  118. func det(alpha []string, vertices vertexArray, final_state []int, state int) {
  119. start_closure := make(vertexArray, 0)
  120. start_closure = append(start_closure, vertices[state])
  121. start := closure(start_closure) // Pointer on DeterministicVertex
  122. count := 0 // Numeration detVertexArray
  123. start.number = count
  124. count++
  125. detAutomata := make(detVertexArray, 0) // determenistic automata
  126. detAutomata = append(detAutomata, start)
  127. isFinalS := make([]int, 0) // Set final states
  128.  
  129. stack := new(Stack)
  130.  
  131. stack.Push(start)
  132.  
  133. for stack.Len() > 0 {
  134. var z *DeterministicVertex
  135. z = stack.Pop().(*DeterministicVertex)
  136.  
  137. for _, u := range z.elements {
  138. if final_state[u.number] == 1 {
  139. isFinalS = append(isFinalS, z.number) // this detVertex is final
  140. break
  141. }
  142. }
  143.  
  144. for _, symbol := range alpha {
  145. temp := make([]*Vertex, 0)
  146. for _, u:= range z.elements {
  147. for k, g := range u.signals {
  148. if g == symbol {
  149. temp = append(temp, u.related[k])
  150. }
  151. }
  152. }
  153.  
  154. new_z := closure(temp)
  155.  
  156. if !isContainedDetVertex(detAutomata, new_z) {
  157. new_z.number = count
  158. count++
  159. detAutomata = append(detAutomata, new_z)
  160. stack.Push(new_z)
  161. } else {
  162. new_z = getNeedDetVertex(detAutomata, new_z)
  163. }
  164.  
  165. z.signals[new_z] = append(z.signals[new_z], symbol)
  166.  
  167. if !isContainedDetVertex(z.related, new_z){
  168. z.related = append(z.related, new_z)
  169. }
  170. }
  171.  
  172. }
  173.  
  174. detAutomata.printDotAutomata(isFinalS, vertices[state])
  175. }
  176.  
  177. func isContainedDetVertex(Q detVertexArray, z *DeterministicVertex) bool {
  178. count := 0
  179. for _, item := range Q {
  180. count = 0
  181. if len(item.elements) != len(z.elements) {
  182. continue
  183. }
  184.  
  185. for _, elem := range item.elements {
  186. for _, elemZ := range z.elements {
  187. if elem.number == elemZ.number {
  188. count++
  189. }
  190. }
  191. }
  192.  
  193. if count == len(item.elements) {
  194. return true
  195. }
  196. }
  197. return false
  198. }
  199.  
  200.  
  201. func (detAutomata detVertexArray) printDotAutomata(final_det []int, start_vertex *Vertex) {
  202. fmt.Println("digraph {")
  203. fmt.Println("\trankdir = LR")
  204. fmt.Println("\tdummy [label = \"\", shape = none] ")
  205.  
  206. for _, element := range detAutomata {
  207. count := 0
  208. fmt.Print("\t", element.number)
  209. fmt.Print(" [label = \"[")
  210. sort.Sort(element.elements)
  211. for _, child := range element.elements {
  212. if count < len(element.elements) - 1 {
  213. fmt.Printf("%d ", child.number)
  214. count++
  215. } else {
  216. fmt.Print(child.number)
  217. }
  218. }
  219. count = 0
  220. fmt.Print("]\", shape =")
  221. if element.isFinalS(final_det) {
  222. fmt.Println(" doublecircle]")
  223. } else {
  224. fmt.Println(" circle]")
  225. }
  226. }
  227.  
  228. for _, start := range detAutomata {
  229. for _, elem:= range start.elements {
  230. if elem.number == start_vertex.number {
  231. fmt.Println("\tdummy ->", start.number)
  232. }
  233. }
  234. }
  235.  
  236.  
  237. for _, item := range detAutomata {
  238. for _, s := range item.related {
  239. count := 0
  240. fmt.Print("\t", item.number, " -> ", s.number)
  241. fmt.Print(" [label = \"")
  242. for _, signal := range item.signals[s] {
  243. if count < len(item.signals[s]) - 1 {
  244. count++
  245. fmt.Print(signal, ", ")
  246. } else {
  247. fmt.Print(signal)
  248. }
  249.  
  250. }
  251. count = 0
  252. fmt.Print("\"]")
  253. fmt.Println()
  254. }
  255. }
  256.  
  257. fmt.Print("}")
  258. }
  259.  
  260. func (vertex *DeterministicVertex) isFinalS(final_det []int) bool {
  261. for _, final := range final_det {
  262. if final == vertex.number {
  263. return true
  264. }
  265. }
  266. return false
  267. }
  268.  
  269. func getNeedDetVertex(Q detVertexArray, z *DeterministicVertex) (*DeterministicVertex) {
  270. count := 0
  271. for _, item := range Q {
  272. count = 0
  273. if len(item.elements) != len(z.elements) {
  274. continue
  275. }
  276.  
  277. for _, elem := range item.elements {
  278. for _, elemZ := range z.elements {
  279. if elem.number == elemZ.number {
  280. count++
  281. }
  282. }
  283. }
  284.  
  285. if count == len(item.elements) {
  286. return item
  287. }
  288. }
  289. return z
  290. }
  291.  
  292. /////////////////////
  293. /////// Stack ///////
  294. /////////////////////
  295.  
  296. type Stack struct {
  297. top *Element
  298. size int
  299. }
  300.  
  301. type Element struct {
  302. value interface{}
  303. next *Element
  304. }
  305.  
  306. func (s *Stack) Len() int {
  307. return s.size
  308. }
  309.  
  310. func (s *Stack) Push(value interface{}) {
  311. s.top = &Element{value, s.top}
  312. s.size++
  313. }
  314.  
  315. func (s *Stack) Pop() (value interface{}) {
  316. if s.size > 0 {
  317. value, s.top = s.top.value, s.top.next
  318. s.size--
  319. return
  320. }
  321. return nil
  322. }
  323.  
  324. /////////////////////
  325. /////// Sort ////////
  326. /////////////////////
  327.  
  328. func (vertices vertexArray) Len() int {
  329. return len(vertices)
  330. }
  331.  
  332. func (vertices vertexArray) Swap(i, j int) {
  333. vertices[i], vertices[j] = vertices[j], vertices[i]
  334. }
  335.  
  336. func (vertices vertexArray) Less(i, j int) bool {
  337. return vertices[i].number < vertices[j].number
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement