nfa | Nondeterministic finite automaton implement in Golang | Interpreter library
kandi X-RAY | nfa Summary
kandi X-RAY | nfa Summary
NFA: Nondeterministic finite automaton.
Support
Quality
Security
License
Reuse
Top functions reviewed by kandi - BETA
- NewNFA creates a new NFA object .
- Reset resets the NFA to true .
nfa Key Features
nfa Examples and Code Snippets
Community Discussions
Trending Discussions on nfa
QUESTION
I have been trying solve this problem for a while now for a university assignment. I'm required to build a DFA and an NFA for the above question. So far I have been able to solve the DFA, but can not find a solution for a proper NFA after multiple tries.
The solution of my DFA for the language provided above:My attempts for the NFA are down below. I apologize for my messy handwriting but these were just rough works that I was drawing out on the go.
My first attempt: My second attempt: My third attempt: ...ANSWER
Answered 2021-Apr-06 at 12:17There's only three words, so just make three parallel paths for your NFA, using a transition function like the following:
Input State Input Symbol Output States [start] a [a.b], [a.bb] [start] b [b.aa] [a.b] b [ab#] [a.bb] b [ab.b] [ab.b] b [abb#] [b.aa] a [ba.a] [ba.a] a [baa#]Here, state names are in brackets ([..]) and state names that end with "#" are terminal.
Generally it's considered easier to make an NFA than a DFA, so the usual method is to first make an NFA and then make the DFA by modifying the NFA by changing multiple output states to a single intermediate state.
If you followed this method for the above NFA, then the resulting DFA would look something like this (I have appended an "*" to the intermediate state names):
Input State Input Symbol Output State [start] a [a.b*] [start] b [b.aa] [a.b*] b [ab.*] [ab.*] (e) [ab#] [ab.*] b [abb.*] [abb.*] (e) [abb#] [b.aa] a [ba.a] [ba.a] a [baa#]I've been a bit loose about all of the empty symbol/end-of-input transitons to terminal states. If you need me to fill al of them in, them I can do that.
QUESTION
What is the NFA that does not accept strings ending "101"?
...ANSWER
Answered 2021-Apr-07 at 14:01There are lots of NFAs (infinitely many, in fact) that work. Here is a simple one:
QUESTION
I am relatively new to Ocaml and I have come across an annoying error. My code is here:
...ANSWER
Answered 2021-Mar-16 at 09:34As mentioned, ;;
just after (nfa_to_dfa_step nfa dfa t)))
is the culprit.
To be a little more nuanced, ;;
is not useless / syntactically invalid, it is used to end the "toplevel phrase". For example:
QUESTION
Task: Draw an DFA that accepts words from the alphabet {0,1} where the last character is not repeated anywhere else in the word. (example: words 0, 1, 00001, 111110, ε are in the language of this NFA, while words 010, 111, 0010, 101 are not).
I think I got the DFA right but I can't minimize it because I have a trap state which I can't get rid of whatever I do. Any advices or tips?
...ANSWER
Answered 2021-Mar-08 at 21:16Your DFA is correct (except the initial state q0 should be accepting since the empty string is in the language). It is also minimal; we can show that the sets of strings that lead to each state are all distinguishable w.r.t. the language according to the Myhill-Nerode indistinguishability relation.
q0: any string in L can be appended to the strings that lead here (the empty string) to get another string in L
q1: appending the string 0 in L to 0 gives 00 not in L, so q1 is distinct from q0.
q2: appending the string 1 in L to 1 gives 11 not in L, so q2 is distinct from q0 and from q1 (since appending 1 to 0 gives 01 which is in L also)
strings that lead to q3 are distinct from q1 in that you cannot append the empty string (i.e., q1 is accepting and q3 isn't), but otherwise identical, and therefore q3 is also distinct from q0-q2
strings that lead to q4 are distinct from q2 in that you cannot append the empty string (i.e., q2 is accepting and q4 isn't), but otherwise identical, and therefore q4 is also distinct from q0-q2
appending anything but the empty string to strings that lead to q5 leads to a string not in the language, so it is distinct from q0-q4
appending anything to a strings that lead to q6 leads to a string not in the language, so it is distinct from q0-q5 (these strings differ from strings that lead to q5 only in that you cannot even append the empty string to them to get a string in L, i.e., q6 is not accepting and q5 is).
Therefore, your DFA is minimal. You can show this by attempting to run a minimization algorithm and noting that no states get removed.
Note: it depends on your definitions but it is a normal (and I would say preferred) definition of DFAs that they define all transitions, which means that dead (or as you call them, trap) states are required to be shown. Minimization algorithms probably don't remove them, but you can remove them if you like (though I'd call the resulting automaton nondeterministic since deterministic behavior is not specified for some transitions).
QUESTION
I have been trying to draw this Non-Deterministic Finite automaton:
NFA with the number of states not exceeding 3 for the language {ab, abc}*, and I reached the solution in the picture below:
The issue seems to be the code logic since my code always prints "rejected. I will appreciate it if someone can give some hints on how to code this algorithm.
...ANSWER
Answered 2021-Feb-17 at 20:16You should always look at the first character of the string, and call recursive calls using everything except the first character.
Also it's not noted in your diagram, but I assume that q0
is the accepting state since that corresponds to (ab + abc)*
.
So in your style (which I personally wouldn't use, but ok):
QUESTION
There are 4 design options to choose when when_any
is passed zero futures, unfortunately all of them make sense.
Till now I am able to
- summarize some weak arguments for each design option;
- list some implementations and which design options they choose.
when_any(zero futures)
should return a future that blocks forever.
The first reason is for the simplicity and uniformity of definition.
if when_any(zero futures) return a future that blocks forever, we get:
wait_all blocks while some is unfinished, until all is finished;
wait_any unblocks if some is finished, not if all is unfinished;
if when_any(zero futures) return a future that is immediately ready we get:
wait_all blocks while some is unfinished, until all is finished;
wait_any unblocks if some is finished, not if all is unfinished, but unblocks if there are zero futures;
The second reason is that when_any
is an associative and commutative binary operation, so for variadic version of when_any
we want to return the identity element of the when_any
operation (which is a future that blocks forever). And in languages where you can define your own binary operators (may be C++ will do that in the future) or where the std::accumulate
algorithm is supported, you will still encounter this identity element problem sooner or later.
when_all
is likeoperator&&
, and in parameter pack expansion the empty pack expands totrue
foroperator&&
,true
is like a future that is immediately ready.
when_any
is likeoperator||
, and in parameter pack expansion the empty pack expands tofalse
foroperator||
,false
is like a future that is never ready.
(The other places where we need the identity element are:
boost::thread::null_mutex
tostd::scoped_lock
(std::scoped_lock
is like an associative and commutative binary operation that consumes smaller locks and produce larger lock),std::monostate
tostd::variant
(std::variant
is like an associative and commutative binary operation that consumes smaller unions and produce larger union),- empty set to
operator|
in regexp (anoperator|
node having zero children can happen if you write a program that convert NFA to regexp), - empty string to
operator concat
in regexp, - ...
)
How should we treat divergence?
a program might:
- produce a value;
- produce an error (the state of the program falls out of the domain of the evaluation function);
- diverge (for every state X, there exists a state Y that: X ---[evaluation function]--> Y);
Divergence is not a value, divergence is not an error, divergence is divergence.
There are programs that diverges (never terminates), such as operating system, protocol stack, database service and web server.
There are ways to deal with divergence. In C# we have cancelation functionality and progress report functionality. In C++ we can interrupt an execution agent (boost.thread) or destroy an execution agent (boost.context, boost.fiber). We can use thread safe queues or channels to send/receive values/errors to/from an actor continuously.
use case for divergence①:
A programmer uses library1 to consult some unreliable web service on an unreliable network. library1 retries forever because network is unreliable. library1 itself shouldn't store an exception in the shared state when some timeout expires because:
- the application layer progrmmers may want to use different cancelation machanisms:
- when a timeout expires, or
- when the user clicks a button, or
- the user clicks a button to start a timeout and when the timeout expires;
- the application layer programmers may want to do different things on cancelation:
- provide a default value, or
- provide an exception, or
- some programmers are not at the uppermost layer so they should not attach a cancelation machanism;
Anyway the programmer must use when_any
to merge the potentially-block-forever future with his own my-cancelation/fallback-machanism future to get a larger future and the bigger future will not diverge now.
(Assume when_any(several future...)
returns future
so we don't have to write boilerplate code at every intermidiate when_any node in the future tree.)
(Some modifications required: (1) the bigger future that when_any
returns should destroy other child futures when the first child future becomes ready; (2) library1 should use the promise object to check if(shared_state.reference_count == 1)
and get to know that the consumer has abandoned the future (i.e. the operation is canceled), and quit that loop;)
use case for divergence②:
A programmer uses library2 to consult some unreliable web service on an unreliable network. library2 retries for n times and then blocks forever, not physically, but logically by setting a bit in the shared_state (shared_state.diverge = true
or stared_state.state = state_t::diverge
). The programmer use when_any
to merge the future from library2 and the my-cancelation/fallback-machanism future. The first ready child future indicates the result. Suppose a failed child future becomes ready with an exception instead of blocking forever, then it answers the bigger future in place of the successful child future that becomes ready later, which is not desired.
(Assume when_any(several future...)
returns future
so we don't have to write boilerplate code at every intermidiate when_any node in the future tree.)
use case for divergence③:
When testing network code, use a future that is never ready to stand for a client that has very poor network condition, use a future that is immediately ready to stand for a client that has very good network condition, use futures with various timeouts to stand for clients that falls in between.
(Some modifications required: (1) add make_diverging_future; (2) add make_timeout_ready_future;)
when_any(zero futures)
should return a future that contains an exception.
c++ - Non-polling implementation of std::when_any() - Code Review Stack Exchange https://codereview.stackexchange.com/questions/176168/non-polling-implementation-of-stdwhen-any
The Concurrency TS's
when_any
philosophically-incorrectly returns a ready future when called with zero arguments. My version doesn't treat that case specially, and so the natural behavior falls out: the internalpromise
is destroyed before any 1 of the 0 provided futures has become ready, and sowhen_any(/*zero args*/)
returns a ready future whoseget()
will throwbroken_promise
.
I think this is a case of "Fail Early, Fail Loudly". Since he is treating divergence as an error, things become problematic in the above use cases.
Design option 3:when_any(zero futures)
should return a future that contains a value of ???.
Design option 4: when_any(zero futures)
should be forbidden.
The last 3 design options are used by the standards and libraries. I'll try to guess their motivation below.
Here are some implementations and their behaviours on *_all and *_any:
functions for CPU-bound programs:(if you have trouble reading the table, go to edit mode)
void wait_for_all(...)
return void
boost.thread *_any
iterator wait_for_any(...)
return the end iterator
boost.fiber *_all
void wait_all_simple(...)
refused at compile time
vector wait_all_values(...)
refused at compile time
vector wait_all_until_error(...)
refused at compile time
vector wait_all_collect_errors(...)
refused at compile time
R wait_all_members(...)
return a value of R
boost.fiber *_any
void wait_first_simple(...)
return void
R wait_first_value(...)
refused at compile time
R wait_first_outcome(...)
refused at compile time
R wait_first_success(...)
refused at compile time
variant wait_first_value_het(...)
refused at compile time
System.Threading.Tasks *_all
void Task.WaitAll(...)
return void
System.Threading.Tasks *_any
int Task.WaitAny(...)
return -1
functions for IO-bound programs:
where function behavior when passed zero tasks std::experimental *_allfuture>> when_all(...)
return a future storing empty sequence
std::experimental *_any
future<...> when_any(...)
return a future storing { size index = -1, sequence> sequence = empty sequence }
boost.thread *_all
future>> when_all(...)
return a future storing empty sequence
boost.thread *_any
future>> when_any(...)
return a future storing empty sequence
System.Threading.Tasks *_all
Task Task.WhenAll(...)
return a future storing empty sequence
System.Threading.Tasks *_any
Task> Task.WhenAny(...)
refused at run time (throw ArgumentException
)
(System.Threading.Tasks.WaitAny(...)
accepts zero futures but System.Threading.Tasks.WhenAny(...)
refuses at run time.)
The reason why we should not allow when_any(zero tasks)
to return a future that blocks forever is perhaps practicality. If we allow that, we open a hole in future's interface saying that every future potentially diverges, so every application layer programmer has to use when_any
to merge the future with my-cancelation/fallback-machanism future to get a bigger never-block future if he lacks further information, which is tedious. If we disallow that, we will protect those teams where not all interfaces are documented in detail (let me make an analogy: imagine you are in a C++ company where library functions receive and return potentially-nullptr
pointers instead of optional>
and reference_wrapper
, without more information or documentation you have to guard every member access expression with if(p)
, which is tedious; similarly with futures we have to do when_any(future_returned_from_library, std::make_timeout_future(1s))
everywhere). So we'd better keep the interfaces and possibilities as small as possible.
(apologize to Alan Birtles: I'm sorry I made a mistake that day about the implementations listed: the wait_any functions of boost.fiber other than the first one forbids zero futures and there's a individual implementation that returns a future storing broken_promise (https://codereview.stackexchange.com/questions/176168/non-polling-implementation-of-stdwhen-any) so I am trying to summarize those in a new question.)
...ANSWER
Answered 2021-Jan-14 at 17:26I'd go for the standard solution: https://en.cppreference.com/w/cpp/experimental/when_any
- If the range is empty (i.e., first == last), the returned future is ready immediately; the futures field of the when_any_result is an empty vector, and the index field is size_t(-1).
- If no argument is provided, the returned future is ready immediately; the futures field of the when_any_result is an empty tuple, and the index field is size_t(-1).
Note also that most of the other "potentially desirable behaviours" can probably easily be composed just by adding an "empty" seed future to any received list:
QUESTION
I want to set up a RDBMS for structured time series data of limited size (about 6000 series, 50mb of data) at various frequencies (daily, monthly, quarterly, annual CY and annual FY), and I want to run SQL queries on the database (mostly join various tables by time). The database is updated once a month. The variable names of the tables in this database are rather technical not very informative. The raw data is labeled as shown in the table below (example of a monthly table).
I started setting this up in MySQL and figured that just equipping tables with appropriate temporal identifiers gives me the join functionality I want. I could however not find out how to store the variable labels appropriately. Is it possible to somehow add attributes to the columns? Or can I link a table to the table mapping labels to the column names, such that it is carried along in joins? Or should I set this up using a different kind of database? (database must be easy to set up and host though, and SQL is strongly preferred). I am grateful for any advice.
Update: I figured you can add comments to MySQL columns and tables, but it seems these cannot be queried in a standard way or carried along in joins. Is it possible to retrieve the information in the comments along with the queried data from a standard database connector (like this one for the R language: https://github.com/r-dbi/RMySQL)? Below a DDL example for tables with variable labels as comments.
...ANSWER
Answered 2020-Nov-27 at 13:42I would structure your data differently. I would put all your measures in a single table and have a single measure per row. I would then add a DATE table (so that you have the week/month/quarter/year values for each metric date) and a METRIC_TYPE table that holds the labels for each metric code.
By normalising the data like this I think you have a more flexible design and it'll allow you to do what you want.
This is only for illustration of what I mean - it is not meant to be a definitive design:
QUESTION
I have a problem with my calloc but i can't figure out why. Here is my code:
...ANSWER
Answered 2020-Dec-05 at 00:49You try to call the function ens_ajouter()
before calling your initilization function ens_init()
. This means that the function calloc()
is never called from the main()
function.
I think you are making a mistake to hide the fact that the type ensemble
is a pointer to a struct ensemble
. This makes your code unreadable.
I would suggest that you change your typedef to this:
QUESTION
I'm just getting started with doxygen (1.9.0). I've added what I believe are correct comment blocks to several functions as well as a typedef
and an enum
in my C project. However, when I run doxygen dconfig
, the resultant HTML only contains my source code and none of the documentation.
Here's an example of my documentation.
...ANSWER
Answered 2020-Sep-27 at 00:55These symptoms look very much like a missing \file
command. Place a doxygen comment at the start of your file like /** \file */
and try again.
QUESTION
My requirement is to match each line of a text file, including the line terminator of each, at most excluding the terminator of the last line, to take into account the crippled, non POSIX-compiant files generated on Windows; each line terminator can be either \n
or \r\n
.
And I'm looking for the best regex, performance-wise.
The first regex I could come up with is this:
...ANSWER
Answered 2020-Sep-19 at 13:31The best performance in regex is achieved when each subsequent pattern cannot match at the same locationin the string. .
and \R
are opposite patterns, .
is used to match any char but line break chars, and \R
is used to match any line break sequence.
In context of C++ Boost regex, where a .
matches any char including line break chars and ^
and $
anchors are line (not string) "terminators", the pattern you may consider using is
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install nfa
Support
Reuse Trending Solutions
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesStay Updated
Subscribe to our newsletter for trending solutions and developer bootcamps
Share this Page