test - regexp javascript
¿Peinar la expresión regular impar e incluso regular a la gramática regular? (1)
Aquí hay una posible solución en SWI-Prolog:
:- use_module(library(clpfd)).
:- use_module(library(lambda)).
odd_even(Lst) :-
variables_signature(Lst, Sigs),
automaton(Sigs, _, Sigs,
% start in s, end in i
[source(s), sink(i)],
% if we meet 0, counter A of a is incremented of one modulo 2
% the others are unchanged
[arc(s, 0, s, [(A+1) mod 2, B, C]),
arc(s, 1, s, [A, (B+1)mod 2, C]),
arc(s, 2, s, [A, B, (C+1) mod 2]),
arc(s, 0, i, [(A+1) mod 2, B, C]),
arc(s, 1, i, [A, (B+1)mod 2, C]),
arc(s, 2, i, [A, B, (C+1) mod 2])],
% name of counters
[A, B, C],
% initial values of counters
[0, 0, 0],
% needed final values of counters
[1,0,1]).
% replace a with 0, b with 1, c with 2
variables_signature(Lst, Sigs) :-
maplist(/X^Y^(X = a -> Y = 0; (X = b -> Y = 1; Y = 2)), Lst, Sigs).
Ejemplo:
?- odd_even([a,c,c,a,c,c,a,c]).
true.
?- odd_even([a,c,c,a,c,c,a]).
false.
Tengo esta clase para la que necesito escribir gramática regular. La gramática es {a, b, c} donde hay un número impar de a''s yc''s, pero un número par de b''s.
Ejemplos de buenas cadenas:
- babc
- abcb
- cbba
- accaccac
- C.A
Malos hilos
- babcb
- a B C
- cbbca
- Accacca
- Automóvil club británico
- *cuerda vacía
Mi expresión regular para incluso b es b∗(ab∗ab∗)∗b∗
(No sé dónde incluir c)
Mi expresión regular para los impares es (c|a(b|c)*a)*a(b|c)*
Mi expresión regular para las c extrañas es (c|a(b|c)*c)*c(b|c)*
Estoy pensando que una gramática regular se vería así:
s -> [a], a
s -> [c], c
a -> [a], a
a -> [b], b
a -> [c], c
b -> [b]
b -> [b], b
b -> [a], a
b -> [c], c
c -> [c], c
c -> [a], a
c -> [b], b
Creo que es evidente que estoy perdido. ¡Cualquier ayuda es apreciada!