Fixed NDFA to DFA conversion, works without issue now
This commit is contained in:
@@ -53,6 +53,15 @@ public class Automata <T extends Comparable> {
|
||||
|
||||
}
|
||||
|
||||
public void print() {
|
||||
System.out.println("Transitions");
|
||||
this.printTransitions();
|
||||
System.out.println("Beginstates");
|
||||
System.out.println(beginStates);
|
||||
System.out.println("Eindstates");
|
||||
System.out.println(eindStates);
|
||||
}
|
||||
|
||||
public void clearEindStates()
|
||||
{
|
||||
eindStates.clear();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.imegumii;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
@@ -66,7 +65,7 @@ public class DFA<T extends Comparable> extends Automata<T> {
|
||||
return new Taal(addSymbols(n - 1, taal));
|
||||
}
|
||||
|
||||
public NDFA<String> Reverse()
|
||||
public NDFA<String> reverse()
|
||||
{
|
||||
NDFA<String> reversed = new NDFA<String>(this.symbols);
|
||||
|
||||
@@ -87,6 +86,31 @@ public class DFA<T extends Comparable> extends Automata<T> {
|
||||
}
|
||||
|
||||
public DFA<String> minimaliseer() {
|
||||
return this.Reverse().toDFA().Reverse().toDFA();
|
||||
// System.out.println("THIS");
|
||||
// reverse1.print();
|
||||
// System.out.println(Graph.generateGraphString((Automata<String>) this));
|
||||
// System.out.println("-----");
|
||||
NDFA<String> reverse1 = this.reverse();
|
||||
// System.out.println("REVERSE1");
|
||||
// reverse1.print();
|
||||
// System.out.println(Graph.generateGraphString(reverse1));
|
||||
// System.out.println("-----");
|
||||
DFA<String> dfa1 = reverse1.toDFA();
|
||||
// System.out.println("DFA1");
|
||||
// System.out.println(Graph.generateGraphString(dfa1));
|
||||
// dfa1.print();
|
||||
// System.out.println("-----");
|
||||
NDFA<String> reverse2 = dfa1.reverse();
|
||||
// System.out.println("REVERSE2");
|
||||
// System.out.println(Graph.generateGraphString(reverse2));
|
||||
// reverse2.print();
|
||||
// System.out.println("-----");
|
||||
DFA<String> dfa2 = reverse2.toDFA();
|
||||
// System.out.println("DFA2");
|
||||
// System.out.println(Graph.generateGraphString(dfa2));
|
||||
// dfa2.print();
|
||||
// System.out.println("-----");
|
||||
return dfa2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+31
-23
@@ -1,7 +1,5 @@
|
||||
package com.imegumii;
|
||||
|
||||
import com.imegumii.codevandocent.*;
|
||||
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class Main {
|
||||
@@ -122,22 +120,36 @@ public class Main {
|
||||
DFA<String> myAutomata = new DFA<String>(characters);
|
||||
|
||||
// AAB
|
||||
myAutomata.addTransition(new Transition<String>("q0", 'a', "q1"));
|
||||
//myAutomata.addTransition(new Transition<String>("q0", 'b', "q1"));
|
||||
myAutomata.addTransition(new Transition<String>("0", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("0", 'b', "1"));
|
||||
|
||||
//myAutomata.addTransition(new Transition<String>("q1", 'a', "q0"));
|
||||
myAutomata.addTransition(new Transition<String>("q1", 'b', "q0"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'b', "2"));
|
||||
|
||||
myAutomata.defineAsEndState("q1");
|
||||
myAutomata.defineAsStartState("q0");
|
||||
myAutomata.addTransition(new Transition<String>("2", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("2", 'b', "2"));
|
||||
|
||||
System.out.println(Graph.generateGraphString(myAutomata));
|
||||
myAutomata.defineAsStartState("0");
|
||||
myAutomata.defineAsEndState("2");
|
||||
|
||||
System.out.println("\nREVERSE:");
|
||||
// System.out.println(Graph.generateGraphString(myAutomata));
|
||||
|
||||
NDFA<String> reverseAutomata = myAutomata.Reverse();
|
||||
// System.out.println("\nREVERSE:");
|
||||
|
||||
System.out.println(Graph.generateGraphString(reverseAutomata));
|
||||
NDFA<String> reverseAutomata = myAutomata.reverse();
|
||||
|
||||
// System.out.println(Graph.generateGraphString(reverseAutomata));
|
||||
|
||||
System.out.println("ORIGINEEL");
|
||||
myAutomata.printTransitions();
|
||||
System.out.println("MET BEGIN EN EIND");
|
||||
System.out.println(myAutomata.beginStates);
|
||||
System.out.println(myAutomata.eindStates);
|
||||
System.out.println("REVERSE");
|
||||
reverseAutomata.printTransitions();
|
||||
System.out.println("MET BEGIN EN EIND");
|
||||
System.out.println(reverseAutomata.beginStates);
|
||||
System.out.println(reverseAutomata.eindStates);
|
||||
}
|
||||
|
||||
public static void Practicum4() {
|
||||
@@ -230,14 +242,14 @@ public class Main {
|
||||
myAutomata.addTransition(new Transition<String>("0", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("0", 'b', "1"));
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("1", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'b', "2"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'b', "1"));
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("2", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
|
||||
myAutomata.addTransition(new Transition<String>("3", 'b', "5"));
|
||||
myAutomata.addTransition(new Transition<String>("3", 'b', "1"));
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("4", 'a', "5"));
|
||||
myAutomata.addTransition(new Transition<String>("4", 'b', "3"));
|
||||
@@ -250,17 +262,13 @@ public class Main {
|
||||
myAutomata.defineAsEndState("4");
|
||||
|
||||
System.out.println("Ongeminimaliseerd krijgen we:");
|
||||
myAutomata.printTransitions();
|
||||
System.out.println("Met als begin en eind states");
|
||||
System.out.println(myAutomata.beginStates);
|
||||
System.out.println(myAutomata.eindStates);
|
||||
myAutomata.print();
|
||||
System.out.println("-------");
|
||||
|
||||
DFA<String> geminimaliseerd = myAutomata.minimaliseer();
|
||||
System.out.println("Geminimaliseerd krijgen we:");
|
||||
geminimaliseerd.printTransitions();
|
||||
System.out.println("Met als begin en eind states");
|
||||
System.out.println(geminimaliseerd.beginStates);
|
||||
System.out.println(geminimaliseerd.eindStates);
|
||||
geminimaliseerd.print();
|
||||
System.out.println("------");
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@@ -21,9 +21,12 @@ public class NDFA<T extends Comparable> extends Automata<T> {
|
||||
while(it.hasNext()) {
|
||||
Transition<T> t = it.next();
|
||||
|
||||
if (t.vanState == vanaf) {
|
||||
// System.out.println(t);
|
||||
if (vanaf.equals(t.vanState)) {
|
||||
// System.out.println("Dit is onze staat");
|
||||
boolean isGelijk = false;
|
||||
isGelijk = s == t.symbol;
|
||||
// System.out.println("Zijn symbolen gelijk? " + isGelijk);
|
||||
|
||||
if (isGelijk && !bereikbaar.contains(t.naarState)) {
|
||||
bereikbaar.add(t.naarState);
|
||||
@@ -40,9 +43,12 @@ public class NDFA<T extends Comparable> extends Automata<T> {
|
||||
DFA<String> eindDFA = new DFA<>(this.symbols);
|
||||
|
||||
SortedSet<T> startSet = new TreeSet<T>();
|
||||
T firstState = this.beginStates.first();
|
||||
startSet.add(firstState);
|
||||
startSet.addAll(statesBereikbaarVanaf(firstState, Transition.EPSILON));
|
||||
//er kunnen meer start states zijn,
|
||||
// een NDFA kan namelijk meerdere start states hebben (die met epsilon overgangen dan toch naar 1 state gewerkt kunnen worden)
|
||||
for (T t : this.beginStates) {
|
||||
startSet.add(t);
|
||||
startSet.addAll(statesBereikbaarVanaf(t, Transition.EPSILON));
|
||||
}
|
||||
// System.out.println("Begin states zijn: ");
|
||||
// startSet.forEach(System.out::println);
|
||||
|
||||
@@ -70,6 +76,7 @@ public class NDFA<T extends Comparable> extends Automata<T> {
|
||||
boolean isBeginState = stateCounter == 1;
|
||||
for (T t : set) {
|
||||
// kijk wat er te bereiken is vanaf t
|
||||
// System.out.println("Bereikbaar vanaf T "+ t + " en s " + symbol + " is");
|
||||
SortedSet<T> bereikbareStates = statesBereikbaarVanaf(t, symbol);
|
||||
// System.out.println("Vanaf " + t + " kan ik bij " + bereikbareStates + " komen via " + symbol);
|
||||
totaalTeBereiken.addAll(bereikbareStates);
|
||||
|
||||
Reference in New Issue
Block a user