/* vim: set filetype=prolog : */

:- [xml,thrash].

eg(1) :- egXmlWhat(X), xml(X).
eg(2) :- date(X), xml(X).
eg(3) :- family(X), xml(X).
 

egXmlWhat(
	family(person(tom,fox,date(7,may,1950),works(bbc,       15200)),
	       person(ann,fox,date(9,may,1951),works(homeMaker, 0    )),
              [person(pat,fox,date(5,may,1973),works(unemployed,0)),
               person(jim,fox,date(5,may,1973),works(unemployed,0))])).
           

thing_(A,B,C) :- family_(A,B,C)
                 ; person_(A,B,C)
                 ; date_(A,B,C)
                 ; works_(A,B,C)
                 ; list_(A,B,C).

family_(dad,  X,family(X,_,_)).
family_(mum,  X,family(_,X,_)).
family_(kids, X,family(_,_,X)).

person_(fname,X,person(X,_,_,_)).
person_(lname,X,person(_,X,_,_)).
person_(dob,  X,person(_,_,X,_)).
person_(job,  X,person(_,_,_,X)).

date_(day,    X,date(X,_,_)).
date_(month,  X,date(_,X,_)).
date_(year,   X,date(_,_,X)).

works_(where, X,works(X,_)).
works_(salary,X,works(_,X)). 

list_(length,X,L) :- length(L,X).
list_(item,X,L) :- member(X,L).


family(family(Dad,Mum,Kids)) :- 
	person(Dad), 
	person(Mum), 
	children(Kids). 

children(Kids) :- kids(Kids),  map(person,Kids).

person(person(Fname,Lname,Dob,Job)) :-
	fname(Fname), 
	lname(Lname),
	date(Dob),
	job(Job).  

kids(Kids) :- one(kids1(S)), length(Kids,S), map(person,Kids).

kids1(0).  kids1(1).  kids1(1).  kids1(1).  kids1(2).  

fname(X) :- one(fname1(X)).

fname1(jane).  fname1(judy).  fname1(amid).  fname1(hanny).  fname1(hanny).  fname1(hanny).  fname1(amir).

lname(X) :- one(lname1(X)).

lname1(jones).
lname1(smith).

date(date(Day,Month,Year)) :-
	year(Year),
	month(Month),
	day(Year,Month,Day).

year(Y) :- one(year1(Y)).

year1(Y) :- between(1960,1971,Y).

month(X) :- one(month1(X)).

month1(jan).
month1(feb).
month1(mar).

day(_,jan,31).
day(_,mar,31).
day(Y,feb,Day) :- (0 is Y mod 4) -> Day=29 ; Day=28.

job(president).
