04.05.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!