Tài liệu Lập trình Prolog_chương 4-5 ppt

92 341 3
Tài liệu Lập trình Prolog_chương 4-5 ppt

Đ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

CHặNG 4 Cỏỳu truùc danh saùch Chổồng naỡy trỗnh baỡy khaùi nióỷm vóử danh saùch, mọỹt trong nhổợng cỏỳu truùc õồn giaớn nhỏỳt vaỡ thọng duỷng nhỏỳt, cuỡng vồùi nhổợng chổồng trỗnh tióu bióứu minh hoaỷ caùch vỏỷn duỷng danh saùch trong Prolog. Cỏỳu truùc danh saùch taỷo nón mọỹt mọi trổồỡng lỏỷp trỗnh thuỏỷn tióỷn cuớa ngọn ngổợ Prolog. I. Bióứu dióựn cỏỳu truùc danh saùch Danh saùch laỡ kióứu cỏỳu truùc dổợ lióỷu õổồỹc sổớ duỷng rọỹng raợi trong caùc ngọn ngổợ lỏỷp trỗnh phi sọỳ. Mọỹt danh saùch laỡ mọỹt daợy bỏỳt kyỡ caùc õọỳi tổồỹng. Khaùc vồùi kióứu dổợ lióỷu tỏỷp hồỹp, caùc õọỳi tổồỹng cuớa danh saùch coù thóứ truỡng nhau (xuỏỳt hióỷn nhióửu lỏửn) vaỡ mọựi vở trờ xuỏỳt hióỷn cuớa õọỳi tổồỹng õóửu coù yù nghộa. Danh saùch laỡ caùch dióựn õaỷt ngừn goỹn cuớa kióứu dổợ lióỷu haỷng phổùc hồỹp trong Prolog. Haỡm tổớ cuớa danh saùch laỡ dỏỳu chỏỳm Do vióỷc bióứu dióựn danh saùch bồới haỡm tổớ naỡy coù thóứ taỷo ra nhổợng bióứu thổùc mỏỷp mồỡ, nhỏỳt laỡ khi xổớ lyù caùc danh saùch gọửm nhióửu phỏửn tổớ lọửng nhau, cho nón Prolog quy ổồùc õỷt daợy caùc phỏửn tổớ cuớa danh saùch giổợa caùc cỷp moùc vuọng. Chúng haỷn .(a,.(b,[ ])). Laỡ danh saùch [ a, b ]. Danh saùch caùc phỏửn tổớ anne, tennis, tom, skier (tón ngổồỡi) õổồỹc vióỳt : [ anne, tennis, tom, skier ] chờnh laỡ haỡm tổớ : . ( anne, .( tennis, .( tom, .( skier, [ ] ) ) ) ) Caùch vióỳt daỷng cỷp moùc vuọng chố laỡ xuỏỳt hióỷn bón ngoaỡi cuớa mọỹt danh saùch. Nhổ õaợ thỏỳy ồớ muỷc trổồùc, moỹi õọỳi tổồỹng cỏỳu truùc cuớa Prolog õóửu coù bióứu dióựn cỏy. Danh saùch cuợng khọng nũm ngoaỷi lóỷ, cuợng coù cỏỳu truùc cỏy. 95 96 Láûp trçnh lägich trong Prolog Lm cạch no âãø biãøu diãùn danh sạch båíi mäüt âäúi tỉåüng Prolog chøn ? Cọ hai kh nàng xy ra l danh sạch cọ thãø räùng hồûc khäng. Nãúu danh sạch räùng, nọ âỉåüc viãút dỉåïi dảng mäüt ngun tỉí : [ ] Nãúu danh sạch khạc räùng, cọ thãø xem nọ âỉåüc cáúu trục tỉì hai thnh pháưn (pair syntax) : 1. Thnh pháưn thỉï nháút, âỉåüc gi l âáưu (head) ca danh sạch. 2. Thnh pháưn thỉï hai, pháưn cn lải ca danh sạch (trỉì ra pháưn âáưu), âỉåüc gi l âi (tail) ca danh sạch, cng l mäüt danh sạch. Trong vê dủ trãn thç âáưu l anne, cn âi l danh sạch : [ tennis, tom, skier ] Nọi chung, âáưu ca danh sạch cọ thãø l mäüt âäúi tỉåüng báút k ca Prolog, cọ thãø l cáy hồûc biãún, nhỉng âi phi l mäüt danh sạch. Hçnh I.1. Biãøu diãùn dảng cáy ca danh sạch mä t cáúu trục cáy ca danh sạch â cho : . anne . âi cng l danh sạch âáưu tennis . tom . skier [ ] Hçnh I.1. Biãøu diãùn dảng cáy ca danh sạch Vç âi tail l mäüt danh sạch, nãn tail cọ thãø räùng, hồûc lải cọ thãø âỉåüc tảo thnh tỉì mäüt âáưu head v mäüt âi tail khạc. Chụ ràòng danh sạch räùng xút hiãûn trong säú cạc hảng, vç ràòng pháưn tỉí cúi cng cọ thãø xem l danh sạch chè gäưm mäüt pháưn tỉí duy nháút cọ pháưn âi l mäüt danh sạch räùng: [ skier ] Vê dủ trãn âáy minh hoả ngun l cáúu trục dỉỵ liãûu täøng quạt trong Prolog ạp dủng cho cạc danh sạch cọ âäü di tu . ?- L1 = [ a, b, c ]. ?- L2 = [ a, a, a ]. Cỏỳu truùc danh saùch 97 L1 = [ a, b, c ] L2 = [ a, a, a ] ?- Leisure1 = [ tennis, music, [ ] ]. ?- Leisure2 = [ sky, eating ], ?- L = [ anne, Leisure1, tom, Leisure2 ]. Leisure1 = [ tennis, music ] Leisure2 = [ sky, eating ] L = [ anne, [ tennis, music ], tom, [ sky, eating ] ] Nhổ vỏỷy, caùc phỏửn tổớ cuớa mọỹt danh saùch coù thóứ laỡ caùc õọỳi tổồỹng coù kióứu bỏỳt kyỡ, kóứ caớ kióứu danh saùch. Thọng thổồỡng, ngổồỡi ta xổớ lyù õuọi cuớa danh saùch nhổ laỡ mọỹt danh saùch. Chúng haỷn, danh saùch : L = [ a, b, c ] coù thóứ vióỳt : tail = [ b, c ] vaỡ L = .(a, tail) óứ bióứu dióựn mọỹt danh saùch õổồỹc taỷo thaỡnh tổỡ õỏửu (Head) vaỡ õuọi (Tail), Prolog sổớ duỷng kyù hióỷu | (split) õóứ phỏn caùch phỏửn õỏửu vaỡ phỏửn õuọi nhổ sau : L = [ a | Tail ] Kyù hióỷu | õổồỹc duỡng mọỹt caùch rỏỳt tọứng quaùt bũng caùch vióỳt mọỹt sọỳ phỏửn tổớ tuyỡ yù cuớa danh saùch trổồùc | rọửi danh saùch caùc phỏửn tổớ coỡn laỷi. Danh saùch bỏy giồỡ õổồỹc vióỳt laỷi nhổ sau : [ a, b, c ] = [ a | [ b, c ] ] = [ a, b | [ c ] ] = [ a, b, c | [ ] ] Sau õỏy laỡ mọỹt sọỳ caùch vióỳt danh saùch : Kióứu hai thaỡnh phỏửn Kióứu lióỷt kó phỏửn tổớ [ ] [ ] [ a | [ ] ] [ a ] [ a | b | [ ] ] [ a, b ] [ a | X ] [ a | X ] [ a | b | X ] [ a, b | X ] [ X 1 | [ [ X n | [ ] ] ] ] [ X 1 , , X n ] Ta coù thóứ õởnh nghộa danh saùchtheo kióứu õóỷ quy nhổ sau : List ồ [ ] List ồ [ Element | List ] 98 Láûp trçnh lägich trong Prolog II. Mäüt säú vë tỉì xỉí l danh sạch ca Prolog SWI-Prolog cọ sàơn mäüt säú vë tỉì xỉí l danh sạch nhỉ sau : Vë tỉì nghéa append(List1, List2, List3) Ghẹp hai danh sạch List1 v List2 thnh List3. member(Elem, List) Kiãøm tra Elem cọ l pháưn tỉí ca danh sạch List hay khäng, nghéa l Elem håüp nháút âỉåüc våïi mäüt trong cạc pháưn tỉí ca List. nextto(X, Y, List) Kiãøm tra nãúu pháưn tỉí Y cọ âỉïng ngay sau pháưn tỉí X trong danh sạch List hay khäng. delete(List1, Elem, List2) Xoạ khi danh sạch List1 nhỉỵng pháưn tỉí håüp nháút âỉåüc våïi Elem âãø tr vãư kãút qu List2. select(Elem, List, Rest) Láúy pháưn tỉí Elem ra khi danh sạch List âãø tr vãư nhỉỵng pháưn tỉí cn lải trong Rest, cọ thãø dng âãø chn mäüt pháưn tỉí vo danh sạch. nth0(Index, List, Elem) Kiãøm tra pháưn tỉí thỉï Index (tênh tỉì 0) ca danh sạch List cọ phi l Elem hay khäng. nth1(Index, List, Elem) Kiãøm tra pháưn tỉí thỉï Index (tênh tỉì 1) ca danh sạch List cọ phi l Elem hay khäng. last(List, Elem) Kiãøm tra pháưn tỉí âỉïng cúi cng trong danh sạch List cọ phi l Elem hay khäng. reverse(List1, List2) Nghëch âo thỉï tỉû cạc pháưn tỉí ca danh sạch List1 âãø tr vãư kãút qu List2. permutation(List1, List2) Hoạn vë danh sạch List1 thnh danh sạch List2. flatten(List1, List2) Chuøn danh sạch List1 chỉïa cạc pháưn tỉí báút k thnh danh sạch phàóng List2. Vê dủ : flatten([a, [b, [c, d], e]], X). cho kãút qu X = [a, b, c, d, e]. sumlist(List, Sum) Tênh täøng cạc pháưn tỉí ca danh sạch List chỉïa ton säú âãø tr vãư kãút qu Sum. numlist(Low, High, List) Nãúu Low v High l cạc säú sao cho Low =< High, thç tr vãư danh sạch List = [Low, Low+1, , High]. Chụ mäüt säú vë tỉì xỉí l danh sạch cọ thãø sỉí dủng cho mi rng büc, kãø c khi cạc tham âäúi âãưu l biãún. Trong Prolog, táûp håüp âỉåüc biãøu diãùn båíi danh sạch, tuy nhiãn, thỉï tỉû cạc pháưn tỉí trong mäüt táûp håüp l khäng quan trng, cạc âäúi tỉåüng d xút hiãûn Cáúu trục danh sạch 99 nhiãưu láưn chè âỉåüc xem l mäüt pháưn tỉí ca táûp håüp. Cạc phẹp toạn vãư danh sạch cọ thãø ạp dủng cho cạc táûp håüp. Âọ l : • Kiãøm tra mäüt pháưn tỉí cọ màût trong mäüt danh sạch tỉång tỉû viãûc kiãøm tra mäüt pháưn tỉí cọ thüc vãư mäüt táûp håüp khäng ? • Ghẹp hai danh sạch âãø nháûn âỉåüc mäüt danh sạch thỉï ba tỉång ỉïng våïi phẹp håüp ca hai táûp håüp. • Thãm mäüt pháưn tỉí måïi, hay loải b mäüt pháưn tỉí. Prolog cọ sàơn mäüt säú vë tỉì xỉí l táûp håüp nhỉ sau : Vë tỉì nghéa is_set(Set) Kiãøm tra Set cọ phi l mäüt táûp håüp hay khäng list_to_set(List, Set) Chuøn danh sạch List thnh táûp håüp Set giỉỵ ngun thỉï tỉû cạc pháưn tỉí ca List (nãúu List cọ cạc pháưn tỉí trng nhau thç chè láúy pháưn tỉí gàûp âáưu tiãn). Vê dủ : list_to_set([a,b,a], X) cho kãút qu X = [a,b]. intersection(Set1, Set2, Set3) Phẹp giao ca hai táûp håüp Set1 v Set2 l Set3. subtract(Set, Delete, Result) Tr vãư kãút qu phẹp hiãûu ca hai táûp håüp Set v Delete l Result (l táûp Set sau khi â xoạ hãút cạc pháưn tỉí ca Delete cọ màût trong âọ). union(Set1, Set2, Set3) Tr vãư kãút qu phẹp håüp ca hai táûp håüp Set1 v Set2 l Set3. subset(Subset, Set) Kiãøm tra táûp håüp Subset cọ l táûp håüp con ca Set hay khäng. III. Cạc thao tạc cå bn trãn danh sạch III.1. Xáy dỉûng lải mäüt säú vë tỉì cọ sàơn Sau âáy ta s trçnh by mäüt säú thao tạc cå bn trãn danh sạch bàòng cạch xáy dỉûng lải mäüt säú vë tỉì cọ sàơn ca Prolog. III.1.1. Kiãøm tra mäüt pháưn tỉí cọ màût trong danh sạch Prolog kiãøm tra mäüt pháưn tỉí cọ màût trong mäüt danh sạch nhỉ sau : member(X, L) 100 Láûp trçnh lägich trong Prolog trong âọ, X l mäüt pháưn tỉí v L l mäüt danh sạch. Âêch member(X, L) âỉåüc tho mn nãúu X xút hiãûn trong L. Vê dủ : ?- member( b, [ a, b, c ] ) Yes ?- member( b, [ a, [ b, c ] ] ) No ?- member( [ b, c], [ a, [ b, c ] ] ) Yes Tỉì cạc kãút qu trãn, ta cọ thãø gii thêch quan hãû member(X, L) nhỉ sau : Pháưn tỉí X thüc danh sạch L nãúu : 1. X l âáưu ca L, hồûc nãúu 2. X l mäüt pháưn tỉí ca âi ca L. Ta cọ thãø viãút hai âiãưu kiãûn trãn thnh hai mãûnh âãư, mãûnh âãư thỉï nháút l mäüt sỉû kiãûn âån gin, mãûnh âãư thỉï hai l mäüt lût : member( X, [ X | Tail ] ). member( X, [ Head | Tail ] ) :- member( X, Tail ). hồûc : member(X, [X|T]). member(X, [_|T]) :- member(X, T). III.1.2. Ghẹp hai danh sạch Âãø ghẹp hai danh sạch, Prolog cọ hm : append( L1, L2, L3). trong âọ, L1 v L2 l hai danh sạch, L3 l kãút qu ca phẹp ghẹp L1 v L2. Vê dủ : ?- append( [ a, b ], [ c, d ], [ a, b, c, d ] ). Yes ?- append( [ a, b ], [ c, d ], [ a, b, a, c ] ). No Hm append hoảt âäüng phủ thüc tham âäúi âáưu tiãn L1 theo cạch nhỉ sau : 1. Nãúu tham âäúi âáưu tiãn l danh sạch räùng, thç tham âäúi thỉï hai v thỉï ba phi l mäüt danh sạch duy nháút, gi l L. Ta viãút trong Prolog nhỉ sau : append( [ ], L, L). Cáúu trục danh sạch 101 2. Nãúu tham âäúi âáưu tiãn ca append l danh sạch khạc räùng, thç nọ gäưm mäüt âáưu v mäüt âi nhỉ sau [ X | L1 ] Kãút qu phẹp ghẹp danh sạch l danh sạch [ X | L3 ], våïi L3 l phẹp ghẹp ca L1 v L2. Ta viãút trong Prolog nhỉ sau : append( [ X | L1 ], L2, [ X | L3 ] ) :- append( L1, L2, L3 ). Hçnh 4.2 dỉåïi âáy minh hoả phẹp ghẹp hai danh sạch [ X | L1 ] v L2. [ X | L1 ] XL3 [ X | L3 ] XL1 L3 L2 Hçnh III.1. Ghẹp hai danh sạch [ X | L1 ] v L2 thnh [ X | L3 ]. Ta cọ cạc vê dủ sau : ?- append( [ a, b, c ], [ 1, 2, 3 ], L ). L = [ a, b, c, 1, 2, 3 ] ?- append( [ a, [ b, c ], d ], [ a, [ ], b ], L ] ). L = [ a, [ b, c ], d, a, [ ], b ] Th tủc append âỉåüc sỉí dủng ráút mãưm do theo nhiãưu cạch khạc nhau. Chàóng hản Prolog âỉa ra bäún phỉång ạn âãø phán tạch mäüt danh sạch â cho thnh hai danh sạch måïi nhỉ sau : ?- append( L1, L2, [ a, b, c ] ). L1 = [ ] L2 = [ a, b, c ]; L1 = [ a ] L2 = [ b, c ]; L1 = [ a, b ] L2 = [ c ]; L1 = [ a, b, c ] L2 = [ ]; Yes 102 Lỏỷp trỗnh lọgich trong Prolog Sổớ duỷng append, ta cuợng coù thóứ tỗm kióỳm mọỹt sọỳ phỏửn tổớ trong mọỹt danh saùch. Chúng haỷn, tổỡ danh saùch caùc thaùng trong nm, ta coù thóứ tỗm nhổợng thaùng õổùng trổồùc mọỹt thaùng õaợ cho, giaớ sổớ thaùng nm (May) : ?- append( Before, [ May | After ] , [ jan, fev, mar, avr, may, jun, jul, aut, sep, oct, nov, dec ] ). Before = [ jan, fev, mar, avr ] After = [ jun, jul, aut, sep, oct, nov, dec ] Yes Thaùng õổùng ngay trổồùc vaỡ thaùng õổùng ngay sau thaùng nm nhỏỷn õổồỹc nhổ sau : ?- append( _, [ Month1, may, Month2 | _ ] , [ jan, fev, mar, avr, may, jun, jul, aut, sep, oct, nov, dec ] ). Month1 = avr Month2 = jun Yes Bỏy giồỡ cho trổồùc danh saùch : L1 = [ a, b, z, z, c, z, z, z, d, e ] Ta cỏửn xoùa caùc phỏửn tổớ õổùng sau ba chổợ z lión tióỳp, kóứ caớ ba chổợ z : ?- L1 = [ a, b, z, z, c, z, z, z, d, e ], append( L2, [ z, z, z | _ ], L1 ). L1 = [ a, b, z, z, c, z, z, z, d, e ] L2 = [ a, b, z, z, c ] Trổồùc õỏy ta õaợ õởnh nghộa quan hóỷ member( X, L ) õóứ kióứm tra mọỹt phỏửn tổớ X coù mỷt trong mọỹt danh saùch L khọng. Bỏy giồỡ bũng caùch sổớ duỷng append, ta coù thóứ õởnh nghộa laỷi member nhổ sau : member1( X, L ) :- append( L1, [ X | L2], L). Móỷnh õóử naỡy coù nghộa : nóỳu X coù mỷt trong danh saùch L thỗ L coù thóứ õổồỹc phỏn taùch thaỡnh hai danh saùch, vồùi X laỡ õỏửu cuớa danh saùch thổù hai. ởnh nghộa member1 hoaỡn toaỡn tổồng õổồng vồùi õởnh nghộa member. õỏy ta sổớ duỷng hai tón khaùc nhau õóứ phỏn bióỷt hai caùch caỡi õỷt Prolog. Ta cuợng coù thóứ õởnh nghộa laỷi member1 bũng caùch sổớ duỷng bióỳn nỷc danh (anonymous variable) : member1( X, L ) :- append( _ , [ X | _ ], L). Cáúu trục danh sạch 103 Mãûnh âãư 2 ca append So khåïp : L1 = [ X | L1’ ] [ b | L2 ] = L2’ [ a, b, c ] = [ X | L3’ ] Tỉì âọ kẹo theo : X = a, L3’ = [ b, c ] Mãûnh âãư 1 ca append So khåïp : L1’ = [ ] [ b | L2 ] = [ b, c ] Tỉì âọ kẹo theo : L2 = [ c ] thnh cäng Mãûnh âãư 1 ca append So khåïp : L1 = [ ] [ b | L2 ] = [ a, b, c ] Tháút bải vç b ≠ a append( L1’, [ b | L2 ], [ b, c ] ) append( L1, [ b | L2 ], [ a, b, c ] ) member1( b, [ a, b, c ] ) Hçnh III.2. Th tủc member1 tçm tưn tỉû mäüt âäúi tỉåüng trong danh sạch â cho. So sạnh hai cạch ci âàût khạc nhau vãư quan hãû thnh viãn, ta nháûn tháúy nghéa th tủc trong âënh nghéa member âỉåüc thãø hiãûn ráút r : Trong member, âãø kiãøm tra pháưn tỉí X cọ màût trong mäüt danh sạch L khäng, 1. Trỉåïc tiãn kiãøm tra pháưn tỉí âáưu ca L l âäưng nháút våïi X, nãúu khäng, 2. Kiãøm tra ràòng X cọ màût trong pháưn âi ca L. Nhỉng trong trỉåìng håüp âënh nghéa member1, ta tháúy hon ton nghéa khai bạo m khäng cọ nghéa th tủc. Âãø hiãøu âỉåüc cạch member1hoảt âäüng nhỉ thãú no, ta hy xem xẹt quạ trçnh Prolog thỉûc hiãûn cáu hi : ?- member1( b, [ a, b, c ] ). 104 Láûp trçnh lägich trong Prolog Cạch tçm ca th tủc member1 trãn âáy tỉång tỉû member, bàòng cạch duût tỉìng pháưn tỉí, cho âãún khi tçm tháúy âäúi tỉåüng cáưn tçm, hồûc danh sạch â cản. III.1.3. Bäø sung mäüt pháưn tỉí vo danh sạch Phỉång phạp âån gin nháút âãø bäø sung mäüt pháưn tỉí vo danh sạch l âàût nọ åí vë trê âáưu tiãn, âãø nọ tråí thnh âáưu. Nãúu X l mäüt âäúi tỉåüng måïi, cn L l danh sạch cáưn bäø sung thãm, thç danh sạch kãút qu s l : [ X | L ] Ngỉåìi ta khäng cáưn viãút th tủc âãø bäø sung mäüt pháưn tỉí vo danh sạch. Båíi vç viãûc bäø sung cọ thãø âỉåüc biãøu diãùn dỉåïi dảng mäüt sỉû kiãûn nãúu cáưn : insert( X, L, [ X | L ] ). III.1.4. Loải b mäüt pháưn tỉí khi danh sạch Âãø loải b mäüt pháưn tỉí X khi danh sạch L, ngỉåìi ta xáy dỉûng quan hãû : remove( X, L, L1 ) trong âọ, L1 âäưng nháút våïi L, sau khi X bë loải b khi L. Th tủc remove cọ cáúu trục tỉång tỉû member. Ta cọ thãø láûp lûn nhỉ sau 1. Nãúu pháưn tỉí X l âáưu ca danh sạch, thç kãút qu l âi ca danh sạch. 2. Nãúu khäng, tçm cạch loải b X khi pháưn âi ca danh sạch. remove( X, [ X | Tail ], Tail ). remove( X, [ Y | Tail ], [ Y | Tail1 ] ) :- remove( X, Tail, Tail1 ). Tỉång tỉû th tủc member, th tủc remove mang tênh khäng xạc âënh. Nãúu cọ nhiãưu pháưn tỉí l X cọ màût trong danh sạch, thç remove cọ thãø xoạ báút k pháưn tỉí no, do quạ trçnh quay lui. Tuy nhiãn, mäùi láưn thỉûc hiãûn, remove chè xoạ mäüt pháưn tỉí l X m khäng âủng âãún nhỉỵng pháưn tỉí khạc. Vê dủ : ?- remove( a, [ a, b, a, a ], L ). L = [ b, a, a ]; L = [ a, b, a ]; L = [ a, b, a ] No . [ Element | List ] 98 Láûp trçnh lägich trong Prolog II. Mäüt säú vë tỉì xỉí l danh sạch ca Prolog SWI -Prolog cọ sàơn mäüt säú vë tỉì xỉí l danh sạch. truùc cuớa Prolog õóửu coù bióứu dióựn cỏy. Danh saùch cuợng khọng nũm ngoaỷi lóỷ, cuợng coù cỏỳu truùc cỏy. 95 96 Láûp trçnh lägich trong Prolog Lm

Ngày đăng: 22/01/2014, 10:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan