diff options
Diffstat (limited to 'subprojects/logic')
9 files changed, 146 insertions, 116 deletions
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java index 607caa48..0b4d87d2 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java | |||
@@ -1,37 +1,20 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.logic; | 6 | package tools.refinery.logic; |
7 | 7 | ||
8 | import java.util.Objects; | 8 | public non-sealed interface AbstractDomain<A extends AbstractValue<A, C>, C> extends AnyAbstractDomain { |
9 | import java.util.Optional; | ||
10 | |||
11 | public non-sealed interface AbstractDomain<A, C> extends AnyAbstractDomain { | ||
12 | @Override | 9 | @Override |
13 | Class<A> abstractType(); | 10 | Class<A> abstractType(); |
14 | 11 | ||
15 | @Override | 12 | @Override |
16 | Class<C> concreteType(); | 13 | Class<C> concreteType(); |
17 | 14 | ||
18 | A toAbstract(C concreteValue); | ||
19 | |||
20 | Optional<C> toConcrete(A abstractValue); | ||
21 | |||
22 | default boolean isConcrete(A abstractValue) { | ||
23 | return toConcrete(abstractValue).isPresent(); | ||
24 | } | ||
25 | |||
26 | default boolean isRefinement(A originalValue, A refinedValue) { | ||
27 | return Objects.equals(commonRefinement(originalValue, refinedValue), refinedValue); | ||
28 | } | ||
29 | |||
30 | A commonRefinement(A leftValue, A rightValue); | ||
31 | |||
32 | A commonAncestor(A leftValue, A rightValue); | ||
33 | |||
34 | A unknown(); | 15 | A unknown(); |
35 | 16 | ||
36 | boolean isError(A abstractValue); | 17 | A error(); |
18 | |||
19 | A toAbstract(C concreteValue); | ||
37 | } | 20 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java new file mode 100644 index 00000000..0b5e0d01 --- /dev/null +++ b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.logic; | ||
7 | |||
8 | import org.jetbrains.annotations.Nullable; | ||
9 | |||
10 | public interface AbstractValue<A extends AbstractValue<A, C>, C> { | ||
11 | @Nullable | ||
12 | C getConcrete(); | ||
13 | |||
14 | default boolean isConcrete() { | ||
15 | return getConcrete() == null; | ||
16 | } | ||
17 | |||
18 | @Nullable | ||
19 | C getArbitrary(); | ||
20 | |||
21 | default boolean isError() { | ||
22 | return getArbitrary() == null; | ||
23 | } | ||
24 | |||
25 | A join(A other); | ||
26 | |||
27 | A meet(A other); | ||
28 | |||
29 | default boolean isRefinementOf(A other) { | ||
30 | return equals(meet(other)); | ||
31 | } | ||
32 | } | ||
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java index 508a454b..29775615 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java | |||
@@ -5,11 +5,8 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; | ||
9 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
10 | 9 | ||
11 | import java.util.Optional; | ||
12 | |||
13 | // Singleton pattern, because there is only one domain for truth values. | 10 | // Singleton pattern, because there is only one domain for truth values. |
14 | @SuppressWarnings("squid:S6548") | 11 | @SuppressWarnings("squid:S6548") |
15 | public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> { | 12 | public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> { |
@@ -29,41 +26,17 @@ public class CardinalityDomain implements AbstractDomain<CardinalityInterval, In | |||
29 | } | 26 | } |
30 | 27 | ||
31 | @Override | 28 | @Override |
32 | public CardinalityInterval toAbstract(Integer concreteValue) { | 29 | public CardinalityInterval unknown() { |
33 | return CardinalityIntervals.exactly(concreteValue); | 30 | return CardinalityIntervals.SET; |
34 | } | ||
35 | |||
36 | @Override | ||
37 | public Optional<Integer> toConcrete(CardinalityInterval abstractValue) { | ||
38 | return isConcrete(abstractValue) ? Optional.of(abstractValue.lowerBound()) : Optional.empty(); | ||
39 | } | ||
40 | |||
41 | @Override | ||
42 | public boolean isConcrete(CardinalityInterval abstractValue) { | ||
43 | if (!(abstractValue instanceof NonEmptyCardinalityInterval nonEmptyValue) || | ||
44 | !((nonEmptyValue.upperBound()) instanceof FiniteUpperCardinality finiteUpperCardinality)) { | ||
45 | return false; | ||
46 | } | ||
47 | return nonEmptyValue.lowerBound() == finiteUpperCardinality.finiteUpperBound(); | ||
48 | } | ||
49 | |||
50 | @Override | ||
51 | public CardinalityInterval commonRefinement(CardinalityInterval leftValue, CardinalityInterval rightValue) { | ||
52 | return leftValue.meet(rightValue); | ||
53 | } | ||
54 | |||
55 | @Override | ||
56 | public CardinalityInterval commonAncestor(CardinalityInterval leftValue, CardinalityInterval rightValue) { | ||
57 | return leftValue.join(rightValue); | ||
58 | } | 31 | } |
59 | 32 | ||
60 | @Override | 33 | @Override |
61 | public CardinalityInterval unknown() { | 34 | public CardinalityInterval error() { |
62 | return CardinalityIntervals.SET; | 35 | return CardinalityIntervals.ERROR; |
63 | } | 36 | } |
64 | 37 | ||
65 | @Override | 38 | @Override |
66 | public boolean isError(CardinalityInterval abstractValue) { | 39 | public CardinalityInterval toAbstract(Integer concreteValue) { |
67 | return abstractValue.isEmpty(); | 40 | return CardinalityIntervals.exactly(concreteValue); |
68 | } | 41 | } |
69 | } | 42 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java index dbf30def..996ebde5 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java | |||
@@ -5,15 +5,15 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; |
9 | 10 | ||
10 | public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { | 11 | public sealed interface CardinalityInterval extends AbstractValue<CardinalityInterval, Integer> |
12 | permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { | ||
11 | int lowerBound(); | 13 | int lowerBound(); |
12 | 14 | ||
13 | UpperCardinality upperBound(); | 15 | UpperCardinality upperBound(); |
14 | 16 | ||
15 | boolean isEmpty(); | ||
16 | |||
17 | CardinalityInterval min(CardinalityInterval other); | 17 | CardinalityInterval min(CardinalityInterval other); |
18 | 18 | ||
19 | CardinalityInterval max(CardinalityInterval other); | 19 | CardinalityInterval max(CardinalityInterval other); |
@@ -23,8 +23,4 @@ public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, | |||
23 | CardinalityInterval take(int count); | 23 | CardinalityInterval take(int count); |
24 | 24 | ||
25 | CardinalityInterval multiply(CardinalityInterval other); | 25 | CardinalityInterval multiply(CardinalityInterval other); |
26 | |||
27 | CardinalityInterval meet(CardinalityInterval other); | ||
28 | |||
29 | CardinalityInterval join(CardinalityInterval other); | ||
30 | } | 26 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java index 29a7f69d..8892b278 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | ||
8 | import tools.refinery.logic.term.uppercardinality.UpperCardinalities; | 9 | import tools.refinery.logic.term.uppercardinality.UpperCardinalities; |
9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 10 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; |
10 | 11 | ||
@@ -18,16 +19,28 @@ public final class EmptyCardinalityInterval implements CardinalityInterval { | |||
18 | } | 19 | } |
19 | 20 | ||
20 | @Override | 21 | @Override |
21 | public int lowerBound() { | 22 | @Nullable |
22 | return 1; | 23 | public Integer getConcrete() { |
24 | return null; | ||
25 | } | ||
26 | |||
27 | @Override | ||
28 | @Nullable | ||
29 | public Integer getArbitrary() { | ||
30 | return null; | ||
23 | } | 31 | } |
24 | 32 | ||
25 | @Override | 33 | @Override |
26 | public boolean isEmpty() { | 34 | public boolean isRefinementOf(CardinalityInterval other) { |
27 | return true; | 35 | return true; |
28 | } | 36 | } |
29 | 37 | ||
30 | @Override | 38 | @Override |
39 | public int lowerBound() { | ||
40 | return 1; | ||
41 | } | ||
42 | |||
43 | @Override | ||
31 | public UpperCardinality upperBound() { | 44 | public UpperCardinality upperBound() { |
32 | return UpperCardinalities.ZERO; | 45 | return UpperCardinalities.ZERO; |
33 | } | 46 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java index 0919fc36..efe1464e 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java | |||
@@ -1,10 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import org.jetbrains.annotations.NotNull; | ||
9 | import org.jetbrains.annotations.Nullable; | ||
8 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; | 10 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; |
9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 11 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; |
10 | 12 | ||
@@ -23,11 +25,37 @@ public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upper | |||
23 | } | 25 | } |
24 | 26 | ||
25 | @Override | 27 | @Override |
26 | public boolean isEmpty() { | 28 | @Nullable |
29 | public Integer getConcrete() { | ||
30 | return isConcrete() ? lowerBound : null; | ||
31 | } | ||
32 | |||
33 | @Override | ||
34 | public boolean isConcrete() { | ||
35 | return upperBound instanceof FiniteUpperCardinality finiteUpperCardinality && | ||
36 | finiteUpperCardinality.finiteUpperBound() == lowerBound; | ||
37 | } | ||
38 | |||
39 | @Override | ||
40 | @NotNull | ||
41 | public Integer getArbitrary() { | ||
42 | return lowerBound; | ||
43 | } | ||
44 | |||
45 | @Override | ||
46 | public boolean isError() { | ||
27 | return false; | 47 | return false; |
28 | } | 48 | } |
29 | 49 | ||
30 | @Override | 50 | @Override |
51 | public boolean isRefinementOf(CardinalityInterval other) { | ||
52 | if (!(other instanceof NonEmptyCardinalityInterval nonEmptyOther)) { | ||
53 | return false; | ||
54 | } | ||
55 | return lowerBound >= nonEmptyOther.lowerBound() && upperBound.compareTo(nonEmptyOther.upperBound()) <= 0; | ||
56 | } | ||
57 | |||
58 | @Override | ||
31 | public CardinalityInterval min(CardinalityInterval other) { | 59 | public CardinalityInterval min(CardinalityInterval other) { |
32 | return lift(other, Math::min, UpperCardinality::min); | 60 | return lift(other, Math::min, UpperCardinality::min); |
33 | } | 61 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java index bbdd3f97..59bdeab3 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java | |||
@@ -1,11 +1,14 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.logic.term.truthvalue; | 6 | package tools.refinery.logic.term.truthvalue; |
7 | 7 | ||
8 | public enum TruthValue { | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
10 | |||
11 | public enum TruthValue implements AbstractValue<TruthValue, Boolean> { | ||
9 | TRUE("true"), | 12 | TRUE("true"), |
10 | 13 | ||
11 | FALSE("false"), | 14 | FALSE("false"), |
@@ -28,14 +31,41 @@ public enum TruthValue { | |||
28 | return value ? TRUE : FALSE; | 31 | return value ? TRUE : FALSE; |
29 | } | 32 | } |
30 | 33 | ||
34 | @Override | ||
35 | @Nullable | ||
36 | public Boolean getArbitrary() { | ||
37 | return switch (this) { | ||
38 | case TRUE -> true; | ||
39 | case FALSE, UNKNOWN -> false; | ||
40 | case ERROR -> null; | ||
41 | }; | ||
42 | } | ||
43 | |||
44 | @Override | ||
45 | public boolean isError() { | ||
46 | return this == ERROR; | ||
47 | } | ||
48 | |||
31 | public boolean isConsistent() { | 49 | public boolean isConsistent() { |
32 | return this != ERROR; | 50 | return !isError(); |
33 | } | 51 | } |
34 | 52 | ||
53 | |||
35 | public boolean isComplete() { | 54 | public boolean isComplete() { |
36 | return this != UNKNOWN; | 55 | return this != UNKNOWN; |
37 | } | 56 | } |
38 | 57 | ||
58 | @Override | ||
59 | @Nullable | ||
60 | public Boolean getConcrete() { | ||
61 | return switch (this) { | ||
62 | case TRUE -> true; | ||
63 | case FALSE -> false; | ||
64 | default -> null; | ||
65 | }; | ||
66 | } | ||
67 | |||
68 | @Override | ||
39 | public boolean isConcrete() { | 69 | public boolean isConcrete() { |
40 | return this == TRUE || this == FALSE; | 70 | return this == TRUE || this == FALSE; |
41 | } | 71 | } |
@@ -56,15 +86,7 @@ public enum TruthValue { | |||
56 | }; | 86 | }; |
57 | } | 87 | } |
58 | 88 | ||
59 | public TruthValue merge(TruthValue other) { | 89 | @Override |
60 | return switch (this) { | ||
61 | case TRUE -> other == UNKNOWN || other == TRUE ? TRUE : ERROR; | ||
62 | case FALSE -> other == UNKNOWN || other == FALSE ? FALSE : ERROR; | ||
63 | case UNKNOWN -> other; | ||
64 | case ERROR -> ERROR; | ||
65 | }; | ||
66 | } | ||
67 | |||
68 | public TruthValue join(TruthValue other) { | 90 | public TruthValue join(TruthValue other) { |
69 | return switch (this) { | 91 | return switch (this) { |
70 | case TRUE -> other == ERROR || other == TRUE ? TRUE : UNKNOWN; | 92 | case TRUE -> other == ERROR || other == TRUE ? TRUE : UNKNOWN; |
@@ -73,4 +95,14 @@ public enum TruthValue { | |||
73 | case ERROR -> other; | 95 | case ERROR -> other; |
74 | }; | 96 | }; |
75 | } | 97 | } |
98 | |||
99 | @Override | ||
100 | public TruthValue meet(TruthValue other) { | ||
101 | return switch (this) { | ||
102 | case TRUE -> other == UNKNOWN || other == TRUE ? TRUE : ERROR; | ||
103 | case FALSE -> other == UNKNOWN || other == FALSE ? FALSE : ERROR; | ||
104 | case UNKNOWN -> other; | ||
105 | case ERROR -> ERROR; | ||
106 | }; | ||
107 | } | ||
76 | } | 108 | } |
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java index 443f744f..de8a89be 100644 --- a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java +++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
@@ -7,8 +7,6 @@ package tools.refinery.logic.term.truthvalue; | |||
7 | 7 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | 9 | ||
10 | import java.util.Optional; | ||
11 | |||
12 | // Singleton pattern, because there is only one domain for truth values. | 10 | // Singleton pattern, because there is only one domain for truth values. |
13 | @SuppressWarnings("squid:S6548") | 11 | @SuppressWarnings("squid:S6548") |
14 | public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> { | 12 | public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> { |
@@ -28,42 +26,17 @@ public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolea | |||
28 | } | 26 | } |
29 | 27 | ||
30 | @Override | 28 | @Override |
31 | public TruthValue toAbstract(Boolean concreteValue) { | 29 | public TruthValue unknown() { |
32 | return TruthValue.toTruthValue(concreteValue); | 30 | return TruthValue.UNKNOWN; |
33 | } | ||
34 | |||
35 | @Override | ||
36 | public Optional<Boolean> toConcrete(TruthValue abstractValue) { | ||
37 | return switch (abstractValue) { | ||
38 | case TRUE -> Optional.of(true); | ||
39 | case FALSE -> Optional.of(false); | ||
40 | default -> Optional.empty(); | ||
41 | }; | ||
42 | } | ||
43 | |||
44 | @Override | ||
45 | public boolean isConcrete(TruthValue abstractValue) { | ||
46 | return abstractValue.isConcrete(); | ||
47 | } | ||
48 | |||
49 | @Override | ||
50 | public TruthValue commonRefinement(TruthValue leftValue, TruthValue rightValue) { | ||
51 | return leftValue.merge(rightValue); | ||
52 | } | 31 | } |
53 | 32 | ||
54 | @Override | 33 | @Override |
55 | public TruthValue commonAncestor(TruthValue leftValue, TruthValue rightValue) { | 34 | public TruthValue error() { |
56 | return leftValue.join(rightValue); | 35 | return TruthValue.ERROR; |
57 | } | 36 | } |
58 | 37 | ||
59 | @Override | 38 | @Override |
60 | public TruthValue unknown() { | 39 | public TruthValue toAbstract(Boolean concreteValue) { |
61 | return TruthValue.UNKNOWN; | 40 | return TruthValue.toTruthValue(concreteValue); |
62 | } | ||
63 | |||
64 | @Override | ||
65 | public boolean isError(TruthValue abstractValue) { | ||
66 | return !abstractValue.isConsistent(); | ||
67 | } | 41 | } |
68 | } | 42 | } |
69 | |||
diff --git a/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java b/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java index 5441c837..d68df335 100644 --- a/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java +++ b/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java | |||
@@ -15,13 +15,13 @@ class CardinalityIntervalsTest { | |||
15 | @Test | 15 | @Test |
16 | void betweenEmptyTest() { | 16 | void betweenEmptyTest() { |
17 | var interval = CardinalityIntervals.between(2, 1); | 17 | var interval = CardinalityIntervals.between(2, 1); |
18 | assertThat(interval.isEmpty(), equalTo(true)); | 18 | assertThat(interval.isError(), equalTo(true)); |
19 | } | 19 | } |
20 | 20 | ||
21 | @Test | 21 | @Test |
22 | void betweenNegativeUpperBoundTest() { | 22 | void betweenNegativeUpperBoundTest() { |
23 | var interval = CardinalityIntervals.between(0, -1); | 23 | var interval = CardinalityIntervals.between(0, -1); |
24 | assertThat(interval.upperBound(), equalTo(UpperCardinalities.UNBOUNDED)); | 24 | assertThat(interval.upperBound(), equalTo(UpperCardinalities.UNBOUNDED)); |
25 | assertThat(interval.isEmpty(), equalTo(false)); | 25 | assertThat(interval.isError(), equalTo(false)); |
26 | } | 26 | } |
27 | } | 27 | } |