1 / 45

Programski jezik PROLOG

Programski jezik PROLOG. 1. Osnovni mehanizmi in elementi 2 2. Vaje na primeru družinskega drevesa 6 3. Strukture in rekurzija 20 4. Samostojno delo in predstavitev 41. Literatura: Ivan BRATKO: Prolog in umetna inteligenca Igor KONONENKO: Uvod v Prolog

hoai
Download Presentation

Programski jezik PROLOG

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programski jezik PROLOG 1. Osnovni mehanizmi in elementi 2 2. Vaje na primeru družinskega drevesa 6 3. Strukture in rekurzija 20 4. Samostojno delo in predstavitev 41 • Literatura: • Ivan BRATKO: Prolog in umetna inteligenca • Igor KONONENKO: Uvod v Prolog • ftp://lopes1.fov.uni-mb.si/pub/pes/vaje_pes.zip

  2. 1. Prolog in ostali jeziki PROGRAMSKI JEZIKI PROLOG ostali razlika? deskriptiven proceduralni

  3. Prilagajanje (pattern matching) Drevesna org. podatkovnih struktur Avtomatsko vračanje (backtracking) . do while EOF IF A=B ... MOVE ana to B . liza ... . ana janez [] end do 1.1. Osnovni mehanizmi prologa

  4. strukture enostavni objekti uporabniške seznam (list) spremenljivke konstante [ana, 2, miza] vsebujejo vsak tip objekta atomi števila mama bojan 'Bojan' 2 -345 98.321 ? 698415 1.2. Objekti v prologu X _29 Seznam_oseb _

  5. Dejstva • Vedno držijo • Na koncu pika • Vprašanja • Cilj, ki ga mora • prolog dokazati z • uporabo pravil in • dejstev • Na koncu vprašaj • Pravila • Zaključek :- • pogojni del • V pogojnem • delu so lahko • prologovi predikati, • pravila in dejstva, • ločeni z vejico. • Na koncu pika 1.3. Vrste prologovih stavkov 7 8 12

  6. tomaž petra bojan liza ana pavla janez 2. Primer družinskega drevesa • Petra in Tomaž sta Bojanova starša • Bojan in Liza sta Pavlina starša • itd... • Podani so samo znani odnosi!

  7. 2.1. Dejstva Dejstva opišemo z relacijami in njihovimi atributi: relacija (atribut1, atribut2,...atributn). V primeru družinskega drevesa bi izgledala vsa dejstva, opisana kot program v prologu, na sledeči naèin: stars(petra, bojan). %Petra je starš Bojanu stars(tomaz, bojan). stars(bojan, ana). stars(bojan, pavla). stars(liza, pavla). stars(pavla, janez).

  8. 2.2. Vprašanja Ko smo prologu posredovali podatke o relaciji stars, mu lahko zastavimo vprašanja o njej. Vprašanje zastavimo tako, da uporabimo ime relacije in znak vprašaj (?). Če nas zanima, ali je Bojan Anin starš, potem vtipkamo: stars(bojan, ana)? Prolog nam odgovori z **yes Na vprašanje stars(tomaz, liza)? pa bo odgovoril **no ker tega dejstva nima zapisanega v programu. Prav tako bomo dobili nikalen odgovor na vprašanje stars(bojan, klemen)? ker program o Klemenu ne ve ničesar.

  9. 2.3. Vprašanja s spremenljivkami Postavimo pa lahko tudi bolj zanimiva vprašanja npr.: Kdo je Anin starš? Da bi to izvedeli, uporabimo na mestu atributa, kjer je po dogovoru starš, spremenljivko: stars(X, janez)? Prolog nam tokrat ne odgovori z **yes, temveč navede tudi vrednost spremenljivke X, pri kateri je stavek resničen: X=pavla Odgovor prolog najde s prvim mehanizmom: prilagajanjem. Po Bojanovih otrocih lahko vprašamo: stars(bojan, X)? Odgovorov je tokrat več: X=ana X=pavla Več odgovorov nam posreduje prolog s svojim drugim mehanizmom: avtomatskim vračanjem.

  10. Kako delujeta oba mehanizma skupaj, pa lahko preverimo z zahtevo, naj nam prikaže kdo je čigav otrok. Drugačna formulacija tega vprašanja je: Poišči takšna X in Y, da bo X starš Y. 2.3. V prologu se to zapiše: stars(X,Y)? Prolog nam sedaj izpiše vse pare starš - otrok: X=petra Y=bojan X=tomaz ... Zaradi boljše čitljivosti izpisa pa lahko namesto imen spremenljivk X in Y uporabimo imeni Stars in Otrok: stars(Stars, Otrok)? Sedaj dobimo odgovore, ki so bolj jasni: Stars=petra Otrok=bojan ...

  11. St_stars stars Vmes stars janez logični IN Kako bi prolog lahko vprašali, komu je Janez vnuk?2.3. Relacije vnuk nimamo zapisane v programu, toda ker vemo, da je vnuk oseba, ki ima svoje starše in ti morajo imeti svoje starše, lahko zapišemo to vprašanje v dveh korakih: 1. Kdo je Janezov starš? Naj bo to Vmes. 2. Kdo je starš od Vmes? Naj bo to St_stars. V prologu to zapišemo z zaporedjem dveh vprašanj: stars(Vmes, janez), stars(St_stars, Vmes)? Kaj se zgodi, če vprašanje obrnemo? stars(X, Y), stars(Y,janez)? Bi lahko izvedeli, kdo je Janezova mama?

  12. logični ČE Dodatna dejstva za družinsko drevo: punca(petra). fant(bojan). punca(liza). fant(tomaz). punca(pavla). fant(janez). punca(ana). 2.4. Pravila zaključek :- pogojni del. glava pravila :- telo pravila. goal :- subgoals.

  13. Definirajmo mamo! M je mama O-ju, če je M starš O-ju in M je punca. mama(M,O) :- stars(M,O), punca(M). Naloge: Babica? (lahko uporabite definicijo mame) Sestra? Pri definiciji sestre bo potrebno uporabiti negacijo: ... not(X=Y). % Uspe, če sta X in Y različna. Teta? (lahko uporabite definicijo sestre) Nečak? Oba starša?

  14. b a d d b 1 c d 2 c c 3 b c 4 c d a a a Zlaganje kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke?

  15. b a d d b 1 c d 2 c c 3 b c 4 c d a a a Zlaganje kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke? d b c b b c a d a d d c c c a a

  16. b a d d b 1 c d 2 c c 3 b c 4 c d a a a Zlaganje kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke? d b 1. Opišite kvadrate - dejstva 2. Opišite pravila zlaganja c b b c a d a d d c c c a a

  17. b a d d b 1 c d 2 c c 3 b c 4 c d a a a Zlaganje kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke? d b 1. Opišite kvadrate - dejstva kv (štev., črka, črka...). 2. Opišite pravila zlaganja prav(K1, K2, K3, K4) :- kv(K1, _, C1, C2, _), kv(K2, ... c b b c a d a d d c c c a a

  18. b a d d b 1 c d 2 c c 3 b c 4 c d a a a Zlaganje kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke? k(1, b,c,d,b). k(2, a,c,a,d). k(3, d,b,a,c). k(4, d,c,a,c). prav(K1,K2,K3,K4) :- k(K1, _,C1,C2,_), k(K2, _,_,C3,C1), k(K3, C3,_,_,C4), k(K4, C2,C4,_,_). d b c b b c a d a d d c c c a a

  19. b b b b 1 1 c c d d Zlaganje kvadratov z vrtenjem kvadratov Kako zložiti kvadrate, da dobimo skupaj iste črke, pri tem pa kvadrate lahko vrtimo? 90o 180o Zg,D, Sp,L vrt(K, ?, ?, ?, ?, 90) :- k(K, A, B, C, D). L, L, Zg, Zg, D, D, Sp Sp Zg,D, Sp,L vrt(K, ?, ?, ?, ?, 180) :- k(K, A, B, C, D). Izpisovanje posameznih odgovorov: only_one?, nato s podpičjem( ; ) in tipko enter izpisujete posamezne.

  20. funktor argumenti 3. Strukture in rekurzija 3.1. Uporabnikove strukture Želimo zapisati podatke o neki osebi v formatu človek(ime, občina bivanja, datum rojstva). Brez strukturiranja bi zapis lahko izgledal takole: clovek(iztok, ’Tržič’, 11, jan, 1961). Podatek o datumu lahko združimo v strukturo: podatekstruktura datum: 11. januar 1961 datum(11, jan, 1961) clovek(iztok, ’Tržič’, dr(11, jan, 1961)). clovek(Ime, Kraj, D_R)?

  21. 3.1. trikotnika dva kroga in krog z luknjo skupaj pravokotnik miza Kako bi opisali tako zložene like? je_na (kaj, kje). je_na(pravok, miza). je_na(skupaj(krog, k_z_l, krog), pravok). je_na(skupaj(l_trik, d_trik), skupaj(krog, k_z_l, krog)). Kako bi poiskali v vaši strukturi krog z luknjo (k_z_l)? Kako bi definirali strukturo z neznanim številom elementov?

  22. . . kruh . pivo prazen seznam (konec seznama) . sir [] meso 3.2. Seznam (list) Kako bi v prologu zapisali, kaj imamo v hladilniku? Uporabimo drevesno strukturo seznam. imamo ([kruh, pivo, sir, meso]). [, AltGr-F], AltGr-G imamo .(kruh, .(pivo, .(sir, .(meso, [])))).

  23. 3.2. Seznam (list) Kako bi v prologu zapisali, kaj imamo v hladilniku? Uporabimo drevesno strukturo seznam. [, AltGr-F], AltGr-G imamo ([kruh, pivo, sir, meso]). imamo .(kruh, .(pivo, .(sir, .(meso, [])))). . . kruh . pivo prazen seznam (konec seznama) . sir [] meso Seznam lahko vedno prerežemo na prvi element (glavo) in ostanek (rep): [Glava | Rep] ali drugače zapisano: [Glava, ..Rep]|, AltGr-W

  24. 3.3. Rekurzija Živel je mož, imel je psa, lepo ga je učil. Nekoč ukrade kos mesa, zato ga je ubil. Na grob napiše: Živel je mož, imel je psa, lepo ga je učil. Nekoč ukrade kos mesa, zato ga je ubil. Na grob napiše: Živel je mož, imel je psa, lepo ga je učil. Nekoč ukrade kos mesa, zato ga je ubil. Na grob napiše: ”Kaj je že to rekurzija?"

  25. 3.3. Preiskovanje seznama z rekurzijo imamo ([kruh, pivo, sir, meso, pivo]). imamo ([Glava | Rep])? Glava = kruh Rep = [pivo, sir, meso, pivo] Napišimo novo relacijo mem! Napišimo novo relacijo mem! Napišimo novo relacijo mem! Kako bi prolog preveril, ali je sir v seznamu? imamo (Seznam), mem (sir, Seznam)? mem (El, [El | Rep]). mem (El, [_ | Rep]) :- mem (El, Rep).

  26. 3.3. Kako deluje preiskovanje seznama (predikat mem)? mem (sir, [kruh, pivo, sir, meso, pivo])? **yes 1.1. mem (El, [El | Rep]). mem (sir, [kruh| pivo, sir, meso, pivo]). 1.2. mem (El, [_ | Rep]):- mem (sir, [_ | pivo, sir, meso, pivo]) :- mem (El, Rep). mem (sir, [pivo, sir, meso, pivo]). Uspe! 2.1. mem (El, [El | Rep]). mem (sir, [ pivo| sir, meso, pivo]). 2.2. mem (El, [_ | Rep]):- mem (sir, [_ | sir, meso, pivo]) :- mem (El, Rep). mem (sir, [sir, meso, pivo]). Uspe! 3.1. mem (El, [El | Rep]). mem (sir, [sir| meso, pivo]). Uspe! Pri sledenju delovanja si lahko pomagate s predikatom trace trace mem?

  27. 3.3. Preiskovanje seznama z omejitvijo iskanja imamo ([kruh, pivo, sir, meso, pivo]). imamo (Seznam), mem (pivo, Seznam)? Seznam = [kruh, pivo, sir, meso, pivo] Seznam = [kruh, pivo, sir, meso, pivo] Če hočemo preprečiti večkratno izpisovanje, uporabimo predikat cut (!) imamo (Seznam), mem (pivo, Seznam),!? Seznam = [kruh, pivo, sir, meso, pivo] Predikat cut prepreči prologovemu mehanizmu avtomatsko vračanje, da se vrne od njega nazaj.

  28. . . . . kruh kruh . . pivo pivo . . sir sir . . meso meso pivo pivo [] [] 3.3. Preiskovanje seznama z omejitvijo iskanja Predikat cut prepreči prologovemu mehanizmu avtomatsko vračanje, da se vrne od njega nazaj. imamo (Seznam), mem (pivo, Seznam),! ? ! pivo pivo S “cut” Brez “cut”

  29. Uporabniške strukture - nadaljevanje je_na(pravok, miza). je_na(skupaj(krog, k_z_l, krog), pravok). je_na(skupaj(l_trik, d_trik), skupaj(krog, k_z_l, krog)). Kako bi v teh dejstvih poiskali krog z luknjo (k_z_l)? 1. Spremenite strukturo skupaj v seznam! 2. Napišite proceduro najdi(X): 2.1. preverite, ali je k_z_l v prvem ali v drugem atributu 2.2. s predikatom mem preiščite oba atributa predikata je_na ! 3. Obogatite izpis s pojasnili, kje je! npr. pravok je na miza Uporabite predikat print (Var, “tekst”, …),

  30. prednik stars naslednik 3.3. Programu o družinskih relacijah dodajmo relacijo prednik. • Definicijo lahko izrazimo z dvema deloma: • prvi del govori o neposrednih prednikih • - neposredni prednik je enostavno starš Za vse P in N velja: P je prednik N, če je P starš N. Zapišite to pravilo v prologu!

  31. 3.3. P stars posredni stars predniki stars N • drugi del pa o posrednih prednikih: • - Rekli bomo, da je P posredni prednik N-ju, • če obstaja med njima veriga ljudi, ki jih • povezuje relacija stars. Pri drugem delu je nekaj več težav, saj moramo določiti verigo starševstva za vsak rod posebej: prednik(P,N) :- %2. gen. stars(P,X1), stars(X1,N). prednik(P,N) :- %3. gen. stars(P,X1), stars(X1,X2), stars(X2,N). prednik(P,N) :- % 4. gen. stars(P,X1), stars(X1,X2), stars(X2,X3), stars(X3,N). ...

  32. P stars V prednik prednik . . . N 3.3. Celoten program je dolg in v našem primeru deluje le do nivoja praprastaršev. Če bi hoteli večjo globino iskanja, bi morali definirati dodatna pravila z več cilji. Druga rešitev pa je rekurzivna definicija drugega dela prednika: Za vsak P in N velja: P je prednik N, če obstaja tak V, da velja: P je starš V in V je prednik N. Zapišite pravilo v prologu!

  33. 3.3. P stars V prednik prednik . . . N Sedaj lahko vprašamo prolog, čigav prednik je Petra: prednik(petra, Naslednik)? Naslednik=bojan Naslednik=ana Naslednik=pavla Naslednik=janez Pri sledenju delovanja si lahko pomagate s predikatom trace trace prednik?

  34. 3.4. Računanje v prologu Za računanje moramo uporabiti operator is Prolog je jezik za simbolično računanje, zato njegov matematični del ni močan. Vse operacije so celoštevilčne: +,- . . . . seštevanje, odštevanje *,/,mod . . množenje, deljenje, ostanek po deljenju ^ . . . . . . potenciranje 2+1? SYNTAX ERROR: Query must be a predicate, not a function A=2+1? A = 2 + 1 A is 2+1? A = 3

  35. Popravite relacijo prednik, da bo računala razliko med generacijami! Na primer: 3.4. Številka za začetno vrednost prednik(petra, Naslednik, Gen, 0)? Naslednik=bojan Gen=1 Naslednik=ana Gen=2 Naslednik=pavla Gen=2 Naslednik=janez Gen=3 Pri sledenju delovanja si lahko pomagate s predikatoma trace in only_one. only_one? trace prednik? trace stars? prednik(petra, Nasl, Gen, 0)?

  36. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje

  37. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje prehrana (malo)? Kosilo za bone. Iščem za: palacinke imaš: jajca kupi: moka imaš: mleko imaš: olje kupi: namaz ** naredi: palacinke Iščem za: juha imaš: testenine kupi: zacimbe - ni dostopno: meso print (’Iščem za: ’, Jed)

  38. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje prehrana nič srednje malo

  39. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje prehrana nič srednje malo - dieta - ... - če kaj imamo, lahko skuhamo... recepti - palačinke: jajca, moka, mleko, olje, namaz - juha: testenine, začimbe, meso

  40. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje prehrana nič srednje malo - dieta - ... - če kaj imamo, lahko skuhamo... - kosilo za bone - ... - za malo denarja lahko kupimo... - če kaj imamo, lahko skuhamo... recepti - palačinke: jajca, moka, mleko, olje, namaz - juha: testenine, začimbe, meso

  41. 4. Samostojno delo Ekspertni sistem o prehrani študentov. denar - nič - malo - srednje prehrana nič srednje malo - halo pizza - ... - za srednje denarja lahko kupimo ... in vse tisto, kot za malo - če kaj imamo, lahko skuhamo... - dieta - ... - če kaj imamo, lahko skuhamo... - kosilo za bone - ... - za malo denarja lahko kupimo... - èe kaj imamo, lahko skuhamo... recepti - palačinke: jajca, moka, mleko, olje, namaz - juha: testenine, začimbe, meso - celo kosilo: juha, testenine, meso, začimbe, solata, palačinke

  42. Ekspertni sistem o prehrani študentov. prehrana (denar) nič srednje malo - halo pizza - ... - dieta - ... - kosilo za bone - ... recepti (jed, sestavine). imamo (sestavine). kupimo (denar, sestavine).

  43. Ekspertni sistem o prehrani študentov. prehrana (denar) nič srednje malo splošno - halo pizza - ... - dieta - ... - kosilo za bone - ... recept za jed Þ seznam sestavin, dostopne sestavine recepti (jed, sestavine). imamo (sestavine). kupimo (denar, sestavine).

  44. Ekspertni sistem o prehrani študentov. prehrana (denar) nič srednje malo splošno - halo pizza - ... - dieta - ... - kosilo za bone - ... recept za jed Þ seznam sestavin, dostopne sestavine na zalogi kupimo (denar) ni dostopno Ali je sestavina na seznamu sestavin, ki jih imamo? Ali je sestavina na seznamu jedi, ki jih lahko kupimo za podani znesek denarja? Sestavina ni dostopna recepti (jed, sestavine). imamo (sestavine). kupimo (denar, sestavine). ... , fail. nikoli ne uspe

  45. Ali je sestavina na seznamu sestavin, ki jih imamo? na_zalogi (Sestavina)? 1. Poiščemo seznam sestavin, ki jih imamo, 2. preiščemo dobljeni seznam, če je sestavina v njem, 3. izpišemo “imaš: sestavina”

More Related