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

Tìm hiểu chương trình logic ưu tiên và ứng dụng đối với việc lập luận

90 202 4

Đ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 90
Dung lượng 485,31 KB

Nội dung

BỘ GIÁO DỤC ĐÀO TẠO ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC NGUYỄN THỊ HUYÊN TÌM HIỂU CHƯƠNG TRÌNH LOGIC ƯU TIÊN ỨNG DỤNG ĐỐI VỚI VIỆC LẬP LUẬ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ập trình logic 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ương trình logic đốn (Abductive Logic Program) FOL Ngơn ngữ bậc (First Ordered Language) PLP Chương trình logic ưu tiên (Prioritized Logic Program) PDLP Chương trình logic ưu tiê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ập trình logic đạt nhiều thành tựu quan trọng lý thuyết ứng dụ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ập trình logic chủ yếu dựa ý tưởng lập trình khai báo, chương trình logic 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ập luận chương trình logic tốn phức tạp thực tế Đã có nhiều nghiên cứu nhằm mở rộng chương trình logic cách bổ sung dạng phủ định cổ điển, phủ định mặc định, phép ưu tiên hay phép tuyển Lập luận với ưu tiên vấn đề quan tâm biểu diễn tri thức Nhiều kỹ thuật lập luận ưu tiên phát triển lĩnh vực trí tuệ nhân tạo (AI) Trong AI số hệ thống lập luận ưu tiên phát triển phân loại theo thứ tự ư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 trình phân tầng xác định cú pháp chương trình, ứng dụng chúng giới hạn chương trình có cấu trúc phân tầng đơn Trong năm gần đây, việc nghiên cứu chương trình ưu tiê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 ưu tiên quy tắc chương trì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 ưu tiên vị từ chương trình Chương trình logic ưu tiên biểu diễn tri thức tự nhiên chương trình phân tầng áp dụng nhiều dạng lập luận khác lập luận đoán, lập luận mặc định,… Việc áp dụng chương trình logic ưu tiên vấn đề lập luận nghiên cứu [3], [4], [6], [7] Luận văn nghiên cứu “Tìm hiểu chương trình logic ưu tiên ứng dụng việc lập luận” Những nội dung nghiên cứu luận văn có ý nghĩa mặt lý thuyết ứng dụ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ương trình bày khái niệm sở, cú pháp, cách tiếp cận 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 hai dạng ưu tiên quy tắc ưu tiên vị từ Chương trình bày việc áp dụng chương trình logic ưu tiên để lập luận chương trình logic đốn; đồng thời thực cài đặt thực thi số toán minh họa chương trình logic ưu tiên hệ thống DLV phần mềm ECLIPSE Phần kết luận trình bày kết đạt hướng phát triển luận văn Chương TỔNG QUAN VỀ CHƯƠNG TRÌNH LOGIC Chương trình bày khái niệm sở chương trình logic Hai lớp chương trình logic xem xét chương trình logic xác định chương trình logic thơng thường Ngữ nghĩa lớp chương trình vớ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ương trình logic 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ớihiệ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

Ngày đăng: 16/10/2018, 08:48

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w