aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend')
-rw-r--r--Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend417
1 files changed, 417 insertions, 0 deletions
diff --git a/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
new file mode 100644
index 00000000..953a21d4
--- /dev/null
+++ b/Domains/ca.mcgill.rtgmrt.example.modes3/src/modes3/run/Modes3UnitPropagationGenerator.xtend
@@ -0,0 +1,417 @@
1package modes3.run
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
4import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality
8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator
9import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator
10import java.util.Map
11import modes3.Modes3Package
12import modes3.queries.Adjacent
13import modes3.queries.Output
14import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
15import org.eclipse.xtend2.lib.StringConcatenationClient
16
17class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator {
18 static val MUST_NOT_CONNECTED_TO = "mustNotConnectedTo"
19 static val MUST_NOT_STRAIGHT = "mustNotStraight"
20 static val MUST_NOT_DIVERGENT = "mustNotDivergent"
21 static val MUST_CONNECTED_TO = "mustConnectedTo"
22 static val MUST_STRAIGHT = "mustStraight"
23 static val MUST_DIVERGENT = "mustDivergent"
24
25 val Type segmentType
26 val Type simpleSegmentType
27 val Type turnoutType
28 val Relation connectedToRelation
29 val Relation straightRelation
30 val Relation divergentRelation
31
32 new(extension Ecore2Logic ecore2Logic, Ecore2Logic_Trace ecore2LogicTrace) {
33 extension val Modes3Package = Modes3Package.eINSTANCE
34 segmentType = ecore2LogicTrace.TypeofEClass(segment)
35 simpleSegmentType = ecore2LogicTrace.TypeofEClass(simpleSegment)
36 turnoutType = ecore2LogicTrace.TypeofEClass(turnout)
37 connectedToRelation = ecore2LogicTrace.relationOfReference(segment_ConnectedTo)
38 straightRelation = ecore2LogicTrace.relationOfReference(turnout_Straight)
39 divergentRelation = ecore2LogicTrace.relationOfReference(turnout_Divergent)
40 }
41
42 override getMustPatterns() {
43 #{
44 connectedToRelation -> MUST_CONNECTED_TO,
45 straightRelation -> MUST_STRAIGHT,
46 divergentRelation -> MUST_DIVERGENT
47 }
48 }
49
50 override getMustNotPatterns() {
51 #{
52 connectedToRelation -> MUST_NOT_CONNECTED_TO,
53 straightRelation -> MUST_NOT_STRAIGHT,
54 divergentRelation -> MUST_NOT_DIVERGENT
55 }
56 }
57
58 override getAdditionalPatterns(extension PatternGenerator generator, Map<String, PQuery> fqnToPQuery) {
59 val StringConcatenationClient parameters = '''
60 problem: LogicProblem, interpretation: PartialInterpretation,
61 source: DefinedElement, target: DefinedElement
62 '''
63
64 val StringConcatenationClient commonMustParameterConstraints = '''
65 find interpretation(problem, interpretation);
66 find mustExist(problem, interpretation, source);
67 find mustExist(problem, interpretation, target);
68 '''
69
70 val StringConcatenationClient commonMayParameterConstraints = '''
71 find interpretation(problem, interpretation);
72 find mayExist(problem, interpretation, source);
73 find mayExist(problem, interpretation, target);
74 '''
75
76 '''
77 pattern mayInput(«parameters») {
78 «commonMayParameterConstraints»
79 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
80 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["target", "source"], Modality.MAY, true, false)»
81 neg «referRelation(straightRelation, "target", "source", Modality.MUST, fqnToPQuery)»
82 neg «referRelation(straightRelation, "target", "source", Modality.MUST, fqnToPQuery)»
83 }
84
85 pattern multipleMayInput(problem: LogicProblem, interpretation: PartialInterpretation,
86 target: DefinedElement) {
87 find interpretation(problem, interpretation);
88 find mustExist(problem, interpretation, target);
89 find mayInput(problem, interpretaton, source1, target);
90 find mayInput(problem, interpretaton, source2, target);
91 neg find mustEquivalent(problem, interpretation, source1, source2);
92 }
93
94 pattern multipleMayStraight(problem: LogicProblem, interpretation: PartialInterpretation,
95 source: DefinedElement) {
96 find interpretation(problem, interpretation);
97 find mustExist(problem, interpretation, source);
98 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
99 «referRelation(straightRelation, "source", "target1", Modality.MAY, fqnToPQuery)»
100 «referRelation(straightRelation, "source", "target2", Modality.MAY, fqnToPQuery)»
101 neg find mustEquivalent(problem, interpretation, target1, target2);
102 }
103
104 pattern multipleMayDivergent(problem: LogicProblem, interpretation: PartialInterpretation,
105 source: DefinedElement) {
106 find interpretation(problem, interpretation);
107 find mustExist(problem, interpretation, source);
108 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
109 «referRelation(divergentRelation, "source", "target1", Modality.MAY, fqnToPQuery)»
110 «referRelation(divergentRelation, "source", "target2", Modality.MAY, fqnToPQuery)»
111 neg find mustEquivalent(problem, interpretation, target1, target2);
112 }
113
114 pattern «MUST_CONNECTED_TO»(«parameters») {
115 «commonMustParameterConstraints»
116 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
117 find mayInput(problem, interpretaton, source, target);
118 neg find multipleMayInput(problem, interpretaton, target);
119 «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)»
120 neg «referRelation(connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery)»
121 neg «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)»
122 neg «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)»
123 }
124
125 pattern «MUST_STRAIGHT»(«parameters») {
126 «commonMustParameterConstraints»
127 neg «referRelation(straightRelation, "source", "_", Modality.MUST, fqnToPQuery)»
128 neg find multipleMayStraight(problem, interpretation, source);
129 «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)»
130 neg «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)»
131 } or {
132 «commonMustParameterConstraints»
133 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
134 find mayInput(problem, interpretaton, source, target);
135 neg find multipleMayInput(problem, interpretaton, target);
136 neg «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)»
137 «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)»
138 neg «referRelation(straightRelation, "source", "target", Modality.MUST, fqnToPQuery)»
139 neg «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)»
140 }
141
142 pattern «MUST_DIVERGENT»(«parameters») {
143 «commonMustParameterConstraints»
144 neg «referRelation(divergentRelation, "source", "_", Modality.MUST, fqnToPQuery)»
145 neg find multipleMayDivergent(problem, interpretation, source);
146 «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)»
147 neg «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)»
148 } or {
149 «commonMustParameterConstraints»
150 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
151 find mayInput(problem, interpretaton, source, target);
152 neg find multipleMayInput(problem, interpretaton, target);
153 neg «referRelation(connectedToRelation, "source", "target", Modality.MAY, fqnToPQuery)»
154 neg «referRelation(straightRelation, "source", "target", Modality.MAY, fqnToPQuery)»
155 «referRelation(divergentRelation, "source", "target", Modality.MAY, fqnToPQuery)»
156 neg «referRelation(divergentRelation, "source", "target", Modality.MUST, fqnToPQuery)»
157 }
158
159 pattern turnoutOutput_must_to_true_by_straight(«parameters», T : DefinedElement, S : DefinedElement) {
160 «commonMayParameterConstraints»
161 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
162 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
163 T == source;
164 S == target;
165 }
166
167 pattern turnoutOutput_must_to_true_by_divergent(«parameters», T : DefinedElement, S : DefinedElement) {
168 «commonMayParameterConstraints»
169 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
170 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
171 T == source;
172 S == target;
173 }
174
175 pattern output_must_to_true_by_connectedTo(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
176 «commonMayParameterConstraints»
177 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "source")»
178 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
179 S1 == source;
180 S2 == target;
181 }
182
183 pattern output_must_to_true_by_straight(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
184 find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S1, S2);
185 }
186
187 pattern output_must_to_true_by_divergent(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
188 find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2);
189 }
190
191 pattern adjacent_must_to_true_by_connectedTo(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
192 find output_must_to_true_by_connectedTo(problem, interpretation, source, target, S1, S2);
193 }
194
195 pattern adjacent_must_to_true_by_straight(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
196 find output_must_to_true_by_straight(problem, interpretation, source, target, S1, S2);
197 } or {
198 find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, S2, S1);
199 }
200
201 pattern adjacent_must_to_true_by_divergent(«parameters», S1 : DefinedElement, S2 : DefinedElement) {
202 find output_must_to_true_by_divergent(problem, interpretation, source, target, S1, S2);
203 } or {
204 find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, S2, S1);
205 }
206
207 pattern connectedToReflexive_must_to_true_by_connectedTo(«parameters», S : DefinedElement) {
208 find mustExist(problem, interpretation, source);
209 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "source")»
210 S == source;
211 S == target;
212 }
213
214 pattern outputReflexive_must_to_true_by_straight(«parameters», T : DefinedElement) {
215 find turnoutOutput_must_to_true_by_straight(problem, interpretation, source, target, T, T);
216 }
217
218 pattern outputReflexive_must_to_true_by_divergent(«parameters», T : DefinedElement) {
219 find turnoutOutput_must_to_true_by_divergent(problem, interpretation, source, target, T, T);
220 }
221
222 pattern turnoutOutputsAreSame_must_to_true_by_straight(«parameters», T : DefinedElement) {
223 «commonMayParameterConstraints»
224 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
225 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
226 T == source;
227 S == target;
228 «referRelation(divergentRelation, "T", "S", Modality.MUST, fqnToPQuery)»
229 }
230
231 pattern turnoutOutputsAreSame_must_to_true_by_divergent(«parameters», T : DefinedElement) {
232 «commonMayParameterConstraints»
233 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
234 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
235 T == source;
236 S == target;
237 «referRelation(straightRelation, "T", "S", Modality.MUST, fqnToPQuery)»
238 }
239
240 pattern tooManyInputsOfSegment_must_to_true_by_connectedTo(«parameters», S : DefinedElement) {
241 find mustExist(problem, interpretation, S);
242 «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")»
243 find output_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S);
244 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
245 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
246 I1 != I2;
247 I1 != I3;
248 I2 != I3;
249 }
250
251 pattern tooManyInputsOfSegment_must_to_true_by_straight(«parameters», S : DefinedElement) {
252 find mustExist(problem, interpretation, S);
253 «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")»
254 find output_must_to_true_by_straight(problem, interpretation, source, target, I1, S);
255 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
256 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
257 I1 != I2;
258 I1 != I3;
259 I2 != I3;
260 }
261
262 pattern tooManyInputsOfSegment_must_to_true_by_divergent(«parameters», S : DefinedElement) {
263 find mustExist(problem, interpretation, S);
264 «typeIndexer.referInstanceOf(simpleSegmentType, Modality.MUST, "S")»
265 find output_must_to_true_by_divergent(problem, interpretation, source, target, I1, S);
266 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
267 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Output.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
268 I1 != I2;
269 I1 != I3;
270 I2 != I3;
271 }
272
273 pattern turnoutConnectedToBothOutputs_must_to_true_by_connectedTo(«parameters», T : DefinedElement) {
274 «commonMayParameterConstraints»
275 find mustExist(problem, interpretation, Straight);
276 find mustExist(problem, interpretation, Divergent);
277 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
278 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
279 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")»
280 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")»
281 «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
282 «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
283 T == source;
284 Straight == target;
285 «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
286 } or {
287 «commonMayParameterConstraints»
288 find mustExist(problem, interpretation, Straight);
289 find mustExist(problem, interpretation, Divergent);
290 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
291 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
292 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")»
293 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")»
294 «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
295 «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
296 «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
297 T == source;
298 Straight == target;
299 }
300
301 pattern turnoutConnectedToBothOutputs_must_to_true_by_straight(«parameters», T : DefinedElement) {
302 «commonMayParameterConstraints»
303 find mustExist(problem, interpretation, Straight);
304 find mustExist(problem, interpretation, Divergent);
305 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
306 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
307 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")»
308 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")»
309 T == source;
310 Straight == target;
311 «referRelation(divergentRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
312 «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
313 «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
314 }
315
316 pattern turnoutConnectedToBothOutputs_must_to_true_by_divergent(«parameters», T : DefinedElement) {
317 «commonMayParameterConstraints»
318 find mustExist(problem, interpretation, Straight);
319 find mustExist(problem, interpretation, Divergent);
320 «typeIndexer.referInstanceOf(turnoutType, Modality.MAY, "source")»
321 «typeIndexer.referInstanceOf(segmentType, Modality.MAY, "target")»
322 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Straight")»
323 «typeIndexer.referInstanceOf(segmentType, Modality.MUST, "Divergent")»
324 «referRelation(straightRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
325 T == source;
326 Divergent == target;
327 «referRelation(connectedToRelation, "T", "Straight", Modality.MUST, fqnToPQuery)»
328 «referRelation(connectedToRelation, "T", "Divergent", Modality.MUST, fqnToPQuery)»
329 }
330
331 pattern tooManyInputsOfTurnout_must_to_true_by_connectedTo(«parameters», T : DefinedElement) {
332 find mustExist(problem, interpretation, S);
333 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")»
334 find adjacent_must_to_true_by_connectedTo(problem, interpretation, source, target, I1, S);
335 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
336 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
337 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)»
338 I1 != I2;
339 I1 != I3;
340 I1 != I4;
341 I2 != I3;
342 I2 != I4;
343 I3 != I4;
344 }
345
346 pattern tooManyInputsOfTurnout_must_to_true_by_straight(«parameters», T : DefinedElement) {
347 find mustExist(problem, interpretation, S);
348 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")»
349 find adjacent_must_to_true_by_straight(problem, interpretation, source, target, I1, S);
350 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
351 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
352 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)»
353 I1 != I2;
354 I1 != I3;
355 I1 != I4;
356 I2 != I3;
357 I2 != I4;
358 I3 != I4;
359 }
360
361 pattern tooManyInputsOfTurnout_must_to_true_by_divergent(«parameters», T : DefinedElement) {
362 find mustExist(problem, interpretation, S);
363 «typeIndexer.referInstanceOf(turnoutType, Modality.MUST, "S")»
364 find adjacent_must_to_true_by_divergent(problem, interpretation, source, target, I1, S);
365 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I2", "S"], Modality.MUST, true, false)»
366 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I3", "S"], Modality.MUST, true, false)»
367 «relationDefinitionIndexer.referPattern(fqnToPQuery.get(Adjacent.instance.fullyQualifiedName), #["I4", "S"], Modality.MUST, true, false)»
368 I1 != I2;
369 I1 != I3;
370 I1 != I4;
371 I2 != I3;
372 I2 != I4;
373 I3 != I4;
374 }
375
376 pattern «MUST_NOT_CONNECTED_TO»_helper(«parameters») {
377 find connectedToReflexive_must_to_true_by_connectedTo(problem, interpretation, source, target, _);
378 } or {
379 find tooManyInputsOfSegment_must_to_true_by_connectedTo(problem, interpretation, source, target, _);
380 } or {
381 find turnoutConnectedToBothOutputs_must_to_true_by_connectedTo(problem, interpretation, source, target, _);
382 } or {
383 find tooManyInputsOfTurnout_must_to_true_by_connectedTo(problem, interpretation, source, target, _);
384 }
385
386 pattern «MUST_NOT_CONNECTED_TO»(«parameters») {
387 find «MUST_NOT_CONNECTED_TO»_helper(problem, interpretation, source, target);
388 } or {
389 find «MUST_NOT_CONNECTED_TO»_helper(problem, interpretation, target, source);
390 }
391
392 pattern «MUST_NOT_STRAIGHT»(«parameters») {
393 find outputReflexive_must_to_true_by_straight(problem, interpretation, source, target, _);
394 } or {
395 find turnoutOutputsAreSame_must_to_true_by_straight(problem, interpretation, source, target, _);
396 } or {
397 find tooManyInputsOfSegment_must_to_true_by_straight(problem, interpretation, source, target, _);
398 } or {
399 find turnoutConnectedToBothOutputs_must_to_true_by_straight(problem, interpretation, source, target, _);
400 } or {
401 find tooManyInputsOfTurnout_must_to_true_by_straight(problem, interpretation, source, target, _);
402 }
403
404 pattern «MUST_NOT_DIVERGENT»(«parameters») {
405 find outputReflexive_must_to_true_by_divergent(problem, interpretation, source, target, _);
406 } or {
407 find turnoutOutputsAreSame_must_to_true_by_divergent(problem, interpretation, source, target, _);
408 } or {
409 find tooManyInputsOfSegment_must_to_true_by_divergent(problem, interpretation, source, target, _);
410 } or {
411 find turnoutConnectedToBothOutputs_must_to_true_by_divergent(problem, interpretation, source, target, _);
412 } or {
413 find tooManyInputsOfTurnout_must_to_true_by_divergent(problem, interpretation, source, target, _);
414 }
415 '''
416 }
417}