الگوریتم کلینی

در علوم نظری رایانه به خصوص در زبان فُرمال، الگوریتم کلین یک ماشین تعیین‌پذیر حالات متناهی را به یک عبارت باقاعده تبدیل می‌کند.

شرح الگوریتم ویرایش

بنابه گفته‌های Gross و Yellen,[۱] این الگوریتم را می‌توان به کلینی[۲] نسبت داد.

شرح این الگوریتم پیرو گفته‌های Hopcroft و Ullman است.[۳] یک ماشین تعیین‌پذیر حالات متناهی (M = (Q, Σ, δ, q0, F با حالت‌های { Q = { q0,... ,qn داریم، محاسبه الگوریتم بدین صورت است: مجموعه‌های k
ij
R شامل همه رشته‌هایی است که ماشین M از حالت qi به حالت qj می‌رود بدون اینکه از حالت‌هایی با شماره بالاتر از k عبور کند. عبور کردن را می‌توان وارد شدن یا خارج شدن تعبیر کرد، پس هر کدام از حالت‌های i و j می‌توانند بزرگتر از k باشد اما حالات میانی نمی‌توانند. هر مجموعه k
ij
R با یک عبارت باقاعده نشان داده می‌شود؛ این الگوریتم عبارات را گام به گام برای k = -1, 0, … , n محاسبه می‌کند. از آنجایی که هیچ حالتی با شماره بزرگتر از n وجود ندارد، پس عبارت باقاعده k
0j
R مجموعه همه رشته‌هایی است که ماشین M از حالت شروع q0 به حالت qj می‌رود. در واقع اگر { F = { q1,... ,qf حالات پذیرش باشد، عبارت باقاعده k
0f
R | و.. | k
01
R نشان‌دهنده زبان پذیرفته‌شده توسط ماشین M است.

عبارت باقاعده اولیه برای k = به صورت زیر محاسبه می‌شود:

R−1
ij
= a1 | … | am, if ij, where δ(qi,a1) = … = δ(qi,am) = qj
R−1
ij
= a1 | … | am | ε, if i=j, where δ(qi,a1) = … = δ(qi,am) = qj

حال در هر قدم عبارت باقاعده k
ij
R از گام‌های قبلی به صورت زیر محاسبه می‌شود:

Rk
ij
= Rk-1
ik
(Rk-1
kk
)* Rk-1
kj
| Rk-1
ij

مثال ویرایش

 
ماشین تعیین‌پذیر حالات متناهی داده شده به الگوریتم کلینی

همان‌طور که در تصویر مشاهده می‌شود، یک ماشین تعیین‌پذیر حالات متناهی (M = (Q, Σ, δ, q0, F با تفاسیر زیر داریم:

  • مجموعه حالات { Q = { q0, q1, q2,
  • الفبای ورودی { Σ = { a, b,
  • تابع انتقال δ که δ(q0,a)=q0, δ(q0,b)=q1, δ(q1,a)=q2, δ(q1,b)=q1, δ(q2,a)=q1, δ(q2,b)=q1,
  • حالت شروع q0,
  • مجموعه حالات پذیرش { F = { q1.

الگوریتم کلینی عبارات باقاعده اولیه را به صورت زیر محاسبه می‌کند:

R−1
00
= a | ε
R−1
01
= b
R−1
02
= ∅
R−1
10
= ∅
R−1
11
= b | ε
R−1
12
= a
R−1
20
= ∅
R−1
21
= a | b
R−1
22
= ε

سپس عبارت باقاعده k
ij
R گام به گام از k-1
ij
R برای k = -۱، ۰، … , محاسبه می‌شود. از ویژگی‌های جبر کلینی برای ساده‌سازی عبارات باقاعده تا حد امکان استفاده شده‌است.

گام صفر:

R0
00
= R−1
00
(R−1
00
)* R−1
00
| R−1
00
= (a | ε) (a | ε)* (a | ε) | a | ε = a*
R0
01
= R−1
00
(R−1
00
)* R−1
01
| R−1
01
= (a | ε) (a | ε)* b | b = a* b
R0
02
= R−1
00
(R−1
00
)* R−1
02
| R−1
02
= (a | ε) (a | ε)* | ∅ = ∅
R0
10
= R−1
10
(R−1
00
)* R−1
00
| R−1
10
= ∅ (a | ε)* (a | ε) | ∅ = ∅
R0
11
= R−1
10
(R−1
00
)* R−1
01
| R−1
11
= ∅ (a | ε)* b | b | ε = b | ε
R0
12
= R−1
10
(R−1
00
)* R−1
02
| R−1
12
= ∅ (a | ε)* | a = a
R0
20
= R−1
20
(R−1
00
)* R−1
00
| R−1
20
= ∅ (a | ε)* (a | ε) | ∅ = ∅
R0
21
= R−1
20
(R−1
00
)* R−1
01
| R−1
21
= ∅ (a | ε)* b | a | b = a | b
R0
22
= R−1
20
(R−1
00
)* R−1
02
| R−1
22
= ∅ (a | ε)* | ε = ε

گام یک:

R1
00
= R0
01
(R0
11
)* R0
10
| R0
00
= a*b (b | ε)* | a* = a*
R1
01
= R0
01
(R0
11
)* R0
11
| R0
01
= a*b (b | ε)* (b | ε) | a* b = a* b* b
R1
02
= R0
01
(R0
11
)* R0
12
| R0
02
= a*b (b | ε)* a | ∅ = a* b* ba
R1
10
= R0
11
(R0
11
)* R0
10
| R0
10
= (b | ε) (b | ε)* | ∅ = ∅
R1
11
= R0
11
(R0
11
)* R0
11
| R0
11
= (b | ε) (b | ε)* (b | ε) | b | ε = b*
R1
12
= R0
11
(R0
11
)* R0
12
| R0
12
= (b | ε) (b | ε)* a | a = b* a
R1
20
= R0
21
(R0
11
)* R0
10
| R0
20
= (a | b) (b | ε)* | ∅ = ∅
R1
21
= R0
21
(R0
11
)* R0
11
| R0
21
= (a | b) (b | ε)* (b | ε) | a | b = (a | b) b*
R1
22
= R0
21
(R0
11
)* R0
12
| R0
22
= (a | b) (b | ε)* a | ε = (a | b) b* a | ε

گام دو:

R2
00
= R1
02
(R1
22
)* R1
20
| R1
00
= a*b*ba ((a|b)b*a | ε)* | a* = a*
R2
01
= R1
02
(R1
22
)* R1
21
| R1
01
= a*b*ba ((a|b)b*a | ε)* (a|b)b* | a* b* b =
R2
02
= R1
02
(R1
22
)* R1
22
| R1
02
= a*b*ba ((a|b)b*a | ε)* ((a|b)b*a | ε) | a* b* ba =
R2
10
= R1
12
(R1
22
)* R1
20
| R1
10
= b* a ((a|b)b*a | ε)* | ∅ = ∅
R2
11
= R1
12
(R1
22
)* R1
21
| R1
11
= b* a ((a|b)b*a | ε)* (a|b)b* | b* =
R2
12
= R1
12
(R1
22
)* R1
22
| R1
12
= b* a ((a|b)b*a | ε)* ((a|b)b*a | ε) | b* a =
R2
20
= R1
22
(R1
22
)* R1
20
| R1
20
= ((a|b)b*a | ε) ((a|b)b*a | ε)* | ∅ = ∅
R2
21
= R1
22
(R1
22
)* R1
21
| R1
21
= ((a|b)b*a | ε) ((a|b)b*a | ε)* (a|b)b* | (a | b) b* =
R2
22
= R1
22
(R1
22
)* R1
22
| R1
22
= ((a|b)b*a | ε) ((a|b)b*a | ε)* ((a|b)b*a | ε) | (a | b) b* a | ε =

«گام دوم نیاز به ساده‌سازی دارد»

q0 حالت شروع و q1 تنها حالت پایان می‌باشد، لذا عبارت باقاعده 2
01
R نشان‌دهنده مجموعه تمام رشته‌های پذیرفته‌شده توسط ماشین M است.

منابع ویرایش

  1. Jonathan L. Gross and Jay Yellen, ed. (2004). Handbook of Graph Theory. Discrete Mathematics and it Applications. CRC Press. ISBN 1-58488-090-2. Here: sect.2.1, remark R13 on p.65
  2. Kleene, Stephen C. (1956). "Representation of Events in Nerve Nets and Finite Automate" (PDF). Automata Studies, Annals of Math. Studies. Princeton Univ. Press. 34.
  3. John E. Hopcroft, Jeffrey D. Ullman (1979). Introduction to Automata Theory, Languages, and Computation. Addison-Wesley. ISBN 0-201-02988-X. Here: Theorem 2.4, p.33-34