From f2dc299eab08855bde784a2b4f6e33183e6020b5 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Thu, 24 Oct 2024 16:25:53 +0200 Subject: [PATCH] Begin working on semantics example: runtime (meta-)model extends design (meta-)model --- examples/semantics/operational/woods_pysem.py | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 examples/semantics/operational/woods_pysem.py diff --git a/examples/semantics/operational/woods_pysem.py b/examples/semantics/operational/woods_pysem.py new file mode 100644 index 0000000..ab557a3 --- /dev/null +++ b/examples/semantics/operational/woods_pysem.py @@ -0,0 +1,192 @@ +from state.devstate import DevState +from bootstrap.scd import bootstrap_scd +from framework.conformance import Conformance, render_conformance_check_result +from concrete_syntax.textual_od import parser, renderer +from concrete_syntax.common import indent +from concrete_syntax.plantuml import renderer as plantuml +from util.prompt import yes_no, pause +from transformation.cloner import clone_od + +state = DevState() + +print("Loading meta-meta-model...") +scd_mmm = bootstrap_scd(state) +print("Done") + + +# Design meta-model +woods_mm_cs = """ + Animal:Class { + abstract = True; + } + + Bear:Class + :Inheritance (Bear -> Animal) + + Man:Class { + lower_cardinality = 1; + upper_cardinality = 2; + + constraint = `get_value(get_slot(this, "weight")) > 20`; + } + :Inheritance (Man -> Animal) + + + Man_weight:AttributeLink (Man -> Integer) { + name = "weight"; + optional = False; + } + + afraidOf:Association (Man -> Animal) { + source_upper_cardinality = 6; + target_lower_cardinality = 1; + } +""" + +woods_mm = parser.parse_od( + state, + m_text=woods_mm_cs, + mm=scd_mmm) + +print("MM valid?") +conf = Conformance(state, woods_mm, scd_mmm) +print(render_conformance_check_result(conf.check_nominal())) + +# Runtime meta-model +woods_rt_mm_cs = woods_mm_cs + """ + AnimalState:Class { + abstract = True; + } + AnimalState_dead:AttributeLink (AnimalState -> Boolean) { + name = "dead"; + optional = False; + } + of:Association (AnimalState -> Animal) { + source_lower_cardinality = 1; + source_upper_cardinality = 1; + target_lower_cardinality = 1; + target_upper_cardinality = 1; + } + + BearState:Class { + constraint = `get_type_name(get_target(get_outgoing(this, "of")[0])) == "Bear"`; + } + :Inheritance (BearState -> AnimalState) + BearState_hunger:AttributeLink (BearState -> Integer) { + name = "hunger"; + optional = False; + constraint = ``` + val = get_value(get_target(this)) + val >= 0 and val <= 100 + ```; + } + + ManState:Class { + constraint = `get_type_name(get_target(get_outgoing(this, "of")[0])) == "Man"`; + } + :Inheritance (ManState -> AnimalState) + + Clock:Class { + lower_cardinality = 1; + upper_cardinality = 1; + } + Clock_time:AttributeLink (Clock -> Integer) { + name = "time"; + optional = False; + constraint = `get_value(get_target(this)) >= 0`; + } +""" + +woods_rt_mm = parser.parse_od( + state, + m_text=woods_rt_mm_cs, + mm=scd_mmm) + +print("RT-MM valid?") +conf = Conformance(state, woods_rt_mm, scd_mmm) +print(render_conformance_check_result(conf.check_nominal())) + +# print("--------------") +# print(indent( +# renderer.render_od(state, +# m_id=woods_rt_mm, +# mm_id=scd_mmm), +# 4)) +# print("--------------") + +# Our design model - the part that doesn't change +woods_m_cs = """ + george:Man { + weight = 80; + } + bill:Man { + weight = 70; + } + + teddy:Bear + mrBrown:Bear + + # george is afraid of both bears + :afraidOf (george -> teddy) + :afraidOf (george -> mrBrown) + + # the men are afraid of each other + :afraidOf (bill -> george) + :afraidOf (george -> bill) +""" + +woods_m = parser.parse_od( + state, + m_text=woods_m_cs, + mm=woods_mm) + +print("M valid?") +conf = Conformance(state, woods_m, woods_mm) +print(render_conformance_check_result(conf.check_nominal())) + +# Our runtime model - the part that changes with every execution step +woods_rt_initial_m_cs = woods_m_cs + """ + georgeState:ManState { + dead = False; + } + :of (georgeState -> george) + + billState:ManState { + dead = False; + } + :of (billState -> bill) + + teddyState:BearState { + dead = False; + hunger = 20; + } + :of (teddyState -> teddy) + + mrBrownState:BearState { + dead = False; + hunger = 80; + } + :of (mrBrownState -> mrBrown) + + clock:Clock { + time = 0; + } +""" + +woods_rt_m = parser.parse_od( + state, + m_text=woods_rt_initial_m_cs, + mm=woods_rt_mm) + +print("RT-M valid?") +conf = Conformance(state, woods_rt_m, woods_rt_mm) +print(render_conformance_check_result(conf.check_nominal())) + +# print("--------------") +# print(indent( +# renderer.render_od(state, +# m_id=woods_rt_m, +# mm_id=woods_rt_mm), +# 4)) +# print("--------------") +