/* * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ package tools.refinery.store.reasoning.translator.opposite; import tools.refinery.logic.AbstractValue; import tools.refinery.store.reasoning.ReasoningAdapter; import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; import tools.refinery.store.reasoning.representation.PartialSymbol; import tools.refinery.store.tuple.Tuple; public class OppositeRefiner, C> extends AbstractPartialInterpretationRefiner { private final PartialInterpretationRefiner opposite; protected OppositeRefiner(ReasoningAdapter adapter, PartialSymbol partialSymbol, PartialSymbol oppositeSymbol) { super(adapter, partialSymbol); opposite = adapter.getRefiner(oppositeSymbol); } @Override public boolean merge(Tuple key, A value) { var oppositeKey = OppositeUtils.flip(key); return opposite.merge(oppositeKey, value); } public static , C1> Factory of(PartialSymbol oppositeSymbol) { return (adapter, partialSymbol) -> new OppositeRefiner<>(adapter, partialSymbol, oppositeSymbol); } }