Skip to content
Snippets Groups Projects
Commit 250438ff authored by Jan Trávníček's avatar Jan Trávníček
Browse files

fix:set difference instead of symmetric difference

parent f717d7a1
No related branches found
No related tags found
No related merge requests found
......@@ -53,7 +53,7 @@ bool CompactNFA::addTransition(const State& from, const string::String& input, c
throw AutomatonException("State \"" + from.getName() + "\" doesn't exist.");
 
std::set<alphabet::Symbol> inputStringAlphabet;
std::set_symmetric_difference(inputAlphabet.begin(), inputAlphabet.end(), input.getAlphabet().begin(), input.getAlphabet().end(), std::inserter(inputStringAlphabet, inputStringAlphabet.end()));
std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), input.getAlphabet().begin(), input.getAlphabet().end(), std::inserter(inputStringAlphabet, inputStringAlphabet.end()));
if (inputStringAlphabet.size() != 0)
throw AutomatonException("Input string is over different alphabet than automaton");
 
......
......@@ -53,7 +53,7 @@ bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input,
throw AutomatonException("State \"" + from.getName() + "\" doesn't exist.");
 
std::set<alphabet::Symbol> inputRegExpAlphabet;
std::set_symmetric_difference(inputAlphabet.begin(), inputAlphabet.end(), input.getAlphabet().begin(), input.getAlphabet().end(), std::inserter(inputRegExpAlphabet, inputRegExpAlphabet.end()));
std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), input.getAlphabet().begin(), input.getAlphabet().end(), std::inserter(inputRegExpAlphabet, inputRegExpAlphabet.end()));
if (inputRegExpAlphabet.size() != 0)
throw AutomatonException("Input string is over different alphabet than automaton");
 
......
......@@ -56,10 +56,10 @@ bool PDA::addStackSymbol(const alphabet::Symbol& symbol) {
 
void PDA::setStackSymbols(const std::set<alphabet::Symbol>& newSymbols) {
std::set<alphabet::Symbol> removed;
std::set_symmetric_difference(stackAlphabet.begin(), stackAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
std::set_difference(stackAlphabet.begin(), stackAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
std::set<alphabet::Symbol> added;
std::set_symmetric_difference(newSymbols.begin(), newSymbols.end(), stackAlphabet.begin(), stackAlphabet.end(), std::inserter(added, added.end()));
std::set_difference(newSymbols.begin(), newSymbols.end(), stackAlphabet.begin(), stackAlphabet.end(), std::inserter(added, added.end()));
for(const alphabet::Symbol& removedSymbol : removed) {
removeStackSymbol(removedSymbol);
......@@ -156,7 +156,7 @@ bool PDA::removeInitialSymbol(const alphabet::Symbol& start) {
 
void PDA::setInitialSymbols(const std::set<alphabet::Symbol>& symbols) {
std::set<alphabet::Symbol> tmp;
std::set_symmetric_difference(symbols.begin(), symbols.end(), this->stackAlphabet.begin(), this->stackAlphabet.end(), std::inserter(tmp, tmp.end()));
std::set_difference(symbols.begin(), symbols.end(), this->stackAlphabet.begin(), this->stackAlphabet.end(), std::inserter(tmp, tmp.end()));
if(tmp.size() != 0)
throw AutomatonException("Initial symbols not in stack alphabet");
......
......@@ -34,10 +34,10 @@ bool BlankSymbolInputTapeAlphabet::addInputSymbol(const alphabet::Symbol& symbol
 
void BlankSymbolInputTapeAlphabet::setInputSymbols(const std::set<alphabet::Symbol>& newSymbols) {
std::set<alphabet::Symbol> removed;
std::set_symmetric_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
std::set<alphabet::Symbol> added;
std::set_symmetric_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
for(const alphabet::Symbol& removedSymbol : removed) {
removeInputSymbol(removedSymbol);
......@@ -54,10 +54,10 @@ bool BlankSymbolInputTapeAlphabet::addTapeSymbol(const alphabet::Symbol& symbol)
 
void BlankSymbolInputTapeAlphabet::setTapeSymbols(const std::set<alphabet::Symbol>& newSymbols) {
std::set<alphabet::Symbol> removed;
std::set_symmetric_difference(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
std::set_difference(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
std::set<alphabet::Symbol> added;
std::set_symmetric_difference(newSymbols.begin(), newSymbols.end(), tapeAlphabet.begin(), tapeAlphabet.end(), std::inserter(added, added.end()));
std::set_difference(newSymbols.begin(), newSymbols.end(), tapeAlphabet.begin(), tapeAlphabet.end(), std::inserter(added, added.end()));
for(const alphabet::Symbol& removedSymbol : removed) {
removeTapeSymbol(removedSymbol);
......
......@@ -22,10 +22,10 @@ bool InputAlphabet::addInputSymbol(const alphabet::Symbol& symbol) {
 
void InputAlphabet::setInputSymbols(const std::set<alphabet::Symbol>& newSymbols) {
std::set<alphabet::Symbol> removed;
std::set_symmetric_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
std::set<alphabet::Symbol> added;
std::set_symmetric_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
for(const alphabet::Symbol& removedSymbol : removed) {
removeInputSymbol(removedSymbol);
......
......@@ -23,10 +23,10 @@ bool MultiInitialStates::addInitialState(const State& state) {
 
void MultiInitialStates::setInitialStates(const std::set<State>& newStates) {
std::set<State> removed;
std::set_symmetric_difference(initialStates.begin(), initialStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
std::set_difference(initialStates.begin(), initialStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
 
std::set<State> added;
std::set_symmetric_difference(newStates.begin(), newStates.end(), initialStates.begin(), initialStates.end(), std::inserter(added, added.end()));
std::set_difference(newStates.begin(), newStates.end(), initialStates.begin(), initialStates.end(), std::inserter(added, added.end()));
for(const State& removedState : removed) {
removeInitialState(removedState);
......
......@@ -23,10 +23,10 @@ bool States::addState(const State& state) {
 
void States::setStates(const std::set<State>& newStates) {
std::set<State> removed;
std::set_symmetric_difference(states.begin(), states.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
std::set_difference(states.begin(), states.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
 
std::set<State> added;
std::set_symmetric_difference(newStates.begin(), newStates.end(), states.begin(), states.end(), std::inserter(added, added.end()));
std::set_difference(newStates.begin(), newStates.end(), states.begin(), states.end(), std::inserter(added, added.end()));
for(const State& removedState : removed) {
removeState(removedState);
......@@ -51,10 +51,10 @@ bool States::addFinalState(const State& state) {
 
void States::setFinalStates(const std::set<State>& newFinalStates) {
std::set<State> removed;
std::set_symmetric_difference(finalStates.begin(), finalStates.end(), newFinalStates.begin(), newFinalStates.end(), std::inserter(removed, removed.end()));
std::set_difference(finalStates.begin(), finalStates.end(), newFinalStates.begin(), newFinalStates.end(), std::inserter(removed, removed.end()));
 
std::set<State> added;
std::set_symmetric_difference(newFinalStates.begin(), newFinalStates.end(), finalStates.begin(), finalStates.end(), std::inserter(added, added.end()));
std::set_difference(newFinalStates.begin(), newFinalStates.end(), finalStates.begin(), finalStates.end(), std::inserter(added, added.end()));
for(const State& removedState : removed) {
removeFinalState(removedState);
......
......@@ -105,13 +105,14 @@ void RegExp::addSymbolToAlphabet(const alphabet::Symbol & symbol) {
}
 
void RegExp::setAlphabet(const std::set<alphabet::Symbol> & symbols) {
std::set<alphabet::Symbol> minimalAlphabet;
this->regExp->computeMinimalAlphabet(minimalAlphabet);
std::set<alphabet::Symbol> removedSymbols;
std::set_symmetric_difference(this->alphabet.begin(), this->alphabet.end(), symbols.begin(), symbols.end(), std::inserter(removedSymbols, removedSymbols.end()));
std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), symbols.begin(), symbols.end(), std::inserter(removedSymbols, removedSymbols.end()));
if(removedSymbols.size() > 0)
throw alib::AlibException("Input symbols are used.");
 
for(const alphabet::Symbol& symbol : removedSymbols) {
if(this->regExp->testSymbol(symbol))
throw alib::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
}
this->alphabet = symbols;
}
 
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment