src/chron.pl: add people groups

Allow definition of people groups with people_group(Label, [People...]).
Users of lists of people can then use people_in_group(Group,
[People...]), where Group can be a list of people or group(Label) if
referring to a people group.

The population_bottleneck rule is updated to support a people group for
the list of survivors.

Signed-off-by: James Hogan <james@albanarts.com>
src/dwelling.pl: add library for handling dwelling places

Add a library called dwelling which handles where people have lived.
Define dwelt(Person, Place, Number, Source) to indicate that an
individual has dwelt at a particular place, or people_dwelt for a group
of people. This creates periods dwell(Person, Place, Number) which are
automatically contained within lifetime(Person).

Also included is moved(Person, From, FromNum, To, ToNum, Source) and
people_moved for a group of people. This creates a new event
[people_]move(Person/People, From, FromNum, To, ToNum), and also implies
[people_]dwell(Person/People, To, ToNum, Source). A move coincides with
the end of the From dwelling period and the beginning of the To dwelling
period.

Signed-off-by: James Hogan <james@albanarts.com>
src/chron: allow period lengths to be specified in derived time units

Use simplify_interval() for period_len and periods_len to allow the time
interval to be a custom derived interval (like event_interval can be).

Signed-off-by: James Hogan <james@albanarts.com>
src/chron.pl: avoid duplicating person() for parent_descendent()

All descendents (parent_descendent) are marked as person, however they
may also be marked as man or woman which also marks them as person. This
results in multiple duplicate person matches.

Therefore only mark descendents as person from parent_descendent if
they're not already marked man or woman.

Signed-off-by: James Hogan <james@albanarts.com>
src/dot.pl: add procedure for writing graph attributes

Add write_dot_attr_graph() to dot.pl for writing graph level attributes.

Signed-off-by: James Hogan <james@albanarts.com>
src/dot_ancestry.pl: use subgraphs for marriages

Use a subgraph for each marriage with the attribute rank=same, instead
of marking the edge as unconstrained. This keeps marriages at the same
rank/level and close together without excessively long and windy edges.

Signed-off-by: James Hogan <james@albanarts.com>
src/chron.pl: add parent_daughter fact

Add a parent_daughter(Parent, Daughter, Source) fact that implies
parent_child(Parent, Daughter, Source) and woman(Daughter).

Signed-off-by: James Hogan <james@albanarts.com>
src/chron.pl: split parent_descendent to avoid infinite recursion

The parent_descendent(Parent, Descendent, Soruce) fact implied
person(Descendent), but this isn't desired when the rule is applied to
all people, as it can cause infinite recursion through person():

parent_descendent(eve, Person, source) :-
        born_person(Person).

Therefore split parent_descendent into parent_descendent and
raw_person_descendent. person_descendent still implies
person(Descendent), but raw_person_descendent doesn't. This allows the
above recursion to be avoided by using raw_person_descendent instead.

Signed-off-by: James Hogan <james@albanarts.com>
src/chron.pl: add parents_sons fact

Add parents_sons([Father, Mother], Sons, Source) fact which implies
parents_son([Father, Mother], Son, Source) for each Son in Sons.

This is mostly for convenience to avoid repetition or having to use
member() in the chron data.

Signed-off-by: James Hogan <james@albanarts.com>
src/chron.pl: add concept of maturity

Add a concept of sexual maturity. The event maturity(Person) is the
point at which they are able to conceive children. This allows chron
data to specify sensible maturity age with mature(Person, Age, Source),
and space out timelines a bit where the ages of parents at their
children's births aren't known.

Signed-off-by: James Hogan <james@albanarts.com>