String operations – Wikipedia

before-content-x4

In computer science, in the area of formal language theory, frequent use is made of a variety of string functions; however, the notation used is different from that used for computer programming, and some commonly used functions in the theoretical realm are rarely used when programming. This article defines some of these basic terms.

after-content-x4

Strings and languages[edit]

A string is a finite sequence of characters.
The empty string is denoted by

ε{displaystyle varepsilon }

.
The concatenation of two string

s{displaystyle s}

and

t{displaystyle t}

is denoted by

st{displaystyle scdot t}

, or shorter by

after-content-x4
st{displaystyle st}

.
Concatenating with the empty string makes no difference:

sε=s=εs{displaystyle scdot varepsilon =s=varepsilon cdot s}

.
Concatenation of strings is associative:

s(tu)=(st)u{displaystyle scdot (tcdot u)=(scdot t)cdot u}

.

For example,

(bl)(εah)=blah=blah{displaystyle (langle brangle cdot langle lrangle )cdot (varepsilon cdot langle ahrangle )=langle blrangle cdot langle ahrangle =langle blahrangle }

.

A language is a finite or infinite set of strings.
Besides the usual set operations like union, intersection etc., concatenation can be applied to languages:
if both

S{displaystyle S}

and

T{displaystyle T}

are languages, their concatenation

ST{displaystyle Scdot T}

is defined as the set of concatenations of any string from

S{displaystyle S}

and any string from

T{displaystyle T}

, formally

ST={stsStT}{displaystyle Scdot T={scdot tmid sin Sland tin T}}

.
Again, the concatenation dot

{displaystyle cdot }

is often omitted for brevity.

The language

{ε}{displaystyle {varepsilon }}

consisting of just the empty string is to be distinguished from the empty language

{}{displaystyle {}}

.
Concatenating any language with the former doesn’t make any change:

S{ε}=S={ε}S{displaystyle Scdot {varepsilon }=S={varepsilon }cdot S}

,
while concatenating with the latter always yields the empty language:

S{}={}={}S{displaystyle Scdot {}={}={}cdot S}

.
Concatenation of languages is associative:

S(TU)=(ST)U{displaystyle Scdot (Tcdot U)=(Scdot T)cdot U}

.

For example, abbreviating

D={0,1,2,3,4,5,6,7,8,9}{displaystyle D={langle 0rangle ,langle 1rangle ,langle 2rangle ,langle 3rangle ,langle 4rangle ,langle 5rangle ,langle 6rangle ,langle 7rangle ,langle 8rangle ,langle 9rangle }}

, the set of all three-digit decimal numbers is obtained as

DDD{displaystyle Dcdot Dcdot D}

. The set of all decimal numbers of arbitrary length is an example for an infinite language.

Alphabet of a string[edit]

The alphabet of a string is the set of all of the characters that occur in a particular string. If s is a string, its alphabet is denoted by

The alphabet of a language

S{displaystyle S}

is the set of all characters that occur in any string of

S{displaystyle S}

, formally:

Alph(S)=sSAlph(s){displaystyle operatorname {Alph} (S)=bigcup _{sin S}operatorname {Alph} (s)}

.

For example, the set

{a,c,o}{displaystyle {langle arangle ,langle crangle ,langle orangle }}

is the alphabet of the string

cacao{displaystyle langle cacaorangle }

,
and the above

D{displaystyle D}

is the alphabet of the above language

DDD{displaystyle Dcdot Dcdot D}

as well as of the language of all decimal numbers.

String substitution[edit]

Let L be a language, and let Σ be its alphabet. A string substitution or simply a substitution is a mapping f that maps characters in Σ to languages (possibly in a different alphabet). Thus, for example, given a character a ∈ Σ, one has f(a)=La where La ⊆ Δ* is some language whose alphabet is Δ. This mapping may be extended to strings as

f(ε)=ε

for the empty string ε, and

f(sa)=f(s)f(a)

for string sL and character a ∈ Σ. String substitutions may be extended to entire languages as [1]

Regular languages are closed under string substitution. That is, if each character in the alphabet of a regular language is substituted by another regular language, the result is still a regular language.[2]
Similarly, context-free languages are closed under string substitution.[3][note 1]

A simple example is the conversion fuc(.) to uppercase, which may be defined e.g. as follows:

character mapped to language remark
x fuc(x)
a { ‹A› } map lowercase char to corresponding uppercase char
A { ‹A› } map uppercase char to itself
ß { ‹SS› } no uppercase char available, map to two-char string
‹0› { ε } map digit to empty string
‹!› { } forbid punctuation, map to empty language
similar for other chars

For the extension of fuc to strings, we have e.g.

  • fuc(‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
  • fuc(‹u2›) = {‹U›} ⋅ {ε} = {‹U›}, and
  • fuc(‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.

For the extension of fuc to languages, we have e.g.

  • fuc({ ‹Straße›, ‹u2›, ‹Go!› }) = { ‹STRASSE› } ∪ { ‹U› } ∪ { } = { ‹STRASSE›, ‹U› }.

String homomorphism[edit]

A string homomorphism (often referred to simply as a homomorphism in formal language theory) is a string substitution such that each character is replaced by a single string. That is,

f(a)=s{displaystyle f(a)=s}

, where

s{displaystyle s}

is a string, for each character

a{displaystyle a}

.[note 2][4]

String homomorphisms are monoid morphisms on the free monoid, preserving the empty string and the binary operation of string concatenation. Given a language

L{displaystyle L}

, the set

f(L){displaystyle f(L)}

is called the homomorphic image of

L{displaystyle L}

. The inverse homomorphic image of a string

s{displaystyle s}

is defined as

f1(s)={w|f(w)=s}{displaystyle f^{-1}(s)={w|f(w)=s}}

while the inverse homomorphic image of a language

L{displaystyle L}

is defined as

f1(L)={s|f(s)L}{displaystyle f^{-1}(L)={s|f(s)in L}}

In general,

f(f1(L))L{displaystyle f(f^{-1}(L))neq L}

, while one does have

f(f1(L))L{displaystyle f(f^{-1}(L))subseteq L}

and

Lf1(f(L)){displaystyle Lsubseteq f^{-1}(f(L))}

for any language

L{displaystyle L}

.

The class of regular languages is closed under homomorphisms and inverse homomorphisms.[5]
Similarly, the context-free languages are closed under homomorphisms[note 3] and inverse homomorphisms.[6]

A string homomorphism is said to be ε-free (or e-free) if

f(a)ε{displaystyle f(a)neq varepsilon }

for all a in the alphabet

Σ{displaystyle Sigma }

. Simple single-letter substitution ciphers are examples of (ε-free) string homomorphisms.

An example string homomorphism guc can also be obtained by defining similar to the above substitution: guc(‹a›) = ‹A›, …, guc(‹0›) = ε, but letting guc be undefined on punctuation chars.
Examples for inverse homomorphic images are

  • guc−1({ ‹SSS› }) = { ‹sss›, ‹sß›, ‹ßs› }, since guc(‹sss›) = guc(‹sß›) = guc(‹ßs›) = ‹SSS›, and
  • guc−1({ ‹A›, ‹bb› }) = { ‹a› }, since guc(‹a›) = ‹A›, while ‹bb› cannot be reached by guc.

For the latter language, guc(guc−1({ ‹A›, ‹bb› })) = guc({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› }.
The homomorphism guc is not ε-free, since it maps e.g. ‹0› to ε.

A very simple string homomorphism example that maps each character to just a character is the conversion of an EBCDIC-encoded string to ASCII.

String projection[edit]

If s is a string, and

Σ{displaystyle Sigma }

is an alphabet, the string projection of s is the string that results by removing all characters that are not in

Σ{displaystyle Sigma }

. It is written as

πΣ(s){displaystyle pi _{Sigma }(s),}

. It is formally defined by removal of characters from the right hand side:

Here

ε{displaystyle varepsilon }

denotes the empty string. The projection of a string is essentially the same as a projection in relational algebra.

String projection may be promoted to the projection of a language. Given a formal language L, its projection is given by

Right quotient[edit]

The right quotient of a character a from a string s is the truncation of the character a in the string s, from the right hand side. It is denoted as

s/a{displaystyle s/a}

. If the string does not have a on the right hand side, the result is the empty string. Thus:

The quotient of the empty string may be taken:

Similarly, given a subset

SM{displaystyle Ssubset M}

of a monoid

M{displaystyle M}

, one may define the quotient subset as

Left quotients may be defined similarly, with operations taking place on the left of a string.[citation needed]

Hopcroft and Ullman (1979) define the quotient L1/L2 of the languages L1 and L2 over the same alphabet as L1/L2 = { s | ∃tL2. stL1 }.[7]
This is not a generalization of the above definition, since, for a string s and distinct characters a, b, Hopcroft’s and Ullman’s definition implies {sa} / {b} yielding {}, rather than { ε }.

The left quotient (when defined similar to Hopcroft and Ullman 1979) of a singleton language L1 and an arbitrary language L2 is known as Brzozowski derivative; if L2 is represented by a regular expression, so can be the left quotient.[8]

Syntactic relation[edit]

The right quotient of a subset

SM{displaystyle Ssubset M}

of a monoid

M{displaystyle M}

defines an equivalence relation, called the right syntactic relation of S. It is given by

The relation is clearly of finite index (has a finite number of equivalence classes) if and only if the family right quotients is finite; that is, if

is finite. In the case that M is the monoid of words over some alphabet, S is then a regular language, that is, a language that can be recognized by a finite state automaton. This is discussed in greater detail in the article on syntactic monoids.[citation needed]

Right cancellation[edit]

The right cancellation of a character a from a string s is the removal of the first occurrence of the character a in the string s, starting from the right hand side. It is denoted as

s÷a{displaystyle sdiv a}

and is recursively defined as

The empty string is always cancellable:

Clearly, right cancellation and projection commute:

Prefixes[edit]

The prefixes of a string is the set of all prefixes to a string, with respect to a given language:

where

sL{displaystyle sin L}

.

The prefix closure of a language is

Example:

L={abc} then Pref(L)={ε,a,ab,abc}{displaystyle L=left{abcright}{mbox{ then }}operatorname {Pref} (L)=left{varepsilon ,a,ab,abcright}}

A language is called prefix closed if

Pref(L)=L{displaystyle operatorname {Pref} (L)=L}

.

The prefix closure operator is idempotent:

The prefix relation is a binary relation

{displaystyle sqsubseteq }

such that

st{displaystyle ssqsubseteq t}

if and only if

sPrefL(t){displaystyle sin operatorname {Pref} _{L}(t)}

. This relation is a particular example of a prefix order.[citation needed]

See also[edit]

  1. ^ Although every regular language is also context-free, the previous theorem is not implied by the current one, since the former yields a shaper result for regular languages.
  2. ^ Strictly formally, a homomorphism yields a language consisting of just one string, i.e.
  3. ^ This follows from the above-mentioned closure under arbitrary substitutions.

References[edit]

  1. ^ Hopcroft, Ullman (1979), Sect.3.2, p.60
  2. ^ Hopcroft, Ullman (1979), Sect.3.2, Theorem 3.4, p.60
  3. ^ Hopcroft, Ullman (1979), Sect.6.2, Theorem 6.2, p.131
  4. ^ Hopcroft, Ullman (1979), Sect.3.2, p.60-61
  5. ^ Hopcroft, Ullman (1979), Sect.3.2, Theorem 3.5, p.61
  6. ^ Hopcroft, Ullman (1979), Sect.6.2, Theorem 6.3, p.132
  7. ^ Hopcroft, Ullman (1979), Sect.3.2, p.62
  8. ^ Janusz A. Brzozowski (1964). “Derivatives of Regular Expressions”. J ACM. 11 (4): 481–494. doi:10.1145/321239.321249. S2CID 14126942.


after-content-x4