Giáo trình lập trình logic trong prolog2

92 358 0
Giáo trình lập trình logic trong prolog2

Đ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 Cáú u trụ c danh sạ c h Chỉång ny trçnh by khại niãûm vãư danh sạch, mäüt nhỉỵng cáúu trục âån gin nháút v thäng dủng nháút, cng våïi nhỉỵng chỉång trçnh tiãu biãøu minh hoả cạch váûn dủng danh Prolog Cáúu trục danh tảo nãn mäüt mäi trỉåìng láûp trçnh thûn tiãûn ca ngän ngỉỵ Prolog I Biãøu diãùn cáúu trục danh Danh l kiãøu cáúu trục dỉỵ liãûu âỉåüc sỉí dủng räüng ri cạc ngän ngỉỵ láûp trçnh phi säú Mäüt danh l mäüt dy báút k cạc âäúi tỉåüng Khạc våïi kiãøu dỉỵ liãûu táûp håüp, cạc âäúi tỉåüng ca danh cọ thãø trng (xút hiãûn nhiãưu láưn) v mäùi vë trê xút hiãûn ca âäúi tỉåüng âãưu cọ nghéa Danh l cạch diãùn âảt ngàõn gn ca kiãøu dỉỵ liãûu hảng phỉïc håüp Prolog Hm tỉí ca danh l dáúu cháúm “.” Do viãûc biãøu diãùn danh båíi hm tỉí ny cọ thãø tảo nhỉỵng biãøu thỉïc máûp måì, nháút l xỉí l cạc danh gäưm nhiãưu pháưn tỉí läưng nhau, cho nãn Prolog quy ỉåïc âàût dy cạc pháưn tỉí ca danh giỉỵa cạc càûp mọc vng Chàóng hản (a,.(b,[ ])) L danh [ a, b ] Danh cạc pháưn tỉí anne, tennis, tom, skier (tãn ngỉåìi) âỉåüc viãút : [ anne, tennis, tom, skier ] chênh l hm tỉí : ( anne, ( tennis, ( tom, ( skier, [ ] ) ) ) ) Cạch viãút dảng càûp mọc vng chè l xút hiãûn bãn ngoi ca mäüt danh Nhỉ â tháúy åí mủc trỉåïc, mi âäúi tỉåüng cáúu trục ca Prolog âãưu cọ biãøu diãùn cáy Danh cng khäng nàòm lãû, cng cọ cáúu trục cáy 95 Láûp trçnh lägich Prolog 96 Lm cạch no âãø biãøu diãùn danh båíi mäüt âäúi tỉåüng Prolog chøn ? Cọ hai kh nàng xy l danh cọ thãø räùng hồûc khäng Nãúu danh räùng, âỉåüc viãút dỉåïi dảng mäüt ngun tỉí : [] Nãúu danh khạc räùng, cọ thãø xem âỉåüc cáúu trục tỉì hai thnh pháưn (pair syntax) : Thnh pháưn thỉï nháút, âỉåüc gi l âáưu (head) ca danh Thnh pháưn thỉï hai, pháưn cn lải ca danh (trỉì pháưn âáưu), âỉåüc gi l âi (tail) ca danh sạch, cng l mäüt danh Trong vê dủ trãn thç âáưu l anne, cn âi l danh : [ tennis, tom, skier ] Nọi chung, âáưu ca danh 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 Hçnh I.1 Biãøu diãùn dảng cáy ca danh mä t cáúu trục cáy ca danh â cho : âáưu âi cng l danh anne tennis tom skier [] Hçnh I.1 Biãøu diãùn dảng cáy ca danh 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 räùng xút hiãûn säú cạc hảng, vç ràòng pháưn tỉí cúi cng cọ thãø xem l danh chè gäưm mäüt pháưn tỉí nháút cọ pháưn âi l mäüt danh räùng: [ skier ] Vê dủ trãn âáy minh hoả ngun l cáúu trục dỉỵ liãûu täøng quạt Prolog ạp dủng cho cạc danh cọ âäü di tu ?- L1 = [ a, b, c ] ?- L2 = [ a, a, a ] Cáúu trục danh 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, cạc pháưn tỉí ca mäüt danh cọ thãø l cạc âäúi tỉåüng cọ kiãøu báút k, kãø c kiãøu danh Thäng thỉåìng, ngỉåìi ta xỉí l âi ca danh l mäüt danh Chàóng hản, danh : L = [ a, b, c ] cọ thãø viãút : tail = [ b, c ] v L = (a, tail) Âãø biãøu diãùn mäüt danh âỉåüc tảo thnh tỉì âáưu (Head) v âi (Tail), Prolog sỉí dủng k hiãûu | (split) âãø phán cạch pháưn âáưu v pháưn âi sau : L = [ a | Tail ] K hiãûu | âỉåüc dng mäüt cạch ráút täøng quạt bàòng cạch viãút mäüt säú pháưn tỉí tu ca danh trỉåïc | räưi danh cạc pháưn tỉí cn lải Danh báy giåì âỉåüc viãút lải sau : [ a, b, c ] = [ a | [ b, c ] ] = [ a, b | [ c ] ] = [ a, b, c | [ ] ] Sau âáy l mäüt säú cạch viãút danh : Kiãøu hai thnh pháưn Kiãøu liãût kã pháưn tỉí [] [a|[]] [a|b|[]] [a|X] [a|b|X] [ X1 | [ [ Xn | [ ] ] ] ] [] [a] [ a, b ] [a|X] [ a, b | X ] [ X1, , Xn ] Ta cọ thãø âënh nghéa danh sạchtheo kiãøu âãû quy sau : List å [ ] List å [ Element | List ] Láûp trçnh lägich Prolog 98 II Mäüt säú vë tỉì xỉí l danh ca Prolog SWI-Prolog cọ sàơn mäüt säú vë tỉì xỉí l danh sau : Vë tỉì append(List1, List2, List3) nghéa Ghẹp hai danh List1 v List2 thnh List3 Kiãøm tra Elem cọ l pháưn tỉí ca danh List hay member(Elem, List) khäng, nghéa l Elem håüp nháút âỉåüc våïi mäüt cạc pháưn tỉí ca List nextto(X, Y, List) Kiãøm tra nãúu pháưn tỉí Y cọ âỉïng sau pháưn tỉí X danh List hay khäng delete(List1, Elem, List2) Xoạ danh List1 nhỉỵng pháưn tỉí håüp nháút âỉåüc våïi Elem âãø tr vãư kãút qu List2 Láúy pháưn tỉí Elem danh List âãø tr vãư select(Elem, List, Rest) nhỉỵng pháưn tỉí cn lải Rest, cọ thãø dng âãø chn mäüt pháưn tỉí vo danh nth0(Index, List, Elem) Kiãøm tra pháưn tỉí thỉï Index (tênh tỉì 0) ca danh 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 List cọ phi l Elem hay khäng last(List, Elem) Kiãøm tra pháưn tỉí âỉïng cúi cng danh List cọ phi l Elem hay khäng reverse(List1, List2) Nghëch âo thỉï tỉû cạc pháưn tỉí ca danh List1 âãø tr vãư kãút qu List2 permutation(List1, List2) Hoạn vë danh List1 thnh danh List2 flatten(List1, List2) sumlist(List, Sum) Chuøn danh List1 chỉïa cạc pháưn tỉí báút k thnh danh phàóng List2 Vê dủ : flatten([a, [b, [c, d], e]], X) cho kãút qu X = [a, b, c, d, e] Tênh täøng cạc pháưn tỉí ca danh List chỉïa ton säú âãø tr vãư kãút qu Sum numlist(Low, High, List) Nãúu Low v High l cạc säú cho Low =< High, thç tr vãư danh List = [Low, Low+1, , High] Chụ mäüt säú vë tỉì xỉí l danh cọ thãø sỉí dủng cho mi rng büc, kãø c cạc tham âäúi âãưu l biãún Trong Prolog, táûp håüp âỉåüc biãøu diãùn båíi danh sạch, nhiãn, thỉï tỉû cạc pháưn tỉí 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 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 cọ thãø ạp dủng cho cạc táûp håüp Âọ l : • Kiãøm tra mäüt pháưn tỉí cọ màût mäüt danh 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 âãø nháûn âỉåüc mäüt danh 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 sau : Vë tỉì is_set(Set) nghéa Kiãøm tra Set cọ phi l mäüt táûp håüp hay khäng Chuøn danh List thnh táûp håüp Set giỉỵ ngun thỉï tỉû cạc pháưn tỉí ca List (nãúu List cọ cạc list_to_set(List, Set) pháưn tỉí trng 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 â xoạ hãút cạc pháưn tỉí ca Delete cọ màût âọ) union(Set1, Set2, Set3) subset(Subset, Set) III Tr vãư kãút qu phẹp håüp ca hai táûp håüp Set1 v Set2 l Set3 Kiãøm tra táûp håüp Subset cọ l táûp håüp ca Set hay khäng Cạc thao tạc cå bn trãn danh 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 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 danh Prolog kiãøm tra mäüt pháưn tỉí cọ màût mäüt danh sau : member(X, L) Láûp trçnh lägich Prolog 100 âọ, X l mäüt pháưn tỉí v L l mäüt danh Âêch member(X, L) âỉåüc tho mn nãúu X xút hiãûn 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) sau : Pháưn tỉí X thüc danh L nãúu : X l âáưu ca L, hồûc nãúu 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 Âãø ghẹp hai danh sạch, Prolog cọ hm : append( L1, L2, L3) âọ, 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 sau : Nãúu tham âäúi âáưu tiãn l danh räùng, thç tham âäúi thỉï hai v thỉï ba phi l mäüt danh nháút, gi l L Ta viãút Prolog sau : append( [ ], L, L) Cáúu trục danh 101 Nãúu tham âäúi âáưu tiãn ca append l danh khạc räùng, thç gäưm mäüt âáưu v mäüt âi sau [ X | L1 ] Kãút qu phẹp ghẹp danh l danh [ X | L3 ], våïi L3 l phẹp ghẹp ca L1 v L2 Ta viãút Prolog 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 [ X | L1 ] v L2 [ X | L1 ] X L1 L2 L3 X L3 [ X | L3 ] Hçnh III.1 Ghẹp hai danh [ X | L1 ] v L2 thnh [ X | L3 ] Ta cọ cạc vê dủ sau : ?- append( [ a, b, c ], [ 1, 2, ], L ) L = [ a, b, c, 1, 2, ] ?- 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 theo nhiãưu cạch khạc Chàóng hản Prolog âỉa bäún phỉång ạn âãø phán tạch mäüt danh â cho thnh hai danh måïi 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 Láûp trçnh lägich Prolog 102 Sỉí dủng append, ta cng cọ thãø tçm kiãúm mäüt säú pháưn tỉí mäüt danh Chàóng hản, tỉì danh cạc thạng nàm, ta cọ thãø tçm nhỉỵng thạng âỉïng trỉåïc mäüt thạng â cho, gi sỉí thạng nàm (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 Thạng âỉïng trỉåïc v thạng âỉïng sau thạng nàm nháûn âỉåüc 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 : L1 = [ a, b, z, z, c, z, z, z, d, e ] Ta cáưn xọa cạc pháưn tỉí âỉïng sau ba chỉỵ z liãn tiãúp, kãø c 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 â âënh nghéa quan hãû member( X, L ) âãø kiãøm tra mäüt pháưn tỉí X cọ màût mäüt danh L khäng Báy giåì bàòng cạch sỉí dủng append, ta cọ thãø âënh nghéa lải member sau : member1( X, L ) :- append( L1, [ X | L2], L) Mãûnh âãư ny cọ nghéa : nãúu X cọ màût danh L thç L cọ thãø âỉåüc phán tạch thnh hai danh sạch, våïi X l âáưu ca danh thỉï hai Âënh nghéa member1 hon ton tỉång âỉång våïi âënh nghéa member ÅÍ âáy ta sỉí dủng hai tãn khạc âãø phán biãût hai cạch ci âàût Prolog Ta cng cọ thãø âënh nghéa lải member1 bàòng cạch sỉí dủng biãún nàûc danh (anonymous variable) : member1( X, L ) :- append( _ , [ X | _ ], L) Cáúu trục danh 103 member1( b, [ a, b, c ] ) append( L1, [ b | L2 ], [ a, b, c ] ) Mãûnh âãư ca append So khåïp : L1 = [ ] [ b | L2 ] = [ a, b, c ] Tháút bải vç b ≠ a Mãûnh âãư 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 ] append( L1’, [ b | L2 ], [ b, c ] ) Mãûnh âãư ca append So khåïp : L1’ = [ ] [ b | L2 ] = [ b, c ] Tỉì âọ kẹo theo : L2 = [ c ] thnh cäng Hçnh III.2 Th tủc member1 tçm tưn tỉû mäüt âäúi tỉåüng danh â cho So sạnh hai cạch ci âàût khạc vãư quan hãû thnh viãn, ta nháûn tháúy nghéa th tủc âënh nghéa member âỉåüc thãø hiãûn ráút r : Trong member, âãø kiãøm tra pháưn tỉí X cọ màût mäüt danh L khäng, Trỉåïc tiãn kiãøm tra pháưn tỉí âáưu ca L l âäưng nháút våïi X, nãúu khäng, Kiãøm tra ràòng X cọ màût pháưn âi ca L Nhỉng 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 thãú no, ta hy xem xẹt quạ trçnh Prolog thỉûc hiãûn cáu hi : ?- member1( b, [ a, b, c ] ) Láûp trçnh lägich Prolog 104 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 tçm tháúy âäúi tỉåüng cáưn tçm, hồûc danh â cản III.1.3 Bäø sung mäüt pháưn tỉí vo danh Phỉång phạp âån gin nháút âãø bäø sung mäüt pháưn tỉí vo danh l âàût åí vë trê âáưu tiãn, âãø tråí thnh âáưu Nãúu X l mäüt âäúi tỉåüng måïi, cn L l danh cáưn bäø sung thãm, thç danh 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 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ỉí danh Âãø loải b mäüt pháưn tỉí X danh L, ngỉåìi ta xáy dỉûng quan hãû : remove( X, L, L1 ) âọ, L1 âäưng nháút våïi L, sau X bë loải b L Th tủc remove cọ cáúu trục tỉång tỉû member Ta cọ thãø láûp lûn sau Nãúu pháưn tỉí X l âáưu ca danh sạch, thç kãút qu l âi ca danh Nãúu khäng, tçm cạch loải b X pháưn âi ca danh 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 khäng xạc âënh Nãúu cọ nhiãưu pháưn tỉí l X cọ màût danh sạch, thç remove cọ thãø xoạ báút k pháưn tỉí no, 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 Láûp trçnh lägich Prolog 172 Yes Prolog cho phẹp viãút gn mäüt danh sau : ?- [‘myexp.pl' ] Âãø nảp v biãn dëch âäưng thåìi nhiãưu tãûp chỉång trçnh khạc nhau, cọ thãø liãût kã mäüt danh sau : ?- ['file1.pl', 'file2.pl'] Sau cạc chỉång trçnh â âỉåüc nảp vo bäü nhåï, NSD bàõt âáưu thỉûc hiãûn chỉång trçnh NSD cọ thãø xem näüi dung ton bäü chỉång trçnh nhåì vë tỉì : ?- listing hồûc xem mäüt mãûnh âãư no âọ : ?- listing(displaylist) displaylist( [ ]) displaylist( [X | L ] ) :write( X ), tab( 1), displaylist( L), nl Yes III.3 ỈÏng dủng chãú âäü lm viãûc våïi cạc tãûp III.3.1 Âënh dảng cạc hảng Gi sỉí mäüt bn ghi cå såí dỉỵ liãûu, l mäüt sỉû kiãûn cọ dảng cáúu trục hm tỉí ca Prolog, cọ näüi dung sau : family( individual(tom, smith, date(7, may, 1960), work(microsoft, 30000)), individual( ann, smith, date(9, avril, 1962), inactive), [ individual( roza, smith, date(16, june, 1991), inactive), individual( eric, smith, date(23, march, 1993), inactive) ] ) Ta cáưn in näüi dung bn ghi sỉí dủng vë tỉì write(F) theo quy cạch sau : parents tom smith, birth day may 7,1960, work microsoft, salary 30000 ann smith, birth day avril 9, 1962, out of work children roza smith, birth day june 16, 1991, out of work eric smith, birth day march 23, 1993, out of work Ta xáy dỉûng th tủc writefamily( F) sau : K thût láûp trçnh Prolog 173 writefamily(family(Husband, Wife, Children)) :nl, write(parents),nl, nl, writeindividual(Husband) ,nl, writeindividual(Wife), nl, nl, write(children), nl, nl, writeindividual(Children) writeindividual(individual(Firstname, Name, date(D, M, Y), Work)) :tab(4), write(Firstname), tab(1), write(Name), write(', birth day '), write(M), tab(1), write(D), tab(1), write(', '), write(Y), write(', '), writework(Work) writeindividual([ ]) writeindividual([ P | L] ):writeindividual( P), nl, writeindividual( L) writework(inactive):write('out of work') writework(work(Soc, Sal)):write(' work '), write(Soc), write(', salaire '), write(Sal) Thỉûc hiãûn âêchX = , writefamily(X), ta nháûn âỉåüc kãút qu sau ?- X = family(individual( tom, smith, date(7, may, 1960), work(microsoft, 30000) ),individual( ann, smith, date(9, avril, 1962), inactive),[individual( roza, smith, date(16, june, 1991), inactive),individual( eric, smith, date(23, march, 1993), inactive) ] ), writefamily(X) parents tom smith, birth day may , 1960, work microsoft, salaire 30000 ann smith, birth day avril , 1962, out of work children roza smith, birth day june 16 , 1991, out of work eric smith, birth day march 23 , 1993, out of work X = family(individual(tom, smith, date(7, may, 1960), work(microsoft, 30000)), individual(ann, smith, date(9, avril, 1962), inactive), [individual(roza, smith, date(16, june, 1991), inactive), individual(eric, smith, date(23, march, 1993), inactive)]) Yes III.3.2 Sỉí dủng tãûp xỉí l cạc hảng Âãø âc dỉỵ liãûu trãn tãûp, ngỉåìi ta sỉí dủng dy âêch sau : , see( F), fileprocess, see( user), Láûp trçnh lägich Prolog 174 Th tủc fileprocess âc v xỉí l láưn lỉåüt tỉìng hảng ca F cho âãún âc hãút tãûp Mä hçnh th tủc sau : filetreat :read( Term), treat( Term) treat( end_of_file) :- ! treat( Term) :treatment( Term), filetreat % Kãút thục tãûp % Xỉí l hảng hiãûn hnh % Xỉí l pháưn cn lải ca tãûp Trong th tủc trãn, treatment( Terme) thãø hiãûn mi thao tạc cọ thãø tạc âäüng lãn hảng Chàóng hản th tủc dỉåïi âáy liãût kã tỉìng hảng ca tãûp kãø tỉì dng thỉï N tråí âi cho âãún hãút tãûp, km theo thỉï tỉû cọ màût ca hảng âọ tãûp : viewfile( N) :read( Term), viewterm( Term, N) viewterm( end_of_file, _ ) :- ! viewterm( Term, N) :write( N), tab( 2), write( Term), nl, N1 is N + 1, viewfile( N1) ?- see('exp.txt'), viewfile(1), see( user), seen parent(pam, bob) parent(tom, bob) parent(tom, liz) parent(bob, ann) parent(bob, pat) … Yes Sau âáy l mäüt mä hçnh khạc âãø xỉí l tãûp Gi sỉí file1 l tãûp dỉỵ liãûu ngưn chỉïa cạc hảng cọ dảng : object( NoObject, Description, Price, FurnisherName) Mäùi hảng mä t mäüt pháưn tỉí ca danh cạc âäúi tỉåüng Gi sỉí ràòng tãûp cáưn xáy dỉûng file2 chỉïa cạc âäúi tỉåüng cng mäüt nh cung cáúp cáúp hng Trong tãûp ny, tãn nh cung cáúp âỉåüc viãút mäüt láưn åí âáưu tãûp, m K thût láûp trçnh Prolog 175 khäng xút hiãûn cạc âäúi tỉåüng, cọ dảng object( No, Desc, Price) Th tủc tảo tãûp sau : createfile(Furnisher) :write(Furnisher), write( ‘.‘), nl, creatremaining(Furnisher) creatremaining( Fournisseur) :read( Objet), treat( Objet, Furnisher) treat( end_of_file) :- ! treat(object( No, Desc, Price, Furn), Furn) :write( object( No, Desc, Price) ), write( ‘.‘), nl, creatremaining(Furn) treat( _ , Furnisher) :creatremaining(Furnisher) Gi sỉí file1 l tãûp see(' file1.txt'),tell(' file2.txt'), createfile(suzuki), seen, see(user), told, tell(user) Vê dủ III.10 : Sao chẹp näüi dung mäüt tãûp lãn mäüt tãûp khạc : copie :repeat, read(X), mywrite(X), X == end_of_file, ! mywrite( end_of_file) mywrite( X) :write( X), write( '.'), nl Âêch sau cho phẹp cäpy tỉì tãûp ngưn f1.txt vo tãûp âêch f2.txt : ?- tell('f2.txt'), see('f1.txt'), copie, seen, told Yes Trong th tủc copie cọ sỉí dủng vë tỉì repeat Vë tỉì repeat ln ln thnh cäng, tảo mäüt vng làûp vä hản Vë tỉì repeat âỉåüc âënh nghéa sau : repeat repeat :- repeat III.3.3 Thao tạc trãn cạc k tỉû Mäüt säú vë tỉì xỉí l k tỉû ca Prolog sau : Láûp trçnh lägich Prolog 176 Tãn vë tỉì nghéa put(Char) Âỉa Char dng hiãûn hnh, Char hồûc l mäüt giạ trë ngun khong 255, hồûc mäüt k tỉû put(File, Char) Âỉa Char tãûp File get_char(Char) Âc tỉì tãûp File v håüp nháút Char våïi k tỉû tiãúp theo get_char(File, Char) Håüp nháút Char våïi k tỉû tiãúp theo tãûp File get0(Char) Âc k tỉû tiãúp theo get0(File, Char) Âc k tỉû tiãúp theo tãûp File get(-Char) Âc k tỉû khạc khong träúng tỉì dng vo v håüp nháút våïi Char get(File, Char) Âc k tỉû khạc khong träúng tiãúp theo tãûp File skip(Char) Âc vo v b qua cạc k tỉû âc âỉåüc cho âãún gàûp âụng k tỉû khåïp âỉåüc våïi Char skip(File, Char) Âc vo tỉì tãûp File v b qua cạc k tỉû âc âỉåüc cho âãún gàûp âụng k tỉû khåïp âỉåüc våïi Char Vê dủ III.11 : % Âỉa liãn tiãúp cạc k tỉû A, B v C cọ m ASCII láưn lỉåüt l 65, 66, 67 ?- put( 65), put( 66), put( 67) ABC yes % Âc v ghi cạc k tỉû ?- get0(X) |: a % G vo mäüt k tỉû räưi Enter (↵), khäng g dáúu cháúm X = 97 Yes ?- get0(X) ^D X = -1 Yes Vê dủ III.12 : Sau âáy ta xáy dỉûng th tủc del_space âc vo mäüt cáu gäưm nhiãưu tỉì cạch båíi cạc khong träúng v tr vãư âụng cáu âọ sau â loải b cạc khong träúng thỉìa, chè giỉỵ lải mäüt khong träúng giỉỵa cạc tỉì m thäi Th tủc hoảt âäüng tỉång tỉû cạc th tủc xỉí l tãûp, bàòng cạch âc láưn lỉåüt tỉìng k tỉû räưi âỉa mn hçnh Th tủc sỉí dủng k thût nhạt càõt âãø xỉí l K thût láûp trçnh Prolog 177 tçnh húng k tỉû âc vo hồûc l mäüt khong träúng, hồûc l mäüt chỉỵ cại, hồûc l mäüt dáúu cháúm kãút thục Sau âáy l th tủc del_space : del_space :get0( C), put( C), follow( C) follow( 46) :- ! % 46 l m ASCII ca dáúu cháúm follow( 32) :- !, % 32 l m ASCII ca dáúu khong träúng get( C), % B qua cạc dáúu khong träúng tiãúp theo put( C), follow( C) follow( Letter) :del_space Chảy thỉí sau : ?- del_space |: The robot try to cast the balls to the basket The robot try to cast the balls to the basket Yes III.3.4 Thao tạc trãn cạc ngun tỉí Prolog cọ vë tỉì name/2 cho phẹp âàût tỉång ỉïng cạc ngun tỉí våïi cạc m ASCII : name( A, L) Vë tỉì tho mn L l danh cạc ca cạc k tỉû ca A Vê dủ : ?- name(mic29, [109, 105, 99, 50, 57 ]) Yes ?- name( aikieutuido, L) L = [ 97, 105, 107, 105, 101, 117, 116, 117, 105 | ] Yes ?- name(X, [ 97, 105, 107, 105, 101, 117, 116, 117, 105, 100, 111 ]) X = aikieutuido Yes Hai chỉïc nàng chênh ca vë tỉì name sau : Chuøn mäüt ngun tỉí thnh mäüt danh cạc k tỉû (m ASCII) Tảo mäüt ngun tỉí tỉì mäüt danh cạc k tỉû Láûp trçnh lägich Prolog 178 Vê dủ III.13 : Xáy dỉûng th tủc qun l cạc cüc gi dëch vủ xe taxi chåí hnh khạch nhåì cạc ngun tỉí sau : Tãn cạc cüc gi call1, call2, Tãn cạc lại xe chauffeur1, chauffeur2, Tãn cạc xe taxi taxi1, taxi2, Vë tỉì taxi( X ) kiãøm tra mäüt ngun tỉí cọ biãøu diãùn âụng mäüt taxi theo cạch biãøu diãùn trãn khäng : taxi( T ) :name( T, Tlist), name( taxi, L), append( L, _ , Tlist) Mäüt cạch tỉång tỉû, ta cọ thãø xáy dỉûng cạc vë tỉì chauffer v taxi Vê dủ III.14 : Sau âáy ta xáy dỉûng th tủc cho phẹp tảo mäüt ngun tỉí bàòng cạch täø håüp cạc k tỉû Th tủc readsentence( Wordlist) s âc mäüt cáu thüc ngän ngỉỵ tỉû nhiãn räưi gạn cho Wordlist danh cạc giạ trë m biãøu diãùn ca cạc k tỉû cáu Tiãúp theo, mäùi cáu âỉåüc xem l mäüt danh cạc tỉì, mäùi tỉì âỉåüc chuøn thnh mäüt ngun tỉí readsentence( WordList) :get0( Char), readchain( Char, WordList) readchain( 46,[ ] ) :- ! % dáúu cháúm kãút thục cáu readchain( 32, WordList) :readsentence(WordList) % B qua cạc dáúu khong träúng readchain( L, [ W | WordList ] ) :readletter( L, Letters, Nextchar ), % Âc cạc k tỉû ca tỉì tiãúp theo name( W, Letters), readchain( Nextchar, WordList) readletter( 46, [ ], 46) :- ! % kãút thục tỉì l mäüt dáúu cháúm readletter( 32, [ ], 32) :- ! % kãút thục tỉì l mäüt dáúu khong träúng readletter( C, [ C | Letters] , Nextchar) :get0( Char), readletter( Char, Letters, Nextchar) K thût láûp trçnh Prolog 179 Chảy chỉång trçnh, ta cọ cạc kãút qu sau : ?- readsentence( WordList) |: The robot ASIMO try to cast the balls to the basket WordList = ['The', robot, 'ASIMO', try, to, cast, the, balls, to| ] Yes ?- readsentence( WordList) |: " Ai âi tràm súi ngn rỉìng " % dáúu Enter ↵ sau dáúu nhạy kẹp |: % dáúu cháúm kãút thục cáu WordList = [ '" Ai', âi, tràm, súi, ngn, 'rỉìng "\n' ] Yes Trong th tủc, ta â gi thiãút ràòng kãút thục cáu vo l mäüt dáúu cháúm v nãúu cọ dáúu cháúm cáu cáu, thç tu theo cạch xút hiãûn m âỉåüc xem l mäüt tỉì hồûc dênh vo våïi tỉì Th tủc âc k tỉû âáưu tiãn l Char, räưi chuøn cho th tủc readchain Th tủc readchain xỉí l trỉåìng håüp sau : (1) Nãúu Char l mäüt dáúu cháúm, thç quạ trçnh âc cáu vo kãút thục (2) Nãúu Char l mäüt khong träúng, ạp dủng th tủc readsentence cho pháưn cn lải ca cáu (3) Nãúu Char l mäüt k tỉû : trỉåïc tiãn âc tỉì W âỉåüc bàõt âáưu båíi k tỉû Char, sau âọ sỉí dủng readsentence âãø âc pháưn cn lải ca cáu v tảo danh WordList Kãút qu âỉåüc têch lu [ W | WordList ] Th tủc readletter( L, Letters, Nextchar ) âc cạc k tỉû ca mäüt tỉì, âọ : (1) L l chỉỵ cại hiãûn hnh (â âỉåüc âc) ca tỉì âang âc (2) Letters l danh cạc chỉỵ cại, bàõt âáưu båíi L cho âãún hãút tỉì (3) Nextchar l k tỉû theo sau tỉì âang âc, cọ thãø khäng phi l mäüt chỉỵ cại Nhåì cạch biãøu diãùn cạc tỉì ca cáu mäüt danh sạch, ngỉåìi ta cọ thãø sỉí dủng Prolog âãø xỉí l ngän ngỉỵ tỉû nhiãn, tçm hiãøu nghéa ca cáu theo mäüt quy ỉåïc no âọ, v.v thüc lénh vỉûc trê tû nhán tảo Láûp trçnh lägich Prolog 180 III.3.5 Mäüt säú vë tỉì xỉí l cå såí dỉỵ liãûu Sau âáy l mäüt säú vë tỉì chøn cho phẹp xỉí l trãn cạc lût v sỉû kiãûn ca mäüt cå såí dỉỵ liãûu Prolog assert(P) Thãm P vo cå såí dỉỵ liãûu Vê dủ cho cå såí dỉỵ liãûu lục ban âáưu : personal(tom) personal(ann) Sau thỉûc hiãûn âêch : ?- assert(personal(bob)) cå såí dỉỵ liãûu lục ny tråí thnh : personal(tom) personal(ann) personal(bob) Do NSD khäng biãút assert â thãm P vo âáưu hay cúi ca cå såí dỉỵ liãûu, Prolog cho phẹp sỉí dủng hai dảng khạc l : asserta(P) Thãm P vo âáưu cå såí dỉỵ liãûu assertz(P) Thãm P vo cúi cå såí dỉỵ liãûu Sỉí dủng vë tỉì : assert((P :- B, C, D)) cọ thãø lm thay âäøi näüi dung mäüt mãûnh âãư chỉång trçnh Tuy nhiãn, ngỉåìi ta khun khäng nãn sỉí dủng lãûnh ny retract(P) Loải b P cå såí dỉỵ liãûu Vê dủ cho cå såí dỉỵ liãûu lục ban âáưu : personal(tom) personal(ann) personal(bob) Sau thỉûc hiãûn âêch : ?- retract(personal(ann)) cå såí dỉỵ liãûu lục ny chè cn : personal(tom) personal(bob) Cọ thãø sỉí dủng biãún retract sau : K thût láûp trçnh Prolog 181 ?- retract(personal(X)) X = tom ; X = bob ; No Lục ny cå såí dỉỵ liãûu â räùng abolish(Term, Arity) Loải b táút c cạc hảng Term cọ cáúp Arity cå såí dỉỵ liãûu Vê dủ : ?- abolish(personal, 2) Loải b táút c cạc hảng Term cọ cáúp Arity=2 Vê dủ III.15 Xáy dỉûng bäü siãu diãùn dëch Prolog Prolog, viãûc xoạ mäüt âêch âỉåüc viãút lải sau : prove(Goal) :- call(Goal) hồûc : prove(Goal) :- Goal hồûc viãút cạc mãûnh âãư : prove(true) prove((Goal1, Goal2)) :prove(Goal1), prove(Goal2) prove(Goal) :clause(Goal, Body), prove(Body) Láûp trçnh lägich Prolog 182 Tọm tàõt chỉång : K thût nhạt càõt v ph âënh • Nhạt càõt ngàn cn sỉû quay lui, khäng nhỉỵng lm tàûng hiãûu qu chảy chỉång trçnh m cn lm täúi ỉu biãøu hiãûn ca ngän ngỉỵ • Âãø tàûng hiãûu qu chảy chỉång trçnh, ngỉåìi láûp trçnh sỉí dủng nhạt càõt âãø chè cho Prolog biãút nhỉỵng âỉåìng dáùn âãún tháút bải • Nhạt càõt cho phẹp tảo cạc kãút lûn loải trỉì dảng : If Condition Thç Conclusion_1 nãúu Conclusion_2 • Nhạt càõt cho phẹp âënh nghéa phẹp ph âënh : not Goal tho mn nãúu Goal tháút bải • Prolog cọ hai âêch âàûc biãût : true ln ln âụng v fail ln ln sai • Cáưn tháûn trng sỉí dủng k thût nhạt càõt, nhạt càõt cọ thãø lm sai lãûch sỉû tỉång ỉïng giỉỵa nghéa khai bạo v nghéa th tủc ca mäüt chỉång trçnh • Phẹp ph âënh not Prolog khäng hon ton mang nghéa lägich, cáưn chụ sỉí dủng not Sỉí dủng cạc cáúu trục Cạc vê dủ â trçnh by chỉång ny minh hoả nhỉỵng âàûc trỉng ráút tiãu biãøu ca k thût láûp trçnh Prolog : • Trong Prolog, táûp håüp cạc sỉû kiãûn â âãø biãøu diãùn mäüt cå såí dỉỵ liãûu • K thût âàût cáu hi v so khåïp ca Prolog l nhỉỵng phỉång tiãûn mãưm cho phẹp truy cáûp t cå såí dỉỵ liãûu nhỉỵng thäng tin cọ cáúu trục • Cáưn sỉí dủng phỉång phạp trỉìu tỉåüng hoạ dỉỵ liãûu l mäüt k thût láûp trçnh cho phẹp sỉí dủng cạc cáúu trục dỉỵ liãûu phỉïc tảp mäüt cạch âån gin, lm chỉång trçnh tråí nãn dãù hiãøu Trong Prolog, phỉång phạp trỉìu tỉåüng hoạ dỉỵ liãûu ráút dãù triãøn khai • Nhỉỵng cáúu trục toạn hc trỉìu tỉåüng ätämat cng ráút dãù ci âàût Prolog • Ngỉåìi ta cọ thãø tiãúp cáûn âãún nhiãưu låìi gii khạc cho mäüt bi toạn nhåì sỉí dủng nhiãưu cạch biãøu diãùn dỉỵ liãûu khạc nhau, trỉåìng håüp K thût láûp trçnh Prolog 183 bi toạn tạm qn háûu Cạch biãøu diãùn dỉỵ liãûu sỉí dủng nhiãưu thäng tin tiãút kiãûm âỉåüc toạn, màûc d lm cho chỉång trçnh tråí nãn rỉåìm r, khọ cä âng • K thût täøng quạt hoạ mäüt bi toạn, trỉìu tỉåüng, nhỉng lải lm tàng kh nàng hỉåïng âãún låìi gii, lm âån gin hoạ phạt biãøu bi toạn Lm viãûc våïi tãûp Cng våïi chãú âäü tỉång tạc cáu hi-tr låìi, quạ trçnh vo v chãú âäü lm viãûc våïi tãûp â lm phong phụ mäi trỉåìng lm viãûc ca Prolog • Cạc tãûp Prolog âãưu hoảt âäüng theo kiãøu tưn tỉû Prolog phán biãût dng vo hiãûn hnh v dng hiãûn hnh • Thiãút bë cúi (terminal) ca NSD gäưm mn hçnh v bn phêm âỉåüc xem mäüt tãûp gi cọ tãn l user • Prolog cọ nhiãưu vë tỉì cọ sàơn âãø xỉí l cạc dng vo-ra • Khi lm viãûc våïi tãûp, chãú âäü âc ghi l xỉí l tỉìng k tỉû hồûc tỉìng hảng Láûp trçnh lägich Prolog 184 Bi táûp chỉång Cho chỉång trçnh : p( ) p( ) :- ! p( ) Cho biãút cạc cáu tr låìi ca Prolog t cạc cáu hi sau : (a) ?- p( X ) (b) ?- p( X ), p( Y ) (c) ?- p( X ), !, p( Y ) Quan hãû sau âáy cho biãút mäüt säú cọ thãø l dỉång, bàòng khäng, hồûc ám : sign( Number, positive) :Number > sign( 0, null) sign( Number, negative) :Number < Hy sỉí dủng k thût nhạt càõt âãø viãút lải chỉång trçnh trãn hiãûu qu hån Th tủc separate(Number, Positive, Negative) xãúp cạc pháưn tỉí danh Number láưn lỉåüt thnh hai danh sạch, danh Positive chè chỉïa cạc säú dỉång, hồûc bàòng khäng, danh Negative chè chỉïa cạc säú ám Vê dủ : separate( [ 3, -1, 0, 5, -2 ], [ 3, 0, ], [ -1, -2 ] ) Hy âënh nghéa th tủc trãn theo hai cạch, mäüt cạch khäng sỉí dủng k thût nhạt càõt, mäüt cạch cọ sỉí dủng k thût nhạt càõt Cho hai danh sạch, Accept v Reject, hy viãút danh cạc âêch sỉí dủng k thût quay lui v cạc quan hãû member v not âãø tçm cạc pháưn tỉí cọ màût Accept nhỉng khäng cọ màût Reject Âënh nghéa th tủc difference( Set1, Set2, SetDiff) tçm hiãûu hai táûp håüp Set1 v Set2 våïi quy ỉåïc cạc táûp håüp âỉåüc biãøu diãùn båíi cạc danh K thût láûp trçnh Prolog 185 Chàóng hản : difference( [ a, b, c, d ], [ b, d, e, f ], [ a, c ] ) Hy âënh nghéa vë tỉì unifiable( List1, Term, List2) âãø kiãøm tra so khåïp, âọ List2 l danh táút c cạc pháưn tỉí ca List1 cọ thãø so khåïp våïi Term nhỉng khäng thỉûc hiãûn phẹp thãú trãn cạc biãún â âỉåüc so khåïp Vê dủ : ?- unifiable( [ X, bibo, t( Y ) ], t(a), List ) List = [X, t( Y )] Chụ ràòng X v Y váùn l cạc biãún tỉû khäng thỉûc hiãûn phẹp thãú t(a) cho X, hay phẹp thãú a cho Y Mún váûy, thỉûc hiãûn hỉåïng dáùn sau : Sỉí dủng phẹp ph âënh not( Term1 = Term2) Nãúu quan hãû Term1 = Term2 âỉåüc tho mn, âọ, not( Term1 = Term2) s tháút bải, v phẹp thãú biãún khäng xy Bi toạn m âi tưn Gi sỉí cạc ä ca bn cåì vua 8×8 âỉåüc biãøu diãùn båíi cạc càûp toả âäü cọ dảng X/Y, våïi X v Y nàòm khong v (a) Âënh nghéa quan hãû jump( case1, case2 ), bàòng cạch sỉí dủng lût âi ca qn m, v gi sỉí ràòng case1 ln ln bë rng büc Vê dủ : ?- jump( 1/1, C ) C = 3/2; C = 2/3; No (b) Âënh nghéa quan hãû mvt_ knight( path ), våïi path l mäüt danh gäưm cạc ä biãøu diãùn läü trçnh cạc bỉåïc nhy håüp l ca qn m trãn bn cåì räùng (c) Sỉí dủng quan hãû mvt_ knight, viãút mäüt cáu hi âãø tçm táút c cạc läü trçnh bäún bỉåïc nhy håüp l ca qn m, xút phạt tỉì ä cọ toả âäü 2/1, âãø âãún biãn bãn phi ca bn cåì (Y = 8) v âãø âãún ä 5/4 sau hai bỉåïc nhy Cho f mäüt tãûp chỉïa cạc hảng, hy âënh nghéa th tủc findterm(Term) âãø âỉa mn hçnh hảng âáưu tiãn ca f khåïp âỉåüc våïi Term ? 10 Cho f mäüt tãûp chỉïa cạc hảng, hy âënh nghéa th tủc findallterm(Term) âãø âỉa mn hçnh táút c cạc hảng ca f khåïp âỉåüc våïi Term ? Kiãøm tra cháút biãún Term khäng thãø âỉåüc gạn giạ trë thỉûc hiãûn tçm kiãúm Láûp trçnh lägich Prolog 186 11 Hy måí räüng th tủc del_space â âỉåüc trçnh by pháưn l thuút âãø cọ thãø xỉí l loải b cạc dáúu cạch thỉìa nàòm trỉåïc dáúu pháøy (comma) v chè giỉỵ lải mäüt dáúu cạch nàòm sau dáúu pháøy 12 Tỉång tỉû bi cho cạc dáúu cháúm cáu khạc dáúu cháúm (period), dáúu cháúm pháøy (semicolon), dáúu cháúm hi (question mark), v.v 13 Âënh nghéa quan hãû firstchar( Atom, Char) cho phẹp kiãøm tra Char cọ phi l k tỉû âáưu tiãn ca Atom khäng (Atom bàõt âáưu båíi Char) ? 14 Âënh nghéa th tủc cho phẹp âäøi mäüt danh tỉì tiãúng Anh tỉì säú êt (singular) sang säú nhiãưu (plural) âỉåüc thỉûc hiãûn sau : ?- plural ( table, X ) X = tables Yes 15 Ạp dủng th tủc readsentence â âỉåüc trçnh by pháưn l thuút âãø xáy dỉûng th tủc : ?- find( Keyword, Sentence ) cho phẹp tçm tãûp âang âc mäüt cáu cọ chỉïa tỉì khoạ Keyword Cáu Sentence phi åí dảng måïi âỉåüc âc vo chỉa xỉí l, nghéa l âỉåüc biãøu diãùn båíi mäüt chùi k tỉû, hồûc båíi mäüt ngun tỉí [...]... trçnh quay lui xy ra bãn trong danh sạch cạc âêch Láûp trçnh lägich trong Prolog 122 P, Q, R, nhỉng ngay khi thỉûc hiãûn nhạt càõt, mi con âỉåìng dáùn âãún cạc mãûnh âãư trong danh sạch P, Q, R âãưu bë b qua Mãûnh âãư C thỉï hai : C :- V cng bë b qua Tuy nhiãn, viãûc quay lui váùn cọ thãø xy ra bãn trong danh sạch cạc âêch S, T, U Âêch cha ca mãûnh âãư chỉïa nhạt càõt l C åí trong mãûnh âãư : A :- B,... âäüng âäúi våïi mãûnh âãư C, m khäng tạc âäüng âäúi våïi A Viãûc quay lui tỉû âäüng trong danh sạch cạc âêch B, C, D váùn âỉåüc thỉûc hiãûn, âäüc láûp våïi nhạt càõt hiãûn diãûn trong C I.2.3 Vê dủ sỉí dủng k thût nhạt càõt 1 Tçm säú max Xáy dỉûng chỉång trçnh tçm säú låïn nháút trong hai säú cọ dảng : max( X, Y, MaX ) trong âọ, Max = X nãúu X låïn hån hồûc bàòng Y, v Max = Y nãúu X nh hån hồûc bàòng... classe(Player, CategorY ) âãø phán thỉï hảng cho mäùi ngỉåìi chåi qưn våüt trong ba hảng nhỉ sau : champion ngỉåìi ln thàõng trong táút c cạc tráûn âáúu combative ngỉåìi cọ c bn thàõng v cọ c bn thua dilettante ngỉåìi ln thua trong táút c cạc tráûn âáúu K thût láûp trçnh Prolog 125 Tỉì kãút qu nhỉỵng tráûn âáúu â cọ âỉåüc cho trong cạc sỉû kiãûn, ta tháúy Ann v Pat âỉåüc xãúp hảng quạn qn (champion),... lägich trong Prolog 114 L = [1, 2, 3, 4] ; No 8 Viãút vë tỉì Prolog getEltFromList(L,N,E) cho phẹp láúy ra pháưn tỉí thỉï N trong mäüt danh sạch Tháút bải nãúu danh sạch khäng cọ â N pháưn tỉí Chỉång trçnh hoảt âäüng nhỉ sau : ?- getEltFromList([a,b,c],0,X) No ?- getEltFromList([a,b,c],2,X) X=b ?- getEltFromList([a,b,c],4,X) No 9 Viãút chỉång trçnh Prolog tçm pháưn tỉí låïn nháút v pháưn tỉí nh nháút trong. .. trục danh sạch 105 Th tủc remove tháút bải nãúu danh sạch khäng chỉïa pháưn tỉí cáưn xoạ Ngỉåìi ta cọ thãø sỉí dủng remove trong mäüt khêa cảnh khạc, mủc âêch âãø bäø sung mäüt pháưn tỉí måïi vo báút cỉï âáu trong danh sạch Vê dủ, nãúu ta mún âàût pháưn tỉí a vo tải mi vë trê báút k trong danh sạch [ 1, 2, 3 ], chè cáưn âàût cáu hi : Cho biãút danh sạch L nãúu sau khi xoạ a, ta nháûn âỉåüc danh sạch [... X ), ! classe( X, champion) :bat( X, _ ), ! classe( X, dilettante) :bat( _, X ) Chụ ràòng khäng nháút thiãút phi sỉí dủng nhạt càõt trong mãûnh âãư champion vç bn cháút ca ba thỉï hảng Láûp trçnh lägich trong Prolog 126 I.3 Phẹp ph âënh I.3.1 Ph âënh båíi tháút bải Trong Prolog, ta cọ thãø nọi âỉåüc cáu : «Marie thêch táút c loi âäüng váût trỉì loi ràõn» hay khäng ? Âäúi våïi vãú thỉï nháút, ta cọ... b) Ngỉåìi ta phi tháûn trng khi sỉí dủng k thût nhạt càõt do nhạt càõt lm thay âäøi nghéa th tủc v lm tàng nguy cå xy ra sai sọt trong chỉång trçnh Nhỉ â xẹt trong cạc vê dủ trỉåïc âáy, viãûc loải b nhạt càõt cọ thãø lm thay âäøi nghéa khai bạo ca mäüt chỉång trçnh Tuy nhiãn trong mäüt säú trỉåìng håüp, nhạt càõt khäng nh hỉåíng âãún nghéa khai bạo Ngỉåìi ta gi nhỉỵng nhạt càõt khäng lm thay âäøi ngỉỵ... :integer(X) Trong cạc trỉåìng håüp khạc, cạc nhạt càõt nh hỉåíng âãún nghéa khai bạo âỉåüc gi l nhạt càõt â (red cuts) Sỉû cọ màût ca cạc nhạt càõt â thỉåìng lm cho chỉång trçnh tråí nãn khọ âc, khọ hiãøu Âãø sỉí dủng âỉåüc chụng, NSD Láûp trçnh lägich trong Prolog 130 phi hãút sỉïc chụ Vê dủ sỉí dủng nhạt càõt â tçm säú min thay âäøi ngỉỵ nghéa : minimum_cut( X, Y, X ) :X =< Y, ! minimum_cut( X, Y, Y ) Trong. .. xạc våïi phẹp ph âënh trong Toạn hc Chàóng hản nãúu trong chỉång trçnh cọ âënh nghéa quan hãû man, m ta âỉa ra mäüt cáu hi âải loải nhỉ : ?- not( man( marie)) Khi âọ, Prolog s tr låìi No nãúu â cọ âënh nghéa man( marie), tr låìi Yes nãúu chỉa cọ âënh nghéa nhỉ váûy Tuy nhiãn, khi tr låìi No, khäng phi Prolog nọi ràòng «Marie khäng phi l mäüt ngỉåìi», m nọi ràòng «Khäng tçm tháúy trong chỉång trçnh thäng... khiãúm khuút ny Trong vê dủ sau âáy, mäüt chỉång trçnh Prolog sỉí dủng k thût quay lui kẹm hiãûu qu Ta cáưn xạc âënh cạc vë trê m tỉì âọ chỉång trçnh bàõt âáưu quạ trçnh quay lui Ta xẹt hm báûc thang Ta cọ ba quy tàõc xạc âënh quan hãû giỉỵa hai trủc X v Y nhỉ sau : 1 Nãúu X < 3 thç Y = 0 2 Nãúu X ≤ 3 v X < 6 thç Y = 2 3 Nãúu X ≤ 6 thç Y = 4 Ta viãút thnh quan hãû nhë phán f( X, Y ) trong Prolog nhỉ ... kãút qu Prolog tr låìi cạc cáu hi sau : ?- [1,2,3] = [1|X] ?- [1,2,3] = [1,2|X] ?- [1 | [2,3]] = [1,2,X] ?- [1 | [2,3,4]] = [1,2,X] ?- [1 | [2,3,4]] = [1,2|X] ?- b(o,n,j,o,u,r) = L ?- bon(Y)... (3) gi (4) gi (5) gi (6) gi length([1, 2, 3], N) -> length([2, 3], N’) -> length([3], N’’) -> length([ ], N’’’) -> N’’ is + -> N’ is + -> N is + -> N’’’ = N’’ = N’ = N=3 Våïi is, ta â âỉa vo mäüt... viãút thnh quan hãû nhë phán f( X, Y ) Prolog sau : f( X, 0) :- X < f( X, 2) :- =< X, X < f( X, 4) :- =< X % lût % lût % lût 117 Láûp trçnh lägich Prolog 118 Y - + + + + + + + + + X Hçnh I.1.Hm báûc

Ngày đăng: 25/01/2016, 02:42

Từ khóa liên quan

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

Tài liệu liên quan