Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 117 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
117
Dung lượng
611,77 KB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH VÕ DUY TRÍ MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH CHO NGÔN NGỮ VISUAL PROLOG CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN MÃ SỐ NGÀNH: 01_02_10 LUẬN VĂN THẠC SĨ TP.HCM – 04/2003 CÔNG TRÌNH ĐƯC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HỒ CHÍ MINH Người hướng dẫn khoa học: TS DƯƠNG TUẤN ANH Người chấm nhận xét 1: PGS.TS PHAN THỊ TƯƠI Người chấm nhận xét 2: TS NGUYỄN XUÂN DŨNG BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC QUỐC GIA CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc Lập – Tự Do – Hạnh Phúc WX NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên: Võ Duy Trí Ngày sinh: 19/10/1970 Chuyên ngành: Công Nghệ Thông Tin Khoá (năm trúng tuyển): 1999 Giới tính: Nam I TÊN ĐỀ TÀI: MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH CHO NGÔN NGỮ VISUAL PROLOG II NHIỆM VỤ VÀ NỘI DUNG: • Nghiên cứu thực mở rộng phương tiện siêu lập trình cho ngôn ngữ Visual Prolog • Hiện thực hóa lập trình hướng đối tượng, dò bước chương trình hệ chuyên gia phương tiện siêu lập trình ngôn ngữ Visual Prolog • Tạo công cụ nhập chương trình nguồn xuất kết trung gian III NGÀY GIAO NHIỆM VỤ: IV NGÀY HOÀN THÀNH NHIỆM VỤ: 22/04/2003 V TS DƯƠNG TUẤN ANH HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: VI HỌ VÀ TÊN CÁN BỘ NHẬN XÉT 1: PGS.TS PHAN THỊ TƯƠI VII HỌ VÀ TÊN CÁN BỘ NHẬN XÉT 2: TS NGUYỄN XUÂN DŨNG CÁN BỘ HƯỚNG DẪN TS Dương Tuấn Anh CÁN BỘ PHẢN BIỆN CÁN BỘ PHẢN BIỆN PGS.TS Phan Thị Tươi TS Nguyễn Xuân Dũng Nội dung đề cương Luận văn thạc só thông qua Hội Đồng Chuyên Ngành PHÒNG ĐÀO TẠO Ngày tháng năm 2003 SAU ĐẠI HỌC CHỦ NHIỆM NGÀNH TS Dương Tuấn Anh LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog LỜI CẢM ƠN Em xin chân thành cám ơn thầy Dương Tuấn Anh tận tình hướng dẫn, định hướng phát triển cho luận văn Cảm ơn thầy giành nhiều thời gian công sức để góp ý, chỉnh sửa báo cáo luận văn Xin cảm ơn tất thầy cô giảng dạy, truyền thụ kiến thức quý báu cho em suốt trình học cao học Xin cảm ơn thầy, cô phản biện thầy hội đồng chấm luận văn giành thời gian quý báu để đọc chân thành góp ý cho luận văn Xin cảm ơn bạn bè lớp động viên hỗ trợ trình học thực luận văn LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog TÓM TẮT Luận văn nghiên cứu mở rộng phương tiện siêu lập trình (meta programming) cho ngôn ngữ Visual Prolog Phương tiện vị từ siêu logic mà ngôn ngữ Visual Prolog chưa trang bị sẵn Ứng dụng phương tiện siêu lập trình, luận văn trình bày ba ứng dụng minh họa lập trình hướng đối tượng, dò bước chương trình hệ chuyên gia Siêu lập trình kỹ thuật lập trình tạo khả thao tác cấu trúc chương trình Siêu lập trình cung cấp phương tiện thay đổi điều khiển chương trình Phương tiện siêu lập trình ứng dụng để: tách chương trình ứng dụng Prolog khỏi liệu, chuyển dạng chương trình nguồn, điều khiển hoạt động chương trình, …vv lónh vực như: máy học, hệ chuyên gia, lập trình hướng dẫn mẫu, lập trình logic có ràng buộc,… Ngoài phương tiện giúp thử nhanh ý tưởng nhằm mục đích tiết kiệm thời gian chi phí Ngôn ngữ Prolog sử dụng cấu trúc liệu điều khiển chương trình giống liệu, nên Prolog thích hợp để viết siêu chương trình Gần ngôn ngữ Visual Prolog có nhiều cải tiến tốc độ thực thi tiết kiệm nhớ nhằm tăng tính hữu hiệu chương trình đưa vào phương tiện thuận lợi tạo giao diện trực quan Siêu lập trình cần thiết nhiều lónh vực lập trình khác nhau, lý ưu tiên cho tính hữu hiệu ngôn ngữ mà nhà sản xuất Visual Prolog không đưa vào ngôn ngữ vị từ thư viện hỗ trợ siêu lập trình Luận văn nghiên cứu cấu trúc ngữ pháp, chế suy diễn, đối sánh, hồi qui, hợp nhất, cấu trúc sở liệu đệ qui, biến môi trường Visual Prolog để xây dựng vị từ thư viện tạo phương tiện siêu lập trình cho ngôn ngữ Thư viện vị từ giúp cho người lập trình ngôn ngữ Prolog rút ngắn nhiều thời gian công sức tạo siêu chương trình Các chức thư viện là: nhận chương trình nguồn, kiễm tra cú pháp, lưu trữ vị từ thành dạng toán hạng thực thi mục tiêu LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog ABSTRACT The thesis aims at extending meta- programming facilities in Visual Prolog language This extension consists of adding built-in metalogical predicates to Visual Prolog Then object-oriented-programming, tracing program and an expert system for university entrance examination are developed as the illustrative applications of this meta-programming extension Meta-programming is a programming technique that can operate on program structures, and provide a means to change the program control This capability is applicable in separating Prolog application programs from their data, in changing the forms of source programs, in controlling the program execution, etc Metaprogramming is very useful in many areas such as, machine learning, expert system, pattern-directed programming, constraint logic programming, and so on Besides, it also helps to test quickly new ideas through prototyping to save time and cost Since Prolog utilizes the data structures to process source program as data, Prolog suits to write meta-programs Recently, there have been several advances in Visual Prolog system in term of improving time and space efficiency as well as providing a Windows programming environment Although meta-programming facilities were already available in many Prolog versions,Visual Prolog did not include any built-in meta-logical predicates to support meta-programming due to the priority it put on the efficiency of the compiler This thesis investigates the syntactic structure, matching mechanism, backtracking, recursive database structure, usage of environment variables in Visual Prolog in order to define the popular built-in metalogical predicates to support metaprogramming in this logic programming language LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog MỤC LỤC CHƯƠNG I GIỚI THIỆU VẤN ĐỀ NGHIÊN CỨU CỦA LUẬN VĂN I.1 GIỚI THIỆU NGÔN NGỮ PROLOG I.2 SIÊU LẬP TRÌNH VÀ NHU CẦU THỰC TẾ I.2.1.Siêu lập trình I.2.2.Cải tiến Visual Prolog lý siêu lập trình không định nghóa sẵn Visual Prolog I.1.1.Nhu cầu thực tế Trang 1 2 I.3 MỤC ĐÍCH NGHIÊN CỨU CỦA LUẬN VĂN CHƯƠNG II SIÊU THÔNG DỊCH VÀ CÁC ỨNG DỤNG KỸ THUẬT SIÊU LẬP TRÌNH II.1 LỊCH SỬ PHÁT TRIỂN CỦA SIÊU LẬP TRÌNH II.2 CÁC VỊ TỪ SIÊU LOGIC 8 10 I.1.2.Nhóm so sánh toán hạng II.2.2 Nhóm kiểm tra toán hạng II.2.3 Nhóm tích hợp phân rã toán hạng II.3 CẤU TRÚC CỦA TRÌNH SIÊU THÔNG DỊCH II.3.1 Cấu trúc II.3.2 Một chương trình siêu lập trình đơn giản II.4 CÁC ỨNG DỤNG CỦA KỸ THUẬT SIÊU LẬP TRÌNH II.4.1 Dò bước chương trình siêu lập trình II.4.2 Hệ chuyên gia II.4.3 Ứng dụng siêu lập trình vào lập trình hướng đối tượng Prolog II.4.4 Lập trình logic có ràng buộc CHƯƠNG III HIỆN THỰC MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH CHO NGÔN NGỮ VISUAL PROLOG III.1 THÀNH PHẦN CỦA SIÊU LẬP TRÌNH III.1.1 III.1.2 III.1.3 III.1.4 Toán hạng Toán hạng tónh Toán hạng động Biến môi trường III.2 QUÁ TRÌNH HP NHẤT III.2.1 Hợp toán hạng tónh toán hạng động III.2.2 Hợp phần thân mệnh đề III.2.3 Thực thi toán hạng vị từ call 10 11 12 15 15 17 20 20 23 27 30 35 36 36 37 40 42 43 45 50 53 LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog III.2.4 Mở rộng phương tiện siêu lập trình: = , functor, arg, clause, name III.2.5 Quá trình thực thi mục tiêu CHƯƠNG IV CÁC ỨNG DỤNG MINH HỌA CỦA SIÊU LẬP TRÌNH IV.1 CÁC ỨNG DỤNG MINH HỌA IV.1.1 Ứng dụng siêu lập trình vào lập trình hướng đối tượng Prolog IV.1.2 Chương trình dò bước (trace) IV.1.3 Hệ chuyên gia tư vấn việc chọn trường đại học IV.2 GIỚI THIỆU CHƯƠNG TRÌNH MINH HỌA IV.2.1 IV.2.2 IV.2.3 IV.2.4 IV.2.5 Giao diện Các chức Thông báo lỗi Minh họa hệ chuyên gia Tổ chức chương trình CHƯƠNG V KẾT LUẬN 57 59 61 61 61 65 69 74 74 76 80 81 83 85 V.1 Kết luận đánh giá V.2 Hướng mở rộng 85 86 THƯ MỤC THAM KHẢO 87 PHỤ LỤC A PHÂN TÍCH TỪ VỰNG VÀ PHÂN TÍCH CÚ PHÁP BẰNG NGÔN NGỮ PROLOG 1 Phân tích từ vựng Phân tích cú pháp Nhận, kiểm tra gọi thực thi mục tiêu Phát biểu vị từ call() PHỤ LỤC B SƠ LƯC LẬP TRÌNH VISUAL PROLOG 5.2 Môi trường phát triển Lập trình giao diện PHỤ LỤC C CÁCH SỬ DỤNG CÁC VỊ TỪ PHƯƠNG TIỆN SIÊU LẬP TRÌNH BẢNG THUẬT NGỮ VIỆT – ANH 10 12 12 13 17 LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog DANH MỤC CÁC HÌNH VẼ [1] Hình 2.1: Siêu thông dịch với liệu tách riêng khỏi chương trình [2] Hình 2.2: Sơ đồ siêu thông dịch [3] Hình 2.3: Sơ đồ chuỗi luật trả lời cho câu hỏi “tại sao” [4] Hình 3.1: Hệ phân cấp vị từ unify_term [5] Hình 3.2: Hệ phân cấp vị từ unify_body [6] Hình 4.1: Tổ chức giao diện [7] Hình 4.2: Chương trình thực thi tìm kiếm mục tiêu [8] Hình 4.3: Chương trình thực thi tìm kiếm mục tiêu có dò bước [9] Hình 4.4: Tắt/ mở dò bước chương trình [10] Hình 4.5: Chương trình nhận mệnh đề thực thi [11] Hình 4.6: Chương trình nhập chương trình nguồn báo lỗi [12] Hình 4.7: Chương trình nhập thông tin bổ sung từ người sử dụng [13] Hình 4.8: Chương trình xuất chứng minh Trang 16 24 47 53 69 75 76 77 78 79 81 82 LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog DANH MỤC CÁC BẢNG [1] [2] [3] [4] [5] Bảng 2.1: Kết vị từ so sánh toán hạng == Bảng 2.2: Kết kiểm tra toán hạng vị từ var(Term) Bảng 3.1: Các dạng lưu trữ toán hạng tónh Bảng 3.2: tương ứng toán hạng tónh toán hạng động Bảng 4.1:Nội dung phân đoạn chương trình Trang 11 37 40 83 LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog digit digit 16 0 int ( LONG) 17 other digit 18 digit " " digit 19 other 20 real (REAL) symbol 0 symbol """ 22 other 23 atom (SYMB) other """ 24 25 str (STR) other 0 " '" "A Z" "_ " 26 28 30 " '" other delim 27 29 atom (ATOM) var ( NAME) "_","0 9","a z","A Z" delim 31 var (_NAME) 0 other 32 other delim other 34 error 33 atom (STR) PL LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog Phân tích cú pháp Chương trình ứng dụng phương pháp phân tích cú pháp đoán nhận trước để phân tích cú pháp chương trình nguồn nhập vào Một toán hạng phân tích thành ba bước: • Toán hạng • Toán hạng có độ ưu tiên • Toán hạng có độ ưu tiên thấp clauses cons_term(TOKL,TOKL1,TERM):s_basisterm(1301,y,TOKL,TOKL2,TERM1), s_higherterm(1201,y,TOKL2,TOKL3,TERM1,TERM2), s_lowerterm(TOKL3,TOKL1,TERM2,TERM) Khi phân tích cú pháp toán hạng gồm: • hàm tử theo sau thông số atom(string) • số int(X), -int(X) • ký tự char(X) • chuỗi str(X) • đối tượng tokobj • Toán hạng atom(ID) • Danh sách bao lbrack_rbrack,lpar_rpar Mỗi toán hạng phân tích dựa theo token đoán nhận trước tạo thành toán hạng tương ứng Để nhận thêm loại toán hạng cần định nghóa mệnh đề tương ứng có token đoán nhận trước, hành vi theo sau, độ ưu tiên toán hạng cách xây dựng toán hạng Việc mở rộng phân tích cú pháp cho toán hạng đơn giản nhờ vào ưu điểm lợi xử lý ký tự chế tự động hồi qui ngôn ngữ Prolog Prolog tự động duyệt qua tất mệnh đề để tìm toán hạng cần phân tích, phát không thích hợp tự động hồi qui tìm giải pháp khác clauses s_basisterm(_,_,[token(atom("-“),_),token(int(X),_)|TOKL], TOKL,int(I)):-!,I = -X s_basisterm(1301,y,[token(tokobj,_),token(lpar,_)|TOKL1], TOKL4,cmp("object",[NAME,FUN])):- !, NEWPRIOR=1201, s_basisterm(NEWPRIOR,y,TOKL1,TOKL2,NAME), s_fun(NEWPRIOR,y,TOKL2,TOKL3,FUN), TOKL3 = [token(rpar,_)|TOKL4] s_basisterm(PRIOR,ASSOC,[token(atom(ID),_)|TOKL1],TOKL2, cmp(FID,[TERM])):- FID=ID,OP=FID, PL LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog prefix_op(NEWPRIOR,XFY,OP),!, ok_rightop(PRIOR,ASSOC,NEWPRIOR), treat_prefix(NEWPRIOR,XFY,TOKL1,TOKL2,TERM) s_basisterm(_,_,[token(var(STRING),_)|TOKL],TOKL, var(STRING)):- ! s_basisterm(_,_,[token(atom(STRING),_)|TOKL1],TOKL0, TERM):-!, s_par(TOKL1,TOKL0,STRING,TERM) s_basisterm(_ ,_,[token(int(X),_)|TOKL],TOKL,int(X)):-! s_basisterm(_ ,_ ,[token(char(X),_)|TOKL],TOKL, char(X)):-! s_basisterm(_ ,_ ,[token(str(X),_)|TOKL],TOKL,str(X)):-! s_basisterm(_ ,_ ,[token(lbrack,_)|TOKL1],TOKL0,TERM):-!, s_list(TOKL1,TOKL0,TERM) s_basisterm(_,_,[token(lpar,_)|TOKL1],TOKL0,TERM):-!, s_priorterm(1201,y,TOKL1,TOKL2,TERM), TOKL2 = [token(rpar,_)|TOKL0] Sau phân tích toán hạng bản, trình phân tích cú pháp tiếp tục tìm kiếm kết hợp trái toán hạng Kết hợp trái toán hạng có độ ưu tiên cao với độ ưu tiên toán hạng vừa phân tích clauses s_higherterm(PRIOR,ASSOC,[token(TOK,_)|TOKL1],TOKL0,TERM, TERM2):is_op(TOK,NEWPRIOR,XFY,OP), ok_rightop(PRIOR,ASSOC,NEWPRIOR),!, treat_sufinfix(NEWPRIOR,XFY,OP,TOKL1,TOKL2,TERM,TERM1), s_higherterm(PRIOR,ASSOC,TOKL2,TOKL0,TERM1,TERM2) s_higherterm(_,_,TOKL,TOKL,TERM,TERM) Các toán hạng có độ ưu tiên cao toán hạng gồm vị từ định nghóa vị từ is_op( ) Vị từ xác định toán hạng độ ưu tiên toán hạng Nếu toán hạng có độ ưu tiên trình phân tích tìm kiếm toán hạng có độ ưu tiên thấp dấu chấm kết thúc mệnh đề, hết token chuỗi token toán hạng có độ ưu tiên cao Thường trình kết thúc có dấu chấm kết thúc mệnh đề hết đệm token Khi trình phân tích cú pháp kết thúc lần xây dựng toán hạng kép mệnh đề ngôn ngữ Prolog clauses s_lowerterm([],[],TERM,TERM):-! s_lowerterm([token(dot,_)|TOKL],TOKL,TERM,TERM):-! s_lowerterm(TOKL2, TOKL0, TERM1, TERM):- PRIOR = 1201, s_higher_something(PRIOR,y,TOKL2,TOKL3,TERM1,TERM2), s_lowerterm(TOKL3,TOKL0,TERM2,TERM),! Để tiện cho trình tham khảo, người viết liệt kê số vị từ phụ trợ trình phân tích cú pháp theo sau: PL LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog predicates s_priorterm(PRIOR,ASSOC,TOKL,TOKL,STERM) s_higher_something(PRIOR,ASSOC,TOKL,TOKL,STERM,STERM) treat_prefix(PRIOR,XFY,TOKL,TOKL,STERM) treat_sufinfix(PRIOR,XFY,OP,TOKL,TOKL,STERM,STERM) s_list(TOKL,TOKL,STERM) s_list_in(TOKL,TOKL,STERM) s_par_in(TOKL,TOKL,STERML) s_par_in1(TOKL,TOKL,STERML) s_par(TOKL,TOKL,STRING,STERM) s_fun(PRIOR,ASSOC,TOKL,TOKL,STERM) is_op(TOK,PRIOR,XFY,OP) ok_rightop(PRIOR,ASSOC,PRIOR) is_prefix(XFY) prefix_op(PRIOR,XFY,OP) clauses s_higher_something(PRIOR,ASSOC,[token(TOK,_ )|TOKL1], TOKL0,TERM0,TERM):is_op(TOK,NEWPRIOR,XFY,OP), ok_rightop(PRIOR,ASSOC,NEWPRIOR), treat_sufinfix(NEWPRIOR,XFY,OP,TOKL1,TOKL2,TERM0,TERM1), s_higherterm(PRIOR,ASSOC,TOKL2,TOKL0,TERM1,TERM) s_fun(PRIOR,y,[token(comma,_ )|TOKL1],TOKL2,FUN):-!, s_basisterm(PRIOR,y,TOKL1,TOKL2,FUN) s_fun(_ ,_ ,TOKL,TOKL,nill) s_list([token(rbrack,_ )|IL],IL,nill):- ! s_list(IL,OL,list(TERM,REST)):s_priorterm(1000,x,IL,OL1,TERM), s_list_in(OL1,OL,REST) s_list_in([token(rbrack,_ )|IL],IL,nill):-! s_list_in([token(comma,_ )|IL],OL,list(TERM,REST)):s_priorterm(1000,x,IL,OL1,TERM), s_list_in(OL1,OL,REST) s_list_in([token(bar,_ )|IL],OL,TERM):s_priorterm(1000,x,IL,OL1,TERM), OL1=[token(rbrack,_ )|OL] s_par([token(lpar,_)|TOKL1],TOKL0,ID,cmp(FID,TERML)):-!, FID=ID, s_par_in(TOKL1,TOKL2,TERML), TOKL2=[token(rpar,_ )|TOKL0] s_par(TOKL,TOKL,STRING,atom(STRING)):-! s_par_in(TOKL1,TOKL0,[TERM|TERML]):s_priorterm(999,y,TOKL1,TOKL2,TERM),!, s_par_in1(TOKL2,TOKL0,TERML) s_par_in(TOKL,TOKL,[]) s_par_in1([token(comma,_ )|TOKL1],TOKL2,TERML):-!, PL LV: Mở rộng phương tiện siêu lập trình ngôn ngữ Visual Prolog s_par_in(TOKL1,TOKL2,TERML) s_par_in1(TOKL,TOKL,[]) treat_prefix(PRIOR,"fx",TOKL1,TOKL2,TERM):s_priorterm(PRIOR,x,TOKL1,TOKL2,TERM) treat_prefix(PRIOR,"fy",TOKL1,TOKL2,TERM):s_priorterm(PRIOR,y,TOKL1,TOKL2,TERM) s_priorterm(PRIOR,ASSOC,TOKL1,TOKL0,TERM):s_basisterm(PRIOR,ASSOC,TOKL1,TOKL2,TERM1), s_higherterm(PRIOR,ASSOC,TOKL2,TOKL0,TERM1,TERM) prefix_op(NEWPRIOR,XFY,FID):op(NEWPRIOR,XFY,FID), is_prefix(XFY),! is_prefix("fx") is_prefix("fy") ok_rightop(PRIOR,_ ,NEWPRIOR):NEWPRIOR Y call("==",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X >= Y call(">