aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/logic/src/main/java')
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java27
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java32
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java39
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java10
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java21
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java32
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java56
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java41
8 files changed, 144 insertions, 114 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 */
6package tools.refinery.logic; 6package tools.refinery.logic;
7 7
8import java.util.Objects; 8public non-sealed interface AbstractDomain<A extends AbstractValue<A, C>, C> extends AnyAbstractDomain {
9import java.util.Optional;
10
11public 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 */
6package tools.refinery.logic;
7
8import org.jetbrains.annotations.Nullable;
9
10public 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 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality;
9import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
10 9
11import 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")
15public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> { 12public 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 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.logic.term.uppercardinality.UpperCardinality; 9import tools.refinery.logic.term.uppercardinality.UpperCardinality;
9 10
10public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { 11public 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 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import org.jetbrains.annotations.Nullable;
8import tools.refinery.logic.term.uppercardinality.UpperCardinalities; 9import tools.refinery.logic.term.uppercardinality.UpperCardinalities;
9import tools.refinery.logic.term.uppercardinality.UpperCardinality; 10import 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 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import org.jetbrains.annotations.NotNull;
9import org.jetbrains.annotations.Nullable;
8import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; 10import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality;
9import tools.refinery.logic.term.uppercardinality.UpperCardinality; 11import 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 */
6package tools.refinery.logic.term.truthvalue; 6package tools.refinery.logic.term.truthvalue;
7 7
8public enum TruthValue { 8import org.jetbrains.annotations.Nullable;
9import tools.refinery.logic.AbstractValue;
10
11public 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
8import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
9 9
10import 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")
14public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> { 12public 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