Implemnted and/or operation on DFA

This commit is contained in:
2017-06-08 14:44:12 +02:00
parent aa12ce2951
commit 58036bd973
3 changed files with 145 additions and 12 deletions
+64 -1
View File
@@ -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;
}
}
+24 -9
View File
@@ -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();
+57 -2
View File
@@ -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();
}
}