Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 90 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
90
Dung lượng
485,31 KB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC NGUYỄN THỊ HUYÊN TÌMHIỂUCHƯƠNGTRÌNHLOGICƯUTIÊNVÀỨNGDỤNGĐỐIVỚIVIỆCLẬPLUẬN CHUYÊN NGÀNH: KHOA HỌC MÁY TÍNH MÃ SỐ: 60.48.01.01 LUẬN VĂN THẠC SĨ KHOA HỌC ĐỊNH HƯỚNG NGHIÊN CỨU NGƯỜI HƯỚNG DẪN KHOA HỌC PGS.TS TRƯƠNG CÔNG TUẤN Thừa Thiên Huế, 2018 LỜI CAM ĐOAN Tôi xin cam đoan luận văn cơng trình nghiên cứu cá nhân Tất số liệu, kết nghiên cứu luận văn trung thực, chưa người khác cơng bố cơng trình nghiên cứu Học viên Nguyễn Thị Huyên LỜI CẢM ƠN Trước tiên xin gửi lời cảm ơn đặc biệt tới PGS.TS Trương Công Tuấn, người định hướng đề tài tận tình hướng dẫn, bảo, động viên tơi suốt q trình thực luận văn thạc sỹ Tôi xin chân thành biết ơn tất thầy, cô khoa trường Đại học khoa học – Đại học Huế truyền đạt cho kiến thức quý báu vấn đề đại lậptrìnhlogic ngành khoa học máy tính Bản luận văn hoàn thành với động viên thầy hướng dẫn bạn lớp Cao học Khoa học Máy tính năm 2016 – 2018 Tơi xin bày tỏ lòng cảm ơn chân thành đến thầy bạn dành nhiều thời gian để trao đổi giúp đỡ tơi tơi gặp khó khăn suốt thời gian thực luận văn Học viên Nguyễn Thị Huyên MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỤC LỤC DANH MỤC CÁC HÌNH DANH MỤC CÁC CHỮ VIẾT TẮT DANH MỤC CÁC HÌNH DANH MỤC CÁC CHỮ VIẾT TẮT AI Trí tuệ nhân tạo (Artificial Intelligence) ALP Chươngtrìnhlogic đốn (Abductive Logic Program) FOL Ngơn ngữ bậc (First Ordered Language) PLP Chươngtrìnhlogicưutiên (Prioritized Logic Program) PDLP Chươngtrìnhlogicưutiên dạng tuyển (Prioritized Disjunctive Logic Program) SLD Phép hợp giải MỞ ĐẦU Hiện nay, việc nghiên cứu lậptrìnhlogic đạt nhiều thành tựu quan trọng lý thuyết ứngdụng áp dụng rộng rãi để biểu diễn tri thức xử lý thông tin nhiều lĩnh vực Lậptrìnhlogic chủ yếu dựa ý tưởng lậptrình khai báo, chươngtrìnhlogic khơng tạo từ câu lệnh từ hàm mà tạo chủ yếu dựa tập vị từ Tuy nhiên phát sinh số vấn đề việc biểu diễn tri thức lậpluậnchươngtrìnhlogic tốn phức tạp thực tế Đã có nhiều nghiên cứu nhằm mở rộng chươngtrìnhlogic cách bổ sung dạng phủ định cổ điển, phủ định mặc định, phép ưutiên hay phép tuyển Lậpluậnvớiưutiên vấn đề quan tâm biểu diễn tri thức Nhiều kỹ thuật lậpluậnưutiên phát triển lĩnh vực trí tuệ nhân tạo (AI) Trong AI số hệ thống lậpluậnưutiên phát triển phân loại theo thứ tự ưutiênlậpluậnưutiên mặc định Tuy nhiên lậptrìnhlogic thiếu chế rõ ràng để biểu diễn tính ưutiênchươngtrìnhƯutiênlậptrìnhlogic thường thể chươngtrìnhlogic phân tầng, ưutiênchươngtrình phân tầng xác định cú pháp chương trình, ứngdụng chúng giới hạn chươngtrình có cấu trúc phân tầng đơn Trong năm gần đây, việc nghiên cứu chươngtrìnhưutiên nhiều người quan tâm có nhiều cơng trình nghiên cứu có giá trị Có hai tiếp cận đề xuất thời gian gần đây, [9], [10] tác giả nghiên cứu tính chất ưutiên quy tắc chươngtrình đưa nhiều tính chất quan trọng Mặt khác, [2], [7], [8] tác giả nghiên cứu tính ưutiên vị từ chươngtrìnhChươngtrìnhlogicưutiên biểu diễn tri thức tự nhiên chươngtrình phân tầng áp dụng nhiều dạng lậpluận khác lậpluận đoán, lậpluận mặc định,… Việc áp dụngchươngtrìnhlogicưutiên vấn đề lậpluận nghiên cứu [3], [4], [6], [7] Luận văn nghiên cứu “Tìm hiểuchươngtrìnhlogicưutiênứngdụngviệclập luận” Những nội dung nghiên cứu luận văn có ý nghĩa mặt lý thuyết ứngdụng thực tiễn, giải số toán thuộc lĩnh vực khác thực tế Cấu trúc luận văn bao gồm phần mở đầu, ba chương nội dung, phần kết luận tài liệu tham khảo Chươngtrình bày khái niệm sở, cú pháp, cách tiếp cận ngữ nghĩa chươngtrìnhlogic Đây kiến thức sở làm tiền đề để nghiên cứu chươngChươngtìmhiểuchươngtrìnhlogicưutiên - mở rộng chươngtrìnhlogic cách thêm vào ưutiên Các ưutiên thêm vào gồm hai dạng ưutiên quy tắc ưutiên vị từ Chươngtrình bày việc áp dụngchươngtrìnhlogicưutiên để lậpluậnchươngtrìnhlogic đốn; đồng thời thực cài đặt thực thi số toán minh họa chươngtrìnhlogicưutiên hệ thống DLV phần mềm ECLIPSE Phần kết luậntrình bày kết đạt hướng phát triển luận văn Chương TỔNG QUAN VỀ CHƯƠNGTRÌNHLOGICChươngtrình bày khái niệm sở chươngtrìnhlogic Hai lớp chươngtrìnhlogic xem xét chươngtrìnhlogic xác định chươngtrìnhlogic thơng thường Ngữ nghĩa lớp chươngtrìnhvới mối quan hệ chúng trình bày chi tiết Đây kiến thức sở, làm tiền đề cho việc nghiên cứu chương 1.1 MỘT SỐ KHÁI NIỆM CƠ SỞ Chươngtrìnhlogic có tảng ngơn ngữ bậc (FOL), phần nêu số khái niệm sở FOL Định nghĩa 1.1 (Bộ ký tự) Bộ ký tự bao gồm lớp ký hiệu sau: Hằng, thường ký hiệu chữ thường a, b, c, Biến, thường ký hiệu chữ in hoa X, Y, Z, Các ký hiệu hàm, thường ký hiệu f, g, h, Các ký hiệu vị từ, thường ký hiệu p, q, r, Các vị từ: true, false Các ký hiệu kết nối ¬(phủ định), ∨(tuyển), ∧(hội), ←(suy ra) Các ký hiệu lượng từ: ∀(với mọi), ∃(tồn tại) Dấu ngoặc đơn trái (, dấu ngoặc đơn phải ), dấu phẩy, Mỗi ký hiệu hàm, ký hiệu vị từ có kèm theo số tự nhiên xác định để số đối số tham gia với ký hiệu hàm ký hiệu vị từ đó, gọi ngơi chúng Trên sở ký tự cho, người ta đưa định nghĩa hạng thức Hạng thức yếu tố quan trọng công thức logic, xây dựng từ hằng, biến, hàm định nghĩa hình thức sau: Định nghĩa 1.2 (Hạng thức) Gọi A ký tự Hạng thức định nghĩa đệ quy sau: (i) (ii) Mỗi A hạng thức, Mỗi biến A hạng thức, 10 adjust(Literal,ALiteral), negated_literal(ALiteral,NegLiteral), AWff = (NegLiteral); Wff = (N < M) -> AWff = prec(N,M); %true -> AWff = Wff name_predicates( [], true ) name_predicates( [N|Ns], NLs ) :name_predicates(Ns,NLs1), conjoin(NLs1,name(N),NLs) % auxiliary predicates, % many of which are taken from Mark Stickel's pttp concatenate(String1,String2,String) :name(String1,L1), name(String2,L2), append(L1,L2,L), name(String,L), ! conjoin(A,B,C) :A == true -> C = B; B == true -> C = A; A == false -> C = false; B == false -> C = false; A == B -> 76 C = A; (B = (B1,_), A == B1) -> C = B; (A = (_,A2), B == A2) -> C = A; %true -> C = (A , B) disjoin(A,B,C) :A == true -> C = true; B == true -> C = true; A == false -> C = B; B == false -> C = A; A == B -> C = A; %true -> C = (A ; B) negated_functor(F,NegF) :name(F,L), name(neg_,L1), (append(L1,L2,L) -> true; %true -> append(L1,L,L2)), name(NegF,L2) negated_literal(Lit,NegLit) :- 77 Lit = [F1|L1], negated_functor(F1,F2), (var(NegLit) -> NegLit = [F2|L1]; %true -> NegLit = [F2|L2], L1 == L2) negative_functor(F) :name(F,L), name(neg_,L1), append(L1,_,L) negative_literal(Lit) :functor(Lit,F,_), negative_functor(F) apply_to_conjuncts(Wff,P,Wff1) :Wff = (A , B) -> apply_to_conjuncts(A,P,A1), apply_to_conjuncts(B,P,B1), conjoin(A1,B1,Wff1); %true -> T1 = [P,Wff,Wff1], call(T1) flatten_conjunction( Wff, FWff ) :flatten_conjunction(Wff,true,FWff) flatten_conjunction( Wff, AWff, FWff ) :Wff = (Wff1,Wff2) -> flatten_conjunction(Wff2,AWff,FWff1), flatten_conjunction(Wff1,FWff1,FWff); AWff = true -> 78 FWff = Wff; %true -> FWff = (Wff,AWff) % i/o predicates write_clause(A) :nl, write(A), write(.) write_clause(A,_) :- % 2-ary predicate can be used as write_clause(A) % argument of apply_to_conjuncts write_clauses(C) :apply_to_conjuncts(C,write_clause,_) write_clauses(File,Wff) :open(File,write,Stream), write_clauses1(Stream,Wff), close(Stream) write_clauses1(Stream,(A,B)) :write_clauses1(Stream,A), write_clauses1(Stream,B), ! write_clauses1(Stream,A) :write(Stream,A), write(Stream,.), nl(Stream), ! write_program(String,Program) :verbose_flag -> write(' '),nl, write(String),nl, 79 write(' '), apply_to_conjuncts(Program,write_clause,_), nl,write('=='),nl; %true-> true read_clauses(File,Wff) :open(File,read,Stream), read_wff_loop(Stream,Wff), close(Stream) read_wff_loop(Stream,Wff) :read(Stream,Wff1), (Wff1 == end_of_file -> Wff = true; %true -> read_wff_loop(Stream,Wff2), conjoin(Wff1,Wff2,Wff)) % verbose predicates, chatting if verbose_mode is turned on :- dynamic(verbose_flag/0) verbose_mode :- % enable verbose mode retract(verbose_flag), fail verbose_mode :assert(verbose_flag) no_verbose_mode :- % disable verbose mode retract(verbose_flag), fail no_verbose_mode :- verbose_mode % default is verbose mode writeln_verbosely(X) :- 80 verbose_flag -> write(X),nl; %true-> true Mã nguồn file pp.pl prettify(File) :read_clauses(File,Clauses), % get_flag(variable_names, Mode), % set_flag(variable_names, on), apply_to_conjuncts(Clauses,replace_variables,PrettyClauses), % set_flag(variable_names, Mode), concatenate(File,'-pp',PrettyFile), write_clauses(PrettyFile,PrettyClauses) replace_variables( Wff, Wff1 ) :variables(Wff, V), length(V,N), new_variables(N,V1), substitution(Wff,Wff1,V,V1) new_variables(0,[]):- ! new_variables(1,['X']):- ! new_variables(2,['X','Y']):- ! new_variables(3,['X','Y','Z']):- ! new_variables(N,L) :N > 3, new_variablesX(N,L) new_variablesX(1,[V1]) :new_variables(1,[V]), concatenate(V,1,V1) 81 new_variablesX(N,[VN|L1]) :N > 1, new_variables(1,[V]), concatenate(V,N,VN), N1 is N - 1, new_variablesX(N1,L1) substitution(Wff1,Wff2,V1,V2) :var(Wff1) -> exchange(Wff1,Wff2,V1,V2); atom(Wff1) -> Wff2 = Wff1; Wff1 = (A1 :- B1) -> substitution(A1,A2,V1,V2), substitution(B1,B2,V1,V2), Wff2 = (A2 :- B2); Wff1 = (A1 , B1) -> substitution(A1,A2,V1,V2), substitution(B1,B2,V1,V2), Wff2 = (A2 , B2); Wff1 = (A1 ; B1) -> substitution(A1,A2,V1,V2), substitution(B1,B2,V1,V2), Wff2 = (A2 ; B2); Wff1 = [A1|Args1] -> substitution(A1,A2,V1,V2), substitution(Args1,Args2,V1,V2), Wff2 = [A2|Args2]; Wff1 = [F|Args1] -> substitution(Args1,Args2,V1,V2), 82 Wff2 = [F|Args2]; %true -> error(substitution:'unknown term') exchange(_X12,X1,[_X11],[X1]) :_X11==_X12,! exchange(_X12,X1,[_X11|_],[X1|_]) :_X11==_X12,! exchange(X1,X2,[_|R1],[_|R2]) :exchange(X1,X2,R1,R2) % auxiliary predicates, idunion([], L, L) idunion([Head|L1tail], L2, L3) :idmember(Head, L2), !, idunion(L1tail, L2, L3) idunion([Head|L1tail], L2, [Head|L3tail]) :idunion(L1tail, L2, L3tail) idmember(X1, [X2|_] ) :- X1 == X2 idmember(X1, [_,X2|_] ) :- X1 == X2 idmember(X1, [_,_,X2|_]) :- X1 == X2 idmember(X , [_,_,_ |L]) :- idmember(X, L) Mã nguồn file grounder.pl ground_file(FileIn, FileOut) :read_clauses(FileIn,Clauses), ground(Clauses,GClauses), write_program('Grounded Version',GClauses), write_clauses(FileOut,GClauses) atomize_file(FileIn, FileOut) :- 83 read_clauses(FileIn,Clauses), homogenize(Clauses,Clauses0), atomize(Clauses0,AClauses), write_program('Atomized Version',AClauses), write_clauses(FileOut,AClauses) ground(P,GP) :constants(P,Cs), apply_to_conjuncts1(P,Cs,instantiate_rule,GP) constants(Wff,L) :Wff = (A :- B) -> constants(A,L1), constants(B,L2), union(L2,L1,L); Wff = (A , B) -> constants(A,L1), constants(B,L2), union(L2,L1,L); Wff = (A ; B) -> constants(A,L1), constants(B,L2), union(L2,L1,L); Wff = (not A) -> constants(A,L); Wff = (neg A) -> constants(A,L); Wff = [_|Terms] -> constants1(Terms,L); %true -> error(constants:'unknown wff':Wff) 84 constants1(Term,L) :var(Term) -> L = []; Term = [] -> L = []; atomic(Term) -> L = [Term]; Term = [H|R] -> constants1(H,L1), constants1(R,L2), union(L1,L2,L); Term = [_|Args] -> constants1(Args,L); %true -> error(constants1:'unknown term':Term) variables(Wff,L) :atom(Wff) -> L = []; var(Wff) -> L = [Wff]; Wff = [H|R] -> variables(H,L1), variables(R,L2), idunion(L1,L2,L); Wff = [_|Args] -> variables(Args,L); %true -> error(variables:'unknown term/wff':Wff) instantiate_rule(Constants, Rule, Instances) :- 85 variables(Rule, Variables), setof(Rule,instantiate(Variables,Constants),InstanceList), list2conjuncts(InstanceList,Instances) instantiate([],_) instantiate([V|Vs],Cs) :member(V,Cs), instantiate(Vs,Cs) atomize(Expr,Sxpr) :atomic(Expr) -> Expr = Sxpr; Expr = (Expr1 :- Expr2) -> atomize(Expr1,Sxpr1), atomize(Expr2,Sxpr2), Sxpr = (Sxpr1 :- Sxpr2); Expr = (Expr1, Expr2) -> atomize(Expr1,Sxpr1), atomize(Expr2,Sxpr2), Sxpr = (Sxpr1, Sxpr2); Expr = (Expr1; Expr2) -> atomize(Expr1,Sxpr1), atomize(Expr2,Sxpr2), Sxpr = (Sxpr1; Sxpr2); Expr = (not Literal) -> atomize(Literal,StrLiteral), Sxpr = (not StrLiteral); Expr = (neg Literal) -> atomize(Literal,StrLiteral), Sxpr = (neg StrLiteral); Expr = [T] -> 86 term2constant(T,S), Sxpr = [S]; Expr = [T|R] -> term2constant(T,S), atomize(R,U), Sxpr = [S|U]; Expr = [P|Args] -> atomize(Args,Strgs), Sxpr = [P|Strgs]; %true -> error(atomize(Expr,Sxpr)) term2constant(Term,Constant) :term_string(Term,String), string_list(String,List), moulinette(List,List1), string_list(String1,List1), term_string(Constant,String1) moulinette([],[]) moulinette([X],[]) :member(X,[41,32]), ! moulinette([X|R1],[95|R2]) :member(X,[40,41,44]), !, moulinette(R1,R2) moulinette([X|R1],R2) :member(X,[32]), !, moulinette(R1,R2) 87 moulinette([Z|R1],[Z|R2]) :moulinette(R1,R2) % auxiliary procedures apply_to_conjuncts1(Wff,Arg,P,Wff1) :Wff = (A , B) -> apply_to_conjuncts1(A,Arg,P,A1), apply_to_conjuncts1(B,Arg,P,B1), conjoin(A1,B1,Wff1); %true -> T1 = [P,Arg,Wff,Wff1], call(T1) list2conjuncts([],true) list2conjuncts([X|L],C) :list2conjuncts(L,C1), conjoin(X,C1,C) Mã nguồn file dlv.pl % the compilation predicates for dlv lp2dlv(Name) :lp2pl(Name), pl2dlv(Name) vlp2dlv(Name) :vlp2pl(Name), pl2dlv(Name) pl2dlv(Name) :concatenate(Name,'.pl',FilePL), concatenate(Name,'.dlv',FileDLV), read_clauses(FilePL,Clauses), apply_to_conjuncts(Clauses, idb_rule, 88 IDBClauses ), apply_to_conjuncts(IDBClauses,replace_variables,PrettyClauses), conjoin( (true, (:- false)) ,PrettyClauses,ClausesDLV), write_program('DLV Program',ClausesDLV), write_clauses(FileDLV,ClausesDLV) % calling dlv from within prolog dlv(Name) :dlv(Name,'') dlv(Name,nice) :concatenate(Name,'.pl',File), read_clauses(File,Program), dlv_options(Program,Options), dlv(Name,Options) dlv(Name,Options) :concatenate(Name,'.dlv',FileDLV), concatenate('dlv ',Options,CMD0), concatenate(CMD0,' ',CMD), concatenate(CMD,FileDLV,CALL), write('Calling ':CALL),nl,write(' '), system(CALL) dlv_options(Program, Options) :predicates(Program, Preds), dlv_options1(Preds, Options) dlv_options1([[P,N]|Preds],Options) :(builtin(P,N) ; P=name ; P=sname ; P=prec ; P=neg_prec ; P=in ; P=neg_in ), 89 !, dlv_options1(Preds,Options) dlv_options1([[P,_]|Preds],Options) :name(P,L), append(_,[49],L), !, dlv_options1(Preds,Options) % dlv_options1([[P,_]|Preds],Options) :% negative_functor(P), % !, % dlv_options1(Preds,Options) dlv_options1([[P,_]|Preds],Options) :% atom_string(P,PS), concatenate(' -filter=',P,Option), dlv_options1(Preds,Options1), concatenate(Options1,Option,Options) dlv_options1([],'') % This is to make dlv happy idb_rule( (Head :- Body) , (Head :- Body) ) idb_rule( name(X) , name(X) % idb_rule( in(X,Y) , in(X,Y) idb_rule( Fact ) ) , (Fact :- true) ) :- Fact \= ( _ :- _ ), writeln_verbosely('IDBing (for dlv) ':Fact) 90 ... ứng với chương trình logic ưu tiên chương trình logic ưu tiên dạng tuyển 2.1 CHƯƠNG TRÌNH LOGIC ƯU TIÊN 2.1.1 Cú pháp Phần trình bày chương trình logic ưu tiên Ngơn ngữ chương trình logic ưu tiên. .. ưu tiên lập luận ưu tiên mặc định Tuy nhiên lập trình logic thiếu chế rõ ràng để biểu diễn tính ưu tiên chương trình Ưu tiên lập trình logic thường thể chương trình logic phân tầng, ưu tiên chương. .. nghĩa chương trình logic Đây kiến thức sở làm tiền đề để nghiên cứu chương Chương tìm hiểu chương trình logic ưu tiên - mở rộng chương trình logic cách thêm vào ưu tiên Các ưu tiên thêm vào gồm