Aleš Horák E-mil: hles@fi.muni.z http://nlp.fi.muni.z/uui/ Seznm: rekurzivní tová struktur uspořáná posloupnost prvků (liovolnýh termů včetně seznmů) operátor./; prázný seznm [].(Hlv,Tělo), lterntivně [Hlv Tělo], Hlv je (typu) prvek seznmu, Tělo je (typu) seznm Osh:.(,[]) [] [ []].(,.(,.(,[]))) [,,] [, []], [ [,]], [,, []], [ [, []]], [ [ [ []]]].(,.(.(,.(,[])),[])) [,[,]] [ [[,]]],...... [1,[[3,3],,e],f1]... Úvo o umělé inteligene /1 1 / 4 memer memer(+rvek,+seznm) true, poku v seznmu je zný prvek 1.. 3. memer(,[ ]). memer(,[ ]). je stručný zápis pro memer(,):-=[ ]. memer(,[ T]) :- memer(,t).? memer(,[,,]). = memer(,[ ]) :- ==. memer(,[ T]) :- memer(,t).? memer(,[,,]).? memer(,[,,]),write(ok),nl,fil. ok ok memer(,[ ]) :- ==. memer(,[ T]) :- \==, memer(,t).? memer(,[,,]),write(ok),nl,fil. ok Úvo o umělé inteligene /1 3 / 4 Úvo o umělé inteligene /1 / 4 el insert preikát el(+a,+,-vysl) smže všehny výskyty prvku A ze seznmu el1(+a,+,-vysl) smže vžy jeen (le poří) výskyt A v seznmu el(,[],[]).? el(1,[1,,1,1,,3,1,1],). el(a,[a T],V) :- el(a,t,v). = [,, 3] el(a,[h T1],[H T]) :- A\=H, el(a,t1,t).? el1(1,[1,,1],). el1(a,[a T],T). = [, 1] ; el1(a,[h T1],[H T]) :- el1(a,t1,t). = [1, ] ; insert(+a,+,-vysl) vkláá postupně (při žáosti o lší řešení) n všehny pozie seznmu prvek A insert1(+a,+,-vysl) vloží A n zčátek seznmu (ve výsleku Vysl) insert(a,,[a ]).? insert(4,[,3,1],). insert(a,[h T1],[H T]):- insert(a,t1,t). = [4,, 3, 1] ; = [, 4, 3, 1] ; = [, 3, 4, 1] ; insert1(,ist,[ ist]). = [, 3, 1, 4] ; Úvo o umělé inteligene /1 4 / 4
permute 1. pomoí insert perm1([],[]).? perm1([1,,3],). perm1([h T],):- perm1(t,v), insert(h,v,). = [1,, 3] ; = [, 1, 3] ; = [, 3, 1] ; = [1, 3, ] ; = [3, 1, ] ; = [3,, 1] ;. pomoí el1 perm([],[]). perm(,[ ]) :- el1(,,1),perm(1,). 3. pomoí ppen perm3([],[]). perm3(,[h T]):- ppen(a,[h B],),ppen(A,B,1), perm3(1,t). Úvo o umělé inteligene /1 5 / 4 využití ppen preikát ppen je všestrnně použitelný: memer(,s) lst(,s) prefix(s,s) suffix(s,s) sulist(s,assbs) jent(,,zs) :- ppen(as,[ s],s). :- ppen(as,[],s). :- ppen(s,as,s). :- ppen(as,s,s). :- ppen(ass,bs,assbs), ppen(as,s,ass). :- ppen(as,[, s],zs). ppen ppen(?seznm1,?seznm,?seznm) Seznm je spojení seznmů Seznm1 Seznm ppen([],,). ppen([h T1],,[H T]) :- ppen(t1,,t). preikát ppen je víesměrný:? ppen([,],[,],). = [,,, ]? ppen(,[,],[,,,]). = [, ]? ppen(,,[,,]). = [] = [,, ]; = [] = [, ]; = [, ] = []; = [,, ] = []; Úvo o umělé inteligene /1 6 / 4 efektivit ppen Efektivní řešení preikátu ppen rozílové seznmy (ifferene lists) Rozílový seznm se zpisuje jko Seznm1-Seznm. Npř.: [,,]... [,,] - [] neo [,,,] - [] neo [,,,,e] - [,e], oeně [,, ] - []... A-A []... [ A]-A Seznm (volná proměnná) slouží jko ukztel n kone seznmu Seznm1 preikát ppen s rozílovými seznmy (ppen l): ppen l(a B,B C,A C).? ppen l([, ],[, ],Z). = [, ] = Z = [,,, ] Úvo o umělé inteligene /1 7 / 4 Úvo o umělé inteligene /1 8 / 4
Tříění seznmů Tříění seznmů Tříění seznmů quiksort Tříění seznmů quiksort preikát qsort(+,-vysl) tříí seznm tehnikou rozěl pnuj prvky 5 M=[3,1,4], qsort(m) M1=[1,3,4] =[5,3,7,8,1,4,7,6] T=[3,7,8,1,4,7,6] Vysl=[1,3,4,5,6,7,7,8] prvky > 5 V=[7,8,7,6], qsort(v) V1=[6,7,7,8] Úvo o umělé inteligene /1 9 / 4 Tříění seznmů quiksort II Tříění seznmů =[H T],H=5 ivie(5,...) ppen - M1.[5].V1 preikát qsort(+,-vysl) tříí seznm tehnikou rozěl pnuj qsort([],[]) :-!. % řez zho lší možnosti řešení qsort([h],[h]) :-!. qsort([h T],) :- ivie(h,t,m,v), qsort(m,m1), qsort(v,v1), ppen(m1,[h V1],). ivie(,[],[],[]) :-!. ivie(h,[k T],[K M],V) :- K=<H,!, ivie(h,t,m,v). ivie(h,[k T],M,[K V]) :- K>H, ivie(h,t,m,v). Úvo o umělé inteligene /1 10 / 4 Uspořáné inární stromy Uspořáné inární stromy preikát qsort l(+,-vysl) efektivnější vrint preikátu qsort s rozílovými seznmy Reprezente inárního stromu: nil prázný strom Hon qsort(,s):- qsort l(,s []). qsort l([],a A). qsort l([h T],A B):- ivie(h,t,m,v), qsort l(v,a1 B), qsort l(m,a [H A1]). % ppen l(a [H A1],A1 B,A B) ivie(,[],[],[]):-!. ivie(h,[k T],[K M],V):- K=<H,!, ivie(h,t,m,v). ivie(h,[k T],M,[K V]):- K>H, ivie(h,t,m,v). t(,hon,) strom říkly stromů: t(nil,8,nil) 8 t(t(nil,1,nil),,t(nil,3,nil)) 1 3 t(nil,,t(t(nil,3,nil),4,t(nil,5,nil))) 4 3 5 Úvo o umělé inteligene /1 11 / 4 Úvo o umělé inteligene /1 1 / 4
řiávání o inárního stromu řiávání o inárního stromu lef(+t,+,-vysl) přiá o inárního stromu T honotu n správnou pozii vzhleem k setříění stromu reikát lef není víesměrný nelze efinovt: lef(nil,,t(nil,,nil)). lef(t(eft,,right),,t(eft,,right)). lef(t(eft,root,right),,t(eft1,root,right)) :- Root>,lef(eft,,eft1). lef(t(eft,root,right),,t(eft,root,right1)) :- Root<,lef(Right,,Right1).? lef(nil,6,t),lef(t,8,t1), lef(t1,,t), lef(t,4,t3), lef(t3,1,t4). T4 = t(t(t(nil, 1, nil),, t(nil, 4, nil)), 6, t(nil, 8, nil))? lef(t(t(t(nil,1,nil),,t(t(nil,3,nil),4,t(nil,5,nil))), 6,t(t(nil,7,nil),8,t(nil,9,nil))), 10, T). T = t( t( t(nil, 1, nil),, t( t(nil, 3, nil), 4, t(nil, 5, nil))), 6, t( t(nil, 7, nil), 8, t( nil, 9, t(nil, 10, nil)))) el(t,,t1) :- lef(t1,,t). A elete() A? Úvo o umělé inteligene /1 13 / 4 Úvo o umělé inteligene /1 14 / 4 správný postup: poku je oeírná honot v listu nhrí se honotu nil jestliže je le v kořenu (po)stromu je nutné tento (po)strom přestvět řestv inárního stromu při ostrňování kořene : ( ) ellef(+t,+,-vysl) ostrní ze stromu T uzel s honotou ellef(t(nil,,right),,right). ellef(t(eft,,nil),,eft). ellef(t(eft,,right),,t(eft,,right1)):- elmin(right,,right1). ellef(t(eft,root,right),,t(eft1,root,right)):- <Root,ellef(eft,,eft1). ellef(t(eft,root,right),,t(eft,root,right1)):- >Root,ellef(Right,,Right1). elmin(t(nil,,r),,r). elmin(t(eft,root,right),,t(eft1,root,right)) :- elmin(eft,,eft1). Úvo o umělé inteligene /1 15 / 4 Úvo o umělé inteligene /1 16 / 4
Jiný způso vkláání: > (?T,+,?Vysl) přiá o inárního stromu T uzel s honotou s přeuspořááním stromu (jko kořen neo jinm při nvrení) + < 1 1 % přiej jko kořen (T,,T1) :- root(t,,t1). % neo kmkoliv o stromu (se zhováním uspořáání) umožní mzání (t(,,r),,t(1,,r)) :- gt(,),(,,1). (t(,,r),,t(,,r1)) :- gt(,),(r,,r1). root(nil,,t(nil,,nil)). root(t(,,r),,t(1,,t(,,r))) :- gt(,),root(,,t(1,,)). root(t(,,r),,t(t(,,r1),,r)) :- gt(,),root(r,,t(r1,,r)). root(t(,,r),,t(,,r)). Definie preikátu gt(,) n konečném uživteli. Funguje i oráeně lze efinovt: el(t,,t1) :- (T1,,T). Úvo o umělé inteligene /1 17 / 4 Výpis inárního stromu Výpis inárního stromu pomoí oszení zorzujeme úroveň uzlu ve stromu elkové uspořáání uzlů (strom je tey zorzen nležto ) t( t( 5, t( t(nil,1,nil), 3, t(nil,4,nil)), t(nil,6, t(nil,7,nil)), 8, t(nil,9,nil))) 1 show(+t) vypíše osh uzlů stromu T se správným oszením show(t) :- show(t,0). show(nil, ). show(t(,,r),inent) :- In is Inent+,show(R,In),t(Inent), write(),nl,show(,in). Úvo o umělé inteligene /1 19 / 4 5 8 3 9 6 4 1 7 5 8 3 9 6 4 7 Úvo o umělé inteligene /1 18 / 4 říkly způsoů reprezente grfů (v rologu): 1 term grph(v,e), ke V je seznm vrholů grfu E je seznm hrn grfu. Kžá hrn je tvru e(v1,v), ke V1 V jsou vrholy grfu. G = grph([,,,],[e(,),e(,),e(,),e(,)]). znázorňuje orientovný grf Úvo o umělé inteligene /1 0 / 4
Cesty v grfeh vgrph(v,e) efinuje uspořánou vojii seznmů vrholů (V) hrn (E). Hrny jsou tvru (oteniv, KonovyV, CenHrny). t G = vgrph([s,t,u,v],[(s,t,3),(t,v,1), (t,u,5),(u,t,),(v,u,)]). u znázorňuje orientovný ohonoený grf 3 grf může ýt uložen v progrmové tázi jko posloupnost fktů (i prviel). ege(g3,,). ege(g3,,). ege(g3,,). ege(g3,,). ege(,a,b) :- ege(,b,a). s 3 1 íky přinému prvilu přestvuje neorientovný grf (ez prvil je orientovný). Úvo o umělé inteligene /1 1 / 4 Cesty v grfeh 5 v Cesty v grfeh Cest v neorientovném grfu: pth(+a,+z,+grf,-cest) v grfu Grf nje z vrholu A o vrholu Z estu Cest (Grf je ve tvru 1). pth(a,z,grf,cest) :- pth1(a,[z],grf,cest). pth1(a,[a Cest1],,[A Cest1]). pth1(a,[ Cest1],Grf,Cest) :- jent(,,grf), \+ memer(,cest1), pth1(a,[, Cest1],Grf,Cest). \+ Cíl nege, not jent(,,grph(es,eges)) :- memer(e(,),eges);memer(e(,),eges). Úvo o umělé inteligene /1 / 4 Kostr grfu Cesty v grfeh II. Kostr grfu Cest v ohonoeném neorientovném grfu: pth(+a,+z,+grf,-cest,-cen) hleá liovolnou estu z jenoho vrholu o ruhého její enu v ohonoeném neorientovném grfu. Kostr grfu je strom, který prohází všehny vrholy grfu jehož hrny jsou zároveň hrnmi grfu. stree(grph,tree) :- memer(ege,grph),spre([ege],tree,grph). pth(a,z,grf,cest,cen) :- pth1(a,[z],0,grf,cest,cen). pth1(a,[a Cest1],Cen1,Grf,[A Cest1],Cen1). pth1(a,[ Cest1],Cen1,Grf,Cest,Cen) :- jent(,,cen,grf), \+ memer(,cest1), Cen is Cen1+Cen, pth1(a,[, Cest1],Cen,Grf,Cest,Cen). jent(,,cen,grf) :- memer( /Cen,Grf);memer( /Cen,Grf). Grph je seznm hrn ve tvru -/Cen (viz jent). Úvo o umělé inteligene /1 3 / 4 spre(tree1,tree,grph) :- ege(tree1,tree,grph), spre(tree,tree,grph). spre(tree,tree,grph) :- \+ ege(tree,,grph). % nelze přit hrnu % přiej hrnu ez vzniku yklu ege(tree,[a B Tree],Grph) :- jent(a,b,grph),noe(a,tree), \+ noe(b,tree). jent(a,b,grph) :- memer(a B,Grph);memer(B A,Grph). noe(a,grph) :- jent(a,,grph).? stree([,,, ],T). T = [,, ] Úvo o umělé inteligene /1 4 / 4