{\small\sf class} $Person$
\par
\kValues
\kw{\kw{private}}\val{MaennlicheVornamen}{\set{\Dquote Hans \Dquote ,\Dquote Georg \Dquote };}
\kw{\kw{private}}\val{WeiblicheVornamen}{\set{\Dquote Heidrun \Dquote ,\Dquote Cornelia \Dquote }}
\kFunctions
\kw{\kw{private}}\begin{fn}[e]{istMaennlicherVorname}%
\signature{\seqof*{\Char } \To \Bool }
\parms*{\Lp v\Rp }
\annlab[o]{Person`istMaennlicherVorname}
v \In MaennlicheVornamen;
\end{fn}
\kw{\kw{private}}\begin{fn}[e]{istWeiblicherVorname}%
\signature{\seqof*{\Char } \To \Bool }
\parms*{\Lp v\Rp }
\annlab[o]{Person`istWeiblicherVorname}
v \In WeiblicheVornamen;
\end{fn}
\kw{\kw{private}}\begin{fn}[e]{keineZeitweiseBigamie}%
\signature{\setof{Hochzeit} \To \Bool }
\parms*{\Lp s\Rp }
\annlab[o]{Person`keineZeitweiseBigamie}
\all{h1,h2 \In s}{h1 \Neq h2 \Implies  \\
\fnapply{h1.Hochzeitsdatum.groesserGleich}{h2.Scheidungsdatum} \Or  \\
\fnapply{h2.Hochzeitsdatum.groesserGleich}{h1.Scheidungsdatum}};
\end{fn}
\kw{\kw{private}}\begin{fn}[e]{initNachname}%
\signature{\setof{Person} \To \seqof*{\Char }}
\parms*{\Lp e\Rp }
\annlab[o]{Person`initNachname}
\If  \Card e = 1
\Then \\
\Letbe* m \In e \Lin \\
m.Nachname
\Else \\
\If  \Card e = 2
\Then \\
\Letbe\kw{ }Mutter \In e \Best\kw{ }Mutter.Geschlecht = \const{weiblich} \Lin \\
\Letbe\kw{ }aktuelleEheDerMutter \In Mutter.hochzeit \Best \\
\kw{ }aktuelleEheDerMutter.Scheidungsdatum = Datum`invalidDatum \Lin \\
\begin{letexpr}
\patdef{aktuellerEhemannDerMutter}{aktuelleEheDerMutter.ehemann}
\end{letexpr} \\
\If aktuellerEhemannDerMutter \In e
\Then \\
aktuelleEheDerMutter.Familienname
\Else \\
Mutter.Nachname
\Fi
\Else \\
\Dquote NameVomGericht \Dquote 
\Fi
\Fi
\end{fn}
\kInstanceVarDef
\parlinebr
\begin{insvar}\kw{public}
\assdef{Nachname}{\seqof*{\Char }}[{\fnapply{initNachname}{elter}}]
\end{insvar}
\begin{insvar}
\assdef{Geburtsname}{\seqof*{\Char }}
\end{insvar}
\begin{insvar}
\assdef{Vorname}{\seqof*{\Char }}
\end{insvar}
\begin{instinvfn}
Geschlecht = \const{maennlich} \Implies \fnapply{istMaennlicherVorname}{Vorname}\end{instinvfn}
\begin{instinvfn}
Geschlecht = \const{weiblich} \Implies \fnapply{istWeiblicherVorname}{Vorname}\end{instinvfn}
\begin{insvar}\kw{public}
\assdef{Geschlecht}{Util`Genus}
\end{insvar}
\begin{insvar}
\assdef{Geburtsort}{\seqof*{\Char }}
\end{insvar}
\begin{insvar}\kw{public}
\assdef{Geburtsdatum}{Datum}
\end{insvar}
\begin{insvar}
\assdef{Staatsbuergerschaft}{Util`Nation}[{\const{de}}]
\end{insvar}
\begin{insvar}
\assdef{Bekenntnis}{\seqof*{\Char }}
\end{insvar}
\begin{insvar}
\assdef{Status}{Util`Personenstand}[{\const{ledig}}]
\end{insvar}
\begin{instinvfn}
Status = \const{tot} \Equiv Sterbedatum = Datum`invalidDatum\end{instinvfn}
\begin{insvar}
\assdef{Sterbedatum}{Datum}
\end{insvar}
\begin{insvar}
\assdef{Beruf}{\seqof*{\Char }}
\end{insvar}
\begin{insvar}
\assdef{BiometrischeMerkmale}{Util`BioDaten}
\end{insvar}
\begin{insvar}
\assdef{Ausweisnummer}{\Nat }[{0}]
\end{insvar}
\begin{insvar}\kw{public}
\assdef{Wohnsitz}{\seqof*{Adresse}}[{\seq{}}]
\end{insvar}
\begin{instinvfn}
 \Len Wohnsitz > 0 \Implies  \\
\kSelf  \In  \Dunion \setcomp{adr.person}{adr \In  \Elems Wohnsitz}\end{instinvfn}
\begin{insvar}\kw{public}
\assdef{hochzeit}{\setof{Hochzeit}}
\end{insvar}
\begin{instinvfn}
 \Card hochzeit > 1 \Implies  \\
\If Geschlecht = \const{maennlich}
\Then \\
\set{\kSelf } = \setcomp{h.ehemann}{h \In hochzeit}
\Else \\
\set{\kSelf } = \setcomp{h.ehefrau}{h \In hochzeit}
\Fi\end{instinvfn}
\begin{instinvfn}
 \Card hochzeit > 0 \Implies \fnapply{keineZeitweiseBigamie}{hochzeit}\end{instinvfn}
\begin{instinvfn}
 \Card hochzeit > 0 \Implies  \\
 \Card \setcomp{h}{h \In hochzeit} \\
[h.Scheidungsdatum = Datum`invalidDatum] \Le  \\
1\end{instinvfn}
\begin{insvar}
\assdef{elter}{\setof{Person}}
\end{insvar}
\begin{instinvfn}
 \Card elter \Le 2\end{instinvfn}
\begin{instinvfn}
 \Card elter > 0 \Implies \kSelf  \In  \Dunion \setcomp{e.kind}{e \In elter}\end{instinvfn}
\begin{instinvfn}
 \Card elter = 0 \Implies Vormund \Neq \Nil \end{instinvfn}
\begin{instinvfn}
 \Card elter > 0 \Implies \all{e \In elter} \\
{\fnapply{Geburtsdatum.minus}{e.Geburtsdatum} \Ge 8}\end{instinvfn}
\begin{instinvfn}
 \Card elter = 1 \Implies \Letbe* e \In elter \Lin \\
Nachname = e.Nachname\end{instinvfn}
\begin{instinvfn}
 \Card elter = 2 \Implies  \\
\all{e \In elter} \\
{ \Card e.hochzeit > 0 \Implies  \\
\all{h \In e.hochzeit} \\
{\fnapply{Geburtsdatum.inbetween}{h.Hochzeitsdatum,h.Scheidungsdatum} \Implies  \\
Nachname = h.Familienname}}\end{instinvfn}
\begin{insvar}
\assdef{kind}{\setof{Person}}
\end{insvar}
\begin{instinvfn}
 \Card kind > 0 \Implies \kSelf  \In  \Dunion \setcomp{k.elter}{k \In kind}\end{instinvfn}
\begin{insvar}
\assdef{Vormund}{\Opt{Person}}
\end{insvar}
\begin{instinvfn}
Vormund \Neq \Nil  \Implies \kSelf  \In Vormund.Muendel\end{instinvfn}
\begin{insvar}
\assdef{Muendel}{\setof{Person}}
\end{insvar}
\begin{instinvfn}
 \Card Muendel > 0 \Implies  \\
\pex{\all{m \In Muendel}{m.Vormund \Neq \Nil }} \And  \\
\pex{\set{\kSelf } = \setcomp{m.Vormund}{m \In Muendel}}\end{instinvfn}
\par
\kOperations
\kw{\kw{public}}\begin{op}[e]{getOpernKarte}%
\signature{\Nat  \Oto \Bool }
\parms{Einzahlung}
\annlab[o]{Person`getOpernKarte}
\return{\True }
\begin{precond}
Einzahlung \Ge 100
\end{precond};
\end{op}
\kw{\kw{public}}\begin{op}[e]{Alter}%
\signature{Datum \Oto \Nat }
\parms{amDatum}
\annlab[o]{Person`Alter}
\return{\fnapply{amDatum.minus}{Geburtsdatum}}
\begin{precond}
\fnapply{amDatum.groesserGleich}{Geburtsdatum}
\end{precond};
\end{op}
\kw{\kw{public}}\begin{op}[e]{sammleVorfahren}%
\signature{\Nat  \Oto \seqof*{Person}}
\parms{level}
\annlab[o]{Person`sammleVorfahren}
\If \pex{level = 0} \Or \pex{ \Card elter = 0}
\Then \\
\return{\seq{}}
\Elseif \pex{ \Card elter = 1}
\Then \\
\Letbe* e1 \In elter \Lin \\
\return{\seq{e1} \Sconc \fnapply{e1.sammleVorfahren}{level \Minus 1}}
\Else \\
\Letbe* e1 \In elter \Lin \\
\Letbe\kw{ }e2 \In elter \Best\kw{ }e2 \Neq e1 \Lin \\
\return{\seq{e1,e2} \Sconc  \\
\fnapply{e1.sammleVorfahren}{level \Minus 1} \Sconc  \\
\fnapply{e2.sammleVorfahren}{level \Minus 1}}
\Fi
\begin{precond}
level \Ge 0
\end{precond};
\end{op}
\kw{\kw{private}}\begin{op}[e]{istNeffe}%
\signature{Person \Oto \Bool }
\parms{n}
\annlab[o]{Person`istNeffe}
\begin{letstmt}
\patdef{Geschwister} \\
{ \Dunion \setcomp{e.kind}{e \In elter} \Setdiff \set{\kSelf }}
\end{letstmt} \\
\begin{letstmt}
\patdef{NeffenUndNichten}{ \Dunion \setcomp{g.kind}{g \In Geschwister}}
\end{letstmt} \\
\return{\pex{n \In NeffenUndNichten} \And  \\
\pex{n.Geschlecht = \const{maennlich}}};
\end{op}
\kw{\kw{private}}\begin{op}[e]{Cousins}%
\signature{() \Oto \setof{Person}}
\parms{}
\annlab[o]{Person`Cousins}
\begin{letstmt}
\patdef{Grosseltern}{ \Dunion \setcomp{e.elter}{e \In elter}}
\end{letstmt} \\
\begin{letstmt}
\patdef{OnkelUndTanten} \\
{ \Dunion \setcomp{g.kind}{g \In Grosseltern} \Setdiff elter}
\end{letstmt} \\
\begin{letstmt}
\patdef{CousinsUndCousinen}{ \Dunion \setcomp{o.kind}{o \In OnkelUndTanten}}
\end{letstmt} \\
\return{\setcomp{c}{c \In CousinsUndCousinen}[c.Geschlecht = \const{maennlich}]};
\end{op}
\kw{\kw{private}}\begin{op}[e]{istStiefvater}%
\signature{Person \Oto \Bool }
\parms{s}
\annlab[o]{Person`istStiefvater}
\begin{letstmt}
\patdef{Mutter}{\iota{e \In elter}{e.Geschlecht = \const{weiblich}}}
\end{letstmt} \\
\begin{letstmt}
\patdef{GattenDerMutter}{\setcomp{h.ehemann}{h \In Mutter.hochzeit}}
\end{letstmt} \\
\begin{letstmt}
\patdef{HochzeitenVonSMitMutter} \\
{\setcomp{h}{h \In s.hochzeit}[h.ehefrau = Mutter]}
\end{letstmt} \\
\return{\pex{s.Geschlecht = \const{maennlich}} \And  \\
\pex{s \In \pex{GattenDerMutter \Setdiff elter}} \And  \\
\pex{\exists{h \In HochzeitenVonSMitMutter} \\
{\fnapply{h.Scheidungsdatum.groesserGleich}{\fnapply{Datum`today}{}}}}}
\end{op}
{\small\sf end} {\it Person}

