@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix dce: <http://purl.org/dc/elements/1.1/>.
@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix math: <http://www.w3.org/2000/10/swap/math#>.
@prefix func: <http://www.w3.org/2007/rif-builtin-function#>.
@prefix e: <http://eulersharp.sourceforge.net/2003/03swap/log-rules#>.
@prefix event: <http://eulersharp.sourceforge.net/2003/03swap/event#>.
@prefix time: <http://eulersharp.sourceforge.net/2003/03swap/time#>.
@prefix organism: <http://eulersharp.sourceforge.net/2003/03swap/organism#>.
@prefix schema: <http://schema.org/>.

<http://eulersharp.sourceforge.net/2003/03swap/age_rules_backward>
    dce:title """Age rules backward"""@en;
    dce:creator """Hans Cools"""@en;
    dce:publisher """Agfa Healthcare/Belgium"""@en;
    dce:description """Rules to calculate an age of a person at a reference time."""@en;
    skos:note """Rules are triggered in another rule and executed backwardly."""@en.


## STARTING FROM BIRTH DATE TIME AND AGE EXPRESSED IN YEARS:
    
{   (?person ?dateTime) time:calculatingAge ?ageInYears}
<=
{   ?person organism:hasBirthDateTime ?birthDateTime.
    (?dateTime ?birthDateTime) math:difference ?seconds.
    ?seconds math:greaterThan 0.
    (?seconds "P1M"^^xsd:duration) math:integerQuotient ?monthsNumeral.
#    ?monthsNumeral math:notLessThan 1.
    (?lexical xsd:yearMonthDuration) log:dtlit ?monthsNumeral, ?yearMonthDuration.
    (?yearMonthDuration) func:years-from-duration ?ageInYears}.


## STARTING FROM BIRTH DATE AND AGE EXPRESSED IN YEARS:
    
{   (?person ?dateTime) time:calculatingAge ?ageInYears}
<=
{   ?person organism:hasBirthDate ?birthDate.
    (?dateTime ?birthDate) math:difference ?seconds.
    ?seconds math:greaterThan 0.
    (?seconds "P1M"^^xsd:duration) math:integerQuotient ?monthsNumeral.
#    ?monthsNumeral math:notLessThan 1.
    (?lexical xsd:yearMonthDuration) log:dtlit ?monthsNumeral, ?yearMonthDuration.
    (?yearMonthDuration) func:years-from-duration ?ageInYears}.



## STARTING FROM BIRTH DATE AND AGE EXPRESSED IN YEARS:
    
{   (?person ?dateTime) time:calculatingAge ?ageInYears}
<=
{   ?person schema:birthDate ?birthDate.
    (?dateTime ?birthDate) math:difference ?seconds.
    ?seconds math:greaterThan 0.
    (?seconds "P1M"^^xsd:duration) math:integerQuotient ?monthsNumeral.
#    ?monthsNumeral math:notLessThan 1.
    (?lexical xsd:yearMonthDuration) log:dtlit ?monthsNumeral, ?yearMonthDuration.
    (?yearMonthDuration) func:years-from-duration ?ageInYears}.

    

## AGE EXPRESSED IN DAYS:

#{   (?person ?dateTime) event:calculatingDayAge ?ageInDays}
#<=
#{   ?person organism:hasBirthDateTime ?birthDateTime.
#    (?dateTime ?birthDateTime) math:difference ?seconds.
#    ?seconds math:greaterThan 0.
#    (?seconds "P1M"^^xsd:duration) math:integerQuotient ?monthsNumeral.
#    ?monthsNumeral math:lessThan 1.
#    (?seconds "P1D"^^xsd:duration) math:integerQuotient ?ageInDays}.
