Prolog-P nowak/se/  · Prolog-ProgrammingInLogic AgnieszkaNowak 28kwietnia2008 1 Prolog-ProgrammingInLogic

  • View
    219

  • Download
    1

Embed Size (px)

Text of Prolog-P nowak/se/  · Prolog-ProgrammingInLogic AgnieszkaNowak 28kwietnia2008 1...

  • Prolog - Programming In Logic

    Agnieszka Nowak

    28 kwietnia 2008

    1 Prolog - Programming In Logic

    Naley do klasy jzykw deklaratywnych, gdzie opisuje si rozwizywany pro-blem, a nie tak jak przy jzykach imperatywnych (proceduralnych) - w ktrychwskazuje si algorytm rozwizania problemu. Dziki zautomatyzowaniu procesudowodzenia twierdze logicznych, a szczeglnie dziki opracowaniu przez Ro-binsona w 1965 roku tzw. zasady rezolucji - stao si moliwe automatycznewywnioskowania rozwizania na podstawie zbioru formu logicznych opisuj-cych problem.Programowanie w prologu skada si z:

    1. deklarowania Faktw dotyczcych obiektw i zwizkow midzy nimi.2. Definiowania Regu dotyczyczcych obiektw i zwizkw midzy nimi.3. Zadawania pyta o obiekty i zwizki midzy nimi.

    2 Budowanie baz wiedzy w Prologu

    Jak wiadomo baza wiedzy to zazwyczaj zbir zoony z faktw i regu.

    2.1 Fakty proste

    Przykadem prostego faktu odzwierciedlajcego zdanie: Jest sonecznie. jest pre-dykat zapiany nastpujco:sunny.W jzyku Prolog spytamy o prawdziwo tego stwierdzenie nastpujco:? sunny.A wic uywamy przed nazw predykatu znakw ?, ktre oznaczaj pytanie oprawdziwo danego faktu. Oczywicie stwierdzenia (fakty) nie musz by jedy-nie funktorami jednoargumentowymi, ale mog by rwnie wieloargumnetowe.Oglna skadnia predykatu wyglda nastpujco:relation(< argument1 >, < argument2 >, ...., < argumentN >).,gdzie relation oznacza po prostu nazw funkcji penionej przez dany predykat,

    1

  • za parametry: < argument1 >, < argument2 >, ...., < argumentN >oznaczaj ko-lejne argumenty tej funkcji. I tak, w jzyku Prolog, stwierdzenie: likes( john,mary).oznacza, e John lubi mary.

    2.2 Zadawanie pyta i interpretacja odopowiedzi na pytania ?

    Kiedy ju wiemy jak zapisywa stwierdzenia (fakty) zawsze moemy pyta o ichprawdziwo. Jeli przykadowy program wyglda nastpujco:eats( f red, oranges). /* Fred je pomaracze */eats(tony, apple). /* Tony je jabko */eats( john, apple). /* John je jabko */To jeli teraz zapytamy:? eats( f red, oranges)./* czy to pasuje do zapisw w bazie wiedzy w Prologu?.*/Wida, i tak, wic Prolog odpowie:yes/* yes, poniewa dokadnie pokrywa si to z 1 zapisem w bazie. */Podobnie zadajc pytanie:? eats( john, apple).Uzyskamy odpowied:yesZa jeli spytamy:? eats(mike, apple).prolog odpowie:no/* poniewa nie ma adnej relacji midzy mike i apple, gdy w naszej bazie niema wcale informacji o mike */

    2.3 Zmienne w Prologu

    W prologu nie musimy zadawa konretnych pyta. Moemy na przykad zawszezapyta w naszym przykadowym zbiorze Kto je jabko? albo Co je Fred ?Jeli wic dla naszego przykadowego programu:eats(fred,oranges).Jeli zapytamy:? eats( f red,what).Prolog odpowie ku naszemu zaskoczeniu:no.Powodem tego jest fakt, e Prolog bdzie szuka dopasowania w swojej bazief red i what. Jeli natomiast chcielimy uy zmiennej w Prologu, to s one tutajwyrnione przez fakt, e zaczynaj si zawsze od wielkiej litery.Przykadowo:X /* pojedyncza litera */VaRiAbLe /* wyraz zaczynajcy si od wielkiej litery */Two words /* dwa wyrazy oddzielone znakiem podkrelenia */Zatem w naszym przypadku, gdy chcielimy spyta Co je Fred? powinnimyuy np skadni:? eats( f red,What)Wwczas Prolog odpowie:

    2

  • What = orangesyesPodobnie moemy spyta: Kto je pomaracze? zapisujco owo zapytanie tak:? eats(Who, oranges).W tym wypadku, Prolog odpowie:Who = f redyesJeli za spytamy:? eats(Who, apple).Pierwsz odpowiedzi bdzie: [Who = tony] poniewa jest to pierwsze dopaso-wanie znalezione w bazie. Teraz Prolog bdzie czeka a wcisnie jaki znak. Jeliwybierzesz znak [enter] Prolog bdzie oczekiwa no nowe pytanie. Jeli za uy-jesz klawisza [; ], Prolog bdzie dalej przeszukiwa swoj baz w celu znalezieniakolejnych dopasowa (podstawie za zmiennWho). W ten sposb Prolog znaj-dzie kolejn odpowied [Who = john]. Jeli teraz ponownie wciniemy znak: [; ]prolog ponownie bdzie chcia szuka kolejnych dopasowa. Wynikiem jednakbdzie odpowied: [no] poniewa faktycznie w bazie nie ma wicej dopasowa(unifikacji) dla tego stwierdzenia.? eats(Who, apple).Who = tony;Who = john;no

    2.4 Reguy w Prologu

    Rozwamy zdanie: Wszystki jabka to owoce. Takie zdanie moemy wyrazi rw-nie w Prologu, nastpujco:f ruit(X) : apple(X).Zdanie to mona odczyta jako: X jest owocem jeli X jest jabkiem.Teraz rozwamy zdanie (fakt): Gloster jest typem jabka.W Prologu zapiszemy to tak:f ruit(X) : apple(X).apple(gloster).Jeli teraz spytamy w Prologu:? f ruit(gloster).Uzyksamy odpowied:yesProlog uyje zdefiniowanej przez nas reguy, zgodnie z ktr X jest owocem,jeli jest jabkiem. Zatem dziki stwierdzeniu: apple(gloster), Prolog wygenerujenowy fakt: f ruit(gloster). W reguach rwnie moemy stosowa zmienne. Zatemmoemy spyta: Jaki X jest owocem?:? f ruit(X).na co Prolog powinien odpowiedzie:X = glosterOczywicie reguy mog mie w czci przesankowej (warunkowej) wicej ele-mentw poczonych operatorem logicznym and lub or. Czasami bowiem, dotego samego stwierdzenia moemy doj rnymi drogami. Przykadowo, zda-

    3

  • nie: Co jest smaczne jeli jest owocem i ma sodki smak lub jeli zawiera cukier.To zdanie mona nastpujco zapisa w Prologu:tasty(X) : /* co jest smaczne jeli */f ruit(X), /* jest owocem i */is sweet(X). /* jest sodkie */tasty(X) : /* albo co jest smaczne jeli */has sugar(X) /* zawiera cukier */Zatem w takim programie, s 2 drogi, aby dowiedzie, si czy co jest smaczneczy nie. Jeli pierwsza regua nie pozwoli wykaza prawdziwoci tego stwierdze-nia, to wwczas Prolog bdzie probowa wykaza prawdziwo drugiej reguy.Naley pamita, i tak samo nazwane zmienne w regule s traktowane jako tasama zmienna. Zatem takie same zmienne w rnych reguach s traktowanejako rne zmienne i s w tym wzgldzie niezalene. Przykadowo w programie:tasty(X) : f ruit(X), is sweet(X).tasty(X) : has sugar(X).Prolog bdzie traktowa nasze zapisy jako:tasty(X1) : f ruit(X 1), is sweet(X 1).tasty(X2) : has sugar(X 2).

    3 rodowisko do programowania w Prologu

    Krtkie fakty dotyczce Prolog:

    Prolog - stworzony w 1971 roku przez Alaina Colmeraurera i PhillipeaRoussela na Uniwersytecie w Marsylii.

    Podczas pracy nad zastosowaniem logiki predykatow (klauzul Horna) doNLP.

    Pierwszy kompilator Prologu powstal w Algolu.

    Od polowy lat 70-tych wspolpraca z Robertem Kowalskim na Uniwersy-tecie w Edynburgu (Szkocja).

    3.1 Implementacje - Narzdzia darmowe

    Ciao Prolog

    ECLIPSE

    GNU Prolog

    SWI-Prolog

    YAP Prolog

    4

  • Rysunek 1: Konsola GNU Prolog

    3.2 Implementacje - Narzdzia komercyjne

    ALS Prolog

    Amzi! Prolog

    IF Prolog

    LPA Prolog

    MINERVA

    SICStus Prolog

    3.3 Czym jest GNU Prolog ?

    GNU Prolog (gprolog), to otwarte oprogramowanie pod GNU General PublicLicense.rdo: [http://gnu-prolog.inria.fr].Jest to narzdzie w peni darmowe, autorem jest Daniel Diaz, napisane w jzykuC.Prcz wbudowanego kompilatora, zawiera take interpreter typu (top-level) idebugger.

    3.4 Czym jest SWI Prolog ?

    SWI-Prolog to rwnie samodzielne darmowe rodowisko do programowania wPrologu. rdo: [http://www.swi-prolog.org]. Zawiera edytor i program uru-

    5

    http://gnu-prolog.inria.frhttp://www.swi-prolog.org

  • Rysunek 2: Konsola SWI Prolog

    chomieniowy. Wraz z narzdziem XPCE pozwala na edycje programw w Pro-logu nie w notatniku, a wanie w edytorze XPCE, pozwalajcym m.in. na ko-lorowanie skadni programu.

    6

  • Rysunek 3: Edytor XPCE dla SWI Prolog

    4 Prolog w praktyce

    4.1 Przykadowa baza: [prolog.pl]

    4.2 Wnioskowanie na bazie [prolog.pl]

    7

  • 8

  • 9

  • 10

  • 5 Prolog w przykadach

    5.1 Przykad nr 1: wprowadzenie do Prologu

    Przykad nr 1:

    Lubi(Jarek, ryby)Lubi(Jarek,Maria)Lubi(Maria, ksiazka)Lubi(Jan, ksiazka)Lubi(Jan, Francja)Teraz gdybymy chcieli wywnioskowa z tych faktw czy Jarek lubi pieniadze:? lubi(Jarek, pieniadze)Odp Prologu: no? lubi(Maria, Jarek)Odp Prologu: no? lubi(Jarek,Maria)Odp Prologu: yesPrzykad :Lubi(Jan, kwiaty)Lubi(Jan,Maria)Lubi(Pawel,Maria)Teraz gdybymy chcieli wywnioskowa z tych faktw co lubi Jan?PYTANIE:? lubi(Jan,X)

    11

  • Odp Prologu:X = kwiaty(zmienna X jest odtd UKONKRETNIONA !)PYTANIE:? lubi(x,Maria)Odp Prologu:X = Jan;X = Pawel;No;co oznacza ze nie ma ju wicej odpowiedzi moliwych !KONIUNKCJE:Przykad :Lubi(Maria, czekolada)Lubi(Maria,wino)Lubi(Jan,wino)Lubi(Jan,Maria)Wwczas:Pytanie:? lubi(Jan,Maria), lubi(Maria, Jan)Odp Prologu: no;Pytanie:? lubi(Maria,X), lubi(Jan,X)czyli czy istnieje co co jednoczenie lubi i Maria i JanOdp Prologu:X = wino;no;

    REGUY:Jan lubi kadego kto lubi winoLubi(Jan,X) : Lubi(X,wino).Jan lubi kobiety, ktre lubi winoLubi(Jan,X) : Kobieta(X), Lubi(X,wino).

    5.2 Przykad nr 2: Rozkad lotw

    2 predykaty s dane:Rejsy(skd, dokd, odlot, przylot)(wyraa dostpne loty midzy miastami USA)Poczenie(skd, dokd, odlot, przylot)(znajduje poczenia porednie i bezporednie, ale na kad przesiadk rezerwu-je minimum godzin midzy przylotem a odlotem.)Dane s:Rejsy(SF,DEN, 930, 1230)Rejsy(SF,DAL, 900, 1430)Rejsy(DEN,CHI, 1500, 1800)Rejsy(DEN,DAL, 1400, 1700)

    12

  • Rejsy(DAL,CHI, 1530, 1730)Rejsy(CHI,NY, 1500, 1930)Rejsy(CHI,NY, 1900, 2200)Rejsy(CHI,NY, 1830, 2130)Polaczenie(X,Y,O,P) : rejsy(X,Y,O,P)Polaczenie(X,Y,O,P) : rejsy(X,Z,O,T1),Polaczenie(Z,Y,T2,P),T2 >= T1 + 100.Teraz w celu znalezienia pocze z San Francisco (SF) do Chicago (CHI) za-dajemy nastpujce pytanie:? Polaczenie(SF,CHI,Odlot,Przylot).A prolog odpowiada:Odlot = 930,Przylot = 1800;Odlot = 900,Przylot = 1730;No.Natomiast jeli chcemy wylecie z SF do NY po godzinie 900, to moemy znaleodpowiednie poczenie zadajc pytanie:? polaczenie(SF,NY,Odlot,Przylot),Odlot > 900.Wwczas Prolog odpowie:Odlot = 930,Przylot = 2200;No.

    5.3 Przykad nr 3 Windsor

    W Prologu zapiszemy to nastpujco:male( james1).male(charles1).ma