
% parents.pro
% Andrew Davison, June 2025, ad@coe.psu.ac.th


% parentOf/2 predicate (made of 6 facts)
parentOf(kim,holly).     % kim is the parent of holly
parentOf(margaret,kim).
parentOf(margaret,kent).
parentOf(esther,margaret).
parentOf(herbert,margaret).
parentOf(herbert,jean).


% livesAt/3 predicate (made of 8 facts)
livesAt(margaret, 9, "Bar Lane").
livesAt(kim, 37, "Foo Street").
livesAt(holly, 37, "Foo Street").
livesAt(esther, 9, "Bar Lane").
livesAt(herbert, 23, "PSU Village").
livesAt(kent, 9, "Bar Lane").
livesAt(bill, 23, "PSU Village").
livesAt(john, 9, "Bar Lane").


% livesWith/2 predicate (made of 1 rule)
livesWith(X, Y) :-
  livesAt(X, No, Addr), livesAt(Y, No, Addr).


% livesWithParent/2
livesWithParent(X, Y) :-
  livesWith(X, Y), parentOf(Y, X).

/*
% predefined
member(X, [X|Rest]).
member(X, [Y|Rest]) :-
  member(X, Rest).
*/


length([], 0).
length([X|Rest], Len) :-
  length(Rest, LenRest),
  Len is LenRest + 1.


/*
% predefined
append([], B, B).
append([Head|TailA], B, [Head|TailC]) :-
  append(TailA, B, TailC).
*/


% ======= queries (uncomment only one) ======

?- parentOf(margaret, kent).
% ?- parentOf(fred, pebbles).

% ?- parentOf(P, jean), writeln(P).
% ?- parentOf(P, esther), writeln(P).

% ?- parentOf(margaret,X), parentOf(X,holly), writeln(X).

% ?- parentOf(margaret,Child), writeln(Child).

% ?- parentOf(X, Y), writeln("X", X), writeln("Y", Y).


% ?- livesAt(margaret, No, Addr), writeln(No), writeln(Addr).

% ?- livesAt(X, 9, "Bar Lane"), writeln(X).


% ?- livesWith(bill, herbert).

% ?- livesWith(kim, X), writeln(X).



% ?- livesWithParent(holly, kim).

% ?- livesWithParent(kim, holly).


% ?- member(1, [2, 1,3]).
% ?- member(j, [a,n,d,y]).
% ?- member(X,[j,i,m]),writeln(X).


% ?- length([a,b,c,d], L), writeln(L).
% ?- length([1,2,3], 4).

% ?- append([1,2],[3,4],Z), writeln(Z).
% ?- append(X, [3,4],[1,2,3,4]), writeln(X).

% ?- append(X,Y,[1,2,3]), writeln("X", X), writeln("Y", Y).


% ?- (parentOf(kim, andrew) ; parentOf(kim, holly)).

% ?- not( member(4,[1,2,3]) ).
% ?- not( member(1,[2,1,3]) ).

% ?- findall(Child, parentOf(margaret, Child), List), writeln(List).

% ===========================================
% printing predicates

writeln(Var) :-
  write(Var), write("\n").

writeln(Name, Var) :-
  write(Name), write(" = "), write(Var), write("\n").


