FWIW, так как обычные языки (или рациональные языки) закрыты при дополнении, всегда можно найти регулярное выражение (также называемое рациональное выражение), которое отрицает другое выражение. Но не многие инструменты реализуют это.
Vcsn поддерживает этот оператор (который он обозначает {c}
, постфикс).
Сначала вы определяете тип своих выражений: например, метки - это буквы (lal_char
), которые можно выбрать от a
до z
(определение алфавита при работе с дополнением, конечно, очень важно), и "значение", вычисленное для каждого слова, является просто логическим: true
слово принято, false
, отклонено.
В Python:
In [5]: import vcsn
c = vcsn.context('lal_char(a-z), b')
c
Out[5]: {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} → ?
затем вы вводите выражение:
In [6]: e = c.expression('(hede){c}'); e
Out[6]: (hede)^c
преобразовать это выражение в автомат:
In [7]: a = e.automaton(); a
наконец, преобразуйте этот автомат обратно в простое выражение.
In [8]: print(a.expression())
\e+h(\e+e(\e+d))+([^h]+h([^e]+e([^d]+d([^e]+e[^]))))[^]*
, где +
обычно обозначается |
, \e
обозначает пустое слово, а [^]
обычно пишется .
(любой символ). Итак, с небольшим переписыванием ()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*
.
Вы можете увидеть этот пример здесь и попробовать Vcsn онлайн там .