1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận biến đổi NPDA sang văn phạm phi ngữ cảnh CFG trong automata

18 760 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 58,5 KB

Nội dung

I.Lý thuyết: 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... 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.

Trang 1

Báo Cáo Đồ Án Môn Automata

ngữ cảnh

Giáo viên hướng dẫn: Hà Chí Trung

Sinh viên thực hiện: Phùng Chí Hiếu

Lớp: Tin Học 6B

Khoa: Công Nghệ Thông Tin.

Trường: Học Viện Kỹ Thuật Quân Sự

Trang 2

Chuyển từ một NPDA sang một văn

phạm phi ngữ cảnh.

I.Lý thuyết:

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}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)={c1,c2, ,cn} tương đương thỏa mãn 2 điều kiện trên

-Điều kiện 1:

Trang 3

Giả sử một NPDA)={c1,c2, ,cn} 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,a,A)={c1,c2, ,cn}qi,z)-),

(qi,a,A)={c1,c2, ,cn}qj,,z)-)->(qi,a,A)={c1,c2, ,cn}qk,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)={c1,c2, ,cn})->(qi,a,A)={c1,c2, ,cn}qj,B) tức là thay A)={c1,c2, ,cn} trên đỉnh Stack thành B (qi,a,A)={c1,c2, ,cn}số phần tử trong stack không đổi)

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)={c1,c2, ,cn} 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)={c1,c2, ,cn})->(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)={c1,c2, ,cn})->(qi,a,A)={c1,c2, ,cn}qt,BB) //Thay ký tự A)={c1,c2, ,cn} 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)={c1,c2, ,cn})->(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)={c1,c2, ,cn})->(qi,a,A)={c1,c2, ,cn}qj,BCDb) tức là thay thế A)={c1,c2, ,cn} trên đỉnh Stack thành BCDb (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

Trang 4

Sau đó dùng trạng thái qt này để làm bước trung gian để thay thế A)={c1,c2, ,cn} bằng chuỗi BCDbF Các bước thực hiện lần lược như sau:

(qi,a,A)={c1,c2, ,cn}qi,a,A)={c1,c2, ,cn})->(qi,a,A)={c1,c2, ,cn}qt,b) //Chuyển sang trạng thái tạm qt và thay A)={c1,c2, ,cn} bằng Db Đỉnh stack lúc

//này là Db

(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à CDb 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à BCDb

- Như thế với 3 bước trung gian ta đã thực hiện được (qi,a,A)={c1,c2, ,cn}qi,a,A)={c1,c2, ,cn})->(qi,a,A)={c1,c2, ,cn}qj,BCDb) thỏa mãn dk

- Sau khi đã chuyển về NPDA)={c1,c2, ,cn} thảo mãn bổ đề ta sẽ chuyển NPDA)={c1,c2, ,cn} 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}qiA)={c1,c2, ,cn}qj)->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}qiA)={c1,c2, ,cn}qj)->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)-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)={c1,c2, ,cn}

*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}qiA)={c1,c2, ,cn}qj) có dạng: (qi,a,A)={c1,c2, ,cn}qiA)={c1,c2, ,cn}qj)->a

Trang 5

B2: Đối với những luật sinh (qi,a,A)={c1,c2, ,cn}qiA)={c1,c2, ,cn}qj)->a(qi,a,A)={c1,c2, ,cn}qjBql)(qi,a,A)={c1,c2, ,cn}qlCqk) với (qi,a,A)={c1,c2, ,cn}qiA)={c1,c2, ,cn}qj) 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}qiA)={c1,c2, ,cn}qj) 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}qiA)={c1,c2, ,cn}qj)->a(qi,a,A)={c1,c2, ,cn}qjBql)(qi,a,A)={c1,c2, ,cn}qlCqk) mà (qi,a,A)={c1,c2, ,cn}qiA)={c1,c2, ,cn}qj) 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}qiA)={c1,c2, ,cn}qj)

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}qiA)={c1,c2, ,cn}qj) cũng thuộc tập này)

Như thế ta được Văn phạm G tương đương với NPDA)={c1,c2, ,cn} 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.

Q: Số trạng thái tối đa của npda

Xichma: Các ký tự gõ nhập

Gama: Các ký tự chứa trong stack

Delta: Hàm chuyển

V: Văn phạm sinh

T:Tập ký tự kết thúc

S: Luật sinh

Trang 6

P: Tập luật sinh

public class NPDA)={c1,c2, ,cn} {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 A)={c1,c2, ,cn}rrayList<String> delta=new A)={c1,c2, ,cn}rrayList(qi,a,A)={c1,c2, ,cn}); //Ham chuyen

public int qst=0; //Trang thai bat dau

public String z)-="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)={c1,c2, ,cn}(qi,a,A)={c1,c2, ,cn}) {c1,c2, ,cn}}

//Chuyen NPDA ve 1 NPDA thoa dieu kien 1

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

Trang 7

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,a,A)={c1,c2, ,cn}q"+i+",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)-e(qi,a,A)={c1,c2, ,cn});

for (qi,a,A)={c1,c2, ,cn}int i=0; i<dcnt; i++) {c1,c2, ,cn}

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 ;

Trang 8

//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

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

Trang 9

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.charA)={c1,c2, ,cn}t(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.charA)={c1,c2, ,cn}t(qi,a,A)={c1,c2, ,cn}1)+")>>"+tam4+","+dsbien+")"); continue;

}

Trang 10

}

}

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)-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.charA)={c1,c2, ,cn}t(qi,a,A)={c1,c2, ,cn}tam.indexOf(qi,a,A)={c1,c2, ,cn}",")+1));

Trang 11

//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)={c1,c2, ,cn}=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)={c1,c2, ,cn}+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)-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

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

Trang 12

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.charA)={c1,c2, ,cn}t(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)={c1,c2, ,cn}=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)={c1,c2, ,cn}+"q"+k+")";

String vephai_ls[]=new String[3];

vephai_ls[0]=kta;

vephai_ls[1]="(qi,a,A)={c1,c2, ,cn}"+qj+haibien.charA)={c1,c2, ,cn}t(qi,a,A)={c1,c2, ,cn}0)+"q"+l+")";

vephai_ls[2]="(qi,a,A)={c1,c2, ,cn}q"+l+haibien.charA)={c1,c2, ,cn}t(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

Ngày đăng: 27/03/2014, 11:01

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w