diff options
author | Kristóf Marussy <marussy@mit.bme.hu> | 2020-05-10 22:13:21 +0200 |
---|---|---|
committer | Kristóf Marussy <marussy@mit.bme.hu> | 2020-05-10 22:13:21 +0200 |
commit | 5a6eea9bd15597eab77bbcedb4b5116020f0a67d (patch) | |
tree | 6c86f7e5bd3d86fde29d3fee4fb4f912f35057bc /Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries | |
parent | Add satellite case study (diff) | |
parent | Merge branch 'master' of https://github.com/viatra/VIATRA-Generator (diff) | |
download | VIATRA-Generator-5a6eea9bd15597eab77bbcedb4b5116020f0a67d.tar.gz VIATRA-Generator-5a6eea9bd15597eab77bbcedb4b5116020f0a67d.tar.zst VIATRA-Generator-5a6eea9bd15597eab77bbcedb4b5116020f0a67d.zip |
Merge branch 'master' of github.com:viatra/VIATRA-Generator
Diffstat (limited to 'Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries')
3 files changed, 491 insertions, 0 deletions
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore new file mode 100644 index 00000000..527f3a0e --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore | |||
@@ -0,0 +1,112 @@ | |||
1 | /.Inv17.java._trace | ||
2 | /.Inv20.java._trace | ||
3 | /.Inv33_con.java._trace | ||
4 | /.Inv34.java._trace | ||
5 | /.Inv35.java._trace | ||
6 | /.Inv47.java._trace | ||
7 | /.Inv48.java._trace | ||
8 | /.Inv48_helper.java._trace | ||
9 | /.Case_study_A.java._trace | ||
10 | /.Inv49.java._trace | ||
11 | /.Inv49_con.java._trace | ||
12 | /.Inv49_helper.java._trace | ||
13 | /.H_inv49.java._trace | ||
14 | /.Ocl_inv49.java._trace | ||
15 | /.Vql_inv49.java._trace | ||
16 | /.Vql_inv492.java._trace | ||
17 | /.H1_inv48.java._trace | ||
18 | /.H2_inv48.java._trace | ||
19 | /.Vql_inv48.java._trace | ||
20 | /.H3_inv48.java._trace | ||
21 | /.H1_inv49.java._trace | ||
22 | /.H2_inv49.java._trace | ||
23 | /.H_inv47.java._trace | ||
24 | /.Inv35test.java._trace | ||
25 | /.Inv33.java._trace | ||
26 | /.X.java._trace | ||
27 | /.H_inv16_moreThan1.java._trace | ||
28 | /.H_inv48_1.java._trace | ||
29 | /.H_inv48_2.java._trace | ||
30 | /.H_inv48_3.java._trace | ||
31 | /.H_inv49_1.java._trace | ||
32 | /.H_inv49_2.java._trace | ||
33 | /.Inv16.java._trace | ||
34 | /.Inv15.java._trace | ||
35 | /.H_inv13.java._trace | ||
36 | /.Inv13.java._trace | ||
37 | /.Inv12.java._trace | ||
38 | /.H_inv12_notNonRes.java._trace | ||
39 | /.H_inv12_notZZ.java._trace | ||
40 | /.H_inv11_incOver100.java._trace | ||
41 | /.Inv11.java._trace | ||
42 | /.H_inv11_incNotOver100.java._trace | ||
43 | /.H_inv8_notEI.java._trace | ||
44 | /.Inv8.java._trace | ||
45 | /.H_inv08_notEI.java._trace | ||
46 | /.Inv08.java._trace | ||
47 | /.H_inv08_inRange.java._trace | ||
48 | /.X_inv08_inRange.java._trace | ||
49 | /.X_inv08_notEI.java._trace | ||
50 | /.X_inv11_incNotOver100.java._trace | ||
51 | /.X_inv11_incOver100.java._trace | ||
52 | /.X_inv12_notNonRes.java._trace | ||
53 | /.X_inv12_notZZ.java._trace | ||
54 | /.X_inv13.java._trace | ||
55 | /.X_inv47.java._trace | ||
56 | /.X_inv48_1.java._trace | ||
57 | /.X_inv48_2.java._trace | ||
58 | /.X_inv48_3.java._trace | ||
59 | /.X_inv49_1.java._trace | ||
60 | /.X_inv49_2.java._trace | ||
61 | /.X_inv48_Dis.java._trace | ||
62 | /.X_inv48_notDis.java._trace | ||
63 | /.X_inv08_noType.java._trace | ||
64 | /.X_inv08_invalidType.java._trace | ||
65 | /.Inv06.java._trace | ||
66 | /.X_inv06_inRange.java._trace | ||
67 | /.Inv05.java._trace | ||
68 | /.X_inv05_inRange.java._trace | ||
69 | /.Inv03.java._trace | ||
70 | /.X_inv03_noAll.java._trace | ||
71 | /.X_inv03_eligAll.java._trace | ||
72 | /.X_inv03_hasAll.java._trace | ||
73 | /.Inv07.java._trace | ||
74 | /.Inv10.java._trace | ||
75 | /.X_inv15.java._trace | ||
76 | /Inv03.java | ||
77 | /Inv05.java | ||
78 | /Inv06.java | ||
79 | /X_inv03_eligAll.java | ||
80 | /X_inv03_hasAll.java | ||
81 | /X_inv05_inRange.java | ||
82 | /Case_study_A.java | ||
83 | /Inv07.java | ||
84 | /Inv08.java | ||
85 | /Inv10.java | ||
86 | /Inv11.java | ||
87 | /Inv12.java | ||
88 | /Inv13.java | ||
89 | /Inv15.java | ||
90 | /Inv17.java | ||
91 | /Inv20.java | ||
92 | /Inv33.java | ||
93 | /Inv34.java | ||
94 | /Inv35.java | ||
95 | /Inv47.java | ||
96 | /Inv48.java | ||
97 | /Inv49.java | ||
98 | /X_inv08_inRange.java | ||
99 | /X_inv08_noType.java | ||
100 | /X_inv08_notEI.java | ||
101 | /X_inv11_incNotOver100.java | ||
102 | /X_inv11_incOver100.java | ||
103 | /X_inv12_notNonRes.java | ||
104 | /X_inv12_notZZ.java | ||
105 | /X_inv13.java | ||
106 | /X_inv15.java | ||
107 | /X_inv47.java | ||
108 | /X_inv48_3.java | ||
109 | /X_inv48_Dis.java | ||
110 | /X_inv48_notDis.java | ||
111 | /X_inv49_1.java | ||
112 | /X_inv49_2.java | ||
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl new file mode 100644 index 00000000..66ae728e --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl | |||
@@ -0,0 +1,45 @@ | |||
1 | import 'file:/Users/Aren Babikian/git/VIATRA-Attributes/case.study.a.model/model/Taxation.ecore' | ||
2 | |||
3 | package Taxation | ||
4 | |||
5 | --context Income inv inv8: | ||
6 | --if(not self.income_type.oclIsTypeOf(Employment_Income)) then | ||
7 | --self.details->forAll(d| d.distance = 0) | ||
8 | --else | ||
9 | --self.details->forAll(d| d.distance >= 0.0 and d.distance <= 100) | ||
10 | --endif | ||
11 | -- | ||
12 | --context Legal_Union_Record inv inv490: | ||
13 | --self.individual_A.oclIsKindOf(Tax_Payer) | ||
14 | -- | ||
15 | --context Legal_Union_Record inv inv491: | ||
16 | --self.individual_B->forAll(i | i.oclIsKindOf(Physical_Person) ) | ||
17 | -- | ||
18 | --context Legal_Union_Record inv inv492: | ||
19 | --self.individual_B->forAll(i | not i.oclIsTypeOf(Dependent) ) | ||
20 | -- | ||
21 | --context Legal_Union_Record inv inv493: | ||
22 | --self.individual_A <> self.individual_B | ||
23 | -- | ||
24 | --context Tax_Payer inv inv13: | ||
25 | -- self.addresses->exists( hab_add:Address | hab_add.oclIsTypeOf(Habitual_Address) = true and hab_add.country=Country::ZZ) | ||
26 | --implies | ||
27 | -- self.oclIsTypeOf(Resident_Tax_Payer) | ||
28 | |||
29 | context Income inv inv7: | ||
30 | let val:Real =self.details->asOrderedSet()->first().distance in | ||
31 | self.details->forAll(d: Income_Detail|d.distance = val) | ||
32 | |||
33 | --context External_Allowance inv inv15: | ||
34 | --let child:Dependent = self.person in | ||
35 | --let h:Household = Household.allInstances()->select(children->includes(child))->asOrderedSet()->first() in | ||
36 | --let t1:Set(Physical_Person) = Set{h.parents.individual_A}->union(h.parents.individual_B)->select(oclIsKindOf(Tax_Payer)) in | ||
37 | --if(t1->size()=1) then | ||
38 | --self.reciver = t1->asOrderedSet()->first() | ||
39 | --else | ||
40 | --self.reciver = t1->asOrderedSet()->at(2) or self.reciver = t1->asOrderedSet()->at(1) | ||
41 | --endif | ||
42 | |||
43 | |||
44 | |||
45 | endpackage \ No newline at end of file | ||
diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql new file mode 100644 index 00000000..f736ec58 --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql | |||
@@ -0,0 +1,334 @@ | |||
1 | package queries | ||
2 | |||
3 | import "http:///TaxCard.ecore" | ||
4 | |||
5 | //AttributeRemoved -> DF | ||
6 | |||
7 | //inv1-External_Allowance.amount is a derived feature (TODOcheck) | ||
8 | //inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck) | ||
9 | |||
10 | //inv3-multiplicity adjusted | ||
11 | @Constraint(message = "inv03", severity = "error", key = {dep}) | ||
12 | pattern inv03(dep : Dependent) { | ||
13 | find x_inv03_eligAll(dep); | ||
14 | neg find x_inv03_hasAll(dep); | ||
15 | } or { | ||
16 | Dependent.birth_year(dep, by); | ||
17 | check(2018-by > 21); | ||
18 | Dependent.continued_studies(dep, false); | ||
19 | Dependent.allowances(dep, _); | ||
20 | } | ||
21 | pattern x_inv03_eligAll(dep : Dependent) { | ||
22 | Dependent.birth_year(dep, by); | ||
23 | check(2018-by <= 21); | ||
24 | } or { | ||
25 | Dependent.continued_studies(dep, true); | ||
26 | } | ||
27 | pattern x_inv03_hasAll(dep : Dependent) { | ||
28 | Dependent.allowances(dep, _); | ||
29 | } | ||
30 | |||
31 | //inv5 - oclIsTypeOf - handled here | ||
32 | @Constraint(message = "inv05", severity = "error", key = {inc}) | ||
33 | pattern inv05(inc : Income) { | ||
34 | //income_type: None | ||
35 | neg find x_inv08_noType(inc); | ||
36 | Income.details.worked_days(inc, wd); | ||
37 | check(wd != 0); | ||
38 | } or { | ||
39 | //income_type: Not Employment_Income | ||
40 | Income.income_type(inc, type); | ||
41 | neg find x_inv08_notEI(type); | ||
42 | Income.details.worked_days(inc, wd); | ||
43 | check(wd != 0); | ||
44 | } or { | ||
45 | //income_type: Employment Income | ||
46 | Income.income_type(inc, type); | ||
47 | Employment_Income(type); | ||
48 | find x_inv05_inRange(inc); | ||
49 | } | ||
50 | pattern x_inv05_inRange(inc : Income) { | ||
51 | Income.details.worked_days(inc, wd); | ||
52 | check(wd < 1); | ||
53 | } or { | ||
54 | Income.details.worked_days(inc, wd); | ||
55 | check(wd > 25); | ||
56 | } | ||
57 | |||
58 | //inv6-Does not make sens, but directly from OCL | ||
59 | //first part of or from definition of getAge() | ||
60 | @Constraint(message = "inv06", severity = "error", key = {tp}) | ||
61 | pattern inv06(tp : Tax_Payer) { | ||
62 | Tax_Payer.dependents(tp, _); | ||
63 | Tax_Payer.birth_year(tp, TPBy); | ||
64 | check(2018 - TPBy > 2018-16); | ||
65 | } or { | ||
66 | Tax_Payer.birth_year(tp, TPBy); | ||
67 | Tax_Payer.dependents(tp, dep); | ||
68 | Dependent.birth_year(dep, DepBy); | ||
69 | check(2018-DepBy <= 2018-TPBy-16); | ||
70 | } | ||
71 | |||
72 | //inv7-OrderedSet | ||
73 | @Constraint(message = "inv07", severity = "error", key = {inc}) | ||
74 | pattern inv07(inc : Income) { | ||
75 | Income.details.distance(inc, d1); | ||
76 | Income.details.distance(inc, d2); | ||
77 | check(d1 != d2);//compare values | ||
78 | } | ||
79 | |||
80 | //user_complete_details-AttributeRemoved | ||
81 | |||
82 | //inv8 - oclIsTypeOf - handled here | ||
83 | @Constraint(message = "inv08", severity = "error", key = {inc}) | ||
84 | pattern inv08(inc : Income) { | ||
85 | //income_type: None | ||
86 | neg find x_inv08_noType(inc); | ||
87 | Income.details.distance(inc, dist); | ||
88 | check(dist != 0); | ||
89 | } or { | ||
90 | //income_type: Not Employment_Income | ||
91 | Income.income_type(inc, type); | ||
92 | neg find x_inv08_notEI(type); | ||
93 | Income.details.distance(inc, dist); | ||
94 | check(dist != 0); | ||
95 | } or { | ||
96 | //income_type: Employment Income | ||
97 | Income.income_type(inc, type); | ||
98 | Employment_Income(type); | ||
99 | find x_inv08_inRange(inc); | ||
100 | } | ||
101 | pattern x_inv08_notEI(type : Employment_Income) { | ||
102 | Employment_Income(type); | ||
103 | } | ||
104 | pattern x_inv08_noType(inc : Income) { | ||
105 | Income.income_type(inc, _); | ||
106 | } | ||
107 | pattern x_inv08_inRange(inc : Income) { | ||
108 | Income.details.distance(inc, dist); | ||
109 | check(dist < 0); | ||
110 | } or { | ||
111 | Income.details.distance(inc, dist); | ||
112 | check(dist > 100); | ||
113 | } | ||
114 | //inv9-DerivedFeature | ||
115 | |||
116 | //inv10-Ordered Sets | ||
117 | @Constraint(message = "inv10", severity = "error", key = {inc}) | ||
118 | pattern inv10(inc : Income) { | ||
119 | Income.details.amount(inc, a1); | ||
120 | Income.details.amount(inc, a2); | ||
121 | check(a1 != a2);//compare values | ||
122 | } | ||
123 | |||
124 | //inv11-attributes-handled by multiplicity | ||
125 | @Constraint(message = "inv11", severity = "error", key = {exp}) | ||
126 | pattern inv11(exp : Expense) { | ||
127 | find x_inv11_incOver100(exp); | ||
128 | find x_inv11_incNotOver100(exp); | ||
129 | } | ||
130 | pattern x_inv11_incOver100(exp : Expense) { | ||
131 | Expense.income.income_amount(exp, incVal); | ||
132 | check(incVal / 2 > 50); | ||
133 | |||
134 | } or { | ||
135 | Expense.declared_amount(exp, decl); | ||
136 | check(decl != 50); | ||
137 | } | ||
138 | pattern x_inv11_incNotOver100(exp : Expense) { | ||
139 | Expense.income.income_amount(exp, incVal); | ||
140 | check(incVal / 2 <= 50); | ||
141 | } or { | ||
142 | Expense.declared_amount(exp, decl); | ||
143 | check(decl < 50); | ||
144 | } or { | ||
145 | Expense.income.income_amount(exp, incVal); | ||
146 | Expense.declared_amount(exp, decl); | ||
147 | check(decl > incVal/2); | ||
148 | } | ||
149 | |||
150 | //inv12 | ||
151 | //exists - handled logically | ||
152 | @Constraint(message = "inv12", severity = "error", key = {tp}) | ||
153 | pattern inv12(tp : Tax_Payer) { | ||
154 | Tax_Payer.addresses(tp, hab_add); | ||
155 | Habitual_Address(hab_add); | ||
156 | neg find x_inv12_notZZ(hab_add); | ||
157 | Tax_Payer.incomes(tp, inc); | ||
158 | Local_Income(inc); | ||
159 | neg find x_inv12_notNonRes(tp); | ||
160 | } | ||
161 | pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) { | ||
162 | Non_Resident_Tax_Payer(tp); | ||
163 | } | ||
164 | pattern x_inv12_notZZ(hab_add : Habitual_Address) { | ||
165 | Address.country(hab_add, ::ZZ); | ||
166 | } | ||
167 | |||
168 | //inv13 - Added new containment rel Phys_Pers->Address | ||
169 | //exists - handled logically | ||
170 | @Constraint(message = "inv13", severity = "error", key = {tp}) | ||
171 | pattern inv13(tp : Tax_Payer) { | ||
172 | Tax_Payer.addresses(tp, hab_add); | ||
173 | Habitual_Address(hab_add); | ||
174 | Address.country(hab_add, ::ZZ); | ||
175 | neg find x_inv13(tp); | ||
176 | } | ||
177 | pattern x_inv13(tp : Resident_Tax_Payer) { | ||
178 | Resident_Tax_Payer(tp); | ||
179 | } | ||
180 | |||
181 | //inv14-MultiplicityChanged | ||
182 | |||
183 | //inv15-Ordered Sets in assignment if block | ||
184 | //ERROR if no household object | ||
185 | @Constraint(message = "inv15", severity = "error", key = {ea}) | ||
186 | pattern inv15(ea : External_Allowance) { | ||
187 | neg find x_inv15(ea); | ||
188 | } | ||
189 | pattern x_inv15(ea : External_Allowance) { | ||
190 | External_Allowance.person(ea, child); | ||
191 | Household.children(h, child);//only one due to multiplicity | ||
192 | Household.parents.individual_A(h, iA); | ||
193 | Tax_Payer(iA); | ||
194 | External_Allowance.reciver(ea, iA); | ||
195 | } or { | ||
196 | External_Allowance.person(ea, child); | ||
197 | Household.children(h, child);//only one due to multiplicity | ||
198 | Household.parents.individual_B(h, iB); | ||
199 | Tax_Payer(iB); | ||
200 | External_Allowance.reciver(ea, iB); | ||
201 | } | ||
202 | |||
203 | //inv16-Tax_Card.tax_card_type is a derived feature | ||
204 | |||
205 | //inv17-attribute-handled by multiplicity | ||
206 | @Constraint(message = "inv17", severity = "error", key = {lur}) | ||
207 | pattern inv17(lur : Legal_Union_Record) { | ||
208 | Legal_Union_Record.start_year(lur, sy); | ||
209 | check(sy < 1950); | ||
210 | } or { | ||
211 | Legal_Union_Record.start_year(lur, sy); | ||
212 | check(sy > 2018); | ||
213 | } | ||
214 | |||
215 | //inv18-MultiplicityChecked | ||
216 | //inv19-MultiplicityChecked | ||
217 | |||
218 | //inv20-Useless constraint since both edges are containment (TODOCheck) | ||
219 | //OclIsUndefined-Handled by multiplicity | ||
220 | @Constraint(message = "inv20", severity = "error", key = {lur}) | ||
221 | pattern inv20(lur : Legal_Union_Record) { | ||
222 | Legal_Union_Record.individual_A(lur, iA); | ||
223 | Legal_Union_Record.individual_B(lur, iB); | ||
224 | iA == iB; | ||
225 | } | ||
226 | //inv21-MultiplicityChecked | ||
227 | //inv22-MultiplicityChecked | ||
228 | //inv23-MultiplicityChecked | ||
229 | //inv24-MultiplicityChecked | ||
230 | //inv25-MultiplicityChecked | ||
231 | //inv26-MultiplicityChanged | ||
232 | //inv27-dupOfInv24 | ||
233 | //inv28-dubOfInv23 | ||
234 | //inv29-MultiplicityChanged | ||
235 | //inv30-AttributeRemoved | ||
236 | //inv31-AttributeRemoved | ||
237 | //inv32-AttributeRemoved | ||
238 | |||
239 | //inv33-attribute-handled by multiplicity | ||
240 | @Constraint(message = "inv33", severity = "error", key = {p}) | ||
241 | pattern inv33(p : Physical_Person) { | ||
242 | Physical_Person.birth_year(p, by); | ||
243 | check(2018-by < 0); | ||
244 | } or { | ||
245 | Physical_Person.birth_year(p, by); | ||
246 | check(2018-by > 100); | ||
247 | } | ||
248 | |||
249 | //inv34-attribute-handled by multiplicity | ||
250 | @Constraint(message = "inv34", severity = "error", key = {p}) | ||
251 | pattern inv34(p : Physical_Person) { | ||
252 | Physical_Person.birth_month(p, birthMonth); | ||
253 | check(birthMonth < 1); | ||
254 | } or { | ||
255 | Physical_Person.birth_month(p, birthMonth); | ||
256 | check(birthMonth > 12); | ||
257 | } | ||
258 | |||
259 | //inv35-attribute-handled by multiplicity | ||
260 | @Constraint(message = "inv35", severity = "error", key = {p}) | ||
261 | pattern inv35(p : Physical_Person) { | ||
262 | Physical_Person.birth_day(p, birthDay); | ||
263 | check(birthDay < 1); | ||
264 | } or { | ||
265 | Physical_Person.birth_day(p, birthDay); | ||
266 | check(birthDay > 28); | ||
267 | } | ||
268 | |||
269 | //inv36-AttributeRemoved | ||
270 | //inv37-AttributeRemoved | ||
271 | //inv38-AttributeRemoved | ||
272 | //inv39-AttributeRemoved | ||
273 | //inv40-AttributeRemoved | ||
274 | //inv41-AttributeRemoved | ||
275 | //inv42-AttributeRemoved | ||
276 | //inv43-AttributeRemoved | ||
277 | //inv44-AttributeRemoved | ||
278 | //inv45-AttributeRemoved | ||
279 | //inv46-AttributeRemoved | ||
280 | |||
281 | //inv47-attributes-handled by multiplicity | ||
282 | @Constraint(message = "inv47", severity = "error", key = {lur}) | ||
283 | pattern inv47(lur : Legal_Union_Record) { | ||
284 | Legal_Union_Record.end_year(lur, endY); | ||
285 | Legal_Union_Record.start_year(lur, startY); | ||
286 | neg find x_inv47(lur); | ||
287 | check(startY >= endY); | ||
288 | } | ||
289 | pattern x_inv47(lur : Legal_Union_Record) { | ||
290 | Legal_Union_Record.separation_cause(lur, ::NONE); | ||
291 | Legal_Union_Record.end_year(lur, -1); | ||
292 | } | ||
293 | |||
294 | //inv48-attributes-handled by multiplicity | ||
295 | @Constraint(message = "inv48", severity = "error", key = {p}) | ||
296 | pattern inv48(p : Physical_Person) { | ||
297 | neg find x_inv48_notDis(p); | ||
298 | neg find x_inv48_Dis(p); | ||
299 | } | ||
300 | pattern x_inv48_notDis(p : Physical_Person) { | ||
301 | Physical_Person.disability_type(p, ::NONE); | ||
302 | Physical_Person.disability_percentage(p, 0.0); | ||
303 | } | ||
304 | pattern x_inv48_Dis(p : Physical_Person) { | ||
305 | neg find x_inv48_3(p); | ||
306 | Physical_Person.disability_percentage(p, disPer); | ||
307 | check(disPer > 0.0); | ||
308 | check(disPer <= 1.0); | ||
309 | } | ||
310 | pattern x_inv48_3(p : Physical_Person) { | ||
311 | Physical_Person.disability_type(p, ::NONE); | ||
312 | } | ||
313 | |||
314 | //inv49-OclKindOf-handled by multiplicity | ||
315 | @Constraint(message = "inv49", severity = "error", key = {lur}) | ||
316 | pattern inv49(lur : Legal_Union_Record) { | ||
317 | neg find x_inv49_1(lur); | ||
318 | } | ||
319 | pattern x_inv49_1(lur : Legal_Union_Record) { | ||
320 | Legal_Union_Record.individual_A(lur, iA); | ||
321 | Legal_Union_Record.individual_B(lur, iB); | ||
322 | Tax_Payer(iA); | ||
323 | Physical_Person(iB); | ||
324 | neg find x_inv49_2(iB); | ||
325 | iA != iB; | ||
326 | } | ||
327 | pattern x_inv49_2(iB: Dependent) { | ||
328 | Dependent(iB); | ||
329 | } | ||
330 | |||
331 | //inv50-MultiplicityChecked | ||
332 | //inv51-MultiplicityChecked | ||
333 | //inv52-MultiplicityChecked | ||
334 | //inv53-MultiplicityChecked \ No newline at end of file | ||