Tải bản đầy đủ (.doc) (12 trang)

Chuyển từ một npda sang một văn phạm phi ngữ cảnh

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 (139.71 KB, 12 trang )

NHĨM 13-KHMT1-k2
2010

March 23,

BỘ CƠNG THƯƠNG
TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP HÀ NỘI
KHOA CƠNG NGHỆ THƠNG TIN

Báo Cáo Bài Tập Lớn
Mơn Automata
Đề tài: Chuyển từ một NPDA sang một văn phạm
phi ngữ cảnh
Giáo viên hướng dẫn:

Trần Hùng Cường

Nhóm sinh viên thực hiện:
1. Hoàng Thị Hạnh.
2. Nguyễn Văn Long.
3. Nguyễn Ngọc Phượng.
Lớp: KHMT1-K2.
Khoa: Công Nghệ Thông Tin.
Trường: ĐH Công Nghiệp Hà Nội.

BTL- Môn Automata

1


NHÓM 13-KHMT1-k2


2010

March 23,

Chuyển từ một NPDA sang một
văn phạm phi ngữ cảnh.
I.Lý thuyết:
Bổ đề 7.1: Với mọi npda ln có một npda tương ứng thỏa mãn hai điều
kiệu sau:
1.Chỉ có 1 trạng thái kết thúc và npda kết thúc khi stack rỗng.
2.Mọi chuyển trạng thái đều có dạng:
(qi,a,A)={c1,c2,...,cn}qi,a,A)={c1,c2,...,cn}c1,c2,...,cn}
trong đó:
ci={c1,c2,...,cn}qj,) (qi,a,A)={c1,c2,...,cn}7.5)
hoặc:
ci=(qi,a,A)={c1,c2,...,cn}qj,BC) (qi,a,A)={c1,c2,...,cn}7.6)
tức là 1 di chuyển hoặc tăng hoặc giảm stack 1 ký hiệu đơn
Bây giờ ta sẽ đi vào chứng minh bổ đề 7.1 bằng cách xây dựng một NPDA
tương đương thỏa mãn 2 điều kiện trên.

-Điều kiện 1:
Giả sử một NPDA có nhiều hơn một trạng thái kết thúc qi,qj,qk.... Ta
chuyển hết tất cả các trạng thái kết thúc qj,qk... về trạng thái kết thúc qi khi
stack rỗng. Điều này tương đương với việc thêm các chuyển dịch delta như
sau vào (qi,a,A)={c1,c2,...,cn}qj, ,z)->(qi,z), )->(qi,a,A)={c1,c2,...,cn}qi,z)->(qi,z), ),
(qi,a,A)={c1,c2,...,cn}qj,,z)->(qi,z), )->(qi,a,A)={c1,c2,...,cn}qk,z)->(qi,z), ),.... với qi là trạng thái kết thúc đầu tiên và qj, qk... là các
trạng thái kết thúc cịn lại. Sau đó ta gán lại cho qj, qk... thành các trạng thái
không kết thúc. Điều kiện 1 đã thỏa.

-Điều kiện 2:

* Đối với các chuyển dịch có dạng:
(qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qj,B) tức là thay A trên đỉnh Stack thành B (qi,a,A)={c1,c2,...,cn}số phần tử trong
stack không đổi)

BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010

March 23,

ta tạo một trạng thái mới qt. Sau đó ta sẽ dùng trạng thái qt này để làm bước
trung gian chuyển từ trạng thái qi sang qj và thay thế A trên đỉnh Stack
thành B.
Bước làm như sau:
Xóa chuyển trạng thái (qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qj,B) đi và thay nó bằng 2 chuyển trạng
thái:
(qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qt,BB) //Thay ký tự A trên đỉnh Stack thành 2 ký tự B và chuyển
sang qt
(qi,a,A)={c1,c2,...,cn}qt,,B)->(qi,a,A)={c1,c2,...,cn}qj,) //Từ qt, không cần nhận ký tự nào từ ngõ nhập và đỉnh
Stack
//lúc này là B (qi,a,A)={c1,c2,...,cn}2 ký tự B). Ta bỏ đi 1 ký tự B.
Như thế, 2 bước chuyển trạng thái này tương đương với bước chuyển trạng
thái (qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qj,B).
*Đối với các chuyển dịch có dạng:
(qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qj,BCDE) tức là thay thế A trên đỉnh Stack thành BCDE (số ) tức là thay thế A trên đỉnh Stack thành BCDE) tức là thay thế A trên đỉnh Stack thành BCDE (số (qi,a,A)={c1,c2,...,cn}số
phần tử trên đỉnh Stack tăng thêm nhiều hơn 1) ta cũng tạo một trạng thái qt

trung gian mới. Sau đó dùng trạng thái qt này để làm bước trung gian để
thay thế A bằng chuỗi BCDE) tức là thay thế A trên đỉnh Stack thành BCDE (số F. Các bước thực hiện lần lược như sau:
(qi,a,A)={c1,c2,...,cn}qi,a,A)->(qi,a,A)={c1,c2,...,cn}qt,E) tức là thay thế A trên đỉnh Stack thành BCDE (số ) //Chuyển sang trạng thái tạm qt và thay A bằng DE) tức là thay thế A trên đỉnh Stack thành BCDE (số . Đỉnh
stack lúc
//này là DE) tức là thay thế A trên đỉnh Stack thành BCDE (số
(qi,a,A)={c1,c2,...,cn}qt, ,D)->(qi,a,A)={c1,c2,...,cn}qt,CD) //thay D bằng CD mà không cần đọc ký tự nào vào.
Đỉnh stack lúc
//này là CDE) tức là thay thế A trên đỉnh Stack thành BCDE (số . Trạng thái vẫn ở qt
(qi,a,A)={c1,c2,...,cn}qt, ,C)->(qi,a,A)={c1,c2,...,cn}qj,BC) //Thay C bằng BC và chuyển xuống trạng thái qj như
yêu cầu. Đỉnh
stack lúc này là BCDE) tức là thay thế A trên đỉnh Stack thành BCDE (số .
- Như thế với 3 bước trung gian ta đã thực hiện được (qi,a,A)={c1,c2,...,cn}qi,a,A)>(qi,a,A)={c1,c2,...,cn}qj,BCDE) tức là thay thế A trên đỉnh Stack thành BCDE (số ) thỏa mãn dk.
- Sau khi đã chuyển về NPDA thảo mãn bổ đề ta sẽ chuyển NPDA này
thành văn phạm
- Với các chuyển dịch (qi,a,A)={c1,c2,...,cn}7.5) ta sẽ sinh ra luật sinh tương ứng:
(qi,a,A)={c1,c2,...,cn}qiAqj)->a.
- Còn với các chuyển dịch có dạng (qi,a,A)={c1,c2,...,cn}7.6) thì sẽ có tập luật sinh:
(qi,a,A)={c1,c2,...,cn}qiAqj)->a(qi,a,A)={c1,c2,...,cn}qjBql)(qi,a,A)={c1,c2,...,cn}qlCqk) trong đó ql và qk là những trạng thái có thể
lấy được trong tập Q (qi,a,A)={c1,c2,...,cn}q0..qn).
- Cuối cùng ta lấy (qi,a,A)={c1,c2,...,cn}q0z)->(qi,z), qf) là biến bắt đầu của văn phạm với qf là biến
kết thúc đơn của NPDA.

BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010


March 23,

*Bước cuối cùng của thao tác này là loại bỏ những luật sinh vô dụng.
Các bước như sau:
B1: Đầu tiên ta tạo một tập biến hữu dụng BHD là những biến (qi,a,A)={c1,c2,...,cn}qiAqj) có
dạng: (qi,a,A)={c1,c2,...,cn}qiAqj)->a.
B2: Đối với những luật sinh (qi,a,A)={c1,c2,...,cn}qiAqj)->a(qi,a,A)={c1,c2,...,cn}qjBql)(qi,a,A)={c1,c2,...,cn}qlCqk) với (qi,a,A)={c1,c2,...,cn}qiAqj) là biến
không thuộc tập biến hữu dụng BHD nhưng (qi,a,A)={c1,c2,...,cn}qjBql),(qi,a,A)={c1,c2,...,cn}qlCqk) thuộc BHD thì
thêm (qi,a,A)={c1,c2,...,cn}qiAqj) vào.
B3: Lặp bước 2 cho đến khi không thể thêm phần tử nào vào được.
B4:Đối với mỗi luật sinh (qi,a,A)={c1,c2,...,cn}qiAqj)->a(qi,a,A)={c1,c2,...,cn}qjBql)(qi,a,A)={c1,c2,...,cn}qlCqk) mà (qi,a,A)={c1,c2,...,cn}qiAqj) hoặc (qi,a,A)={c1,c2,...,cn}qjBql)
hoặc (qi,a,A)={c1,c2,...,cn}qlCqk) khơng thuộc tập BHD thì bỏ loại bỏ luật sinh đó (qi,a,A)={c1,c2,...,cn}thực ra chỉ
cần xét (qi,a,A)={c1,c2,...,cn}qiAqj) có thuộc tập BHD khơng thơi vì nếu (qi,a,A)={c1,c2,...,cn}qjBql) và (qi,a,A)={c1,c2,...,cn}qlCqk) đều
thuộc BHD thì (qi,a,A)={c1,c2,...,cn}qiAqj) cũng thuộc tập này).
Như thế ta được Văn phạm G tương đương với NPDA M đã cho.

II.Cài đặt:
Việc cài đặt chương trình thực chất là biến những bước chơ bản trên thành
code:
Lớp NPDA: Dựa vào các thơng số của NPDA, làm nó thỏa mãn điều
kiện 1 và 2 (bao gồm 7.5 và 7.6 nếu nó chưa thỏa) và chuyển nó sang
Văn phạm bằng phương thức toVP.
public class NPDA {c1,c2,...,cn}
public int q_; //So trang thai toi da cua npda
public String xichma=""; //Cac ky tu ngo nhap
public String gama=""; //Cac ky tu chua trong stack
public ArrayList<String> delta=new ArrayList(qi,a,A)={c1,c2,...,cn}); //Ham chuyen
public int qst=0; //Trang thai bat dau
public String z)->(qi,z), ="z)->(qi,z), "; //Ky tu khoi dau stack
public boolean F[]=new boolean[100000]; //Trang thai ket thuc

//Khoi tao NPDA, chua lam j het.
public NPDA(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn}}
//Chuyen NPDA ve 1 NPDA thoa dieu kien 1
BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010

March 23,

public void thoadieukien1(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn}
for (qi,a,A)={c1,c2,...,cn}int i=0; i<=q_; i++)
//tim trang thai ket thuc dau tien
if (qi,a,A)={c1,c2,...,cn}F[i]) {c1,c2,...,cn}
//Chuyen cac trang thai ket thuc con lai sang trang thai ket
thuc dau tien
for (qi,a,A)={c1,c2,...,cn}int j=i+1; j<=q_; j++)
if (qi,a,A)={c1,c2,...,cn}F[j]) {c1,c2,...,cn}
delta.add(qi,a,A)={c1,c2,...,cn}"d(qi,a,A)={c1,c2,...,cn}q"+j+",~,z)->(qi,z), )>>(qi,a,A)={c1,c2,...,cn}q"+i+",z)->(qi,z), )");
F[j]=false;
}
break;
}
}
public void thoadieukien2(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn} //Làm NPDA thỏa điều kiện 2
int dcnt=delta.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn});
for (qi,a,A)={c1,c2,...,cn}int i=0; i

String tam=delta.get(qi,a,A)={c1,c2,...,cn}i);
//neu thoa dieu kien
if (qi,a,A)={c1,c2,...,cn}tam.endsWith(qi,a,A)={c1,c2,...,cn}",~)")) //dang 1 (qi,a,A)={c1,c2,...,cn}7.5)
continue;
if (qi,a,A)={c1,c2,...,cn}tam.substring(qi,a,A)={c1,c2,...,cn}tam.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")).length(qi,a,A)={c1,c2,...,cn})==4) //dang 2 (qi,a,A)={c1,c2,...,cn}7.6)
continue;
//Khong thoa man
delta.remove(qi,a,A)={c1,c2,...,cn}i);
dcnt--;
i--;
//Truong hop thay doi 1 ky tu tren dinh stack (ko thay doi so ky
tu trong stack)
if (qi,a,A)={c1,c2,...,cn}tam.substring(qi,a,A)={c1,c2,...,cn}tam.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")).length(qi,a,A)={c1,c2,...,cn})==3) {c1,c2,...,cn}
//Tao them 1 trang thai trung gian.
q_++;
//Lay ham chuyen dich
String tam2=tam.substring(qi,a,A)={c1,c2,...,cn}0,tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
//Lay trang thai can chuyen den
String tam3=tam.substring(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
String tam4=tam3.substring(qi,a,A)={c1,c2,...,cn}2,tam3.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay bien can thay the
BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010

March 23,


String bien=tam3.substring(qi,a,A)={c1,c2,...,cn}tam3.indexOf(qi,a,A)={c1,c2,...,cn}",")+1,tam3.length(qi,a,A)={c1,c2,...,cn})-1);
delta.add(qi,a,A)={c1,c2,...,cn}tam2+">>(qi,a,A)={c1,c2,...,cn}q"+q_+","+bien+bien+")");
delta.add(qi,a,A)={c1,c2,...,cn}"d(qi,a,A)={c1,c2,...,cn}q"+q_+",~,"+bien+")>>"+tam4+",~)");
continue;
}
//Truong hop thay tren dinh stack nhieu hon 2 ky tu (them nhieu
hon 1 ky tu vao stack)
if (qi,a,A)={c1,c2,...,cn}tam.substring(qi,a,A)={c1,c2,...,cn}tam.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")).length(qi,a,A)={c1,c2,...,cn})>=4) {c1,c2,...,cn}
//Tao them 1 trang thai
q_++;
//Lay ham chuyen dich
String tam2=tam.substring(qi,a,A)={c1,c2,...,cn}0,tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
//Lay trang thai can chuyen den
String tam3=tam.substring(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
String tam4=tam3.substring(qi,a,A)={c1,c2,...,cn}2,tam3.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay danh sach bien can thay the
String dsbien=tam3.substring(qi,a,A)={c1,c2,...,cn}tam3.indexOf(qi,a,A)={c1,c2,...,cn}",")+1,tam3.length(qi,a,A)={c1,c2,...,cn})1);
//lay 2 ky tu cuoi
String tam5=dsbien.substring(qi,a,A)={c1,c2,...,cn}dsbien.length(qi,a,A)={c1,c2,...,cn})-2);
delta.add(qi,a,A)={c1,c2,...,cn}tam2+">>(qi,a,A)={c1,c2,...,cn}q"+q_+","+tam5+")");
dsbien=dsbien.substring(qi,a,A)={c1,c2,...,cn}0,dsbien.length(qi,a,A)={c1,c2,...,cn})-1);
while (qi,a,A)={c1,c2,...,cn}true) {c1,c2,...,cn}
if (qi,a,A)={c1,c2,...,cn}dsbien.length(qi,a,A)={c1,c2,...,cn})<=2)
break;
//lay 2 ky tu cuoi
tam5=dsbien.substring(qi,a,A)={c1,c2,...,cn}dsbien.length(qi,a,A)={c1,c2,...,cn})-2);
//Them lan luoc cac ham chuyen trang thai vao
delta.add(qi,a,A)={c1,c2,...,cn}"d(qi,a,A)={c1,c2,...,cn}q"+q_+",~,"+tam5.charAt(qi,a,A)={c1,c2,...,cn}1)+")>>(qi,a,A)={c1,c2,...,cn}q"+q_+","+tam5+")");
dsbien=dsbien.substring(qi,a,A)={c1,c2,...,cn}0, dsbien.length(qi,a,A)={c1,c2,...,cn})-1);

}
delta.add(qi,a,A)={c1,c2,...,cn}"d(qi,a,A)={c1,c2,...,cn}q"+q_+",~,"+dsbien.charAt(qi,a,A)={c1,c2,...,cn}1)+")>>"+tam4+","+dsbien+")");
continue;
}
}
}

BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010

March 23,

public VP toVP(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn} //Phương thức chuyển sang văn phạm
VP kq=new VP(qi,a,A)={c1,c2,...,cn});
//Gan tap ky tu ket thuc
kq.setT(qi,a,A)={c1,c2,...,cn}xichma+"~");
//Lam NPDA thoa dieu kien 1
this.thoadieukien1(qi,a,A)={c1,c2,...,cn});
//Lam NPDA thoa dieu kien 2
this.thoadieukien2(qi,a,A)={c1,c2,...,cn});
//Doi voi cac ham delta
for (qi,a,A)={c1,c2,...,cn}int i=0; i<delta.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn}); i++) {c1,c2,...,cn}
String tam=delta.get(qi,a,A)={c1,c2,...,cn}i);
if (qi,a,A)={c1,c2,...,cn}tam.endsWith(qi,a,A)={c1,c2,...,cn}",~)")) { //Ham delta o dang 7.5
//Lay qi

String qi=tam.substring(qi,a,A)={c1,c2,...,cn}2,tam.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay qj
String tam2=tam.substring(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}">>")+2);
String qj=tam2.substring(qi,a,A)={c1,c2,...,cn}1,tam2.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay ky tu chuyen a
String kta=String.valueOf(qi,a,A)={c1,c2,...,cn}tam.charAt(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}",")+1));
//Lay bien dinh Stack A
String bentrai_npda=tam.substring(qi,a,A)={c1,c2,...,cn}0,tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
String
bienA=bentrai_npda.substring(qi,a,A)={c1,c2,...,cn}bentrai_npda.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")+1,
bentrai_npda.lastIndexOf(qi,a,A)={c1,c2,...,cn}")"));
String vetrai_ls="(qi,a,A)={c1,c2,...,cn}"+qi+bienA+qj+")";
String vephai_ls[]=new String[1];
vephai_ls[0]=kta;
kq.addP(qi,a,A)={c1,c2,...,cn}vetrai_ls, vephai_ls);
continue;
}
//Cac truong hop con lai la ham delta o dang 7.6
//se duoc them vao o vong lap sau (cho de nhin)
}
//Vong lap them cac truong hop o 7.6
for (qi,a,A)={c1,c2,...,cn}int i=0; i<delta.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn}); i++) {c1,c2,...,cn}
String tam=delta.get(qi,a,A)={c1,c2,...,cn}i);
if (qi,a,A)={c1,c2,...,cn}!tam.endsWith(qi,a,A)={c1,c2,...,cn}",~)")) { //Ham delta o dang 7.6
//Lay qi
BTL- Môn Automata

1



NHÓM 13-KHMT1-k2
2010

March 23,

String qi=tam.substring(qi,a,A)={c1,c2,...,cn}2,tam.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay qj
String tam2=tam.substring(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}">>")+2);
String qj=tam2.substring(qi,a,A)={c1,c2,...,cn}1,tam2.indexOf(qi,a,A)={c1,c2,...,cn}","));
//Lay ky tu chuyen a
String kta=String.valueOf(qi,a,A)={c1,c2,...,cn}tam.charAt(qi,a,A)={c1,c2,...,cn}tam.indexOf(qi,a,A)={c1,c2,...,cn}",")+1));
//Lay bien dinh Stack A
String bentrai_npda=tam.substring(qi,a,A)={c1,c2,...,cn}0,tam.indexOf(qi,a,A)={c1,c2,...,cn}">>"));
String
bienA=bentrai_npda.substring(qi,a,A)={c1,c2,...,cn}bentrai_npda.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")+1,
bentrai_npda.lastIndexOf(qi,a,A)={c1,c2,...,cn}")"));
//Lay 2 ky tu bien ben phai npda
String haibien=tam.substring(qi,a,A)={c1,c2,...,cn}tam.lastIndexOf(qi,a,A)={c1,c2,...,cn}",")+1,
tam.length(qi,a,A)={c1,c2,...,cn})-1);
for (qi,a,A)={c1,c2,...,cn}int k=0; k<=q_; k++)
for (qi,a,A)={c1,c2,...,cn}int l=0; l<=q_; l++) {c1,c2,...,cn}
String vetrai_ls="(qi,a,A)={c1,c2,...,cn}"+qi+bienA+"q"+k+")";
String vephai_ls[]=new String[3];
vephai_ls[0]=kta;
vephai_ls[1]="(qi,a,A)={c1,c2,...,cn}"+qj+haibien.charAt(qi,a,A)={c1,c2,...,cn}0)+"q"+l+")";
vephai_ls[2]="(qi,a,A)={c1,c2,...,cn}q"+l+haibien.charAt(qi,a,A)={c1,c2,...,cn}1)+"q"+k+")";
kq.addP(qi,a,A)={c1,c2,...,cn}vetrai_ls, vephai_ls);
}
continue;
}

}
//tim trang thai ket thuc
int luu=-1;
for (qi,a,A)={c1,c2,...,cn}int i=0; i<=q_; i++)
if (qi,a,A)={c1,c2,...,cn}F[i]) {c1,c2,...,cn}
luu=i;
break;
}
kq.S="(qi,a,A)={c1,c2,...,cn}q0z)->(qi,z), q"+luu+")";
return kq;
}
}

BTL- Môn Automata

1


NHĨM 13-KHMT1-k2
2010

March 23,

Lớp luật sinh luatsinh: Mơ tả cấu trúc cơ bản của 1 luật sinh gồm 2 vế
trái, phải với vế trái là 1 biến và vế phải là một tập thuộc (VT)*.
public class luatsinh {c1,c2,...,cn}
public String vetrai="";
public ArrayList<String> vephai=new ArrayList(qi,a,A)={c1,c2,...,cn});
}
Lớp văn phạm VP: Văn phạm được sinh ra là văn phạm tồn tại với những

luật sinh vô dụng. Ở đây có phương thức loại bỏ những luật sinh vô dụng
và được văn phạm rút gọn tương đương
public class VP {c1,c2,...,cn}
public String T="";
public ArrayList<String> V=new ArrayList(qi,a,A)={c1,c2,...,cn});
public String S="";
public ArrayList<luatsinh> P=new ArrayList(qi,a,A)={c1,c2,...,cn});
public VP(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn}}
public void setT(qi,a,A)={c1,c2,...,cn}String T) {c1,c2,...,cn}
this.T=T;
}
public void addV(qi,a,A)={c1,c2,...,cn}String V_) {c1,c2,...,cn}
if (qi,a,A)={c1,c2,...,cn}!this.V.contains(qi,a,A)={c1,c2,...,cn}V_))
this.V.add(qi,a,A)={c1,c2,...,cn}V_);
}
public void addP(qi,a,A)={c1,c2,...,cn}String vetrai, String[] vephai) {c1,c2,...,cn}
luatsinh tam=new luatsinh(qi,a,A)={c1,c2,...,cn});
tam.vetrai=vetrai;
//add 1 bien vao V
addV(qi,a,A)={c1,c2,...,cn}vetrai);
for (qi,a,A)={c1,c2,...,cn}int i=0; i//Neu la 1 bien thi add vao V
if (qi,a,A)={c1,c2,...,cn}vephai[i].startsWith(qi,a,A)={c1,c2,...,cn}"(qi,a,A)={c1,c2,...,cn}"))
addV(qi,a,A)={c1,c2,...,cn}vephai[i]);
tam.vephai.add(qi,a,A)={c1,c2,...,cn}vephai[i]);
}
BTL- Môn Automata

1



NHÓM 13-KHMT1-k2
2010

March 23,

P.add(qi,a,A)={c1,c2,...,cn}tam);
}
public void loaiboluatsinhvodung(qi,a,A)={c1,c2,...,cn}) {c1,c2,...,cn} //Loại bỏ những luật sinh vô dụng
ArrayList<String> bienhuudung=new ArrayList(qi,a,A)={c1,c2,...,cn});
//Khoi tao tap bien huu dung
int luu=0;
for (qi,a,A)={c1,c2,...,cn}int i=0; i<P.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn}); i++)
if (qi,a,A)={c1,c2,...,cn}P.get(qi,a,A)={c1,c2,...,cn}i).vephai.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn})==1)
bienhuudung.add(qi,a,A)={c1,c2,...,cn}P.get(qi,a,A)={c1,c2,...,cn}i).vetrai);
else {c1,c2,...,cn} luu=i; break; }
//trong khi co the them duoc bien huu dung vao tap thi them vao
while (qi,a,A)={c1,c2,...,cn}true) {c1,c2,...,cn}
boolean flag=false;
for (qi,a,A)={c1,c2,...,cn}int i=luu; i<P.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn}); i++) {c1,c2,...,cn}
luatsinh ls=P.get(qi,a,A)={c1,c2,...,cn}i);
String bien=ls.vetrai;
//bien do nam trong tap roi thi bo qua
if (qi,a,A)={c1,c2,...,cn}bienhuudung.contains(qi,a,A)={c1,c2,...,cn}bien)) continue;
//neu la bien huu dung thi them vao
if (qi,a,A)={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}bienhuudung.contains(qi,a,A)={c1,c2,...,cn}ls.vephai.get(qi,a,A)={c1,c2,...,cn}1)))&&
(qi,a,A)={c1,c2,...,cn}bienhuudung.contains(qi,a,A)={c1,c2,...,cn}ls.vephai.get(qi,a,A)={c1,c2,...,cn}2)))) {c1,c2,...,cn}
flag=true;
bienhuudung.add(qi,a,A)={c1,c2,...,cn}bien);
}

}
if (qi,a,A)={c1,c2,...,cn}!flag) break;
}
//Loai bo cac luat sinh vo dung
//Cac luat sinh goi la vo dung khi ve ben phai trai
//hoac ve ben phai ton tai bien vo dung
for (qi,a,A)={c1,c2,...,cn}int i=luu; i<P.siz)->(qi,z), e(qi,a,A)={c1,c2,...,cn}); i++) {c1,c2,...,cn}
luatsinh ls=P.get(qi,a,A)={c1,c2,...,cn}i);
//neu ve ben trai la bien vo dung
if (qi,a,A)={c1,c2,...,cn}!bienhuudung.contains(qi,a,A)={c1,c2,...,cn}ls.vetrai)) {c1,c2,...,cn}
P.remove(qi,a,A)={c1,c2,...,cn}i);
i--;
continue;
BTL- Môn Automata

1


NHÓM 13-KHMT1-k2
2010

March 23,

}
//neu ve ben phai la bien vo dung
if (qi,a,A)={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}!bienhuudung.contains(qi,a,A)={c1,c2,...,cn}ls.vephai.get(qi,a,A)={c1,c2,...,cn}1)))
||(qi,a,A)={c1,c2,...,cn}!bienhuudung.contains(qi,a,A)={c1,c2,...,cn}ls.vephai.get(qi,a,A)={c1,c2,...,cn}2)))) {c1,c2,...,cn}
P.remove(qi,a,A)={c1,c2,...,cn}i);
i--;
continue;

}
}
//Gan lai tap bien
V.clear(qi,a,A)={c1,c2,...,cn});
V.addAll(qi,a,A)={c1,c2,...,cn}bienhuudung);
}
}

Chạy thử chương trinh:
(qi,a,A)={c1,c2,...,cn}q0,a,z)->(qi,z), )={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}q0,Az)->(qi,z), )}
(qi,a,A)={c1,c2,...,cn}q0,a,A)={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}q3,)}
(qi,a,A)={c1,c2,...,cn}q3, ,z)->(qi,z), )={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}q0,Az)->(qi,z), )}
(qi,a,A)={c1,c2,...,cn}q0,b,A)={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}q1, )}
(qi,a,A)={c1,c2,...,cn}q1, ,z)->(qi,z), )={c1,c2,...,cn}(qi,a,A)={c1,c2,...,cn}q2, )}
với q0 là trạng thái bắt đầu và q2 là trạng thái kết thúc.

D.Cài đặt và sử dụng:
A.Cài để chạy được các chương trình:
Đầu tiên là cài bộ Java Runtime từ file “jre-6u17-windows-i586.exe”. Sau
khi cài xong có thể chạy trực tiếp các ứng dụng viết trên Java (qi,a,A)={c1,c2,...,cn}Cụ thể là vào
thư mục “chuong trinh” sẽ có các file .jar, các file này chạy giống như các
file .exe).
B.Cài để xem source code:
Cài bộ Netbean 6.1 kèm Java vào từ file “jdk-6u7-nb-6_1-windows-ml.exe”.
Sau khi cài xong ta vào File chọn Open Project sau đó chọn đến đường dẫn
nơi ta đặt Project chương trình để mở và xem source của chương trình. (qi,a,A)={c1,c2,...,cn}Cụ
thể là thư mục “ma nguon”).

E.Tài liệu tham khảo:
BTL- Môn Automata


1


NHÓM 13-KHMT1-k2
2010

March 23,

- Giáo viên hướng dẫn: Trần Hùng Cường.
- Tập “Giáo trình Automat” thầy PGS, TS Phạm Văn Chung (qi,a,A)={c1,c2,...,cn}ĐH Cơng
nghiệp tp.HCM).
- Giáo trình “Lý thuyết Automat và ngơn ngữ hình thức” thầy Hồ Văn Quân
(qi,a,A)={c1,c2,...,cn}ĐH Bách Khoa Tp.HCM) nhà xuất bản ĐH Quốc gia tp.HCM.

* Báo cáo gồm:
-Tập báo cáo
-Đĩa CD chứa bài báo cáo, source code, chương trình và các phần mềm kèm
theo.

BTL- Mơn Automata

1



×