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ỉí dủng append, ta cng cọ thãø tçm kiãúm mäüt säú pháưn tỉí trong mäüt danh
sạch. Chàóng hản, tỉì danh sạch cạc thạng trong 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 ngay trỉåïc v thạng âỉïng ngay sau thạng nàm 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 sạch :
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 trong mäüt danh sạch L khäng. Báy giåì bàòng cạch sỉí dủng
append, ta cọ thãø âënh nghéa lải member nhỉ sau :
member1( X, L ) :- append( L1, [ X | L2], L).
Mãûnh âãư ny cọ nghéa : nãúu X cọ màût trong danh sạch L thç L cọ thãø âỉåüc
phán tạch thnh hai danh sạch, våïi X l âáưu ca danh sạch 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 nhau âãø 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 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
Cáúu 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 [ 1, 2, 3 ] ?
?- remove( a, L, [ 1, 2, 3 ] ).
L = [ a, 1, 2, 3 ];
L = [ 1, a, 2, 3 ];
L = [ 1, 2, a, 3 ];
L = [ 1, 2, 3, a ]
No
Mäüt cạch täøng quạt, phẹp toạn chn insert mäüt pháưn tỉí X vo mäüt danh
sạch List âỉåüc âënh nghéa båíi th tủc remove bàòng cạch sỉí dủng mäüt danh
sạch låïn hån LargerList lm tham âäúi thỉï hai :
insert( X, List, LargerList ) :-
remove( X, LargerList, List ).
Ta â âënh nghéa quan hãû thüc vãư trong th tủc member1 bàòng cạch sỉí
dủng th tủc append. Tuy nhiãn, ta cng cọ thãø âënh nghéa lải quan hãû
thüc vãư trong th tủc måïi member2 båíi th tủc remove bàòng cạch xem mäüt
pháưn tỉí X thüc vãư mäüt danh sạch List nãúu X bë xoạ khi List :
member2( X, List ) :-
remove( X, List, _ ).
III.1.5. Nghëch âo danh sạch
Sỉí dủng append, ta cọ thãø viãút th tủc nghëch âo mäüt danh sạch nhỉ
sau :
reverse ( [ ], [ ] ).
reverse ( [ X | Tail ], R ) :-
reverse (Tail, R1 ),
append(R1, [X], R).
?- reverse( [ a, b, c , d, e, f ] , L).
L = [f, e, d, c, b, a]
Yes
106 Láûp trçnh lägich trong Prolog
Sau âáy l mäüt th tủc khạc âãø nghëch âo mäüt danh sạch nhỉng cọ sỉí
dủng hm bäø tråü trong thán th tủc :
revert(List, RevList) :-
rev(List, [ ], RevList).
rev([ ], R, R).
rev([H|T], S, R) :-
rev(T, [H|S], R).
?- revert( [ a, b, c , d, e, f ] , R).
R = [f, e, d, c, b, a]
Yes
Sỉí dủng reverse, ta cọ thãø kiãøm tra mäüt danh sạch cọ l âäúi xỉïng
(palindrome) kay khäng :
palindrome(L) :-
reverse( L, L ).
?- palindrome([ a, b, c , d, c, b, a ]).
Yes
III.1.6. Danh sạch con
Ta xáy dỉûng th tủc sublist nháûn hai tham âäúi l hai danh sạch L v S
sao cho S l danh sạch con ca L nhỉ sau :
?- sublist( [ c, d, e ], [ a, b, c , d, e, f ] )
Yes
?- sublist( [ c, e ], [ a, b, c , d, e, f ] )
No
Ngun l âãø xáy dỉûng th tủc sublist tỉång tỉû th tủc member1, màûc d
åí âáy quan hãû danh sạch con täøng quạt hån.
L
L
XL2
L3SL1
L2
[ X | L2 ]
L1
member( X, L )
sublist( S, L )
Hçnh III.3. Cạc quan hãû member v sublist.
Cáúu trục danh sạch 107
Quan hãû danh sạch con âỉåüc mä t nhỉ sau :
S l mäüt danh sạch con ca L nãúu :
1. Danh sạch L cọ thãø âỉåüc phán tạch thnh hai danh sạch L1 v L2, v
nãúu
2. Danh sạch L2 cọ thãø âỉåüc phán tạch thnh hai danh sạch S v L3.
Nhỉ â tháúy, viãûc phán tạch cạc danh sạch cọ thãø âỉåüc mä t båíi quan hãû
ghẹp append.
Do âọ ta viãút lải trong Prolog nhỉ sau :
sublist( S, L ) :-
append( L1, L2, L ), append( S, L3, L2 ).
Ta tháúy th tủc sublist ráút mãưm do v do váûy cọ thãø sỉí dủng theo nhiãưu
cạch khạc nhau. Chàóng hản ta cọ thãø liãût kã mi danh sạch con ca mäüt
danh sạch â cho nhỉ sau :
?- sublist( S, [ a, b, c ] ).
S = [ ];
S = [ a ];
S = [ a, b ];
S = [ a, b, c ];
S = [ b ];
III.2. Hoạn vë
Âäi khi, ta cáưn tảo ra cạc hoạn vë ca mäüt danh sạch. Ta xáy dỉûng quan
hãû permutation cọ hai tham biãún l hai danh sạch, m mäüt danh sạch l hoạn
vë ca danh sạch kia. Ta s táûn dủng phẹp quay lui nhỉ sau :
?- permutation( [ a, b, c ], P ).
P = [ a, b, c ];
P = [ a, c, b ];
P = [ b, a, c ];
Ngun l hoảt âäüng ca th tủc swap dỉûa trãn hai trỉåìng håüp phán
biãût, tu theo danh sạch thỉï nháút :
1. Nãúu danh sạch thỉï nháút räùng, thç danh sạch thỉï hai cng phi räùng.
108 Láûp trçnh lägich trong Prolog
2. Nãúu danh sạch thỉï nháút khạc räùng, thç nọ s cọ dảng [ X | L ] v âỉåüc
tiãún hnh hoạn vë nhỉ sau : trỉåïc tiãn hoạn vë L âãø nháûn âỉåüc L1, sau
âọ chn X vo táút c cạc vë trê trong L1.
L1 l mäüt hoạn vë ca L
Chn X tải mäüt vë trê âãø nháûn âỉåüc mäüt hoạn vë ca [ X | L ]
X L
hoạn vë L
L1
Hçnh III.4. Mäüt cạch xáy dỉûng hoạn vë permutation ca danh sạch [ X | L ].
Ta nháûn âỉåüc hai mãûnh âãư tỉång ỉïng våïi th tủc nhỉ sau :
permutation( [ ], [ ] ).
permutation( [ X | L ], P ) :-
permutation( L, L1 ), insert( X, L1, P ).
Mäüt phỉång phạp khạc l loải b pháưn tỉí X khi danh sạch âáưu tiãn,
hoạn vë pháưn cn lải ca danh sạch ny âãø nháûn âỉåüc danh sạch P, sau âọ
thãm X vo pháưn âáưu ca P. Ta cọ chỉång trçnh khạc permutation2 nhỉ sau :
permutation2( [ ], [ ] ).
permutation2( L, [ X | P ] ) :-
remove( X, L, L1 ), permutation2( L1, P ).
Tỉì âáy, ta cọ thãø khai thạc th tủc hoạn vë, chàóng hản (chụ khi chảy
Arity Prolog cáưn g vo mäüt dáúu cháúm pháøy ; sau ->) :
?- permutation( [ red, blue, green ], P ).
P = [ red, blue, green ];
P = [ red, green, blue ];
P = [ blue, red, green ];
P = [ blue, green, red ];
P = [ green, red, blue ];
P = [ green, blue, red ];
Yes
Hồûc nãúu sỉí dủng permutation theo cạch khạc nhỉ sau :
?- permutation( L, [ a, b, c ] ).
Prolog s rng büc liãn tiãúp cho L âãø âỉa ra 6 hoạn vë khạc nhau cọ thãø.
Tuy nhiãn, nãúu NSD u cáưu mäüt gii phạp khạc, Prolog s khäng bao giåì
Không có nhận xét nào:
Đăng nhận xét