NGÔN NGỮ LẬP TRÌNH
Th.s NGUY N VĔN LINH NGƠN NG L P TRÌNH Đ ợc biên so n khuôn khổ dự án ASVIET002CNTT ”Tăng c ờng hiệu đào t o lực tự đào t o sinh viên khoa Công nghệ Thông tin - Đ i h c C n th ” Đ I H C C N TH - 12/2003 Ngơn ngữ lập trình Mục lục CH NG 0: T NG QUAN i 0.1 M C ĐÍCH YÊU C U .i 0.2 Đ I T NG S D NG i 0.3 N I DUNG C T LÕI .i 0.4 KI N TH C TIÊN QUY T ii 0.5 DANH M C TÀI LI U THAM KH O ii CH NG 1: M Đ U 1.1 T NG QUAN 1.2 KHÁI NI M V NGÔN NG L P TRÌNH 1.3 VAI TRỊ C A NGƠN NG L P TRÌNH 1.4 L I ÍCH C A VI C NGHIÊN C U NNLT 1.5 CÁC TIÊU CHU N ÐÁNH GIÁ M T NGÔN NG L P TRÌNH T T 1.6 CÂU H I ÔN T P CH NG 2: KI U D LI U 2.1 T NG QUAN 2.2 Ð I T NG D LI U 2.3 BI N VÀ H NG .10 2.4 KI U D LI U 10 2.5 S KHAI BÁO 13 2.6 KI M TRA KI U VÀ BI N Ð I KI U 14 2.7 CHUY N Ð I KI U 17 2.8 GÁN VÀ KH I T O 17 2.9 CÂU H I ÔN T P 20 CH NG 3: KI U D LI U S C P 22 3.1 T NG QUAN 22 3.2 Ð NH NGHƾA KI U D LI U S C P 22 3.3 S Ð C T CÁC KI U D LI U S C P 22 3.4 CÀI Ð T CÁC KI U D LI U S C P 23 3.5 KI U D LI U S 24 3.6 KI U LI T KÊ 27 3.7 KI U LOGIC 28 3.8 KI U KÝ T 29 3.9 CÂU H I ÔN T P 29 CH NG 4: KI U D LI U CÓ C U TRÚC 30 4.1 T NG QUAN 30 4.2 Ð NH NGHƾA KI U D LI U CÓ C U TRÚC 30 4.3 S Ð C T KI U C U TRÚC D LI U 30 4.4 S CÀI Ð T CÁC C U TRÚC D LI U 32 4.5 VÉCT 34 4.6 M NG NHI U CHI U 36 4.7 M U TIN 39 4.8 M U TIN CÓ C U TRÚC THAY Ð I 41 4.9 CHU I KÝ T : 45 4.10 C U TRÚC D LI U CĨ KÍCH TH C THAY Ð I 47 4.11 CON TR 48 4.12 T P H P 50 4.13 T P TIN 52 4.14 CÂU H I ÔN T P 54 CH NG 5: KI U DO NG I DÙNG Ð NH NGHƾA 58 5.1 T NG QUAN 58 5.2 S PHÁT TRI N C A KHÁI NI M KI U D LI U 58 Ngơn ngữ lập trình 5.3 5.4 5.5 CH 6.1 6.2 6.3 6.4 6.5 6.6 CH 7.1 7.2 7.3 7.4 7.5 7.6 CH 8.1 8.2 8.3 CH 9.1 9.2 9.3 Mục lục TR U T NG HÓA 58 Ð NH NGHƾA KI U 60 CÂU H I ÔN T P 62 NG 6: CH NG TRÌNH CON 63 T NG QUAN 63 Ð NH NGHƾA CH NG TRÌNH CON 63 C CH G I CH NG TRÌNH CON 65 CH NG TRÌNH CON CHUNG 68 TRUY N THAM S CHO CH NG TRÌNH CON 68 CÂU H I ÔN T P 70 NG 7: ÐI U KHI N TU N T 71 T NG QUAN 71 KHÁI NI M ÐI U KHI N TU N T 71 ÐI U KHI N TU N T TRONG BI U TH C 71 ÐI U KHI N TU N T GI A CÁC L NH 75 S NGO I L VÀ X LÝ NGO I L 78 CÂU H I ÔN T P 80 NG 8: L P TRÌNH HÀM 81 T NG QUAN 81 NGƠN NG L P TRÌNH HÀM 81 NGÔN NG LISP 83 NG 9: L P TRÌNH LOGIC 95 T NG QUAN 95 GI I THI U V L P TRÌNH LOGIC 95 NGÔN NG PROLOG 96 Ngơn ngữ lập trình Tổng quan TỔNG QUAN M C ĐÍCH U C U M c đích c a mơn h c Ngơn ng l p trình cung c p cho sinh viên m t kh i l ng ki n th c t ng đ i hồn ch nh v ngun lí c a ngơn ng l p trình Cùng v i mơn h c Tin h c lí thuy t, Ngơn ng l p trình s môn h c tiên quy t đ h c mơn Trình biên d ch Sau h c xong môn h c này, sinh viên c n: - N m đ c khái ni m v đ i t ng d li u ki u d li u Các khía c nh c n nghiên c u đ c t cài đ t m t ki u d li u V n đ ki m tra ki u chuy n đ i ki u c n đ c quan tâm - N m đ c ki u d li u s c p có c u trúc V i m i ki u d li u c n n m đ nh nghƿa, đ c t cách cài đ t ki u d li u - N m đ c khái ni m tr u t ng hoá l p trình th hi n hai khía c nh tr u t ng hoá d li u b ng cách s d ng ki u d li u t đ nh nghƿa tr u t ng hố ch ng trình b ng cách chia ch ng trình thành ch ng trình V n đ truy n tham s cho ch ng trình c n đ c l u tâm - N m đ c khái ni m u n tu n t , nguyên t c u n tu n t bi u th c gi a câu l nh Đ IT NG S D NG Mơn h c ngơn ng l p trình đ chuyên ngành Tin h c c dùng đ gi ng d y cho sinh viên nĕm th N I DUNG C T LÕI Trong khuôn kh 45 ti t, giáo trình đ c c u trúc thành ch ng Ch ng 1: M đ u Ch ng trình bày khái ni m v ngơn ng l p trình, l i ích c a vi c nghiên c u ngơn ng l p trình tiêu chu n đ đánh giá m t ngôn ng l p trình t t Ch ng 2: Ki u d li u Ch ng trình bày khái ni m v đ i t ng d li u ki u d li u; ph ng pháp ki m tra ki u chuy n đ i ki u; Phép gán tr cho bi n s kh i t o bi n Ch c p, s c a ch con, ki ng 3: Ki u d li u s c p Ch ng trình bày khái ni m v ki u d li u s đ c t nguyên t c cài đ t m t ki u d li u s c p nói chung Ph n ch y u ng trình bày m t s ki u d li u s c p ph bi n nh ki u s , ki u mi n u li t kê, ki u kí t ki u logic Ch ng 4: Ki u d li u có c u trúc Ch ng trình bày khái ni m v ki u d li u có c u trúc, s đ c t thu c tính, đ c t phép tốn, đ c bi t phép toán l a ch n m t ph n t ; ph ng pháp l u tr m t c u trúc d li u b nh ph ng pháp l a ch n ph n t N i dung ch y u c a ch ng trình bày c u trúc c th nh m ng, m u tin, chu i ký t , t p h p… Ch ng 5: Ki u d li u t đ nh nghƿa Ch ng trình bày v s tr u t ng hoá, đ nh nghƿa ki u d li u s t ng đ ng c a ki u d li u đ c đ nh nghã i Ngơn ngữ lập trình Tổng quan Ch ng 6: Ch ng trình Ch ng trìn bày v s đ nh nghƿa c ch g i th c hi n ch ng trình con, ph ng pháp truy n tham s cho ch ng trình Ch ng 7: Đi u n tu n t Ch v n đ x lý ngo i l ng trình bày lo i u n tu n t Ch ng 8: L p trình hàm Ch ng trình bày khái ni m, b n ch t c a l p trình hàm gi i thi u m t ngôn ng l p trình hàm n hình LISP Ch ng 9: L p trình logic Ch ng trình bày khái ni m, b n ch t c a l p trình logic gi i thi u m t ngơn ng l p trình hàm n hình PROLOG KI N TH C TIÊN QUY T Đ h c t t môn h c ngôn ng l p trình c n ph i có ki n th c kƿ nĕng l p trình cĕn b n DANH M C TÀI LI U THAM KH O [1] Terrence W Pratt, Marvin V Zelkowitz; Programming Languages: Design and Implementation; Prentice-Hall, 2000 [2] Doris Appleby, Julius J VandeKopple; Programming Languages; McGrawHill; 1997 [3] Ryan Stensifer; The Study of Programming Languages; Prentice Hall, 1995 [4] Maryse CONDILLAC; Prolog fondements et applications; BORDAS, Paris 1986 [5] Website v XLISP http://webmaker.web.cern.ch/WebMaker/examples/xlisp/www/cldoc_1.html [6] Website v Turbo Prolog http://www.csupomona.edu/%7Ejrfisher/www/prolog_tutorial/contents.html ii Chương I: Mở đầu Ngơn ngữ lập trình CHƯƠNG 1: MỞ ĐẦU 1.1 TỔNG QUAN 1.1.1 Mục tiêu Sau h c xong ch ng này, sinh viên c n ph i n m: - Khái ni m phân lo i ngơn ng l p trình - Vai trị c a ngơn ng l p trình cơng ngh ph n m m - L i ích c a vi c nghiên c u ngơn ng l p trình - Các tiêu chu n đ đánh giá ngôn ng l p trình 1.1.2 Nội dung cốt lõi - Khái ni m v ngơn ng l p trình - Vai trị c a ngơn ng l p trình - L i ích c a vi c nghiên c u ngôn ng l p trình - Các tiêu chu n đ đánh giá m t ngơn ng l p trình t t 1.1.3 Kiến thức c c n thiết Ki n th c kƿ nĕng l p trình cĕn b n 1.2 KHÁI NIỆM VỀ NGƠN NGỮ LẬP TRÌNH Nh bi t, máy tính bao g m ph n c ng thi t b n t thơng tin đ c bi u di n d i d ng s nh phân ph n m m bao g m ch ng trình đ c t o b ng cách s d ng ngơn ng l p trình Nh v y ngơn ng l p trình (NNLT) ngơn ng dùng đ vi t ch ng trình cho máy tính Cũng nh ngôn ng thông th ng, NNLT có t v ng, cú pháp ng nghƿa Theo ti n trình l ch s phát tri n, ngơn ng l p trình có th đ c chia làm ba lo i ch y u nh sau: Ngôn ng máy (machine language): Là ch th d i d ng nh phân, can thi p tr c ti p vào m ch n t Ch ng trình đ c vi t b ng ngơn ng máy có th đ c th c hi n không c n qua b c trung gian Tuy nhiên ch ng trình vi t b ng ngơn ng máy d sai sót, c ng k nh khó đ c, khó hi u tồn nh ng s Hợp ng (assembly language): H p ng m t b c ti n v t b c đ a ngôn ng l p trình kh i ngơn ng máy khó hi u Ngôn ng xu t hi n vào nh ng nĕm 1950, đ c thi t k đ máy tính tr nên thân thi n h n v i ng i s d ng H p ng đ a khái ni m bi n (variable), nh mà ta có th gán m t ký hi u cho m t v trí b nh mà không ph i vi t l i đ a ch d i d ng nh phân m i l n s d ng H p ng ch a vài "phép toán gi ", t c ta có th bi u bi n mã phép tốn d i d ng phát bi u (hay g i câu l nh) thay d i d ng nh phân Các câu l nh bao g m hai ph n: ph n mã l nh Chương I: Mở đầu Ngơn ngữ lập trình (vi t t a ti ng Anh) ch phép toán c n th c hi n ph n tên bi n ch đ a ch ch a toán h ng c a phép tốn Ð máy th c hi n đ c m t ch ng trình vi t b ng h p ng ch ng trình ph i đ c d ch sang ngôn ng máy Công c th c hi n vi c d ch đ c g i Assembler Ngôn ng c p cao (High level language): Là ngôn ng đ c t o phát tri n nh m ph n ánh cách th c ng i l p trình nghƿ làm Ngôn ng c p cao r t g n v i ngôn ng ng i (Anh ng ) nh ng xác nh ngơn ng tốn h c Nh ngôn ng c p cao mà lƿnh v c l p trình tr nên ph bi n, r t nhi u ng i có th vi t đ c ch ng trình, nh th mà ph n m m phát tri n nh vũ bão, ph c v nhi u lƿnh v c c a cu c s ng Cùng v i s phát tri n c a th h máy tính, ngơn ng l p trình c p cao đ c phát tri n r t đa d ng phong phú, vi c l p trình cho máy tính th mà có nhi u khuynh h ng khác nhau: l p trình c u trúc, l p trình h ng đ i t ng, l p trình logic, l p trình hàm M t ch ng trình vi t b ng ngôn ng c p cao đ c g i ch ng trình ngu n (source programs) Ð máy tính "hi u" th c hi n đ c l nh ch ng trình ngu n ph i có m t ch ng trình d ch đ d ch ch ng trình ngu n (vi t b ng ngơn ng c p cao) thành ch ng trình đích Trong khn kh tài li u này, thu t ng ngơn ng l p trình dùng đ ch ngơn ng l p trình c p cao 1.3 VAI TRỊ CỦA NGƠN NGỮ LẬP TRÌNH Ð th y rõ vai trị c a ngơn ng l p trình cơng ngh ph n m m xét giai đo n ch y u đ xây d ng m t ph n m m Các giai đo n bao g m: - Xác đ nh: M c tiêu c a giai đ an xác đ nh đ hi u rõ yêu c u c a khách hàng K t qu c a giai đ an mơ hình th gi i th c đ c ph n ánh thông qua m t tài li u đ c t yêu c u - Phân tích: M c tiêu c a giai đo n xác đ nh xác h th ng s làm nh ng theo quan m c a ng i s d ng K t qu c a giai đo n phân tích m t tài li u đ c t ch c nĕng mô t h th ng s có nh ng ch c nĕng - Thi t k : M c tiêu c a giai đ an thi t k xác đ nh xác h th ng s làm vi c nh th K t qu c a giai đ an m t tài li u đ c t thi t k Ðây m t tài li u kỹ thu t mà nh ng ng i th c hi n s cĕn c vào mà t o ph n m m - Cài đ t: Là vi c th c hi n cách gi i quy t v n đ đ c đ xu t b i ng i thi t k b ng m t NNLT K t qu c a giai đ an m t h ch ng trình máy tính - Tích h p ki m th h th ng: Do chuyên viên tin h c th c hi n nh m ghép n i b ph n c a h th ng ki m tra xem h th ng có đ c th c hi n theo thi t k không - Ch p nh n: Do chuyên viên tin h c v i khách hàng ti n hành nh m xác nh n h th ng ch ng trình b o đ m yêu c u c a ng i s d ng - V n hành khai thác: H th ng đ c tri n khai đ s d ng Chương I: Mở đầu Ngơn ngữ lập trình ch trình bày m t mơ hình làm ph n m m, g i mơ hình thác n c (water fall), ngồi cịn có nhi u mơ hình khác Tuy nhiên t t c mơ hình y đ u ph i có giai đo n cài đặt Trong NNLT đóng vai trị m t công cụ giúp ng i th c hi n b c cài đ t Cơng c ngày đ c c i ti n hoàn thi n có th nói m i ti n b tin h c đ u th hi n NNLT NNLT v a công c giúp nhà tin h c gi i quy t v n đ th c t nh ng đ ng th i n i mà nh ng nghiên c u m i nh t c a tin h c đ c đ a vào Lƿnh v c v a mang tính truy n th ng v a mang tính hi n đ i 1.4 LỢI ÍCH CỦA VIỆC NGHIÊN CỨU NNLT Tr c nghiên c u v NNLT, c n th o lu n xem sinh viên tin h c nhà l p trình chuyên nghi p c n ph i n m khái ni m t ng quát v NNLT Vi c nghiên c u t t NNLT s đ t đ c l i ích nh sau: 1.4.1 Cho phép lựa ch n NNLT phù hợp với dự án thực tế Hi n có r t nhi u d án công ngh thông tin ng d ng vào nhi u lƿnh v c khác c a cu c s ng Do tính ch t c a t ng d án mà ph n m m có th đ c cài đ t b ng NNLT khác V i m t v n ki n th c r ng v NNLT, nh ng ng i làm d án có th l a ch n nhanh chóng m t NNLT phù h p v i đ án th c t Chẳng h n có th l a ch n ngơn ng l p trình Java cho d án l p trình truy n thơng, hay h ng l p trình logic cho d án v trí tu nhân t o 1.4.2 S dụng cách có hiệu cơng cụ ngơn ng Các ngơn ng nói chung đ u cung c p nh ng công c đ c bi t đ t o ti n ích cho l p trình viên, nh ng s d ng chúng khơng đ n có th s gây nh ng sai l m l n M t ví d n hình phép đ quy (recursion) - m t cơng c l p trình đ c bi t có hi u l c nhi u ngôn ng Khi s d ng đ quy m t cách đ n có th cài đ t m t gi i thu t đẹp đ có hi u qu Nh ng tr ng h p khác có th gây m t s lãng phí th i gian ch y máy r t l n cho m t gi i thu t đ n gi n Ði u có th tránh đ c n u nh l p trình viên có m t s hi u bi t sâu s c v ngơn ng l p trình cài đ t bên 1.4.3 Làm tăng vốn kinh nghiệm xây dựng ch ng trình N u ng i l p trình có s nghiên c u m t cách r ng rãi nhi u ngôn ng mà m t chúng có cài đ t s n nh ng cơng c có th t thi t l p nh ng cơng c t ng t ph i vi t ch ng trình b i m t ngơn ng mà cơng c nh th ch a đ c cài đ t 1.4.4 T o dễ dàng để h c ngơn ng M c dù có nhi u NNLT khác nh ng chúng đ u có nh ng nguyên t c chung c a NNLT R t nhi u ngơn ng có chung cú pháp (sai khác chút v cách vi t), có chung ki u d li u (sai khác chút v tên g i) Vi c n m v ng nguyên lý c b n c a NNLT s m t u ki n thu n l i l n đ ti p c n m t cách nhanh chóng v i m t ngơn ng l p trình c th m i Th c t cho th y r ng v i nh ng ng i n m v ng NNLT, g p m t ngơn ng l p trình c th m i, h có th v a nghiên c u ngơn ng m i v a áp d ng đ l p trình gi i quy t m t toán theo yêu c u Chương I: Mở đầu Ngơn ngữ lập trình 1.4.5 T o tiền đề để thiết kế ngôn ng Vi c thi t k ngơn ng m i m t địi h i c a khoa h c phát tri n NNLT N u không nghiên c u v NNLT khơng th có ki n th c đ xây d ng m t ngôn ng m i 1.5 CÁC TIÊU CHUẨN ÐÁNH GIÁ MỘT NGƠN NGỮ LẬP TRÌNH TỐT Nh ng y u t sau t o nên m t ngơn ng t t, nh ng tiêu chu n đ ng i l p trình đánh giá ngôn ng t t h n ngôn ng l a ch n m t ngôn ng đ s d ng Ngoài thi t k m t ngơn ng l p trình m i, ta ph i quan tâm đ n tiêu chu n đ có đ c m t ngơn ng t t 1.5.1 Tính dễ đ c Tính d đ c c a m t NNLT s d dàng đ c hi u m t ch ng trình đ ngơn ng Tính d đ c đ c đ c tr ng b i thu c tính sau: c vi t b ng 1.- Sự giản d M t ngôn ng đ c g i có tính gi n d n u ngơn ng có thành ph n c s , t c y u t đ c đ nh nghƿa tr c Các ngôn ng mà có th đ t đ c m t phép tốn b ng nhi u cách khác khơng ph i m t ngôn ng gi n d Chẳng h n ngôn ng C đ tĕng thêm m t đ n v cho bi n count ta có th s d ng nhi u cách nh count = count + 1, count += 1, count++ ho c ++count Các phép toán ch ng (overload) làm cho ngôn ng tr nên ph c t p Chẳng h n tốn t + có th hi u c ng hai s nguyên, c ng hai s th c, h p hai t p h p hay ghép n i hai chu i ký t 2.- C u trúc điều khiển Các l nh có c u trúc cho phép vi t ch ng trình sáng s a, d đ c, d hi u Chúng ta có th nh n th y u ngôn ng thu c th p niên 1960 nh BASIC, FORTRAN thi u c u trúc u n nên ch ng trình ph i s d ng nhi u l nh GOTO, r t khó theo dõi đ hi u ch ng trình Ta so sánh hai đo n ch ng trình in hình 10 s t nhiên đ u tiên đ c vi t b ng ngôn ng BASIC (không có l nh c u trúc FOR) ngơn ng Pascal Vi t b ng BASIC 10 20 30 40 50 60 Vi t b ng Pascal i=1; IF i>10 THEN GOTO 60; PRINT i ; i=i+1; GOTO 20; PRINT “In xong”; FOR i:=1 TO 10 DO Writeln(i); Writeln(‘In xong’); 3.- Kiểu d liệu c u trúc d liệu Xem xét ki u d li u c u trúc d li u c a m t ngôn ng góp ph n đánh giá m t ngơn ng có d đ c hay khơng Chẳng h n ngơn ng khơng có ki u d li u logic ph i s d ng ki u s đ thay th mà ch ng trình tr nên khó đ c Ví d ta hay s d ng bi n found ch ng trình tìm ki m m t ph n t x m t m ng a g m n ph n t N u ngơn ng s d ng có ki u logic ta có th gán cho found giá tr TRUE ho c FALSE đ bi u di n tr ng thái tìm th y ph n t c n tìm hay khơng, ng c l i đ i v i ngơn ng khơng có ki u logic ta ph i dùng ki u s gán cho found giá tr ho c Ta so sánh hai đo n ch ng trình sau đ xem đo n ch ng trình d hi u h n Chương I: Mở đầu Ngôn ngữ lập trình found := 0; i := 1; While (i a ; bi n a lúc đ c gi i phóng nên LISP s thông báo l i error: unbound variable - A Biến cục che biến toàn cục Trong l p trình hàm, ng i ta r t h n ch s d ng bi n, n u th t s c n thi t nên s d ng bi n c c b Tuy nhiên vi c khai báo bi n c c b hàm LET gây khó khĕn cho vi c vi t ch ng trình h n s d ng bi n toàn c c Đ kh c ph c tình tr ng này, ta s k t h p c hai hàm LET SETQ đ s d ng bi n c c b che bi n toàn c c Cách làm nh sau: - Trong ph n gán tr cho bi n c a LET ta t o m t bi n gán cho m t giá tr b t kỳ, chẳng h n s - Trong ph n đ nh tr bi u th c, ta có th s d ng SETQ đ gán tr cho bi n t o trên, bi n s m t bi n c c b ch khơng cịn tồn c c n a - C th có th vi t: (LET ( (var E1)… ) …… (SETQ var E2) …… ) V i cách làm bi n var hàm SETQ s tr thành bi n c c b Ví d : Gi s ta đ nh nghƿa đ c hàm (ptb2 a b c), gi i ph ng trình b c hai ax2+bx+c = Bây gi ta vi t hàm (giai_ptb2) cho phép nh p h s a, b, c t bàn phím g i hàm (ptb2 a b c) đ th c hi n vi c gi i ph ng trình Có hai ph ng pháp đ vi t hàm Ph ng pháp 1: dùng bi n toàn c c a, b, c (defun giai_ptb2 () (progn (print “Ch ng trình gi i ph 92 ng trình b c hai“) Ngơn ngữ lập trình Chương VIII: Lập trình hàm (princ “Nh p h s a: “) (setq a (read)) (princ “Nh p h s b: “) (setq b (read)) (princ “Nh p h s c: “) (setq c (read)) (ptb2 a b c) ) ) Sau th c hi n ch Ph ng trình này, bi n tồn c c a, b c v n ng pháp 2: dùng bi n c c b d, e, f (defun giai_ptb2 () (let ((d 0) (e 0) (f 0)) (print “Ch ng trình gi i ph (princ “Nh p h s a: “) (setq (princ “Nh p h s b: “) (setq (princ “Nh p h s c: “) (setq (ptb2 d e f) ) ) Sau th c hi n ch ng trình b c hai“) d (read)) e (read)) f (read)) ng trình này, bi n c c b d, e f đ c gi i phóng 8.3.7 H ớng d n s dụng LISP S dụng XLISP XLISP m t trình thơng d ch, ch y d i h u hành Windows Ch c n chép t p tin th c thi XLISP.EXE có dung l ng 288Kb vào máy tính c a b n có th th c hi n đ c Đ th c hi n hàm, ch c n gõ tr c ti p hàm vào sau d u ch l nh (>) c a XLISP Trong tr ng h p khơng có d u ch l nh, dùng menu Run/Top level ho c Ctrl-C đ làm xu t hi n d u ch l nh Vi c đ nh nghƿa m t hàm có th gõ tr c ti p vào sau d u ch l nh Tuy nhiên cách làm s khó s a ch a hàm v y ta th ng đ nh nghƿa hàm m t t p tin ch ng trình, sau n p vào cho XLISP đ s d ng Ta có th l u tr l i tình tr ng làm vi c hi n hành vào t p tin WKS b ng cách dùng menu File/Save workspace sau có th khơi ph c l i b ng cách dùng menu File/Restore workspace So n thảo t p tin ch ng trình Do XLISP khơng có cơng c đ so n th o ch đ so n th o t p tin ch ng trình Trong m t t p tin ch ng trình nên ta có th s d ng Notepad ng trình ta có th đ nh nghƿa nhi u hàm L u t p tin ch ng trình có tên theo quy đ nh c a DOS (8.3) v i ph n m r ng LSP đ c p d u nháy kép 93 Ngơn ngữ lập trình Chương VIII: Lập trình hàm N p hàm tự đ nh nghĩa cho XLISP Có hai ph • Ph ng pháp đ n p hàm t đ nh nghƿa cho XLISP: ng pháp 1: Copy dán kh i - Trong Notepad, đánh d u kh i m t hàm t (Edit/Copy ho c Ctrl-C) đ nh nghƿa copy kh i - Trong XLISP, dán kh i t i d u ch l nh (Edit/Paste ho c Ctrl-Ins) - V i ph ng pháp vi t hàm, khơng nên vi t m t dịng l nh dài - N u kh i hàm dán vào khơng có l i tên hàm s xu t hi n ta có th s d ng đ c hàm • Ph - Ph ng pháp r t phù h p v i vi c ki m th t ng hàm ng pháp 2: M t p tin ch ng trình - Trong XLISP, s d ng menu File-Open/Load đ m t p tin ch ng trình ch a hàm đ c vi t l u tr b i Notepad Chúng ta có th s d ng hàm (LOAD ) đ m t p tin ch ng trình - N u vi c m thành cơng có th g i th c hi n b t kỳ hàm có t p tin ch ng trình - N u có m t hàm vi t sai d u ngo c vi c m t p tin s th t b i ta không th dùng b t kỳ hàm t p tin - Ph ng pháp thích h p v i vi c n p nhi u hàm đ m t t p tin ch ng trình đ s d ng c ki m ch ng Một số thông báo lỗi th ờng gặp Unbound function: Hàm khơng có Bad function: Hàm sai Too many arguments: Th a tham s Too few arguments: Thi u tham s Misplaced close paren: Th a d u ngo c đóng/ Thi u d u ngo c m EOF reached beore expression end: Th a d u ngo c m / Thi u d u ngo c đóng - Not a number: Đ i s c a hàm ph i m t s - Bad argument type: Ki u c a tham s sai - 94 Ngơn ngữ lập trình Chương IX: Lập trình logic CHƯƠNG 9: LẬP TRÌNH LOGIC 9.1 TỔNG QUAN 9.1.1 Mục tiêu Sau h c xong ch ng này, sinh viên c n ph i n m: - Khái ni m v l p trình logic - Các nguyên t c l p trình logic - Vi t ch ng trình đ n gi n b ng ngơn ng Prolog 9.1.2 Nội dung cốt lõi - L p trình logic - Cĕn b n v ngơn ng l p trình Prolog 9.1.3 Kiến thức c c n thiết Ki n th c kƿ nĕng l p trình cĕn b n 9.2 GIỚI THIỆU VỀ LẬP TRÌNH LOGIC Trong l p trình logic, ta có th s d ng v t đ đ nh nghƿa khái ni m c a t t c môn khoa h c khác Ví d đ nh nghƿa m t s nguyên t : S nguyên t N m t s nguyên l n h n 1, ch chia h t cho Đ xét xem s N có ph i s nguyên t hay không, ng i ta th ng s d ng d u hi u nh n bi t: S nguyên t m t s nguyên d ng, không chia h t cho m i s nguyên t nh h n s nguyên t nh nh t D u hi u có th mơ t b ng v t nh sau: - m t s nguyên t - N m t s nguyên t n u N>0, M s ngun t đó, M0, M s nguyên t đó, M0, so_nguyen_to(M), M0, so_nguyen_to(M), M X=thuy • Do dep(thuy) sai nên quay lui đ ng nh t khoe(X) v i khoe(lan) => X=lan • Do dep(lan) nên ti p t c ki m tra thong_minh(lan) • Do thong_minh(lan) sai nên quay lui đ đ ng nh t khoe(X) v i khoe(binh) đ có X=binh, sau ki m tra th y dep(binh) thong_minh(binh) đ u nên X=binh m t nghi m 9.3.5 Bộ ký tự, từ khoá Prolog dùng b ký t sau: ch ch s (A – Z, a – z, – 9); toán t (+, -, *, /, ) ký hi u đ c bi t M t s t khoá: a Trace: Khi có t khố đ u ch ng trình, ch hi n t ng b c đ theo dõi; dùng phím F10 đ ti p t c ng trình đ c th c b Fail: Khi ta dùng goal n i, ch ng trình ch cho ta m t k t qu (m c dù có th cịn nh ng k t qu khác), đ nh n v t t c k t qu ch y goal n i, ta dùng tốn t Fail 101 Ngơn ngữ lập trình Chương IX: Lập trình logic c ! hay g i nhát c t, goal ngo i cho ta m i k t qu , mu n nh n ch m t k t qu t goal ngo i, ta dùng ký hi u ! 9.3.6 Các kiểu d liệu Trong prolog có ki u d li u chu n ki u ng i l p trình đ nh nghƿa Kiểu d liệu chuẩn Là ki u d li u prolog đ nh nghƿa s n Prolog cung c p ki u d li u chu n là: char, integer, real, string symbol a Char: Là ki u ký t H ng ký t ph i n m gi a hai d u nháy đ n Ví d : ‘a’, ‘#’ b Integer: Là ki u s nguyên, t p giá tr bao g m s nguyên t -32768 đ n 32767 c Real: Là ki u s th c, t p giá tr bao g m s th c thu c hai đo n: đo n s âm t -10307 đ n -10-307 đo n s d ng t 10-307 đ n 10307 d String: Là ki u chu i ký t H ng chu i ký t ph i n m gi a hai d u nháy kép Ví d : “Turbo prolog 2.0” e Symbol: Là m t ki u s c p, có hình th c gi ng chu i ký t H ng symbol có hai d ng: Dãy ch , s d u g ch d i vi t liên ti p, ký t đ u ph i vi t th ng (chẳng h n: telephone_number); Dãy ký t gi a m t c p hai nháy kép (gi ng nh ch i ký t ) f Một số phép toán kiểu Phép toán số h c Phép toán Ý nghĩa + C ng hai s Kiểu đối số Integer, real - Tr hai s Integer, real * Nhân hai s Integer, real / Chia hai s Integer, real Phép chia l y ph n d Phép chia l y ph n nguyên Integer Integer Mod Div Kiểu kết gi ng ki u đ s gi ng ki u đ s gi ng ki u đ s gi ng ki u đ s Integer Integer Phép toán quan hệ Phép toán Kiểu đối số Ý nghĩa Kết < Nh h n Char, integer, real, string Yes ho c No L nh n Char, integer, real, string Yes ho c No >= L n h n hay b ng Char, integer, real, string Yes ho c No Khác Char, integer, real, string Yes ho c No hay >< Các v từ nh hàm toán h c V từ Ý nghĩa Sin(X) Tan(X) Arctan(X) Exp(X) Ln(X) Log(X) SQRT(X) ROUND(X) Kiểu đối số Tính sin c a X real Tính tang c a X real Tính arctang c a X real X Tính e real Tính logarit c s e c a X real Tính Logarit c s 10 c a real X Tính cĕn b c hai c a X real Cho ta s nguyên s X real đ c làm tròn, d u d u c aX TRUNC(X) Cho ph n nguyên c a s X, d u d u c a X ABS(X) Cho ta tr t đ i c a X Random(X) Cho ta s th c X n m kho ng [0, 1) Random(Y, X) Cho ta s nguyên X n m kho ng [0, Y) Kiểu kết real real real real real real real integer real integer real real real real real integer Toán t NOT(X) : N u X Yes NOT(X) No ng Ví dụ round(2.3)=2 round(2.5)=3 round(-2.5)=-2 round(-2.6)=-3 trunc(2.5)=2 trunc(-2.6)=-2 c l i Các kiểu d liệu ng ời l p trình đ nh nghĩa a Kiểu mẩu tin: Cú pháp: = tên mẩu tin (danh sách kiểu ph n t ) Ví d : Domains ten, tac_gia, nha_xb, dia_chi = string nam, thang, so_luong = integer dien_tich = real nam_xb = nxb(thang, nam) do_vat = sach(tac_gia, ten, nha_xb, nam_xb); xe(ten, so_luong); nha(dia_chi, dien_tich) predicates so_huu(ten,do_vat) clauses so_huu(“Nguyen Van A”, sach(“Do Xuan Loi”, “Cau truc DL”, “Khoa hoc Ky thuat”, nxb(8,1985))) 103 Ngôn ngữ lập trình Chương IX: Lập trình logic so_huu(“Le thi B”, xe(“Dream II”, 2)) so_huu(“Nguyen Huu C”, nha(“3/1 Ly Tu Trong, Can Tho”, 100.5)) b Kiểu danh sách Cú pháp: = * Ví d : Domains intlist = integer* M t danh sách m t dãy ph n t phân cách b i d u ph y đ t c p d u ngo c vng Ví d : [] % Danh sách r ng [1,2,3] % Danh sách g m ba s nguyên 1, C u trúc c a danh sách bao g m hai ph n: Ph n đ u ph n t đ u tiên c a danh sách ph n đuôi m t danh sách c a ph n t l i Danh sách đ c vi t theo d ng [X|Y] X ph n t đ u Y danh sách đuôi Chẳng h n danh sách [1,2,3] đ u s ngun danh sách [2,3] Trong danh sách có th dùng bi n t do, chẳng h n ta có th vi t [_|Y] đ ch m t danh sách có đ u m t ph n t có danh sách Y 9.3.7 Các hàm xu t nh p chuẩn Xu t hình a Write( Arg1, Arg2, … ,Argn) in hình giá tr c a đ i s b Writef( Formatstring, Arg1, Arg2, … ,Argn) in hình giá tr c a đ i s theo đ nh d ng đ c ch đ nh Formastring Trong Formastring m t chu i có th là: ng; đ i s ph i char ho c integer - “%d”: In s th p phân bình th - “%c”: Đ i s m t s integer, in ký t có mã Ascci đ i s đó, chẳng h n writef(“%c”,65) đ c A - “%e”: In s th c d - “%x”: In s Hexa; đ i s ph i char ho c integer - “%s”: In m t chu i ho c m t symbol i d ng lũy th a c a 10 Nh p vào từ bàn phím a Readln(X): Nh p m t chu i ký t vào bi n X b ReadInt(X): Nh p m t s nguyên vào bi n X c ReadReal(X): Nh p m t s th c vào bi n X d ReadChar(X): Nh p vào m t ký t vào bi n X 104 Ngơn ngữ lập trình Chương IX: Lập trình logic 9.3.8 Kỹ thu t đệ quy Đ quy kỹ thu t l p trình đ c s d ng nhi u ngôn ng Trong Turbo Prolog ta s d ng đ quy m t v t đ c đ nh nghƿa nh vào v t Nh nói ch tr ng h p d ng l Prolog, tr ng h p d d ng th hi n b ng m ng l p trình hàm, ch ng trình đ quy ph i có nh t m t i g i đ quy ph i ch a y u t d n đ n tr ng h p d ng Trong ng đ c th hi n b ng m t s ki n, y u t d n đ n tr ng h p t bi n, liên h v i bi n ban đ u b i m t cơng th c Ví d 1: Tính n giai th a Predicates Facto (integer, integer) Clauses Facto(0,1):- ! Facto(N, FactN) :- N > 0, M = N – 1, facto(M, factM), factN = N*factM ví d ta đ nh nghƿa m t v t dùng đ tính giá tr giai th a c a m t s t nhiên, đ i s th nh t s c n tính giai th a đ i s th hai dùng đ nh n giá tr tr v Tr ng h p d ng đ c xác đinh b i s ki n giai th a Đ tính N! ta tính M! v i M= N-1 Y u t d n đ n tr tr b ng N-1 ng h p d ng bi n M có giá Ví d 2: Xác đ nh m t ph n t danh sách symbol domains symbol_list = symbol* predicates element1(integer,symbol_list,symbol) element (integer,symbol_list,symbol) clauses % element1 không suy di n ng c đ c element1(1,[X|_],X) element1(N,[_|L],Y):M=N-1, element1(M,L,Y) % element có th suy di n ng c element(1,[X|_],X) element(N,[_|L],Y):element(M,L,Y), N=M+1 S suy di n thu n chi u cho danh sách v trí, tìm đ c ph n t t i v trí đó, chẳng h n, n u ta đ a vào goal element(2,[a,b,c,d],X) ta đ c X=b S suy di n ng c cho danh sách ph n t , tìm đ c v trí c a ph n t đó, chẳng h n, n u ta đ a vào goal element(N,[a,b,c,d], b) ta đ c N=2 Ví d 3: S p x p m t danh sách s nguyên domains list=integer* predicates 105 Ngôn ngữ lập trình Chương IX: Lập trình logic insert(integer,list,list) sort(list,list) clauses insert(E,[],[E]) insert(E,[A|B],[E,A|B]):insert(E,[A|B],[A|C]):sort([],[]) sort([X|R1],L):- EA,insert(E,B,C) sort(R1,R), insert(X,R,L) 106 ... i ép ki u) ngôn ng th c hi n m t s tr ng h p khơng t ng th? ?ch ki u Ví d Pascal đ i s c a phép toán s h c "+" có l n s th c s nguyên ho c gán m t s nguyên cho m t bi n s th c s nguyên ph i đ c... ch s ) t bàn phím vào m t bi n s ch ng trình có m t s chuy n đ i ch s (chu i ch s ) th? ?nh s Hay ta ghi m t s máy in ho c m t t p tin vĕn b n có m t s chuy n đ i t s th? ?nh ch s (chu i ch s )... Julius J VandeKopple; Programming Languages; McGrawHill; 1997 [3] Ryan Stensifer; The Study of Programming Languages; Prentice Hall, 1995 [4] Maryse CONDILLAC; Prolog fondements et applications;