AmpersandTarski / Ampersand

Build database applications faster than anyone else, and keep your data pollution free as a bonus.
http://ampersandtarski.github.io/
GNU General Public License v3.0
40 stars 8 forks source link

Meatgrinder ignores generated Enforce-rules #1224

Closed stefjoosten closed 2 years ago

stefjoosten commented 2 years ago

What happened

I got an error in RAP (see screenshot below) indicating that some rules in the RAP atlas were ignored by the meatgrinder. These are precisely the rules that are generated as a result of an ENFORCE statement.

What I expected

I expected this script to fly without mistakes.

Version of Ampersand that was used

Ampersand-v4.4.0 [83d056aab482032f468d54b93c117d68d443ad95], build time: 16-Sep-21

Steps to reproduce

  1. Run a copy of RAP with the Ampersand compiler at commit 83d056aab482032f468d54b93c117d68d443ad95.
  2. Copy the script below
  3. Paste the script into the editor window of RAP
  4. Compile

Screenshot / Video

image

Context / Source of ampersand script

CONTEXT BIG

PURPOSE RELATION eerder[Datum*Datum]
{+ Deze relatie is nodig om twee datums (data?) te kunnen vergelijken. +}
RELATION eerder[Datum*Datum]
MEANING
{+ Voor elke denkbare datum d1 en d2 geldt d1 eerder d2 dan en slechts dan als d1 < d2. +}

PURPOSE RELATION register[Aantekening*Register]
{+ Een aantekening als bedoeld in artikel 9, tweede lid, onderdeel a van de Wet BIG
is bedoeld om een maatregel ten aanzien van een ingeschrevene te registreren.
+}
RELATION register[Aantekening*Register] [UNI,TOT]

PURPOSE RELATION beschikking[Aantekening*Beschikking]
{+ Een register registreert een beschikking als bedoeld in artikel 10 van de Wet BIG
om een aantekening in datzelfde register te onderbouwen.
+}
RELATION beschikking[Aantekening*Beschikking] [UNI]

RELATION doorgehaald[Inschrijving*Datum]
RELATION register[Inschrijving*Register] [UNI,TOT]

PURPOSE PATTERN "Inschrijfduur"
{+ Inschrijvingen in een register zijn beperkt geldig.
Artikel 8, eerste lid van de Wet BIG stelt:
"Bij algemene maatregel van bestuur wordt bepaald dat de inschrijving in een bij de maatregel aangewezen register wordt doorgehaald
indien na de in het tweede lid bedoelde datum een bij de maatregel aangegeven periode is verstreken."
Artikel 2, tweede lid van het Besluit periodieke registratie Wet BIG stelt deze periode op vijf jaren.
+}
PATTERN "Inschrijfduur"

PURPOSE RELATION diplomadatum[Inschrijving*Datum]
{+ Een register registreert de datum waarop de ingeschrevene een diploma heeft behaald
   op grond waarvan de ingeschrevene
   een erkenning van beroepskwalificaties als bedoeld in de Algemene wet erkenning EU-beroepskwalificaties
   heeft verkregen, zoals bedoeld in Art. 8 lid 2 sub a van de Wet BIG.
   Als er meerdere diploma's zijn, kunnen er dus ook meerdere diplomadata zijn voor dezelfde inschrijving.
+}
RELATION diplomadatum[Inschrijving*Datum]
MEANING "Er is een erkend diploma bij een inschrijving geregistreerd dat relevant is voor het bepalen van de geldigheid van die inschrijving."

PURPOSE RELATION verklaringdatum[Inschrijving*Datum]
{+ Een register registreert de datum waarop de ingeschrevene een in artikel 41, eerste lid, onder b, bedoelde verklaring heeft verkregen,
   zoals bedoeld in Art. 8 lid 2 sub a van de Wet BIG.
   Als er meerdere van dit soort verklaringen zijn, kunnen er dus ook meerdere data zijn bij dezelfde inschrijving.
+}
RELATION verklaringdatum[Inschrijving*Datum]
MEANING "Er is een verklaring bij een inschrijving geregistreerd die relevant is voor het bepalen van de geldigheid van die inschrijving."

PURPOSE RELATION getuigschriftdatum[Inschrijving*Datum]
{+ Een register registreert datum waarop de ingeschrevene een bij of krachtens hoofdstuk III of VI aangewezen getuigschrift heeft verkregen,
   zoals bedoeld in Art. 8 lid 2 sub a van de Wet BIG.
   Als er meerdere getuigschriften zijn, kunnen er dus ook meerdere data zijn bij dezelfde inschrijving.
+}
RELATION getuigschriftdatum[Inschrijving*Datum]
MEANING "Er is een getuigschrift bij een inschrijving geregistreerd dat relevant is voor het bepalen van de geldigheid van die inschrijving."

PURPOSE RELATION kwalificatiedatum[Inschrijving*Datum]
{+ Om de inschrijvingsduur te bepalen rekenen we met de meest recente van de geregistreerde diplomadata, verklaringdata en getuigschriftdata.
   Uiteindelijk is er dus precies één datum die gebruikt wordt om de inschrijfduur te bepalen.
+}
RELATION kwalificatiedatum[Inschrijving*Datum]
ENFORCE kwalificatiedatum := getuigschriftdatum\/verklaringdatum\/diplomadatum
-- zie https://ampersandtarski.gitbook.io/documentation/the-language-ampersand/the-enforce-statement
-- Voor het bepalen van de meest recente kwalificatiedatum hebben we dus het maximum van deze data nodig. -->  TODO.

PURPOSE RELATION einddatum[Inschrijving*Datum]
{+ Om het einde van een inschrijving te bepalen tellen we vijf jaar (zie Artikel 2.2 van het besluit) op bij de meest recente kwalificatiedatum.
Als gevolg daarvan verandert de einddatum als de ingeschrevene tijdig verlenging krijgt.
+}
RELATION einddatum[Inschrijving*Datum]
-- TODO: het rekenwerk voor het optellen van 5 jaar kan Ampersand niet. Daarvoor moeten we een stukje maatwerk-code toevoegen. Dat laten we
-- in deze afstudeeropdracht achterwege.

RELATION vandaag[Datum]
PURPOSE RELATION doorgehaald[Inschrijving*Datum]
{+ Om het einde van een inschrijving te bepalen tellen we vijf jaar (zie Artikel 2.2 van het besluit) op bij de meest recente kwalificatiedatum.
Als gevolg daarvan verandert de einddatum als de ingeschrevene tijdig verlenging krijgt.
+}
RELATION einddatum[Inschrijving*Datum]
ENFORCE doorgehaald := einddatum;eerder~;vandaag~
ENDPATTERN

ENDCONTEXT
stefjoosten commented 2 years ago

Analysis

I traced the generation of Atlas population to the file ConceptStructure.hs, where the mistake was staring me in the face: image Is clear from the violations (see screenshot above) that the rules generated by enforceRules are missing. Instead, the code uses ctxEnforces, which only provides the expressions in the script but not the expressions that are generated.

Diagnosis

This was a software error.

Treatment

I'll fix it and close this issue if I have proved the analysis right.

hanjoosten commented 2 years ago

The analysis is spot on. Nice catch. A workaround for the student could be to remove the patterns. But the fix shouldn't be to hard to bring to production soon.

stefjoosten commented 2 years ago

The analysis is spot on. Nice catch. A workaround for the student could be to remove the patterns. But the fix shouldn't be too hard to bring to production soon.

The workaround doesn't work. The reason is that the function ctxEnforces does not yield the generated rules, both inside and outside of a pattern. I verified this experimentally by removing all PATTERN statements from my script to promote every enforce statement to the top level. I got exactly the same errors.

stefjoosten commented 2 years ago

As expected, the solution works. The errors have vanished.

afbeelding