Implemnted and/or operation on DFA
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package com.imegumii;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import javafx.util.Pair;
|
||||
|
||||
/**
|
||||
* Created by imegumii on 01/05/2017.
|
||||
@@ -115,5 +117,66 @@ public class DFA<T extends Comparable> extends Automata<T> {
|
||||
return returnDFA;
|
||||
}
|
||||
|
||||
//TODO: add and & or operations
|
||||
public DFA<String> en(DFA<T> other)
|
||||
{
|
||||
return maakTupleDFA((DFA<String>)this, (DFA<String>)other, false);
|
||||
}
|
||||
|
||||
public DFA<String> of(DFA<T> other)
|
||||
{
|
||||
return maakTupleDFA((DFA<String>)this, (DFA<String>)other, true);
|
||||
}
|
||||
|
||||
private DFA<String> maakTupleDFA(DFA<String> dfa1, DFA<String> dfa2, boolean of)
|
||||
{
|
||||
DFA<String> merged = new DFA<String>(dfa1.symbols);
|
||||
|
||||
//Create all transitions and states
|
||||
for(Transition t1 : dfa1.transistions)
|
||||
{
|
||||
for(Transition t2 : dfa2.transistions)
|
||||
{
|
||||
if(t1.symbol == t2.symbol) {
|
||||
Transition t3 = new Transition<String>(t1.vanState + "-" + t2.vanState, t1.symbol, t1.naarState + "-" + t2.naarState);
|
||||
|
||||
if(dfa1.beginStates.contains(t1.vanState) && dfa2.beginStates.contains(t2.vanState))
|
||||
merged.defineAsStartState((String)t3.vanState);
|
||||
|
||||
if(of)
|
||||
{
|
||||
if(dfa1.eindStates.contains(t1.vanState) || dfa2.eindStates.contains(t2.vanState))
|
||||
merged.defineAsEndState((String)t3.vanState);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(dfa1.eindStates.contains(t1.vanState) && dfa2.eindStates.contains(t2.vanState))
|
||||
merged.defineAsEndState((String)t3.vanState);
|
||||
}
|
||||
|
||||
merged.addTransition(t3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Delete wrong states
|
||||
SortedSet<String> usedStates = new TreeSet<String>();
|
||||
for(Transition t : merged.transistions)
|
||||
{
|
||||
usedStates.add((String)t.naarState);
|
||||
}
|
||||
|
||||
Iterator<Transition<String>> it = merged.transistions.iterator();
|
||||
|
||||
while(it.hasNext())
|
||||
{
|
||||
Transition<String> t = it.next();
|
||||
|
||||
if(!usedStates.contains(t.vanState))
|
||||
{
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,13 +19,28 @@ public class Graph {
|
||||
|
||||
public static String generateGraphString(Automata<String> a)
|
||||
{
|
||||
String text = "digraph finite_state_machine {\nrankdir=LR;\nsize=\"8,5\";\nnode [shape = doublecircle];";
|
||||
String text = "digraph finite_state_machine {\nrankdir=LR;\nsize=\"8,5\";\n";
|
||||
|
||||
for(String s : a.eindStates){
|
||||
text += s + " ";
|
||||
|
||||
if(a.eindStates.size() > 0) {
|
||||
text += "node [shape = doublecircle];";
|
||||
|
||||
for (String s : a.eindStates) {
|
||||
text += "\"" + s + "\" ";
|
||||
}
|
||||
|
||||
text += ";";
|
||||
}
|
||||
|
||||
text += ";\nnode [shape = circle];\n";
|
||||
if(a.beginStates.size() > 0) {
|
||||
text += "\nnode [shape = point];\n";
|
||||
|
||||
for (String s : a.beginStates) {
|
||||
text += "\" \" -> \"" + s + "\" [label = \" \"];";
|
||||
}
|
||||
}
|
||||
|
||||
text += "\nnode [shape = circle];\n";
|
||||
|
||||
for(Transition<String> t : a.transistions)
|
||||
{
|
||||
@@ -35,7 +50,7 @@ public class Graph {
|
||||
else
|
||||
s = t.symbol + "";
|
||||
|
||||
text += t.vanState + " -> " + t.naarState + " [ label = \"" + s + "\"];\n";
|
||||
text += "\"" + t.vanState + "\" -> \"" + t.naarState + "\" [ label = \"" + s + "\"];\n";
|
||||
}
|
||||
|
||||
text += "}";
|
||||
@@ -45,9 +60,9 @@ public class Graph {
|
||||
|
||||
public static void generateImage(Automata<String> a, String fileName) {
|
||||
try {
|
||||
File f = new File("images/" + a.toString() + ".dot");
|
||||
File f = new File("images/" + a.hashCode() + ".dot");
|
||||
PrintWriter w = new PrintWriter(f);
|
||||
w.println(Graph.generateGraphString(a));
|
||||
w.print(Graph.generateGraphString(a));
|
||||
w.flush();
|
||||
w.close();
|
||||
MutableGraph g = Parser.read(f);
|
||||
@@ -57,8 +72,8 @@ public class Graph {
|
||||
Graphviz.fromGraph(g).width(1080).render(Format.PNG).toFile(new File("images/" + a.toString() + ".png"));
|
||||
}
|
||||
|
||||
if (f.delete()) {
|
||||
System.out.println("Succesfully deleted temp file");
|
||||
if (!f.delete()) {
|
||||
System.out.println("Failed to delete temp file");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.imegumii;
|
||||
|
||||
import jdk.nashorn.internal.runtime.regexp.joni.Regex;
|
||||
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class Main {
|
||||
@@ -174,7 +176,7 @@ public class Main {
|
||||
DFA<String> minimized = convert.minimize();
|
||||
|
||||
System.out.println("\nMinimized automata..");
|
||||
System.out.println(Graph.generateGraphString(minimized));
|
||||
Graph.generateImage(minimized, null);
|
||||
}
|
||||
|
||||
public static void ReverseAutomata()
|
||||
@@ -337,6 +339,57 @@ public class Main {
|
||||
geminimaliseerd.ontkenning();
|
||||
}
|
||||
|
||||
public static void TupleConstructie()
|
||||
{
|
||||
Character [] characters = {'a', 'b'};
|
||||
DFA<String> aut1 = new DFA<String>(characters);
|
||||
|
||||
aut1.addTransition(new Transition<String>("1", 'a', "2"));
|
||||
aut1.addTransition(new Transition<String>("1", 'b', "1"));
|
||||
|
||||
aut1.addTransition(new Transition<String>("2", 'a', "1"));
|
||||
aut1.addTransition(new Transition<String>("2", 'b', "2"));
|
||||
|
||||
|
||||
aut1.defineAsStartState("1");
|
||||
aut1.defineAsEndState("1");
|
||||
|
||||
System.out.println("\n\nA1\n--------");
|
||||
System.out.println(Graph.generateGraphString(aut1));
|
||||
|
||||
|
||||
DFA<String> aut2 = new DFA<String>(characters);
|
||||
|
||||
aut2.addTransition(new Transition<String>("1", 'a', "1"));
|
||||
aut2.addTransition(new Transition<String>("1", 'b', "2"));
|
||||
|
||||
aut2.addTransition(new Transition<String>("2", 'a', "1"));
|
||||
aut2.addTransition(new Transition<String>("2", 'b', "3"));
|
||||
|
||||
aut2.addTransition(new Transition<String>("3", 'a', "1"));
|
||||
aut2.addTransition(new Transition<String>("3", 'b', "4"));
|
||||
|
||||
aut2.addTransition(new Transition<String>("4", 'a', "4"));
|
||||
aut2.addTransition(new Transition<String>("4", 'b', "4"));
|
||||
|
||||
aut2.defineAsStartState("1");
|
||||
aut2.defineAsEndState("1");
|
||||
aut2.defineAsEndState("2");
|
||||
|
||||
System.out.println("\n\nA2\n--------");
|
||||
System.out.println(Graph.generateGraphString(aut2));
|
||||
|
||||
DFA<String> en = aut1.en(aut2);
|
||||
|
||||
System.out.println("\n\nEN\n--------");
|
||||
System.out.println(Graph.generateGraphString(en));
|
||||
|
||||
DFA<String> of = aut1.of(aut2);
|
||||
|
||||
System.out.println("\n\nOF\n--------");
|
||||
System.out.println(Graph.generateGraphString(of));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Practicum1();
|
||||
|
||||
@@ -348,6 +401,8 @@ public class Main {
|
||||
|
||||
// ReverseAutomata();
|
||||
|
||||
Hopcroft();
|
||||
// Hopcroft();
|
||||
|
||||
TupleConstructie();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user