Fixed NDFA to DFA conversion, works without issue now

This commit is contained in:
Yorick Rommers
2017-05-31 10:56:01 +02:00
parent dfe6d1f1c5
commit 01e3277756
4 changed files with 78 additions and 30 deletions
+9
View File
@@ -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();
+27 -3
View File
@@ -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
View File
@@ -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) {
+11 -4
View File
@@ -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);