aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java
blob: 443f744f6a2e86ac1fddab0aa40b945a7f66c54e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
 *
 * SPDX-License-Identifier: EPL-2.0
 */
package tools.refinery.logic.term.truthvalue;

import tools.refinery.logic.AbstractDomain;

import java.util.Optional;

// Singleton pattern, because there is only one domain for truth values.
@SuppressWarnings("squid:S6548")
public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> {
	public static final TruthValueDomain INSTANCE = new TruthValueDomain();

	private TruthValueDomain() {
	}

	@Override
	public Class<TruthValue> abstractType() {
		return TruthValue.class;
	}

	@Override
	public Class<Boolean> concreteType() {
		return Boolean.class;
	}

	@Override
	public TruthValue toAbstract(Boolean concreteValue) {
		return TruthValue.toTruthValue(concreteValue);
	}

	@Override
	public Optional<Boolean> toConcrete(TruthValue abstractValue) {
		return switch (abstractValue) {
			case TRUE -> Optional.of(true);
			case FALSE -> Optional.of(false);
			default -> Optional.empty();
		};
	}

	@Override
	public boolean isConcrete(TruthValue abstractValue) {
		return abstractValue.isConcrete();
	}

	@Override
	public TruthValue commonRefinement(TruthValue leftValue, TruthValue rightValue) {
		return leftValue.merge(rightValue);
	}

	@Override
	public TruthValue commonAncestor(TruthValue leftValue, TruthValue rightValue) {
		return leftValue.join(rightValue);
	}

	@Override
	public TruthValue unknown() {
		return TruthValue.UNKNOWN;
	}

	@Override
	public boolean isError(TruthValue abstractValue) {
		return !abstractValue.isConsistent();
	}
}