In dieser Aufgabe verwenden wir einige Preview Features aus Java 15.
Gegeben sei ein Datentyp für aussagenlogische Formeln.
public interface Logic{
static record Var(String n) implements Logic{}
static record Neg(Logic f) implements Logic{}
static record Implication(Logic l,Logic r) implements Logic{}
static record And(Logic l,Logic r) implements Logic{}
static record Or(Logic l,Logic r) implements Logic{}
Innerhalb der Schnittstelle für logische Formeln gibt es jetzt zusätzlich eine Methode, die in der Lage ist, alle Teilformeln in der dargestellten Formel durch eine Funktionsanwendung zu ersetzen
default Logic everywhere(Function<Logic,Logic> f){
var result = f.apply(this);
if (result instanceof Neg n) return f.apply(new Neg(n.f.everywhere(f)));
if (result instanceof Or n) return f.apply(new Or(n.l.everywhere(f),n.r.everywhere(f)));
if (result instanceof And n) return f.apply(new And(n.l.everywhere(f),n.r.everywhere(f)));
if (result instanceof Implication n) return f.apply(new Implication(n.l.everywhere(f),n.r.everywhere(f)));
if (result instanceof Var v) return v;
throw new RuntimeException("unknown Logic class: "+this);
}
}
Implementieren Sie eine Methode, die die folgende Umwandlungen auf toplevel Ebene macht:
Mit Hilfe der Methode everywhere erhalten Sie eine Umformung in eine logisch äquivalente Fromel, in der alle Negationszeichen direkt vor einer aussagenlogischen Variable sehen.