metamodels.alc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "library.alh"
  4. include "conformance_scd.alh"
  5. Element function create_metamodels():
  6. if (bool_not(dict_in(dict_read(read_root(), "__hierarchy"), "models"))):
  7. Element scd
  8. Element scd_model
  9. scd = create_node()
  10. scd_model = create_node()
  11. dict_add(scd, "model", scd_model)
  12. instantiate_bottom_node(scd, "Class")
  13. instantiate_bottom_value(scd, "Type", Type)
  14. instantiate_bottom_value(scd, "__String", String)
  15. instantiate_bottom_value(scd, "__name", "name")
  16. instantiate_bottom_edge(scd, "Attribute", scd_model["Class"], scd_model["Type"])
  17. instantiate_bottom_edge(scd, "__Name", scd_model["Attribute"], scd_model["__String"])
  18. instantiate_bottom_edge(scd, "Association", scd_model["Class"], scd_model["Class"])
  19. instantiate_bottom_edge(scd, "Inheritance", scd_model["Class"], scd_model["Class"])
  20. instantiate_bottom_edge(scd, "__name_edge", scd_model["__Name"], scd_model["__name"])
  21. instantiate_bottom_edge(scd, "__inh_1", scd_model["Association"], scd_model["Class"])
  22. instantiate_bottom_edge(scd, "__inh_2", scd_model["Attribute"], scd_model["Class"])
  23. instantiate_bottom_value(scd, "__attribute", "attribute")
  24. instantiate_bottom_edge(scd, "__attribute_edge", scd_model["Attribute"], scd_model["__attribute"])
  25. // Instantiated, now retype to make sure that everything is correct
  26. Element mapping
  27. mapping = create_node()
  28. dict_add(mapping, scd_model["Class"], scd_model["Class"])
  29. dict_add(mapping, scd_model["Type"], scd_model["Type"])
  30. dict_add(mapping, scd_model["__String"], scd_model["Type"])
  31. dict_add(mapping, scd_model["Attribute"], scd_model["Attribute"])
  32. dict_add(mapping, scd_model["__Name"], scd_model["Attribute"])
  33. dict_add(mapping, scd_model["Association"], scd_model["Association"])
  34. dict_add(mapping, scd_model["Inheritance"], scd_model["Association"])
  35. dict_add(mapping, scd_model["__inh_1"], scd_model["Inheritance"])
  36. dict_add(mapping, scd_model["__inh_2"], scd_model["Inheritance"])
  37. dict_add(mapping, scd_model["__name"], scd_model["__String"])
  38. dict_add(mapping, scd_model["__name_edge"], scd_model["__Name"])
  39. dict_add(mapping, scd_model["__attribute"], scd_model["__String"])
  40. dict_add(mapping, scd_model["__attribute_edge"], scd_model["__Name"])
  41. retype(scd, scd, scd_model["Inheritance"], mapping)
  42. export_node("models/SimpleClassDiagrams", scd)
  43. // TODO this code is also very dirty as there is no nice "dictionary" and "list" syntax yet
  44. Element modeletamodel
  45. modeletamodel = instantiate_new_model(scd, scd_model["Inheritance"])
  46. Element tokens
  47. tokens = create_node()
  48. dict_add(tokens, "tokens", Integer)
  49. instantiate_model_lib(modeletamodel, scd_model["Class"], "Place", create_node(), tokens, create_node())
  50. instantiate_model_lib(modeletamodel, scd_model["Class"], "Transition", create_node(), create_node(), create_node())
  51. Element weight
  52. weight = create_node()
  53. dict_add(weight, "weight", Integer)
  54. Element p2t_links
  55. p2t_links = create_node()
  56. list_append(p2t_links, modeletamodel["model"]["Place"])
  57. list_append(p2t_links, modeletamodel["model"]["Transition"])
  58. Element t2p_links
  59. t2p_links = create_node()
  60. list_append(t2p_links, modeletamodel["model"]["Transition"])
  61. list_append(t2p_links, modeletamodel["model"]["Place"])
  62. instantiate_model_lib(modeletamodel, scd_model["Association"], "P2T", p2t_links, weight, create_node())
  63. instantiate_model_lib(modeletamodel, scd_model["Association"], "T2P", t2p_links, weight, create_node())
  64. set_model_constraints(modeletamodel, petrinet_constraints)
  65. export_node("models/PetriNets", modeletamodel)
  66. // Also create conformance bottom metamodel
  67. Element mm_bottom
  68. Element mm_bottom_model
  69. mm_bottom = create_node()
  70. mm_bottom_model = create_node()
  71. dict_add(mm_bottom, "model", mm_bottom_model)
  72. instantiate_bottom_node(mm_bottom, "Node")
  73. instantiate_bottom_value(mm_bottom, "Type", Type)
  74. instantiate_bottom_value(mm_bottom, "Integer", Integer)
  75. instantiate_bottom_value(mm_bottom, "Action", Action)
  76. instantiate_bottom_value(mm_bottom, "Float", Float)
  77. instantiate_bottom_value(mm_bottom, "String", String)
  78. instantiate_bottom_value(mm_bottom, "Boolean", Boolean)
  79. instantiate_bottom_edge(mm_bottom, "Edge", mm_bottom_model["Node"], mm_bottom_model["Node"])
  80. instantiate_bottom_edge(mm_bottom, "__Inheritance", mm_bottom_model["Node"], mm_bottom_model["Node"])
  81. instantiate_bottom_edge(mm_bottom, "__inh_1", mm_bottom_model["Type"], mm_bottom_model["Node"])
  82. instantiate_bottom_edge(mm_bottom, "__inh_2", mm_bottom_model["Integer"], mm_bottom_model["Node"])
  83. instantiate_bottom_edge(mm_bottom, "__inh_3", mm_bottom_model["Action"], mm_bottom_model["Node"])
  84. instantiate_bottom_edge(mm_bottom, "__inh_4", mm_bottom_model["Float"], mm_bottom_model["Node"])
  85. instantiate_bottom_edge(mm_bottom, "__inh_5", mm_bottom_model["String"], mm_bottom_model["Node"])
  86. instantiate_bottom_edge(mm_bottom, "__inh_6", mm_bottom_model["Boolean"], mm_bottom_model["Node"])
  87. instantiate_bottom_edge(mm_bottom, "__inh_7", mm_bottom_model["Edge"], mm_bottom_model["Node"])
  88. // Retype it with itself
  89. mapping = create_node()
  90. dict_add(mapping, mm_bottom_model["Node"], mm_bottom_model["Node"])
  91. dict_add(mapping, mm_bottom_model["Type"], mm_bottom_model["Type"])
  92. dict_add(mapping, mm_bottom_model["Integer"], mm_bottom_model["Type"])
  93. dict_add(mapping, mm_bottom_model["Float"], mm_bottom_model["Type"])
  94. dict_add(mapping, mm_bottom_model["String"], mm_bottom_model["Type"])
  95. dict_add(mapping, mm_bottom_model["Boolean"], mm_bottom_model["Type"])
  96. dict_add(mapping, mm_bottom_model["Action"], mm_bottom_model["Type"])
  97. dict_add(mapping, mm_bottom_model["Edge"], mm_bottom_model["Edge"])
  98. dict_add(mapping, mm_bottom_model["__Inheritance"], mm_bottom_model["Edge"])
  99. dict_add(mapping, mm_bottom_model["__inh_1"], mm_bottom_model["__Inheritance"])
  100. dict_add(mapping, mm_bottom_model["__inh_2"], mm_bottom_model["__Inheritance"])
  101. dict_add(mapping, mm_bottom_model["__inh_3"], mm_bottom_model["__Inheritance"])
  102. dict_add(mapping, mm_bottom_model["__inh_4"], mm_bottom_model["__Inheritance"])
  103. dict_add(mapping, mm_bottom_model["__inh_5"], mm_bottom_model["__Inheritance"])
  104. dict_add(mapping, mm_bottom_model["__inh_6"], mm_bottom_model["__Inheritance"])
  105. dict_add(mapping, mm_bottom_model["__inh_7"], mm_bottom_model["__Inheritance"])
  106. retype(mm_bottom, mm_bottom, mm_bottom_model["__Inheritance"], mapping)
  107. export_node("models/LTM_bottom", mm_bottom)
  108. return dict_read(dict_read(read_root(), "__hierarchy"), "models")
  109. String function petrinet_constraints(model : Element):
  110. // Check places to have positive number of tokens
  111. Element all_elems
  112. Element elem_constraint
  113. all_elems = allInstances(model, model["metamodel"]["model"]["Place"])
  114. while (0 < read_nr_out(all_elems)):
  115. elem_constraint = set_pop(all_elems)
  116. if (integer_lt(readAttribute(model, elem_constraint, "tokens"), 0)):
  117. return "Negative number of tokens in Place " + getName(model, elem_constraint)
  118. // Check P2T transitions to have positive weight
  119. all_elems = allInstances(model, model["metamodel"]["model"]["P2T"])
  120. while (0 < read_nr_out(all_elems)):
  121. elem_constraint = set_pop(all_elems)
  122. if (integer_lt(readAttribute(model, elem_constraint, "weight"), 0)):
  123. return "Negative weight in arc " + getName(model, elem_constraint)
  124. // Check T2P transitions to have positive weight
  125. all_elems = allInstances(model, model["metamodel"]["model"]["T2P"])
  126. while (0 < read_nr_out(all_elems)):
  127. elem_constraint = set_pop(all_elems)
  128. if (integer_lt(readAttribute(model, elem_constraint, "weight"), 0)):
  129. return "Negative weight in arc " + getName(model, elem_constraint)
  130. return "OK"