Title: Repetition
1Repetition
Logikprogrammering måndag 11 november 2002
2ö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
3predikat och frågorförälder/2 och förfader/2
aritet (ställighet)
- 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
fakta
huvud
regler
klausuler (totalt 4 st.)
kropp
fråga
4enkla termer
- atomer pelle, liten.fel.txt,
- tal 42
- variabler Träd, _Träd, _
5sammansatta 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)
6backtracking(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 -gtåt höger, nedåt.
- Vid if-then-else lyckas inte backtracking.
? (Xa Xb), (YX Yc). X a, Y a ? X
a, Y c ? X b, Y b ? X b, Y c ?
no
?- ((Xa Xb) -gt YX Yc). X a, Y a ? no
7unifiering(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
8rekursion
- 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(
rekursionAnrop) - rekursivt_predikat(Anrop).
?- rekursivt_predikat(Anrop). Anrop basfall ?
Anrop rekursion,basfall ? Anrop
rekursion,rekursion,basfall ? och så vidare
9mappning 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
10sortering
- 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.