Programmeringsparadigm/övning 4 (Prolog) 1) Skriv predikat för ...
Programmeringsparadigm/övning 4 (Prolog) 1) Skriv predikat för ...
Programmeringsparadigm/övning 4 (Prolog) 1) Skriv predikat för ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Programmeringsparadigm</strong>/<strong>övning</strong> 4 (<strong>Prolog</strong>)<br />
1) <strong>Skriv</strong> <strong>predikat</strong> <strong>för</strong>:<br />
–paternal_grandfather_of(X,Y)<br />
–maternal_grandfather_of(X,Y)<br />
–paternal_grandmother_of(X,Y)<br />
–maternal_grandmother_of(X,Y)<br />
–full_siblings(X, Y)<br />
–half_siblings(X,Y) 2p<br />
Du får utgå från:<br />
father_of(carl, erik).<br />
father_of(carl, lena).<br />
father_of(erik, stig).<br />
father_of(erik, lars).<br />
father_of(stig, janne).<br />
father_of(stig, brita).<br />
father_of(lars, lisa).<br />
father_of(lars, petter).<br />
mother_of(alli, carl).<br />
mother_of(lena, anna).<br />
mother_of(lena, kajsa).<br />
mother_of(lena, ellen).<br />
mother_of(lena, olle).<br />
mother_of(ulla, janne).<br />
mother_of(ulla, brita).<br />
mother_of(eva, lisa).<br />
mother_of(eva, petter).<br />
parent_of(X,Y) :- father_of(X,Y).<br />
parent_of(X,Y) :- mother_of(X,Y).<br />
ancestor_of(X,Y) :- parent_of(X,Y).<br />
ancestor_of(X,Y) :- parent_of(X,Z), ancestor_of(Z,Y).
2) Predikatet ancestor_of/2 (se ovan) går att använda <strong>för</strong> att<br />
hitta ens <strong>för</strong>fäder och stammödrar, men det fungerar mycket<br />
ineffektivt om kunskapsbasen är ens aningen större. <strong>Skriv</strong> ett<br />
<strong>predikat</strong> descendant_of som utgår från ättlingen i fråga och<br />
gör sökningen effektivare!<br />
3 a) <strong>Skriv</strong> <strong>predikat</strong>et combine1/3 som tar tre listor som<br />
argument och kombinerar de två <strong>för</strong>sta enligt följande:<br />
?- combine1([a,b,c],[1,2,3],X).<br />
X = [a, 1, b, 2, c, 3].<br />
?- combine1([f,b,yip,yup],[glu, gla, gli, glo], Res).<br />
Res = [f, glu, b, gla, yip, gli, yup, glo].<br />
b) <strong>Skriv</strong> <strong>predikat</strong>et combine2/3 som tar tre listor som<br />
argument och kombinerar de två <strong>för</strong>sta enligt följande:<br />
?- combine2([a,b,c],[1,2,3],X).<br />
X = [[a, 1], [b, 2], [c, 3]].<br />
?- combine2([f,b,yip,yup],[glu, gla, gli, glo], Res).<br />
Res = [[f, glu], [b, gla], [yip, gli], [yup, glo]].<br />
c) <strong>Skriv</strong> <strong>predikat</strong>et combine3/3 som tar tre listor som<br />
argument och kombinerar de två <strong>för</strong>sta enligt följande:<br />
?- combine3([a,b,c],[1,2,3],X).<br />
X = [j(a, 1), j(b, 2), j(c, 3)].<br />
?- combine3([f,b,yip,yup],[glu, gla, gli, glo], Res).<br />
Res = [j(f, glu), j(b, gla), j(yip, gli), j(yup, glo)]. 2p<br />
2p
4) Det finns en gata med tre hus som ligger som grannar till<br />
varandra. De har alla olika färg: rött, blått och grönt. De bebos<br />
av folk av olika nationaliteter, och de har alla olika husdjur<br />
(dock endast ett/hushåll). Här följer några fakta:<br />
• Engelsmannen bor i det röda huset.<br />
• Den spanska familjen har en jaguar som husdjur.<br />
• Japanen bor till höger om huset med en snigel som<br />
husdjur.<br />
• Personen med snigeln bor till vänster om det blåa huset.<br />
Så: vem har zebra som husdjur? Definiera ett <strong>predikat</strong><br />
zebra/1 som berättar nationaliteten av zebraägaren!<br />
Vink: Tänk noga hur du ska representera husen och gatan.<br />
Koda begränsningarna i <strong>Prolog</strong>! Du kan ha nytta av<br />
member/2 och sublist/2 …<br />
4p