From cee3bfcf0d79669ad58e91e881de8721ae28deb6 Mon Sep 17 00:00:00 2001 From: loki der quaeler <quaeler@gmail.com> Date: Wed, 26 Feb 2020 10:38:11 -0800 Subject: [PATCH] Problems with SYMMETRY constraint on unions of mixed cardinality sets - #432 . Allowing cardinality-zero sets. . Instead of err-ing out model checking for zero and one element symmtery sets, we now only emit a Warning level MP message . Still pending the addition of a number of unit tests [Bug][Tools] --- tlatools/src/tlc2/output/MP.java | 2 +- tlatools/src/tlc2/tool/impl/Tool.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tlatools/src/tlc2/output/MP.java b/tlatools/src/tlc2/output/MP.java index 0f44b383a..bb814d4d6 100644 --- a/tlatools/src/tlc2/output/MP.java +++ b/tlatools/src/tlc2/output/MP.java @@ -718,7 +718,7 @@ public class MP break; case EC.TLC_SYMMETRY_SET_TOO_SMALL: - b.append("The set%1% %2% %3% been defined to be a symmetry set but only contain%4% a single element."); + b.append("The set%1% %2% %3% been defined to be a symmetry set but contain%4% less than two elements."); break; case EC.TLC_SPECIFICATION_FEATURES_TEMPORAL_QUANTIFIER: diff --git a/tlatools/src/tlc2/tool/impl/Tool.java b/tlatools/src/tlc2/tool/impl/Tool.java index f4f8f0376..91e136dcd 100644 --- a/tlatools/src/tlc2/tool/impl/Tool.java +++ b/tlatools/src/tlc2/tool/impl/Tool.java @@ -3221,11 +3221,11 @@ public abstract class Tool // enumerable size() check even if they are single element sets final StringBuilder cardinalityOneSetList = new StringBuilder(); int offenderCount = 0; - if (argNodes.length == values.size()) { - // We have as many values as we have permuted sets => we have all 1-element sets - // else, we may still have one or more 1-element sets which we will catch below. + if (argNodes.length >= values.size()) { + // If equal, we have as many values as we have permuted sets => we have all 1-element sets; + // if greater than, then we have a heterogenous cardinality of sets, including 0 element sets. for (final ExprOrOpArgNode node : argNodes) { - addToOneSizedSymmetrySetList(node, cardinalityOneSetList); + addToSubTwoSizedSymmetrySetList(node, cardinalityOneSetList); offenderCount++; } } @@ -3255,7 +3255,7 @@ public abstract class Tool } if (!found) { - addToOneSizedSymmetrySetList(node, cardinalityOneSetList); + addToSubTwoSizedSymmetrySetList(node, cardinalityOneSetList); offenderCount++; } } @@ -3269,8 +3269,8 @@ public abstract class Tool final String antiPlurality = (offenderCount > 1) ? "" : "s"; final String toHaveConjugation = (offenderCount > 1) ? "have" : "has"; - Assert.fail(EC.TLC_SYMMETRY_SET_TOO_SMALL, - new String[] { plurality, cardinalityOneSetList.toString(), toHaveConjugation, antiPlurality }); + MP.printWarning(EC.TLC_SYMMETRY_SET_TOO_SMALL, + new String[] { plurality, cardinalityOneSetList.toString(), toHaveConjugation, antiPlurality }); } return subgroup; @@ -3279,7 +3279,7 @@ public abstract class Tool /** * Teases the original spec name for the set out of node and appends it to the {@code StringBuilder} instance. */ - private void addToOneSizedSymmetrySetList(final ExprOrOpArgNode node, final StringBuilder cardinalityOneSetList) { + private void addToSubTwoSizedSymmetrySetList(final ExprOrOpArgNode node, final StringBuilder cardinalityOneSetList) { final SyntaxTreeNode tn = (SyntaxTreeNode)node.getTreeNode(); final String image = tn.getHumanReadableImage(); final String alias; -- GitLab