Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avDavid Lund
1
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20021 Repetition Logikprogrammering: måndag 11 november 2002
2
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20022 översikt predikat och frågor enkla termer sammansatta termer backtracking unifiering rekursion –mappning och filtrering –sortering grammatiker (CFG) DCG-notation aritmetik ackumulatorer operatorer binära träd in- och uthantering findall, setof, bagof cut
3
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20023 predikat och frågor förälder/2 och förfader/2 förälder(marit, mette-marit). förälder(mette-marit, marius). förfader(X,Z) :- förälder(X,Z). förfader(X,Z) :- förälder(X,Y), förfader(Y,Z). ?- förfader(X, marius). X = mette-marit ? ; X = marit ? yes huvud kropp fakta regler fråga klausuler (totalt 4 st.) aritet (ställighet)
4
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20024 enkla termer atomer: pelle, ’liten.fel.txt’, + tal: 42 variabler: Träd, _Träd, _
5
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20025 sammansatta termer (strukturer) Flera termer kan sättas ihop till en sammansatt term med hjälp av en funktor: Listor (med funktorn ”.”) ?- [h,e,j|[]] =.(h,.(e,.(j,[]))). yes Strängar ?- "hej" = [h,e,j]. yes Egna strukturer fras(np,[ord(namn,"lisa"),fras(prps,[])]) t(Left, Elem, Right) point(1,1)
6
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20026 backtracking (tillbaka-spårning) När ett mål misslyckas går Prolog tillbaka till det senast uppfyllda målet för att försöka hitta alternativa lösningar. riktning: vänstra övre hörnet ->åt höger, nedåt. Vid if-then-else lyckas inte backtracking. ? – (X=a ; X=b), (Y=X ; Y=c). X = a, Y = a ? ; X = a, Y = c ? ; X = b, Y = b ? ; X = b, Y = c ? ; no ?- ((X=a ; X=b) -> Y=X ; Y=c). X = a, Y = a ? ; no
7
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20027 unifiering (matchning) Unifiering av två termer lyckas om: –minst en av termerna är en oinstansierad variabel eller … –termerna är samma atom eller samma tal –termerna är två sammansatta termer där funktor och argument matchar Två variabler som unifierats är därefter identiska. ?- X = 1, Y = 2, X \= Y. X = 1, Y = 2 ? yes ?- X = 1, X \= Y, X = 2. no ?- X = Y, X == Y. Y = X ? yes ?- X == Y, X = Y. no
8
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20028 rekursion Rekursiva predikat har alltid (minst) ett rekursivt anrop och (minst) ett basfall. Basfallet innehåller inget rekursivt anrop. Basfallet/en bör alltid göras så få och enkla som möjligt. Basfallet deklareras ofta som ett fakta, men inte alltid. Rekursionsfallet är alltid en regel (det rekursiva anropet sker i kroppen). rekursivt_predikat([basfall]). rekursivt_predikat([rekursion|Anrop]) :- rekursivt_predikat(Anrop). ?- rekursivt_predikat(Anrop). Anrop = [basfall] ? ; Anrop = [rekursion,basfall] ? ; Anrop = [rekursion,rekursion,basfall] ? ; och så vidare …
9
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 20029 mappning och filtrering Mappning är när man utför något på varje element i en lista och stoppa in resultatet i en ny lista. ?- leka_rövare("kalle",Rövartext). Rövartext = "kokalollole" ? yes Filtrering genererar också en ny lista, men väljer ut vissa element ur en lista och kastar resten av dem. ?- kasta_vokaler("Nefertiti",Sträng). Sträng = "Nfrtt" ? yes
10
Karl-Henrik Hagdahl, hagdahl@cs.chalmers.semåndag 11 november 200210 sortering insertionsort/2 : Sätt in ett element i taget på rätt plats med insert/3. quicksort/2 : Välj ett pivotelement och dela listan i mindre och större element med delning/3. Sortera delarna rekursivt och sätt ihop. mergesort/2 : Dela listan i två lika stora delar med halvera/3. Sortera delarna och sätt ihop dem med merge/3.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.