ancestor_of/2 — strămoș
Utilizând aceeași bază de cunoștințe ca la Exercițiul 1, definiți un predicat ancestor_of/2, care să verifice dacă al doilea argument este strămoș al primului. Predicatul trebuie să fie true pentru toate întrebările pe linia directă, de exemplu ?- ancestor_of(olivia, sam).
?- ancestor_of(olivia, sam).
true.
Hint: două clauze — caz direct (
parent_of/2) și caz recursiv (mergi cu un pas de părinte și reapelează).
Te-ai blocat?
editor
soluție
male(sam).
male(oliver).
male(ben).
male(peter).
male(roger).
female(elizabeth).
female(sandra).
female(mary).
female(lisa).
female(olivia).
parent_of(sandra, sam).
parent_of(sandra, elizabeth).
parent_of(ben, sam).
parent_of(ben, elizabeth).
parent_of(peter, oliver).
parent_of(peter, sandra).
parent_of(roger, ben).
parent_of(roger, lisa).
parent_of(olivia, roger).
parent_of(olivia, mary).
ancestor_of(X, Y) :- parent_of(X, Y).
ancestor_of(X, Y) :-
parent_of(X, Z),
ancestor_of(Z, Y).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (3 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
ancestor_of(olivia, sam).
așteptat: true
?
ancestor_of(sandra, sam).
așteptat: true
?
ancestor_of(sam, olivia).
așteptat: false