HUMIT2720, V2007, Innleveringssett 1

Besvarelsene skal leveres individuelt innen 7.2. i Class Fronter!

Oppgave 1

Du skal lage en familiedatabase i Prolog. Følgende relasjoner skal være de som databasen er gitt ved: mann/1, kvinne/1, forelder/2. For den siste gjelder at forelder(A,B) hvis A er far eller mor til B. Du skal innføre nye binære predikat, og lage regler for dem slik at de kan beregnes fra databasen, f.eks. far(X,Y) :- forelder(X, Y), mann(X).

Lag regler for:

Legg inn en familiedatabase gitt ved forelder, mann og kvinne med minst fem generasjoner, slik at alle predikatene blir sanne for minst et par, og der ikke alle er i slekt med hverandre og prøv ut.

Oppgave 2

Lag et predikat som tar et element og en liste. Hvis elementet finnes i listen, returnerer predikatet en ny liste med elementet fjernet. Hvis elementet ikke finnes i listen returneres No, eks

32 ?- remove(a, [b,a,c,d],R).
R = [b, c, d] ;
No
33 ?- remove(a, [b,c,d],R).
No
34 ?- remove(X, [b,c,d],R).
X = b
R = [c, d] ;
X = c
R = [b, d] ;
X = d
R = [b, c] ;
No
35 ?-

Oppgave 3

Vi skulle også gjerne laget regler for

Men her oppstår et problem. Det enkleste ville være å skrive f.eks.

bror(X,Y) :- mann(X), far(Z,X), far(Z,Y).

Problemet er at da blir en gutt sin egen bror, din far blir din onkel osv. Det finnes veier rundt dette i PROLOG, men de er ikke helt rene. Vi skal i stedet endre databasen. Vi har ikke lenger predikatet forelder/2 som basis. I stedet har vi predikatet barna_til/2. Her er andre argument en liste, listen over alle barna til første elementet, f.eks. barna_til(kari, [anne, per, ali]) betyr nå at kari er forelder til nøyaktig 3 forskjellige barn: anne, per og ali.

a. Lag først nye regler for

basert på dette.

b. Lag deretter regler for de andre predikatene, bror, søster, etc. Forandr familiedatabasen din og prøv ut reglene. Hint: Bruk oppgave 2.