Lý thuyết ngôn ngữ hình thức, chính vì thực chất của nó là một lĩnh vực khoa học liên ngành; nhu cầu mô tả hình thức văn phạm được phát sinh trong nhiều ngành khoa học khác nhau từ ngôn
Trang 1HỌC VIỆN KỸ THUẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN: AUTOMAT VÀ NGÔN NGỮ HÌNH THỨC
ĐỀ TÀI: GIAO VÀ HIỆU CỦA 2 DFA
Nhóm thực hiện đề tài:
Giáo viên hướng dẫn:
Hà Nội : 07/2011
Trang 2MỤC LỤC
ĐẶT VẤN ĐỀ
Lý thuyết ngôn ngữ hình thức và automata đóng một vai trò rất quan trọng trong các cơ sở toán học của tin học Ngôn ngữ hình thức được sử dụng trong việc xây dựng các ngôn ngữ lập trình, lý thuyết về các chương trình dịch Các ngôn ngữ hình thức tạo thành một công cụ mô tả đối với các mô hình tính toán
cả cho dạng thông tin vào-ra lẫn kiểu thao tác Lý thuyết ngôn ngữ hình thức, chính vì thực chất của nó là một lĩnh vực khoa học liên ngành; nhu cầu mô tả hình thức văn phạm được phát sinh trong nhiều ngành khoa học khác nhau từ ngôn ngữ học đến sinh vật học
Như chúng ta đã biết, ngôn ngữ hình thức và chương trình dịch là những
bộ môn phát triển sớm nhất so với các ngành khác trong khoa học máy tính, khối lượng kiến thức trong các bộ môn này rất đồ sộ Ở nước ta hiện nay, đã có nhiều trường đại học cũng đã bắt đầu giảng dạy môn học này cho các sinh viên ngành Công nghệ thông tin
Để hiểu rõ hơn về ngôn ngữ hình thức và automata, trong nội dung bài tập lớn này, chúng em xin trình bày vấn đề về: hiệu và giao của hai DFA Chúng em chia đề tài ra làm 3 phần chính :
1 Tìm hiểu về DFA
2 Tìm hiểu về giao và hiệu của 2 DFA
3 Chương trình minh họa
Trong suốt quá trình làm, với sự cố gắng của từng thành viên trong nhóm cùng với các ý kiến đóng góp của bạn bè, sự hướng dẫn của thầy giáo và tham khảo các tài liệu khác, chúng em đã hoàn thành được nội dung đề ra Tuy nhiên,
do kỹ năng và kiến thức còn có hạn nên nội dung chương trình không thể tránh
Trang 3khỏi những sai sót Chúng em hy vọng sẽ nhận được nhiều những sự đóng góp
từ phía thầy và bạn bè để chương trình này được hoàn thiện hơn!
Chúng em xin chân thành cảm ơn!
PHẦN 1: AUTOMAT HỮU HẠN ĐƠN ĐỊNH
DFA
Một ôtômát hữu hạn đơn định (DFA) gồm một tập hữu hạn các trạng thái
và một tập các phép chuyển từ trạng thái này tới trạng thái khác trên các ký hiệu nhập (input symbols) được chọn từ một bộ chữ cái Σ nào đó Mỗi ký hiệu nhập
có đúng một phép chuyển khỏi mỗi trạng thái (có thể chuyển trở về chính nó) Một trạng thái, thường ký hiệu là q0, gọi là trạng thái bắt đầu (trạng thái ôtômát bắt đầu) Một số trạng thái được thiết kế như là các trạng thái kết thúc hay trạng thái chấp nhận
Một đồ thị có hướng, gọi là sơ đồ chuyển (transition diagram) tương ứng với một DFA như sau: các đỉnh của đồ thị là các trạng thái của DFA; nếu có một đường chuyển từ trạng thái q đến trạng thái p trên input a thì có một cung nhãn a chuyển từ trạng thái q đến trạng thái p trong sơ đồ chuyển DFA chấp nhận một chuỗi x nếu như tồn tại dãy các phép chuyển tương ứng trên mỗi ký hiệu của x dẫn từ trạng thái bắt đầu đến một trong những trạng thái kết thúc
Chẳng hạn, sơ đồ chuyển của một DFA được mô tả trong hình 1 Trạng thái khởi đầu q0 được chỉ bằng mũi tên có nhãn "Start" Chỉ có duy nhất một trạng thái kết thúc, cũng là q0 trong trường hợp này, được chỉ ra bằng hai vòng tròn Ôtômát này chấp nhận tất cả các chuỗi số 0 và số 1 với số số 0 và số số 1 là
số chẵn
Trang 4Hình 1 - Sơ đồ chuyển của một DFA
Một điều cần lưu ý, DFA sử dụng mỗi trạng thái của nó để giữ chỉ một phần của chuỗi số 0 và 1 chứ không phải chứa một số thực sự, vì thế DFA cần dùng một số hữu hạn trạng thái
Một cách hình thức ta định nghĩa ôtômát hữu hạn là bộ gồm năm thành phần (Q, Σ, δ, q0, F), trong đó :
Q là tập hợp hữu hạn các trạng thái
Σ là bộ chữ cái nhập hữu hạn
δ là hàm chuyển ánh xạ từ Q × Σ → Q, tức là δ(q, a) là một trạng thái được cho bởi phép chuyển từ trạng thái q trên ký hiệu nhập a
q0 ÎÎ Q là trạng thái bắt đầu
F ÎÍ Q là tập các trạng thái kết thúc
Để có thể mô tả một cách hình thức hoạt động của một DFA trên chuỗi, ta
mở rộng hàm chuyển δ để áp dụng đối với một trạng thái trên chuỗi hơn là một trạng thái trên từng ký hiệu Ta định nghĩa hàm chuyển δ như một ánh xạ từ Q × Σ* → Q với ý nghĩa δ(q, w) là trạng thái DFA chuyển đến từ trạng thái q trên) là trạng thái DFA chuyển đến từ trạng thái q trên chuỗi w) là trạng thái DFA chuyển đến từ trạng thái q trên Một cách hình thức, ta định nghĩa :
1 δ (q, ε) = q
2 δ (q, w) là trạng thái DFA chuyển đến từ trạng thái q trêna) = δ(δ (q, w) là trạng thái DFA chuyển đến từ trạng thái q trên), a), với mọi chuỗi w) là trạng thái DFA chuyển đến từ trạng thái q trên và ký hiệu nhập a
Trang 5Một số quy ước về ký hiệu :
- Q là tập các trạng thái Ký hiệu q và p (có hoặc không có chỉ số) là các trạng thái, q0 là trạng thái bắt đầu
- Σ là bộ chữ cái nhập Ký hiệu a, b (có hoặc không có chỉ số) và các chữ
số là các ký hiệu nhập
- δ là hàm chuyển
- F là tập các trạng thái kết thúc
- w) là trạng thái DFA chuyển đến từ trạng thái q trên, x, y và z (có hoặc không có chỉ số) là các chuỗi ký hiệu nhập
PHẦN 2: GIAO VÀ HIỆU CỦA 2 DFA
1.1 Định nghĩa
L1 Ç L2 = {x | x Î L1 and x Î L2}
Ví dụ :
– L1 = {0x | x Î {0,1}*} chuỗi bắt đầu bằng 0
– L2 = {x0 | x Î {0,1}*} chuỗi kết thúc bằng 0
– L1 Ç L2 = {x Î {0,1}* | x bắt đầu và kết thúc bằng 0} 1.2
Cách thực hiện
Ta có ví dụ sau :
Kết quả :
Trang 6Chú ý :
Trạng thái của giao la kết thúc nếu cả hai trạng thái thành phần đều là trạng thái kết thúc
2.1 Định nghĩa
L1 - L2 = {x | x Î L1 and x Î L2}
Ví dụ :
– L1 = {0x | x Î {0,1}*} chuỗi bắt đầu bằng 0
– L2 = {x0 | x Î {0,1}*} chuỗi kết thúc bằng 0
– L1 Ç L2 = {0x1| x Î {0,1}*} chuỗi bắt đầu là 0 và kết thúc khác 0
Chú ý :
L1-L2 =L1Ç ( ÎL})
2.2 Cách xây dựng
1- Tính phần bù của L2 như ví dụ sau:
Trang 7Trạng thái kết thúc chuyển thành trạng thái không kết thúc và ngược lại
2-Tính giao phần bù của L2 và L1 theo cách đã trình bày ở trên
PHẦN 3 : CHƯƠNG TRÌNH MINH HỌA
Trang 82 CODE chương trình chính
2.1 Hàm tạo DFA
private void btnTao1_Click( object sender, EventArgs e)
{
{
MessageBox Show( "nhập đủ thông tin DFA1" ); return ;
}
if (txtKiTu1.Text.Length > 2) {
MessageBox Show( "số kí tự chuyển nhỏ hơn 3" );
return ; }
kiemtra1 = true ; pnKetThuc1.Controls.Clear();
pnTrangThai1.Controls.Clear();
pnDFA1.Controls.Clear();
pnDFA2.Controls.Clear();
pnGiao.Controls.Clear();
pnHieu.Controls.Clear();
//tao trang thai ket thuc
soTrangThai1 = Convert ToInt16(cbTrangThai1.Text);
for ( int i = 0; i < soTrangThai1; i++)
CheckBox cb = new CheckBox ();
cb.Name = "cb1" + i;
cb.Text = " p" + i;
cb.Width = 50;
if (i < 2) cb.Location = new Point (10, (i +1) * 20);
else
cb.Location = new Point (100, (i - 1) * 20); pnKetThuc1.Controls.Add(cb);
}
//tao bang chuyen trang thai
kituchuyen1 = txtKiTu1.Text;
for ( int i = 0; i <= soTrangThai1; i++) {
for ( int j = 0; j <= kituchuyen1.Length; j++) {
if (!(i == 0 && j == 0))
Trang 9GroupBox bangTrangThai = new GroupBox ();
bangTrangThai.Height = 35;
bangTrangThai.Width = 50;
bangTrangThai.Location = new Point ((j + 1) * 50 - 35, (i + 1) * 30-30 );
pnTrangThai1.Controls.Add(bangTrangThai);
if (i == 0) {
Label trangthaibd = new Label ();
trangthaibd.Text = kituchuyen1[j - 1].ToString(); trangthaibd.Width = 25;
trangthaibd.Location = new Point (10, 15);
bangTrangThai.Controls.Add(trangthaibd);
}
else if (j == 0) {
Label kitu = new Label ();
kitu.Text = " q" + (i - 1);
kitu.Width = 25;
kitu.Location = new Point (10, 15);
bangTrangThai.Controls.Add(kitu);
}
else
{
ComboBox trangthaiden = new ComboBox ();
trangthaiden.Name = "trangthai1" + (i-1)+(j-1);
trangthaiden.Items.Add( " " );
for ( int k = 0; k < soTrangThai1; k++) trangthaiden.Items.Add( " q" + k);
trangthaiden.Width = 40;
trangthaiden.SelectedIndex = 0;
trangthaiden.Location = new Point (5, 10);
bangTrangThai.Controls.Add(trangthaiden);
} } Tải bản FULL (file w) là trạng thái DFA chuyển đến từ trạng thái q trênord 13 trang): bit.ly/2Yw) là trạng thái DFA chuyển đến từ trạng thái q trênib4t
}
Dự phòng: fb.com/KhoTaiLieuAZ
} }
2.2 Hàm vẽ sơ đồ của DFA vừa tạo
private void btnDFA1_Click( object sender, EventArgs e)
{
try
{
if (kiemtra1 == false ) {
MessageBox Show( "nhập đủ thông tin DFA1" );
return ; }
int x = 30, y = 70, w = 40, h = 40, r = 90, a = 10, b = 10; int yy = y + h / 2;
Pen pen = new Pen ( Color Black, 2);
Brush brush1 = new SolidBrush ( Color Black);
Brush brush2 = new SolidBrush ( Color White);
Font f = new Font ( "Tahoma" , 11);
vitri1 = new DataTable ();
vitri1.Columns.Add( "xb" );
vitri1.Columns.Add( "xe" );
#region tao bang
//tao cac bang chuyen
bangchuyen1 = new DataTable ();
foreach ( char c in kituchuyen1) bangchuyen1.Columns.Add(c.ToString());
Trang 10DataRow row = bangchuyen1.NewRow();
for ( int j = 0; j < kituchuyen1.Length; j++) {
ComboBox cbTrangthai =
row[j] = cbTrangthai.Text.Substring(2);
} bangchuyen1.Rows.Add(row);
} ketthuc1 = new DataTable ();
for ( int i = 0; i < soTrangThai1; i++) ketthuc1.Columns.Add();
DataRow r1 = ketthuc1.NewRow();
for ( int i = 0; i < soTrangThai1; i++) {
CheckBox chktrangthai = ( CheckBox ) this Controls.Find( "cb1" +
i, true )[0];
r1[i] = chktrangthai.Checked;
if (r1[i].ToString() == "True" ) sottketthuc1++;
} ketthuc1.Rows.Add(r1);
#endregion tao bang
#region ve trang thai va xuat phat
//ve cac trang thai
for ( int i = 0; i < soTrangThai1; i++) {
DataRow rr = vitri1.NewRow();
rr[ "xb" ] = x;
rr[ "xe" ] = x + w;
vitri1.Rows.Add(rr);
if ( Convert ToBoolean(ketthuc1.Rows[0][i]) == true ) {
g1.FillEllipse( new SolidBrush ( Color Red), x, y, w, h); g1.DrawString( "q" + i, f, brush2, x + a, y + b);
}
else
{ g1.DrawEllipse(pen, x, y, w, h);
g1.DrawString( "q" + i, f, brush1, x + a, y + b);
}
x += r + w;
}
//ve duong bat dau
pen.Width = 3;
pen.EndCap = LineCap ArrowAnchor;
g1.DrawLine(pen, new Point (5, yy), new Point (30, yy)); #endregion ve trang thai va xuat phat
#region ve cung
//ve cac cung noi cac trang thai
int sls = 6, sll = 20;
DataTable arr = new DataTable (), arr1 = new DataTable (), arr2 =
new DataTable ();
for ( int i = 0; i < soTrangThai1; i++) arr.Columns.Add(i.ToString());
DataRow row_arr = arr.NewRow();
for ( int i = 0; i < soTrangThai1; i++) row_arr[i.ToString()] = 0;
arr.Rows.Add(row_arr);
for ( int i = 0; i < soTrangThai1; i++) {
DataRow row0 = bangchuyen1.Rows[i];