teori - Åbo akademiusers.abo.fi/soini/prolog3.pdf · – visa att det kan finnas diskrepanser...
TRANSCRIPT
![Page 1: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/1.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Föreläsning 3: rekursion
• Teori – Introducera rekursiva definitioner i Prolog – Fyra exempel – Visa att det kan finnas diskrepanser mellan
Prolog-programmets deklarativa och procedurala betydelse!
![Page 2: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/2.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Rekursiva definitioner
• Prolog-predikat kan definieras rekursivt • Ett predikat är rekursivt definierat om
en eller flera regler i dess definition refererar till detta predikat.
![Page 3: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/3.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 1: Eating
isDigesting(X,Y):- justAte(X,Y). isDigesting(X,Y):- justAte(X,Z), isDigesting(Z,Y).
justAte(mosquito,blood(john)). justAte(frog,mosquito). justAte(stork,frog).
?-
![Page 4: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/4.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
En bild av läget ...
X Y
justAte
isDigesting
✚
![Page 5: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/5.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
En bild av läget ...
X Y
justAte
isDigesting
X Z
justAte
isDigesting
Y
isDigesting
✚ myggan
som drack
Johns
blod
![Page 6: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/6.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 1: Eating
isDigesting(X,Y):- justAte(X,Y). isDigesting(X,Y):- justAte(X,Z), isDigesting(Z,Y).
justAte(mosquito,blood(john)). justAte(frog,mosquito). justAte(stork,frog).
?- isDigesting(stork,mosquito).
![Page 7: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/7.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
En annan rekursiv definition
p:- p.
?-
![Page 8: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/8.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
En annan rekursiv definition
p:- p.
?- p.
![Page 9: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/9.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
En annan rekursiv definition
p:- p.
?- p. ERROR: out of memory
![Page 10: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/10.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: descendant
child(bridget,caroline). child(caroline,donna).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), child(Z,Y).
• Tolkning av child(X, Y): “X has_child Y”
![Page 11: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/11.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(bridget,caroline). child(caroline,donna).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), child(Z,Y).
• Tolkning av descend(X, Y): “Y descends from
X”
![Page 12: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/12.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), child(Z,Y).
anna
bridget
caroline
donna
emily
![Page 13: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/13.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), child(Z,Y).
?- descend(anna,donna). no ?-
anna
bridget
caroline
donna
emily
![Page 14: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/14.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), child(Z,Y). descend(X,Y):- child(X,Z), child(Z,U), child(U,Y).
?-
anna (X)
bridget (Z)
caroline (U)
donna (Y)
emily
![Page 15: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/15.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), descend(Z,Y).
?-
anna
bridget
caroline
donna
emily
![Page 16: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/16.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 2: Descendant
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), descend(Z,Y).
?- descend(anna,donna).
anna
bridget
caroline
donna
emily
![Page 17: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/17.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Sökträd
• Rita sökträdet för ?- descend(anna,donna).
anna
bridget
caroline
donna
emily
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), descend(Z,Y).
![Page 18: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/18.jpg)
Sökträd ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend(anna, donna)?
child(anna, donna)? child(anna,_G395), descend(_G395, donna)?
r1 r2
F child(anna, bridget)
descend(bridget, donna)?
child(bridget, donna)?
r1
F child(bridget,_G395), descend(_G395, donna)?
r2
![Page 19: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/19.jpg)
Sökträd ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
r1 r2
child(bridget,_G395), descend(_G395, donna)?
child(bridget, caroline) descend(caroline, donna)?
child(caroline, donna)? child(caroline,_G395), descend(_G395, donna)?
r1 r2
• Glöm inte att prolog söker
alla sätten att bevisa målet!
true
![Page 20: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/20.jpg)
Sökträd ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
r1 r2
child(caroline,_G395), descend(_G395, donna)?
r1 r2
child(caroline, donna) descend(donna, donna)?
child(donna, donna)?
F
child(emily,_G395), descend(_G395, donna)?
child(donna, emily) descend(emily, donna)?
r1 r2
child(emily, donna)?
F
r1
child(donna,_G395), descend(_G395, donna)?
r2
F
![Page 21: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/21.jpg)
Trace descend(anna, donna). ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
trace] ?- descend(anna, donna).
Call: (6) descend(anna, donna) ? creep
Call: (7) child(anna, donna) ? creep
Fail: (7) child(anna, donna) ? creep
Redo: (6) descend(anna, donna) ? creep
Call: (7) child(anna, _G415) ? creep
Exit: (7) child(anna, bridget) ? creep
Call: (7) descend(bridget, donna) ? creep
Call: (8) child(bridget, donna) ? creep
Fail: (8) child(bridget, donna) ? creep
Redo: (7) descend(bridget, donna) ? creep
Call: (8) child(bridget, _G415) ? creep
Exit: (8) child(bridget, caroline) ? creep
Call: (8) descend(caroline, donna) ? creep
Call: (9) child(caroline, donna) ? creep
Exit: (9) child(caroline, donna) ? creep
Exit: (8) descend(caroline, donna) ? creep
Exit: (7) descend(bridget, donna) ? creep
Exit: (6) descend(anna, donna) ? creep
true ;
![Page 22: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/22.jpg)
Trace descend(anna, donna). ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Redo: (8) descend(caroline, donna) ? creep
Call: (9) child(caroline, _G415) ? creep
Exit: (9) child(caroline, donna) ? creep
Call: (9) descend(donna, donna) ? creep
Call: (10) child(donna, donna) ? creep
Fail: (10) child(donna, donna) ? creep
Redo: (9) descend(donna, donna) ? creep
Call: (10) child(donna, _G415) ? creep
Exit: (10) child(donna, emily) ? creep
Call: (10) descend(emily, donna) ? creep
Call: (11) child(emily, donna) ? creep
Fail: (11) child(emily, donna) ? creep
Redo: (10) descend(emily, donna) ? creep
Call: (11) child(emily, _G415) ? creep
Fail: (11) child(emily, _G415) ? creep
Fail: (10) descend(emily, donna) ? creep
Fail: (9) descend(donna, donna) ? creep
Fail: (8) descend(caroline, donna) ? creep
Fail: (7) descend(bridget, donna) ? creep
Fail: (6) descend(anna, donna) ? creep
false.
Kunde
inte
bevisas på ett annat sätt.
![Page 23: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/23.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 3: Successor
• Anta att vi använder följande sätt att skriva nummer:
1. 0 är ett nummer. 2. Om X är ett nummer, så är även
succ(X).
![Page 24: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/24.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 3: Successor
numeral(0). numeral(succ(X)):- numeral(X).
![Page 25: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/25.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 3: Successor
numeral(0). numeral(succ(X)):- numeral(X).
?- numeral(succ(succ(succ(0)))). yes ?-
![Page 26: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/26.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 3: Successor
numeral(0). numeral(succ(X)):- numeral(X).
?- numeral(X).
![Page 27: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/27.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 3: Successor
numeral(0). numeral(succ(X)):- numeral(X).
?- numeral(X). X=0; X=succ(0); X=succ(succ(0)); X=succ(succ(succ(0))); X=succ(succ(succ(succ(0))))
![Page 28: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/28.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 4: Addition
?- add(succ(succ(0)),succ(succ(succ(0))), Result). Result=succ(succ(succ(succ(succ(0))))) yes
![Page 29: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/29.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 4: Addition
add(0,X,X). %%% base clause
?- add(succ(succ(0)),succ(succ(succ(0))), Result). Result=succ(succ(succ(succ(succ(0))))) yes
![Page 30: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/30.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Exempel 4: Addition
add(0,X,X). %%% base clause
add(succ(X),Y,succ(Z)):- %%% recursive clause add(X,Y,Z).
?- add(succ(succ(0)),succ(succ(succ(0))), Result). Result=succ(succ(succ(succ(succ(0))))) yes
succ(X) + Y blir succ(Z) om
X + Y är Z.
![Page 31: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/31.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Sökträd
• Rita sökträdet för
add(succ(succ(0)), succ(succ(succ(0))), R).
![Page 32: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/32.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Sökträd
add(succ(succ(0)), succ(succ(succ(0))), R).
add(0,X,X). add(succ(X),Y,succ(Z)):- add(X,Y,Z).
add((succ(0), succ(succ(succ(0))), R1).
add(0, succ(succ(succ(0))), R2).
R = succ(R1)
R1 = succ(R2)
basfall: R2 = succ(succ(succ(0)))
![Page 33: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/33.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Sökträd
add(succ(succ(0)), succ(succ(succ(0))), R).
add(0,X,X). add(succ(X),Y,succ(Z)):- add(X,Y,Z).
add((succ(0), succ(succ(succ(0))), R1).
add(0, succ(succ(succ(0))), R2).
R = succ(R1)
R1 = succ(R2)
basfall: R2 = succ(succ(succ(0)))
R1 = succ(succ(succ(succ(0))))
R = succ(succ(succ(succ(succ(0)))))
![Page 34: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/34.jpg)
Trace ... ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
[trace] ?- add(succ(succ(0)), succ(succ(succ(0))), Z).
Call: (6) add(succ(succ(0)), succ(succ(succ(0))), _G348) ? creep
Call: (7) add(succ(0), succ(succ(succ(0))), _G424) ? creep
Call: (8) add(0, succ(succ(succ(0))), _G426) ? creep
Exit: (8) add(0, succ(succ(succ(0))), succ(succ(succ(0)))) ? creep
Exit: (7) add(succ(0), succ(succ(succ(0))), succ(succ(succ(succ(0))))) ?
creep
Exit: (6) add(succ(succ(0)), succ(succ(succ(0))), succ(succ(succ(succ
(succ(0)))))) ? creep
Z = succ(succ(succ(succ(succ(0))))).
![Page 35: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/35.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Prolog och logik
• Prolog var det första rimliga försöket att skapa ett språk för logikprogrammering – Programmeraren ger en deklarativ
specifikation av problemet, mha logikens språk
– Programmeraren borde inte behöva berätta för datorn vad den ska göra
– För att få information ger programmeraren helt enkelt en förfrågning
![Page 36: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/36.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Prolog och logic
• Prolog innebär flera viktiga steg i denna riktning, men trots allt är Prolog inte ett fullständigt logikprogrammeringsspråk!
• Prolog har ett specifikt sätt att besvara förfrågningar: – Sök kunskapsbasen uppifrån ner – Processera satserna från vänster till höger – “Backtracka” för att ersätta dåliga val eller
för att söka efter flera svar/bevis.
![Page 37: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/37.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend1.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- child(X,Z), descend(Z,Y).
?- descend(A,B). A=anna B=bridget
![Page 38: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/38.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend2.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Z), descend(Z,Y). descend(X,Y):- child(X,Y).
?- descend(A,B). A=anna B=emily
![Page 39: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/39.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend2.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Z), descend(Z,Y). descend(X,Y):- child(X,Y).
?- descend(A,B). A=anna B=emily
Ordningen där
svaren ges
ändras.
![Page 40: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/40.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend2.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Z), descend(Z,Y). descend(X,Y):- child(X,Y).
?- descend(A,B). A=anna B=emily
Att ändra
ordningen i
vilken
reglerna ges
brukar inte
annars
ändra på
programmets beteende.
![Page 41: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/41.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend3.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- descend(Z,Y), child(X,Z). descend(X,Y):- child(X,Y).
?- descend(A,B). ERROR: OUT OF LOCAL STACK
Vi har ändrat
på ordningen
av delmålen INNE i en regel
![Page 42: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/42.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend3.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- descend(Z,Y), child(X,Z). descend(X,Y):- child(X,Y).
?- descend(A,B). ERROR: OUT OF LOCAL STACK
Det första
delmålet är
rekursivt => evig rekursion!!
![Page 43: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/43.jpg)
descend3.pl ©
Patr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend(anna, donna)
descend(X,Y):- descend(Z,Y), child(X,Z)
descend(W4, donna)
child(anna, W1)
descend(W2, donna)
descend(W3, donna)
descend(W1, donna)
...
En vänster- rekursiv regel
![Page 44: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/44.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
descend4.pl
child(anna,bridget). child(bridget,caroline). child(caroline,donna). child(donna,emily).
descend(X,Y):- child(X,Y). descend(X,Y):- descend(Z,Y), child(X,Z).
?- descend(A,B).
Vissa svar hittas, andra leder till
evig rekursion
![Page 45: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/45.jpg)
Övning
• Utgå från följande kunskapsbas:
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz mother_of(alli, carl).
mother_of(lena, anna).
mother_of(lena, kajsa).
mother_of(lena, ellen).
mother_of(lena, olle).
mother_of(ulla, janne).
mother_of(ulla, brita).
mother_of(eva, lisa).
mother_of(eva, petter).
father_of(carl, erik).
father_of(carl, lena).
father_of(erik, stig).
father_of(erik, lars).
father_of(stig, janne).
father_of(stig, brita).
father_of(lars, lisa).
father_of(lars, petter).
![Page 46: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/46.jpg)
Övning
• Skriv reglerna (predikaten) för: – paternal_grandfather_of(X,Y) – maternal_grandfather_of(X,Y) – paternal_grandmother_of(X,Y) – maternal_grandmother_of(X,Y) – full_siblings(X, Y) – half_siblings(X,Y)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
![Page 47: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/47.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Sammandrag
• Idag har vi sett på rekursiva predikat • Vi har också diskuterat skillnaden
mellan ett Prolog-programs deklarativa och procedurala betydelse.
• Vi har identifierat några av Prologs svagheter som ett logikprogrammeringsspråk.
![Page 48: Teori - Åbo Akademiusers.abo.fi/soini/Prolog3.pdf · – Visa att det kan finnas diskrepanser mellan Prolog-programmets deklarativa och procedurala betydelse! Rekursiva definitioner](https://reader033.vdocuments.site/reader033/viewer/2022053107/607301e8c902644dfa764ca6/html5/thumbnails/48.jpg)
© P
atr
ick B
lack
bu
rn,
Joh
an
Bo
s &
Kri
stin
a S
trie
gn
itz
Nästa FL ...
• Introducerar listorna i Prolog – Viktig rekursiv datastruktur i Prolog-
programmering – Definierar predikatet member/2, ett
grundläggande Prolog-verktyg för listhantering
– Diskuterar hur man rekursivt bearbetar listorna
– Extra: prolog i problemlösning Läckert
!