package modes3.run; import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic; import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation; import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type; import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality; import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator; import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.UnitPropagationPatternGenerator; import java.util.Collections; import java.util.Map; import modes3.Modes3Package; import modes3.queries.ExtraInputOfTurnout; import modes3.queries.Output; import modes3.queries.TurnoutOutput; import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery; import org.eclipse.xtend2.lib.StringConcatenationClient; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.Pair; @SuppressWarnings("all") public class Modes3UnitPropagationGenerator implements UnitPropagationPatternGenerator { private static final String MUST_NOT_CONNECTED_TO = "mustNotConnectedTo"; private static final String MUST_NOT_CONNECTED_TO_HELPER = "mustNotConnectedTo_helper"; private static final String MUST_NOT_TURNOUT_OUTPUT = "mustNotTurnoutOutput"; private static final String MUST_NOT_STRAIGHT = "mustNotStraight"; private static final String MUST_NOT_DIVERGENT = "mustNotDivergent"; private final Type segmentType; private final Type turnoutType; private final Relation connectedToRelation; private final Relation straightRelation; private final Relation divergentRelation; public Modes3UnitPropagationGenerator(@Extension final Ecore2Logic ecore2Logic, final Ecore2Logic_Trace ecore2LogicTrace) { @Extension final Modes3Package Modes3Package = modes3.Modes3Package.eINSTANCE; this.segmentType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getSegment()); this.turnoutType = ecore2Logic.TypeofEClass(ecore2LogicTrace, Modes3Package.getTurnout()); this.connectedToRelation = ecore2Logic.relationOfReference(ecore2LogicTrace, Modes3Package.getSegment_ConnectedTo()); this.straightRelation = ecore2Logic.relationOfReference(ecore2LogicTrace, Modes3Package.getTurnout_Straight()); this.divergentRelation = ecore2Logic.relationOfReference(ecore2LogicTrace, Modes3Package.getTurnout_Divergent()); } @Override public Map getMustPatterns() { return CollectionLiterals.emptyMap(); } @Override public Map getMustNotPatterns() { Pair _mappedTo = Pair.of(this.connectedToRelation, Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO); Pair _mappedTo_1 = Pair.of(this.straightRelation, Modes3UnitPropagationGenerator.MUST_NOT_STRAIGHT); Pair _mappedTo_2 = Pair.of(this.divergentRelation, Modes3UnitPropagationGenerator.MUST_NOT_DIVERGENT); return Collections.unmodifiableMap(CollectionLiterals.newHashMap(_mappedTo, _mappedTo_1, _mappedTo_2)); } @Override public StringConcatenationClient getAdditionalPatterns(@Extension final PatternGenerator generator, final Map fqnToPQuery) { StringConcatenationClient _xblockexpression = null; { StringConcatenationClient _client = new StringConcatenationClient() { @Override protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { _builder.append("problem: LogicProblem, interpretation: PartialInterpretation,"); _builder.newLine(); _builder.append("source: DefinedElement, target: DefinedElement"); _builder.newLine(); } }; final StringConcatenationClient parameters = _client; StringConcatenationClient _client_1 = new StringConcatenationClient() { @Override protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { _builder.append("find interpretation(problem, interpretation);"); _builder.newLine(); _builder.append("find mustExist(problem, interpretation, source);"); _builder.newLine(); _builder.append("find mustExist(problem, interpretation, target);"); _builder.newLine(); } }; final StringConcatenationClient commonParameterConstraints = _client_1; StringConcatenationClient _client_2 = new StringConcatenationClient() { @Override protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { _builder.append("pattern "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("// connectedToReflexive unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "source"); _builder.append(_referInstanceOf, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_1 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_1, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("source == target;"); _builder.newLine(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// tooManyInputsOfSegment unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_2 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "source"); _builder.append(_referInstanceOf_2, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_3 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_3, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_4 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input1"); _builder.append(_referInstanceOf_4, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_5 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input2"); _builder.append(_referInstanceOf_5, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("neg "); CharSequence _referInstanceOf_6 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "source"); _builder.append(_referInstanceOf_6, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input1", "source" }, Modality.MUST, true, false); _builder.append(_referPattern, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_1 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input2", "source" }, Modality.MUST, true, false); _builder.append(_referPattern_1, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("input1 != input2;"); _builder.newLine(); _builder.append("\t"); _builder.append("input1 != target;"); _builder.newLine(); _builder.append("\t"); _builder.append("input2 != target;"); _builder.newLine(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutConnectedToBothOutputs unit propagation 1"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_7 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_7, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_8 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_8, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_9 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "divergent"); _builder.append(_referInstanceOf_9, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_1 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_1, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_2 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_2, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutConnectedToBothOutputs unit propagation 2"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_10 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_10, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_11 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_11, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_12 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "straight"); _builder.append(_referInstanceOf_12, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_3 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "straight", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_3, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_4 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_4, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_5 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_5, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_13 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_13, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_14 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_14, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_15 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); _builder.append(_referInstanceOf_15, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_2 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(TurnoutOutput.instance().getFullyQualifiedName()), new String[] { "source", "target" }, Modality.MAY, false, false); _builder.append(_referPattern_2, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_3 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); _builder.append(_referPattern_3, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("target != extraInput;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("find "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER, "\t"); _builder.append("(problem, interpretation, source, target);"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("find "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_CONNECTED_TO_HELPER, "\t"); _builder.append("(problem, interpretation, target, source);"); _builder.newLineIfNotEmpty(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("// outputReflexive unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_16 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_16, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_17 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "target"); _builder.append(_referInstanceOf_17, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("source == target;"); _builder.newLine(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// tooManyInputsOfSegment unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_18 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_18, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_19 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_19, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_20 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input1"); _builder.append(_referInstanceOf_20, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_21 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "input2"); _builder.append(_referInstanceOf_21, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("neg "); CharSequence _referInstanceOf_22 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MAY, "target"); _builder.append(_referInstanceOf_22, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_4 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input1", "target" }, Modality.MUST, true, false); _builder.append(_referPattern_4, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_5 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(Output.instance().getFullyQualifiedName()), new String[] { "input2", "target" }, Modality.MUST, true, false); _builder.append(_referPattern_5, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("input1 != input2;"); _builder.newLine(); _builder.append("\t"); _builder.append("input1 != source;"); _builder.newLine(); _builder.append("\t"); _builder.append("input2 != source;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_STRAIGHT); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("find "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT, "\t"); _builder.append("(problem, interpretation, source, target);"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutOutputsAreSame unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_23 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_23, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_24 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_24, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_6 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_6, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutConnectedToBothOutputs unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_25 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_25, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_26 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_26, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_27 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "divergent"); _builder.append(_referInstanceOf_27, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_7 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_7, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_8 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "divergent", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_8, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_9 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "divergent", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_9, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_28 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_28, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_29 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_29, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_30 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); _builder.append(_referInstanceOf_30, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_31 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "potentialExtraInput"); _builder.append(_referInstanceOf_31, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_6 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); _builder.append(_referPattern_6, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_10 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_10, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("neg "); CharSequence _referRelation_11 = generator.referRelation(Modes3UnitPropagationGenerator.this.divergentRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery); _builder.append(_referRelation_11, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("extraInput != potentialExtraInput;"); _builder.newLine(); _builder.append("\t"); _builder.append("extraInput != target;"); _builder.newLine(); _builder.append("\t"); _builder.append("potentialExtraInput != target;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("pattern "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_DIVERGENT); _builder.append("("); _builder.append(parameters); _builder.append(") {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("find "); _builder.append(Modes3UnitPropagationGenerator.MUST_NOT_TURNOUT_OUTPUT, "\t"); _builder.append("(problem, interpretation, source, target);"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutOutputsAreSame unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_32 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_32, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_33 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_33, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_12 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_12, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// turnoutConnectedToBothOutputs unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_34 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_34, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_35 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_35, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_36 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "straight"); _builder.append(_referInstanceOf_36, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_13 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "target", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_13, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_14 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "straight", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_14, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_15 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "straight", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_15, "\t"); _builder.newLineIfNotEmpty(); _builder.append("} or {"); _builder.newLine(); _builder.append("\t"); _builder.append("// tooManyExtraInputsOfTurnout unit propagation"); _builder.newLine(); _builder.append("\t"); _builder.append(commonParameterConstraints, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_37 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.turnoutType, Modality.MUST, "source"); _builder.append(_referInstanceOf_37, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_38 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "target"); _builder.append(_referInstanceOf_38, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_39 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "extraInput"); _builder.append(_referInstanceOf_39, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referInstanceOf_40 = generator.getTypeIndexer().referInstanceOf(Modes3UnitPropagationGenerator.this.segmentType, Modality.MUST, "potentialExtraInput"); _builder.append(_referInstanceOf_40, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referPattern_7 = generator.getRelationDefinitionIndexer().referPattern(fqnToPQuery.get(ExtraInputOfTurnout.instance().getFullyQualifiedName()), new String[] { "source", "extraInput" }, Modality.MUST, true, false); _builder.append(_referPattern_7, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _referRelation_16 = generator.referRelation(Modes3UnitPropagationGenerator.this.connectedToRelation, "source", "potentialExtraInput", Modality.MUST, fqnToPQuery); _builder.append(_referRelation_16, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("neg "); CharSequence _referRelation_17 = generator.referRelation(Modes3UnitPropagationGenerator.this.straightRelation, "source", "potentialExtraInput", Modality.MAY, fqnToPQuery); _builder.append(_referRelation_17, "\t"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("extraInput != potentialExtraInput;"); _builder.newLine(); _builder.append("\t"); _builder.append("extraInput != target;"); _builder.newLine(); _builder.append("\t"); _builder.append("potentialExtraInput != target;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); } }; _xblockexpression = _client_2; } return _xblockexpression; } }