Tải bản đầy đủ (.docx) (13 trang)

Báo cáo bài tập lớn automata về giao và hiệu cảu 2 DFA

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (412.66 KB, 13 trang )

HỌ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:
Đơn vị : Lớp Tin học 44
Giáo viên hướng dẫn:
Hà Nội : 07/2011
1
MỤ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
2
khỏ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

1. Giới thiệu
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.

3

Hì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.
2. Định nghĩa
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.
3. Hàm chuyển trạng thái mở rộng
Để 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
chuỗi w. Một cách hình thức, ta định nghĩa :
1. δ (q, ε) = q
2. δ (q, wa) = δ(δ (q, w), a), với mọi chuỗi w và ký hiệu nhập a.

4
Mộ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, 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. Giao của 2 DFA
1.1 Định nghĩa
L
1
∩ L
2
= {x | x ∈ L
1
and x ∈ L
2
}
Ví dụ :
– L
1
= {0x | x ∈ {0,1}*} chuỗi bắt đầu bằng 0
– L
2
= {x0 | x ∈ {0,1}*} chuỗi kết thúc bằng 0
– L
1
∩ L
2
= {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ả :
5
Chú ý :
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. Hiệu của 2 DFA
2.1 Định nghĩa
L
1
- L
2
= {x | x ∈ L
1
and x ∈ L
2
}
Ví dụ :
– L
1
= {0x | x ∈ {0,1}*} chuỗi bắt đầu bằng 0
– L
2
= {x0 | x ∈ {0,1}*} chuỗi kết thúc bằng 0
– L
1
∩ L
2
= {0x1| x ∈ {0,1}*} chuỗi bắt đầu là 0 và kết thúc khác 0
Chú ý :
L

1
- L
2
= L
1
∩ ( ∈ L } )
2.2 Cách xây dựng
1- Tính phần bù của L
2
như ví dụ sau:
6


Trạ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 L
2
và L
1
theo cách đã trình bày ở trên
PHẦN 3 : CHƯƠNG TRÌNH MINH HỌA
1. Giao diện
7
2. CODE chương trình chính
2.1 Hàm tạo DFA
private void btnTao1_Click(object sender, EventArgs e)
{
if (txtKiTu1.Text == "" || cbTrangThai1.Text == "")
{
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))
8
{
GroupBox 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);
}
}
}
}
}
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());
for (int i = 0; i < soTrangThai1; i++)
9
{
DataRow row = bangchuyen1.NewRow();
for (int j = 0; j < kituchuyen1.Length; j++)
{
ComboBox cbTrangthai =
(ComboBox)this.Controls.Find("trangthai1" + i + j, true)[0];
if (cbTrangthai.Text != " ")
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];
10
int flag = 0;
arr1 = arr.Copy();
arr2 = arr.Copy();
foreach (char c in kituchuyen1)
{
//if (row0[c.ToString()].ToString() != " ")
//{
int q = Convert.ToInt16(row0[c.ToString()]);
if (i < q)
{
Point pb = new
Point(Convert.ToInt16(vitri1.Rows[i]["xe"]), yy + (i - q) * sls);
Point pe = new
Point(Convert.ToInt16(vitri1.Rows[q]["xb"]), yy + (i - q) * sls);
Point pc = new Point((pb.X + pe.X) / 2, yy + (i

- q) * sll);
int n = Convert.ToInt16(arr1.Rows[0]
[q.ToString()]);
if (n == 0)
{
g1.DrawCurve(pen, new Point[] { pb, pc,
pe });
g1.DrawString(c.ToString(), f, brush1, pc.X
- 8, pc.Y - 17);
}
else
{
g1.DrawString("," + c.ToString() + " ", f,
brush1, pc.X - 10 + 10 * n, pc.Y - 17);
}
arr1.Rows[0][q.ToString()] = n + 1;
}
else if (i == q)
{
Point pb = new
Point(Convert.ToInt16(vitri1.Rows[i]["xe"]) - 5, yy - 17);
Point pe = new
Point(Convert.ToInt16(vitri1.Rows[i]["xb"]) + 5, yy - 17);
Point pc1 = new Point((pb.X + pe.X) / 2 + 5, yy
- 40);
Point pc2 = new Point((pb.X + pe.X) / 2 - 5, yy
- 40);
if (flag == 0)
{
g1.DrawCurve(pen, new Point[] { pb, pc1,

pc2, pe });
g1.DrawString(c.ToString(), f, brush1, (pb.X
+ pe.X) / 2 - 8, pc1.Y - 22);
}
else
{
g1.DrawString("," + c.ToString() + " ", f,
brush1, (pb.X + pe.X) / 2 - 10 + 10 * flag, pc1.Y - 22);
}
flag++;
}
else
{
Point pb = new
Point(Convert.ToInt16(vitri1.Rows[i]["xb"]), yy + (i - q) * sls);
Point pe = new
Point(Convert.ToInt16(vitri1.Rows[q]["xe"]), yy + (i - q) * sls);
Point pc = new Point((pb.X + pe.X) / 2, yy + (i
- q) * sll);
int n = Convert.ToInt16(arr2.Rows[0]
[q.ToString()]);
if (n == 0)
{
11
g1.DrawCurve(pen, new Point[] { pb, pc,
pe });
g1.DrawString(c.ToString(), f, brush1, pc.X
- 8, pc.Y - 1);
}
else

{
g1.DrawString("," + c.ToString() + " ", f,
brush1, pc.X - 10 + (10 * n), pc.Y - 1);
}
arr2.Rows[0][q.ToString()] = n + 1;
}
//}
}
}
#endregion ve cung
}
catch
{
MessageBox.Show("nhập đủ thông tin DFA1");
}
}
2.3 Hàm tạo giao
2.4 Hàm tạo hiệu
TÀI LIỆU THAM KHẢO
1. Giáo trình AUTOMATA ngôn ngữ hình thức và nguyên lý chương trình
dịch – PGS.TS Nguyễn Văn Xuất ( Học viện Kỹ thuật Quân sự).
12
2. Slide bài giảng của thầy Hà Chí Trung ( Bộ môn Khoa học máy tính –
Khoa Công nghệ thông tin - HVKTQS)
3. Lý thuyết automata và ngôn ngữ hình thức – Nguyễn Gia Định ( Đại Học
Huế)
4. Tài liệu tham khảo khác
13

×