在電腦科學 領域形式語言 理論中,經常用到各種字串 函式;但是符號不同於電腦編程 中所用到的,某些在理論領域中常用的函式,在編程中很少用到。本文定義其中一些基本術語。
字串的字母表 是在一個特定字串中出現的所有字母的列表。如果 s 是字串,則它的字母表 指示為
Alph
(
s
)
{\displaystyle \operatorname {Alph} (s)}
這可以等價地認為是先把字串中的所有字母按照給定的順序排好,再去掉其中重複者。
字串同態 是使得每個字母被替代為一個單一字串的字串代換。就是說,
f
(
a
)
=
s
{\displaystyle f(a)=s}
,這裡的 s 是字串,對於每個字母 a 。字串同態是保持字串連接 二元運算 的同態 。給定一個語言 L ,
f
(
L
)
{\displaystyle f(L)}
的集合叫做 L 的同態像 。字串 s 的逆同態像 被定義為
f
−
1
(
s
)
=
{
w
|
f
(
w
)
=
s
}
{\displaystyle f^{-1}(s)=\{w\vert f(w)=s\}}
而語言 L 的逆同態像被定義為
f
−
1
(
L
)
=
{
s
|
f
(
s
)
∈
L
}
{\displaystyle f^{-1}(L)=\{s\vert f(s)\in L\}}
注意一般的說
f
(
f
−
1
(
L
)
)
≠
L
{\displaystyle f(f^{-1}(L))\neq L}
,然而確實有
f
(
f
−
1
(
L
)
)
⊆
L
{\displaystyle f(f^{-1}(L))\subseteq L}
和
L
⊆
f
−
1
(
f
(
L
)
)
{\displaystyle L\subseteq f^{-1}(f(L))}
對於任何語言 L 。簡單單一字母置換密碼 是字串代換的例子。
字串 s 與字母 a 的右商 是在字串 s 中切斷右手端字母 a 得到的字串。它被指示為
s
/
a
{\displaystyle s/a}
。如果字串在右手端沒有 a ,則結果是空字串。就是:
(
s
a
)
/
b
=
{
s
if
a
=
b
ε
if
a
≠
b
{\displaystyle (sa)/b={\begin{cases}s&{\mbox{if }}a=b\\\varepsilon &{\mbox{if }}a\neq b\end{cases}}}
空字串的右商可以是:
ε
/
a
=
ε
{\displaystyle \varepsilon /a=\varepsilon }
類似的,給出么半群
M
{\displaystyle M}
的子集
S
⊂
M
{\displaystyle S\subset M}
,可以定義商子集為
S
/
a
=
{
s
∈
M
|
s
a
∈
S
}
{\displaystyle S/a=\{s\in M\vert sa\in S\}}
左商可以類似的定義,運算發生在字串的左端。
么半群
M
{\displaystyle M}
的子集
S
⊂
M
{\displaystyle S\subset M}
的右商定義了一個等價關係 ,叫做 S 的右語法關係 。它給出為
∼
S
=
{
(
s
,
t
)
∈
M
×
M
|
S
/
s
=
S
/
t
}
{\displaystyle \sim _{S}\;\,=\,\{(s,t)\in M\times M\vert S/s=S/t\}}
關係明顯是有有限索引的(有有限數目個等價類),若且唯若右商族有限的;就是說如果
{
S
/
m
|
m
∈
M
}
{\displaystyle \{S/m\vert m\in M\}}
是有限的。在這種情況下,S 是可辨識語言 ,就是說可被有限狀態自動機 辨識的語言。這個在語法么半群 中詳細討論。
字串 s 與字母 a 的右取消 是切除字串 s 右手端的字母 a 的首次出現得到的字串。它被指示為
s
÷
a
{\displaystyle s\div a}
並被遞迴的定義為
(
s
a
)
÷
b
=
{
s
if
a
=
b
(
s
÷
b
)
a
if
a
≠
b
{\displaystyle (sa)\div b={\begin{cases}s&{\mbox{if }}a=b\\(s\div b)a&{\mbox{if }}a\neq b\end{cases}}}
空字串總是可取消的:
ε
÷
a
=
ε
{\displaystyle \varepsilon \div a=\varepsilon }
明顯的,右取消和投影可交換 :
π
Σ
(
s
)
÷
a
=
π
Σ
(
s
÷
a
)
{\displaystyle \pi _{\Sigma }(s)\div a=\pi _{\Sigma }(s\div a)}
字串的字首 是關於給定語言一個字串的所有字首 的集合:
Pref
L
(
s
)
=
{
t
|
s
=
t
u
for
u
∈
L
}
{\displaystyle \operatorname {Pref} _{L}(s)=\{t\vert s=tu{\mbox{ for }}u\in L\}}
語言的字首閉包 是
Pref
(
L
)
=
⋃
s
∈
L
Pref
L
(
s
)
{\displaystyle \operatorname {Pref} (L)=\bigcup _{s\in L}\operatorname {Pref} _{L}(s)}
一個語言叫做字首閉合 的,如果
Pref
(
L
)
=
L
{\displaystyle \operatorname {Pref} (L)=L}
。明顯的,字首閉包算子是冪等 的:
Pref
(
Pref
(
L
)
)
=
Pref
(
L
)
{\displaystyle \operatorname {Pref} (\operatorname {Pref} (L))=\operatorname {Pref} (L)}
字首關係 是二元關係
⊑
{\displaystyle \sqsubseteq }
,有著
s
⊑
t
{\displaystyle s\sqsubseteq t}
若且唯若
s
∈
Pref
L
(
t
)
{\displaystyle s\in \operatorname {Pref} _{L}(t)}
。
字首文法 生成(關於這個文法)字首閉合的語言。
John E. Hopcroft and Jeffrey D. Ullman, Introduction to Automata Theory, Languages and Computation , Addison-Wesley Publishing, Reading Massachusetts, 1979. ISBN 0-201-02988-X . (See chapter 3.)