Frage zum regulären Ausdruck

Hallo,

ich möchte einen regulären Ausdruck bilden, weiss aber leider nicht weiter.

L = {w | w ∈ {a,b,c}^* und w enthält mindestens ein a und mindestens ein b}

Möglich ist also jede beliebige Kombination aus a’s, b’s und c’s, wobei aber mindestens ein a und mindestens ein b enthalten sein muss. Und zwar an beliebiger Stelle.

Habe nun lange herumprobiert und komme nicht weiter. Kann mit jemand helfen?

Hi,

L = {w | w ∈ {a,b,c}^* und w enthält mindestens ein a und
mindestens ein b}
Habe nun lange herumprobiert und komme nicht weiter. Kann mit
jemand helfen?

Also, der NEA sieht ja sehr einfach aus:
z_0 —{a,b,c}—> z_0
z_0 —{a}—> z_1
z_0 —{b}—> z_2
z_1 —{a,b,c}—> z_1
z_1 —{b}—> z_f
z_2 —{a,b,c}—> z_2
z_2 —{a]—> z_f
z_f —{a,b,c}—> z_f

Wie man das als Grammatik formulieren kann, fällt mir gerade nicht ein. Ich werd mal weiter aufräumen und drüber nachdenken.

Ich weiß nicht, welche Anforderungen an den Stil gelegt werden, sonst kann man auch einfach L_1 als den z_1-Weg nehmen und L_2 als den z_2-Weg und L=L_1+L_2, denn die lassen sich ja problemlos als DEA schreiben.

Viele Grüße
pg


Stil hin oder her. Die Fallunterscheidung lässt sich problemlos korrekt in eine Grammatik schreiben :wink:

(und der DEA ist sogar übersichtlicher als der NEA)

Hallo,

bei der Definition des regulären Ausdrucks kann man folgendermaßen herangehen:
Wir wissen, dass in dem Wort ein a und ein b ist. Entweder kommt erst das a und dann das b oder anders rum. Dazwischen sowie davor und danach steht irgendetwas. Also:

R = (a\*b\*c\*)\*a(a\*b\*c\*)\*b(a\*b\*c\*)\* | (a\*b\*c\*)\*b(a\*b\*c\*)\*a(a\*b\*c\*)\*

Wenn man den beliebigen Teil noch in einer Variablen definiert, sieht das auch nicht ganz so viel aus:

B = (a\*b\*c\*)\*
R = BaBbB | BbBaB

Nico

{a,b,c}*a{a,b,c}*b{a,b,c}* or {a,b,c}*b{a,b,c}*a{a,b,c}*

Ich würde einen DEA mit folgenden Zuständen bzw. Übergängen konstruieren (bzw. skizzieren):

q0—a--->q1
q0—b--->q2
q0—c--->q0

q1—a--->q1
q1—b--->q3
q1—c--->q1

q2—a--->q3
q2—b--->q2
q2—c--->q2

q3—a--->q3
q3—b--->q3
q3—c--->q3

start = q0
end = q3

daraus lässt sich dieser reguläre Ausdruck herleiten:
c*(a[ac]*b)|(b[bc]*a)[abc]*

  • in Worten:
    beliebig viele c
    genau ein a, beliebig viele a oder c, genau ein b
    ODER
    genau ein b, beliebig viele b oder c, genau ein a
    beliebig viele a, b, c