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
Xem thêm: Tài liệu Lập trình Prolog_chương 4-5 ppt, Tài liệu Lập trình Prolog_chương 4-5 ppt