1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

10 13 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 502,76 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Lý thuyết ngôn ngữ hình thức, chính vì thực chất của nó

Trang 1

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:

Giáo viên hướng dẫn:

Hà Nội : 07/2011

Trang 2

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

Trang 3

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

Trang 4

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

Trang 5

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

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 6

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

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 7

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 L2 và L1 theo cách đã trình bày ở trên

PHẦN 3 : CHƯƠNG TRÌNH MINH HỌA

1 Giao diện

Trang 8

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++)

Trang 9

{

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++)

Tải bản FULL (file word 13 trang): bit.ly/2Ywib4t

Dự phòng: fb.com/KhoTaiLieuAZ

Trang 10

{

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++)

{

Ngày đăng: 06/09/2021, 16:27

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w