1 Logisk Programmering Relasjoner vz. funksjoner Funksjon: inn og ut, en verdi Relasjon: ingen retning, null eller flere verdier LP slagord: algoritme = logikk + kontroll Logikk ( hva ): logisk program Kontroll ( hvordan ): innebygd i tolkeren
2 Horn klausuler Logisk program: liste Horn klausuler Horn klausul: spesiell logisk setning x. P 1 P n C for alle x: C hvis P 1 og... og P n operasjonelt: beregn C gjennom beregning av P 1,..., P n Kan være betinget (n > 0) eller ubetinget (n = 0) Query (spørsmål): x. P 1 P n
3 Fakta, regler og spørsmål Horn klausuler i LP: c :- p1,...,pn. Logiske atomer c,p1,...,pn kan inneholde variabler Faktum (ubetinget), eksempel: foreleser(bezem,inf121). Regel (betinget), eksempel: eksaminator(x,y) :- foreleser(x,y). Spørsmål, eksempel:?- eksaminator(x,inf121). Predikater, variabler og konstanter
4 Lister i Prolog Ikke head : tail men [head tail] Samme [] Notasjon [1,2,3] som i ML I tillegg [1,2 Rest] for 1:2:Rest Prolog er utypet: [1,2, abc ] er OK
5 LP anvendelser Søkealgoritmer Kunstig intelligens Språkteknologi (parsing og oversetting) Spørrespråk for relasjonelle databaser (Datalog) Prototyping
6 Relasjoner Relasjon R formelt: R D n n-tupler: (d 1,..., d n ) D n Eksempel: {(ams, bgo), (ams, bcn), (bgo, osl), (osl, ams), (osl, cph), (bcn, cph)} Eksempel: {(0, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 2),...} Eksempel: {([], [], []), ([a], [], [a]), ([], [a], [a]), ([a], [b], [a, b]),...} Hvordan spesifiseres relasjoner? (endelig/uendelig)
7 Relasjoner, spesifikasjon Direkte flyforbindelser: opplisting av fakta Addisjon: beregning av sum Konkatenering av lister (append): logisk program: append([],l,l). append([h T],L,[H TogL]) :- append(t,l,togl).
8 Eksempler på spørsmål (svar fra Prolog) append([a,b],[c],[a,b,c]). append([a,b],[c],l). append([a,b],l,[a,b,c]). append([a,b],[d],[a,b,c]). append([a,b],[d],[a,b,c]). append(l1,l2,[a,b,c]). append(l,[b,c],[a,b,c]). append(l,[b],[a,b,c]).
9 Prolog-syntaks Som i predikatlogikk, med noe særpreg Atom (språkatom): begynner med liten bokstav eller Enkel term: tall, variabel (begynner med stor bokstav), atom, eksempler: -1, 1.23E4, Liste, X, inf121, p, f Term (= sammensatt term), BNF syntaks: <term> ::= <enkel_term> <atom>(<terms>) <terms> ::= <term> <terms>,<term> <fact> ::= <term>. <rule> ::= <term> :- <terms>. <query> ::= <terms>. Obs: språkatomer versus predikatlogiske atomer
10 Eksempler Faktum: foreleser(bezem,inf121). Regel: eksaminator(x,y) :- foreleser(x,y). Spørsmål: eksaminator(x,inf121),foreleser(x,inf170). Øvelse: gi grammatiske avledniger Laste program: consult( Prosjekter/Prolog/flyforbindelser ). Liste program: listing.
11 Prolog program append([],l,l). append([h T],L,[H TogL]) :- append(t,l,togl). prefix(x,z) :- append(x,_,z). %% obs: _ suffix(y,z) :- append(_,y,z). %% obs: _ infix(y,z) :- prefix(x,z), suffix(y,x). %% obs: X % eksempel query: infix(l,[a,b,c])
12 Flyforbindelser direkte(bgo,ams). direkte(ams,bcn). direkte(bgo,osl). direkte(osl,ams). direkte(osl,cph). direkte(cph,bcn). forbindelse(x,x). forbindelse(x,z):- direkte(x,y),forbindelse(y,z).
13 Queries Er det en direkte flyforbindelse fra Bergen til Barcelona? Er det en flyforbindelse fra Bergen til Barcelona? Er det en flere flyforbindelser fra Bergen til Barcelona? Til hvilke byer kan vi fly fra Bergen? Fra hvilke byer kan vi fly til Amsterdam? Er det en flyforbindelse fra Bergen til Fantoft?
14 Viktige begrep Unifikasjon, = er syntaktisk likhet Eksempel: f(a,x)=f(y,b), 2=1+1 Dypde-først søk (depth-first search) Negasjon-ved-å-feile (negation as failure) Aritmetikk i Prolog: is Eksempel: X is 1+1, Y is Z+1
15 Kap. 3 Datastrukturer i Prolog Lister: [Head Tail] =.(Head,Tail) Eksempel:.(a,.(b,.(c,[]))) member i ML og i Prolog: % member _ [] = False % member e (h:t) = e==t member e t member(elt,[elt _]). member(elt,[_ Tail]):- member(elt,tail). LP: det positive eksplisitt, det negative ved å feile LP: member(b,[a,b,c,b]) lykkes to ganger!
16 Termer som datastrukturer Eksempel: binære søketrær Betingelse i hver node: tallene i deltreet til venstre skal være mindre enn tallet i selve noden, som i sin tur skal være mindre enn tallene i deltreet til høyre Eksempel: node(2,node(1,e,e),node(3,e,e)) Søk-algoritme: % jf. type Btree = Loev Node Int Btree Btree tmember(key,node(key,_,_)). %% obs: _ tmember(key,node(n,left,_)):- Key < N, tmember(key,left). tmember(key,node(n,_,right)):- Key > N, tmember(key,right).
17 Programmeringsteknikker Akkumulatorer Halerekursjon (tail recursion) Gjett og verifiser (guess and verify) Forskjellslister (difference lists) Åpne datastrukturer
18 Akkumulatorer Lengde i unær representasjon length([],0). length([_ Tail],N+1):- length(tail,n). Lengde i normal representasjon length([],0). length([_ Tail],Nplus1):- length(tail,n), Nplus1 is N+1. Ikke hale-rekursivt!
19 Tail recursion Lengde i normal representasjon, hale-rekursivt! length([],out,out). length([_ Tail],Accu,Out):- New is Accu+1, length(tail,new,out). length(l,n):- length(l,0,n). Obs: length/2 og length/3 Annet eksempel: snu en liste rev([],out,out). rev([h Tail],Accu,Out):- rev(tail,[h Accu],Out). rev(l,lrev):- rev(l,[],lrev). Obs: rev/2 og rev/3
20 Guess and verify Kalles også: generate and test Problemstilling: finn i en gitt mengde, et element som... Eksempel: overlapp mellom to lister Løsning: overlap(l1,l2):- member(e,l1),member(e,l2). deklarativt: det finnes et felles element i L1,L2 operasjonelt: generer alle E i L1, sjekk om E i L2 Pragmatikk: mengden skal være endelig, ellers skal du vite at det finnes et element som har egenskapen man ønsker
21 Difference lists Problemstilling: for treg konkatenering av lister IP løsning ifm. dynamiske lister: peker til siste element IP eksempel på tavla LP løsning: forskell-lister Representasjon, eksempel: dl([a,b,c X],X) Konkatenering: concat(dl(x,y),dl(y,z),dl(x,z)). (!) Eksempel: concat(dl([a,b L],L),dl([c M],M),dl(P,Q)).
22 Åpne datastrukturer Endemarkører ( endmarkers ): f.eks. [], Loev 1 Åpne datastrukturer: variabler som endmarkers Eksempel: [a,b,c []] vs. [a,b,c X] Variabelen gir tilgang til siste element Prolog variabel: peker til en datastruktur Kan utvides på konstant tid
23 Boblesortering i Prolog b([max],[],max). b([h1,h2 T],[H2 L],X) :- H1 >H2, b([h1 T],L,X). b([h1,h2 T],[H1 L],X) :- H1=<H2, b([h2 T],L,X). bs([],l,l). bs([h T],L,O) :- b([h T],Lred,Max), bs(lred,[max L],O). :- bs([12,-1,10,100,-3,0,0,-100,8,4,2,6,1],[],o).