metamodels.alc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "library.alh"
  4. include "conformance_scd.alh"
  5. include "modelling.alh"
  6. Element function create_metamodels():
  7. if (bool_not(dict_in(dict_read(read_root(), "__hierarchy"), "models"))):
  8. Element scd
  9. scd = instantiate_bottom()
  10. model_add_node(scd, "Class")
  11. model_add_node(scd, "Type")
  12. model_add_node(scd, "Any")
  13. model_add_node(scd, "String")
  14. model_add_value(scd, "inheritance", "inheritance")
  15. model_add_value(scd, "link", "link")
  16. model_add_value(scd, "name", "name")
  17. model_add_edge(scd, "class_inherits_any", "Class", "Any")
  18. model_add_edge(scd, "type_inherits_any", "Type", "Any")
  19. model_add_edge(scd, "Inheritance", "Any", "Any")
  20. model_add_edge(scd, "inheritance_name", "Inheritance", "inheritance")
  21. model_add_edge(scd, "Association", "Any", "Any")
  22. model_add_edge(scd, "assoc_inherits_any", "Association", "Any")
  23. model_add_edge(scd, "association_name", "Association", "link")
  24. model_add_edge(scd, "association_attr", "Association", "String")
  25. model_add_edge(scd, "attr_name", "association_attr", "name")
  26. model_add_node(scd, "Integer")
  27. // TODO: possible to use instantiate_named here?
  28. // Lower multiplicity on classes
  29. model_add_value(scd, "lower_multiplicity", "lower_multiplicity")
  30. model_add_edge(scd, "class_to_lm", "Class", "Integer")
  31. model_add_edge(scd, "lm_name", "class_to_lm", "lower_multiplicity")
  32. // Upper multiplicity on classes
  33. model_add_value(scd, "upper_multiplicity", "upper_multiplicity")
  34. model_add_edge(scd, "class_to_um", "Class", "Integer")
  35. model_add_edge(scd, "um_name", "class_to_um", "upper_multiplicity")
  36. // Source lower multiplicity on associations
  37. model_add_value(scd, "source_lower_cardinality", "source_lower_cardinality")
  38. model_add_edge(scd, "assoc_to_slc", "Association", "Integer")
  39. model_add_edge(scd, "slc_name", "assoc_to_slc", "source_lower_cardinality")
  40. // Source upper multiplicity on associations
  41. model_add_value(scd, "source_upper_cardinality", "source_upper_cardinality")
  42. model_add_edge(scd, "assoc_to_suc", "Association", "Integer")
  43. model_add_edge(scd, "suc_name", "assoc_to_suc", "source_upper_cardinality")
  44. // Target lower multiplicity on associations
  45. model_add_value(scd, "target_lower_cardinality", "target_lower_cardinality")
  46. model_add_edge(scd, "assoc_to_tlc", "Association", "Integer")
  47. model_add_edge(scd, "tlc_name", "assoc_to_tlc", "target_lower_cardinality")
  48. // Target upper multiplicity on associations
  49. model_add_value(scd, "target_upper_cardinality", "target_upper_cardinality")
  50. model_add_edge(scd, "assoc_to_tuc", "Association", "Integer")
  51. model_add_edge(scd, "tuc_name", "assoc_to_tuc", "target_upper_cardinality")
  52. retype_model(scd, scd)
  53. define_inheritance(scd, "Inheritance")
  54. retype(scd, "Class", "Class")
  55. retype(scd, "Type", "Class")
  56. retype(scd, "Any", "Class")
  57. retype(scd, "String", "Type")
  58. retype(scd, "inheritance", "String")
  59. retype(scd, "link", "String")
  60. retype(scd, "name", "String")
  61. retype(scd, "class_inherits_any", "Inheritance")
  62. retype(scd, "type_inherits_any", "Inheritance")
  63. retype(scd, "Inheritance", "Association")
  64. retype(scd, "inheritance_name", "association_attr")
  65. retype(scd, "Association", "Association")
  66. retype(scd, "assoc_inherits_any", "Inheritance")
  67. retype(scd, "association_name", "association_attr")
  68. retype(scd, "association_attr", "Association")
  69. retype(scd, "attr_name", "association_attr")
  70. retype(scd, "Integer", "Type")
  71. // TODO: with instantiate_named, after all previous retypings?
  72. // Lower multiplicity on classes
  73. retype(scd, "lower_multiplicity", "String")
  74. retype(scd, "lm_name", "association_attr")
  75. retype(scd, "class_to_um", "Association")
  76. // Upper multiplicity on classes
  77. retype(scd, "upper_multiplicity", "String")
  78. retype(scd, "class_to_lm", "Association")
  79. retype(scd, "um_name", "association_attr")
  80. // Source lower cardinality on associations
  81. retype(scd, "source_lower_cardinality", "String")
  82. retype(scd, "assoc_to_slc", "Association")
  83. retype(scd, "slc_name", "association_attr")
  84. // Source upper cardinality on associations
  85. retype(scd, "source_upper_cardinality", "String")
  86. retype(scd, "assoc_to_suc", "Association")
  87. retype(scd, "suc_name", "association_attr")
  88. // Target lower cardinality on associations
  89. retype(scd, "target_lower_cardinality", "String")
  90. retype(scd, "assoc_to_tlc", "Association")
  91. retype(scd, "tlc_name", "association_attr")
  92. // Target upper cardinality on associations
  93. retype(scd, "target_upper_cardinality", "String")
  94. retype(scd, "assoc_to_tuc", "Association")
  95. retype(scd, "tuc_name", "association_attr")
  96. // TODO: try this
  97. //instantiate_named(scd, "Association", "lower_multiplicity", "Class", "Integer")
  98. //instantiate_named(scd, "Association", "upper_multiplicity", "Class", "Integer")
  99. //instantiate_named(scd, "Association", "source_lower_multiplicity", "Association", "Integer")
  100. //instantiate_named(scd, "Association", "source_upper_multiplicity", "Association", "Integer")
  101. //instantiate_named(scd, "Association", "target_lower_multiplicity", "Association", "Integer")
  102. //instantiate_named(scd, "Association", "target_upper_multiplicity", "Association", "Integer")
  103. export_node("models/SimpleClassDiagrams", scd)
  104. Element pn
  105. pn = instantiate_model(scd)
  106. define_inheritance(pn, "Inheritance")
  107. instantiate_node(pn, "Class", "Place")
  108. instantiate_node(pn, "Class", "Transition")
  109. instantiate_node(pn, "Type", "Integer")
  110. instantiate_link(pn, "Association", "P2T", "Place", "Transition")
  111. instantiate_link(pn, "Association", "T2P", "Transition", "Place")
  112. instantiate_named(pn, "Association", "tokens", "Place", "Integer")
  113. instantiate_named(pn, "Association", "weight", "P2T", "Integer")
  114. instantiate_named(pn, "Association", "weight", "T2P", "Integer")
  115. set_model_constraints(pn, petrinet_constraints)
  116. export_node("models/PetriNets", pn)
  117. Element ltm_bottom
  118. ltm_bottom = instantiate_bottom()
  119. model_add_node(ltm_bottom, "Node")
  120. model_add_edge(ltm_bottom, "Edge", "Node", "Node")
  121. model_add_edge(ltm_bottom, "inheritance", "Node", "Node")
  122. model_add_edge(ltm_bottom, "__inh", "Edge", "Node")
  123. retype_model(ltm_bottom, ltm_bottom)
  124. define_inheritance(ltm_bottom, "inheritance")
  125. retype(ltm_bottom, "Node", "Node")
  126. retype(ltm_bottom, "Edge", "Edge")
  127. retype(ltm_bottom, "inheritance", "Edge")
  128. retype(ltm_bottom, "__inh", "inheritance")
  129. export_node("models/LTM_bottom", ltm_bottom)
  130. return dict_read(dict_read(read_root(), "__hierarchy"), "models")
  131. String function petrinet_constraints(model : Element):
  132. // Check places to have positive number of tokens
  133. Element all_elems
  134. Element elem_constraint
  135. all_elems = allInstances(model, model["metamodel"]["model"]["Place"])
  136. while (0 < read_nr_out(all_elems)):
  137. elem_constraint = set_pop(all_elems)
  138. if (integer_lt(read_attribute(model, getName(model, elem_constraint), "tokens"), 0)):
  139. return "Negative number of tokens in Place " + getName(model, elem_constraint)
  140. // Check P2T transitions to have positive weight
  141. all_elems = allInstances(model, model["metamodel"]["model"]["P2T"])
  142. while (0 < read_nr_out(all_elems)):
  143. elem_constraint = set_pop(all_elems)
  144. if (integer_lt(read_attribute(model, getName(model, elem_constraint), "weight"), 0)):
  145. return "Negative weight in arc " + getName(model, elem_constraint)
  146. // Check T2P transitions to have positive weight
  147. all_elems = allInstances(model, model["metamodel"]["model"]["T2P"])
  148. while (0 < read_nr_out(all_elems)):
  149. elem_constraint = set_pop(all_elems)
  150. if (integer_lt(read_attribute(model, getName(model, elem_constraint), "weight"), 0)):
  151. return "Negative weight in arc " + getName(model, elem_constraint)
  152. return "OK"