NDFA to DFA conversion WORKING, including with epsilon
This commit is contained in:
+98
-11
@@ -118,25 +118,112 @@ public class Main {
|
||||
Character [] characters = {'a', 'b'};
|
||||
NDFA<String> myAutomata = new NDFA<String>(characters);
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
|
||||
myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
|
||||
myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
myAutomata.addTransition(new Transition<String>("2", 'b', "1"));
|
||||
myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
|
||||
myAutomata.addTransition(new Transition<String>("3", 'a', "2"));
|
||||
myAutomata.addTransition(new Transition<String>("3", 'a', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "3"));
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'a', "1"));
|
||||
// myAutomata.defineAsStartState("0");
|
||||
// myAutomata.defineAsEndState("0");
|
||||
// myAutomata.defineAsEndState("1");
|
||||
|
||||
// Test 2
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'a', "1"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'a', "3"));
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'b', "3"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("0", 'b', "2"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'a', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'b', "3"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'b', "2"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "4"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "3")); //ja? Ja.
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'b', "2"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'b', "3"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'b', "4"));
|
||||
//
|
||||
// myAutomata.defineAsStartState("0");
|
||||
// myAutomata.defineAsEndState("1");
|
||||
|
||||
// Test 3
|
||||
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("1", 'b', "1"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'a', "3"));
|
||||
// myAutomata.addTransition(new Transition<String>("2", 'b', "2"));
|
||||
// myAutomata.addTransition(new Transition<String>("2", Transition.EPSILON, "1"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'a', "4"));
|
||||
// myAutomata.addTransition(new Transition<String>("3", 'b', "3"));
|
||||
// myAutomata.addTransition(new Transition<String>("3", Transition.EPSILON, "2"));
|
||||
//
|
||||
// myAutomata.addTransition(new Transition<String>("4", 'a', "1"));
|
||||
// myAutomata.addTransition(new Transition<String>("4", 'b', "4"));
|
||||
// myAutomata.addTransition(new Transition<String>("4", Transition.EPSILON, "3"));
|
||||
//
|
||||
// myAutomata.defineAsStartState("1");
|
||||
// myAutomata.defineAsEndState("2");
|
||||
// myAutomata.defineAsEndState("3");
|
||||
|
||||
myAutomata.defineAsStartState("0");
|
||||
myAutomata.defineAsEndState("1");
|
||||
System.out.println("De NDFA is ");
|
||||
myAutomata.printTransitions();
|
||||
System.out.println("Met als begin en eind states");
|
||||
System.out.println(myAutomata.beginStates);
|
||||
System.out.println(myAutomata.eindStates);
|
||||
|
||||
System.out.println("DFA is dan ");
|
||||
myAutomata.toDFA().printTransitions();
|
||||
DFA<String> myDfa = myAutomata.toDFA();
|
||||
myDfa.printTransitions();
|
||||
System.out.println("Met als begin en eind states");
|
||||
System.out.println(myDfa.beginStates);
|
||||
System.out.println(myDfa.eindStates);
|
||||
|
||||
}
|
||||
|
||||
public static void Practicum5 () {
|
||||
|
||||
Character [] characters = {'a', 'b'};
|
||||
DFA<String> myAutomata = new DFA<String>(characters);
|
||||
// Test 4 minimalisatie
|
||||
|
||||
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>("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>("4", 'a', "5"));
|
||||
myAutomata.addTransition(new Transition<String>("4", 'b', "3"));
|
||||
|
||||
myAutomata.addTransition(new Transition<String>("5", 'a', "0"));
|
||||
myAutomata.addTransition(new Transition<String>("5", 'b', "3"));
|
||||
|
||||
myAutomata.defineAsStartState("0");
|
||||
myAutomata.defineAsEndState("2");
|
||||
myAutomata.defineAsEndState("4");
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// System.out.println("Here my code be");
|
||||
// com.imegumii.codevandocent.Automata<String> t1 = TestAutomata.getExampleSlide8Lesson2();
|
||||
|
||||
+83
-33
@@ -21,60 +21,110 @@ public class NDFA<T extends Comparable> extends Automata<T> {
|
||||
while(it.hasNext()) {
|
||||
Transition<T> t = it.next();
|
||||
|
||||
boolean isGelijk = false;
|
||||
isGelijk = s == t.symbol;
|
||||
if (t.vanState == vanaf) {
|
||||
boolean isGelijk = false;
|
||||
isGelijk = s == t.symbol;
|
||||
|
||||
if (isGelijk && !bereikbaar.contains(t.naarState)) {
|
||||
bereikbaar.add(t.naarState);
|
||||
bereikbaar.addAll(statesBereikbaarVanaf(t.naarState, Transition.EPSILON));
|
||||
if (isGelijk && !bereikbaar.contains(t.naarState)) {
|
||||
bereikbaar.add(t.naarState);
|
||||
bereikbaar.addAll(statesBereikbaarVanaf(t.naarState, Transition.EPSILON));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return bereikbaar;
|
||||
}
|
||||
|
||||
public SortedSet<T> statesBereikbaarVanafSymbool(char s) {
|
||||
SortedSet<T> bereikbareStates = new TreeSet<T>();
|
||||
Iterator<T> it = this.states.iterator();
|
||||
while (it.hasNext()) {
|
||||
T state = it.next();
|
||||
bereikbareStates.addAll(statesBereikbaarVanaf(state, s));
|
||||
}
|
||||
|
||||
return bereikbareStates;
|
||||
}
|
||||
|
||||
public SortedSet<T> transitie (char c) {
|
||||
SortedSet<T> bereikbareStates = statesBereikbaarVanafSymbool(c);
|
||||
if (bereikbareStates.equals(this.states)) {
|
||||
return this.states;
|
||||
} else {
|
||||
return bereikbareStates;
|
||||
}
|
||||
}
|
||||
|
||||
public DFA<T> toDFA () {
|
||||
DFA<T> eindDFA = new DFA<T>(this.symbols);
|
||||
public DFA<String> toDFA () {
|
||||
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));
|
||||
System.out.println("Begin states zijn: ");
|
||||
startSet.forEach(System.out::println);
|
||||
// System.out.println("Begin states zijn: ");
|
||||
// startSet.forEach(System.out::println);
|
||||
|
||||
for (T t : startSet) {
|
||||
eindDFA.defineAsStartState(t);
|
||||
}
|
||||
HashMap<SortedSet<T>, Integer> totaalEindStates = new HashMap<>();
|
||||
|
||||
totaalEindStates.put(startSet, 0);
|
||||
|
||||
Queue<SortedSet<T>> kue = new LinkedList<>();
|
||||
kue.offer(startSet);
|
||||
kue.offer(startSet); // add beginstate(s)
|
||||
|
||||
// System.out.println("Start ------------");
|
||||
|
||||
int stateCounter = 1;
|
||||
|
||||
SortedSet<Transition<String>> trans = new TreeSet<>();
|
||||
|
||||
while (!kue.isEmpty()) {
|
||||
SortedSet<T> set = kue.poll();
|
||||
// we beginnen bij de begin states
|
||||
|
||||
// kijk welke states je kunt bereiken vanaf deze state.
|
||||
for (Character symbol : this.symbols) {
|
||||
SortedSet<T> totaalTeBereiken = new TreeSet<>();
|
||||
boolean isEindState = false;
|
||||
boolean isBeginState = stateCounter == 1;
|
||||
for (T t : set) {
|
||||
// kijk wat er te bereiken is vanaf t
|
||||
SortedSet<T> bereikbareStates = statesBereikbaarVanaf(t, symbol);
|
||||
// System.out.println("Vanaf " + t + " kan ik bij " + bereikbareStates + " komen via " + symbol);
|
||||
totaalTeBereiken.addAll(bereikbareStates);
|
||||
if (this.eindStates.contains(t)) {
|
||||
isEindState = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!totaalEindStates.containsKey(totaalTeBereiken)) {
|
||||
kue.offer(totaalTeBereiken);
|
||||
totaalEindStates.put(totaalTeBereiken, stateCounter);
|
||||
stateCounter++;
|
||||
}
|
||||
|
||||
// add transitions
|
||||
// System.out.println("Vanaf " + set + " kan ik dus bij " + totaalTeBereiken + " komen via " + symbol);
|
||||
eindDFA.addTransition(new Transition<>(totaalEindStates.get(set).toString(), symbol, totaalEindStates.get(totaalTeBereiken).toString()));
|
||||
if (isBeginState) {
|
||||
// beginstate
|
||||
eindDFA.defineAsStartState(totaalEindStates.get(set).toString());
|
||||
}
|
||||
if (isEindState) {
|
||||
// System.out.println("Eind state is ");
|
||||
eindDFA.defineAsEndState(totaalEindStates.get(set).toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// System.out.println("----end");
|
||||
|
||||
// System.out.println("In totaal krijgen we " + totaalEindStates);
|
||||
// eindDFA.transistions.forEach((t) -> {
|
||||
//// System.out.println(t.vanState);
|
||||
// System.out.println("(" + getByValue(totaalEindStates, t.vanState) + ", " + t.symbol + ")-->" + getByValue(totaalEindStates, t.naarState));
|
||||
//
|
||||
// });
|
||||
|
||||
|
||||
// trans.forEach(System.out::println);
|
||||
// for (Transition<String> t : trans) {
|
||||
// eindDFA.addTransition(t);
|
||||
// }
|
||||
return eindDFA;
|
||||
}
|
||||
|
||||
// public SortedSet<T> getByValue (HashMap<SortedSet<T>, Integer> map, String value) {
|
||||
// for (Map.Entry<SortedSet<T>, Integer> e : map.entrySet()) {
|
||||
// if (value.equals(e.getValue().toString())) {
|
||||
// return e.getKey();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return null;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user