diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f774336812..394de5087d 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,10 +1,16 @@ # Release notes of Ampersand ## Unreleased changes + +## v4.7.7 (27 november 2023) + +- Brackets in the natural language formatting were erroneous, so Stef fixed it. This helps to resolve a little bit of our technical debt. + * [Issue #1419](https://github.com/AmpersandTarski/Ampersand/issues/1419) added a test, to be activated in the regression after resolving #1419. * [Issue #1420](https://github.com/AmpersandTarski/Ampersand/issues/1420) added a test, to be activated in the regression after resolving #1420. * [Issue #1421](https://github.com/AmpersandTarski/Ampersand/issues/1421) added easier development through Docker image at dockerhub: [ampersandtarski/ampersand-devcontainer](https://hub.docker.com/repository/docker/ampersandtarski/ampersand-devcontainer/general). Also fixes https://github.com/AmpersandTarski/Ampersand/issues/1359 -* Development of Ampersand generator can now be done with codespaces. +* Development of Ampersand generator can now be done with codespaces (Check it out!). + ## v4.7.6 (26 february 2023) ## v4.7.5 (25 february 2023) diff --git a/ampersand.cabal b/ampersand.cabal index c0d4adeed8..f8d79f1763 100644 --- a/ampersand.cabal +++ b/ampersand.cabal @@ -5,7 +5,7 @@ cabal-version: 2.0 -- see: https://github.com/sol/hpack name: ampersand -version: 4.7.6 +version: 4.7.7 synopsis: Toolsuite for automated design of enterprise information systems. description: You can define your business processes by means of rules, written in Relation Algebra. category: Database Design diff --git a/package.yaml b/package.yaml index 50718110d5..69af440b67 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: ampersand -version: 4.7.6 +version: 4.7.7 author: Stef Joosten maintainer: stef.joosten@ou.nl synopsis: Toolsuite for automated design of enterprise information systems. diff --git a/src/Ampersand/Output/PredLogic.hs b/src/Ampersand/Output/PredLogic.hs index eef6ea060d..298e44ac1c 100644 --- a/src/Ampersand/Output/PredLogic.hs +++ b/src/Ampersand/Output/PredLogic.hs @@ -109,11 +109,12 @@ predLshow lang vMap = charshow 0 Dom pexpr var -> vMap var <> T.pack " ∈ dom(" <> charshow 8 pexpr <> T.pack ")" Cod pexpr var -> vMap var <> T.pack " ∈ cod(" <> charshow 8 pexpr <> T.pack ")" R pexpr rel pexpr' - | isIdent (EDcD rel) -> wrap i 5 (charshow 5 pexpr) <> T.pack " = " <> wrap i 5 (charshow 5 pexpr') + | isIdent (EDcD rel) -> wrap i 5 (charshow 2 pexpr) <> T.pack " = " <> wrap i 2 (charshow 5 pexpr') | otherwise -> - if T.null (decprL <> decprM <> decprR) - then d <> T.pack " " <> name rel <> T.pack " " <> c - else decprL <> d <> decprM <> c <> decprR + wrap i 5 $ + if T.null (decprL <> decprM <> decprR) + then d <> T.pack " " <> name rel <> T.pack " " <> c + else decprL <> d <> decprM <> c <> decprR where d = wrap i 5 (charshow 5 pexpr) c = wrap i 5 (charshow 5 pexpr') @@ -127,7 +128,7 @@ predLshow lang vMap = charshow 0 Function pexpr rel -> name rel <> T.pack "(" <> charshow 1 pexpr <> T.pack ")" Kleene0 rs -> wrap i 6 (charshow 6 rs <> T.pack "*") Kleene1 rs -> wrap i 7 (charshow 7 rs <> T.pack "+") - Not rs -> wrap i 8 (l (toNL " niet ", toEN " not ") <> charshow 8 rs) + Not rs -> wrap i 8 (l (toNL " niet ", toEN " not ") <> charshow 1 rs) predNormalize :: PredLogic -> PredLogic predNormalize predlogic = predlogic --TODO: Fix normalization of PredLogic diff --git a/testing/Travis/testcases/Misc/Arbeidsduur.adl b/testing/Travis/testcases/Misc/Arbeidsduur.adl index 3526a9f7ff..75f156ad22 100644 --- a/testing/Travis/testcases/Misc/Arbeidsduur.adl +++ b/testing/Travis/testcases/Misc/Arbeidsduur.adl @@ -7,25 +7,25 @@ PATTERN Arbeidsduur --[Arbeidsrelaties]-- werkgever :: Arbeidsrelatie -> Persoon -PRAGMA "In" "is" "de werkgever" +PRAGMA "In " " is " " de werkgever" MEANING "Elke arbeidsrelatie benoemt expliciet welke (rechts)persoon de rol van werkgever vervult." PURPOSE RELATION werkgever {+Om de werkgever te kunnen bepalen gaan we ervan uit dat elke arbeidsrelatie precies één werkgever heeft.+} werknemer :: Arbeidsrelatie -> Persoon -PRAGMA "In" "is" "de werknemer" +PRAGMA "In " " is " " de werknemer" MEANING "Elke arbeidsrelatie benoemt expliciet welke persoon de rol van werknemer vervult." PURPOSE RELATION werknemer {+We gaan ervan uit dat elke arbeidsrelatie precies één werknemer heeft.+} arbeidsduur :: Arbeidsrelatie -> Arbeidsduur -PRAGMA "In" "is" "als arbeidsduur afgesproken" +PRAGMA "In " " is " " als arbeidsduur afgesproken" MEANING "Elke arbeidsrelatie vermeldt de afgesproken arbeidsduur." PURPOSE RELATION arbeidsduur REF "Artikel 2 lid 1" {+De Wet aanpassing arbeidsduur spreekt van ``de uit zijn arbeidsovereenkomst of publiekrechtelijke aanstelling voortvloeiende arbeidsduur''. Dat impliceert dat er voor elke arbeidsovereenkomst of publiekrechtelijke aanstelling precies één arbeidsduur is. Er zijn ongetwijfeld andere wetten en regelingen die dat garanderen, maar hier nemen we dit als een gegeven (uitgangspunt) over.+} inDienst :: Arbeidsrelatie -> Datum -PRAGMA "" "vermeldt" "als tijdstip van indiensttreding" +PRAGMA "" " vermeldt " " als tijdstip van indiensttreding" MEANING "Elke arbeidsrelatie kent een tijdstip van indiensttreding." PURPOSE RELATION inDienst REF "Artikel 2 lid 3" {+Om een verzoek te mogen indienen dient de werknemer ten minste een jaar voorafgaand aan het beoogde tijdstip van ingang van de aanpassing in dienst te zijn bij de werkgever. @@ -35,7 +35,7 @@ Deze details worden om praktische redenen buiten scope gehouden.+} --[Verzoeken]-- arbeidsrelatie :: Verzoek -> Arbeidsrelatie -PRAGMA "" "betreft" +PRAGMA "" " betreft " MEANING "Het verzoek vermeldt de arbeidsrelatie waarop de aanpassing van toepassing is." PURPOSE RELATION arbeidsrelatie {+Het verzoek moet duidelijk vermelden welke arbeidsrelatie onderwerp is van het verzoek. @@ -43,14 +43,14 @@ Dat is immers niet vanzelfsprekend in die gevallen waar een werknemer meerdere a De onderzochte wet sluit zelfs niet uit dat één werkgever en één werknemer op hetzelfde moment verschillende arbeidsrelaties onderhouden.+} tot :: Verzoek * Aanpassing [UNI] -PRAGMA "" "tot" +PRAGMA "" " tot " MEANING "Elk verzoek beschrijft de gewenste aanpassing van de uit zijn arbeidsovereenkomst of publiekrechtelijke aanstelling voortvloeiende arbeidsduur." PURPOSE RELATION tot[Verzoek*Aanpassing] REF "Artikel 2 lid 1" {+Omdat het gaat om verzoeken tot aanpassing van de arbeidsduur, gedaan vanuit de werknemer, is het beschrijven van de aanpassing verplicht.+} ingediend :: Verzoek * Datum [UNI] -PRAGMA "" "is ingediend" +PRAGMA "" " is ingediend " MEANING "Van elk verzoek is het tijdstip van indienen geregistreerd." PURPOSE RELATION ingediend REF "Artikel 2 lid 3" {+Omdat het tijdstip van indienen van het verzoek relevant is voor de ontvankelijkheid ervan, moeten we het registreren.+} @@ -75,7 +75,7 @@ PURPOSE RELATION laatsteVerzoek REF "Artikel 2 lid 3" --[Beslissingen]-- op :: Beslissing -> Verzoek -PRAGMA "" "op" +PRAGMA "" " op " MEANING "Elke beslissing verwijst naar het verzoek waarop de beslissing genomen is." PURPOSE RELATION op REF "Artikel 2 lid 7" {+Duidelijkheid is nodig over de vraag op welk verzoek een beslissing gevraagd wordt. @@ -83,7 +83,7 @@ De tekst van de wet rept van ``De beslissing op het verzoek ...'' Daarom wordt voor elke beslissing bijgehouden op welk verzoek de betreffende beslissing genomen wordt.+} aanp :: Beslissing -> Aanpassing -PRAGMA "" "tot" +PRAGMA "" " tot " MEANING "Een beslissing beschrijft de aanpassing van de uit de betreffende arbeidsovereenkomst of publiekrechtelijke aanstelling voortvloeiende arbeidsduur." PURPOSE RELATION aanp[Beslissing*Aanpassing] REF "Artikel 2 lid 7" {+De aanpassing waartoe een werkgever besluit kan afwijken van de aanpassing die door de werknemer is verzocht. @@ -91,7 +91,7 @@ Daarom wordt aan het besluit nadrukkelijk de aanpassing verbonden die door de we Onder inwilligen zullen we dan ook verstaan dat de aanpassing waarom verzocht is gelijk is aan de aanpassing die in het besluit is vermeld.+} door :: Beslissing -> Persoon -PRAGMA "" "door" +PRAGMA "" " door " MEANING "Elke beslissing wordt door een (rechts)persoon genomen." PURPOSE RELATION door {+Het moet duidelijk zijn door welke (rechts)persoon een beslissing genomen is. @@ -99,14 +99,14 @@ Het optreden van natuurlijke personen als tekenbevoegde voor een rechtspersoon w Hier volstaan we met de juridische entiteit, ofwel de werkgever die de beslissing neemt.+} medegedeeldAan :: Beslissing * Persoon [UNI] -PRAGMA "" "is medegedeeld aan" +PRAGMA "" " is medegedeeld aan " MEANING "Beslissingen kunnen worden medegedeeld aan personen. Dat gebeurt schriftelijk." PURPOSE RELATION medegedeeldAan REF "Artikel 2 lid 7" {+De beslissing op het verzoek om aanpassing van de arbeidsduur wordt door de werkgever schriftelijk aan de werknemer meegedeeld. Daarom wordt het mededelen vastgelegd.+} reden :: Beslissing * Reden [INJ,SUR] -PRAGMA "" "wordt gemotiveerd door" +PRAGMA "" " wordt gemotiveerd door " MEANING "Beslissingen kunnen met redenen worden omkleed." PURPOSE RELATION reden REF "Artikel 2 lid 7" {+Een beslissing, die afwijkt van de wensen van de werknemer, dient onder schriftelijke opgave van de redenen te worden meegedeeld. @@ -114,26 +114,26 @@ Hier scheppen we de ruimte om redenen voor de beslissing vast te leggen. De eis zelf, namelijk dat er redenen moeten zijn voor een afwijkend besluit, is elders in deze analyse geformuleerd.+} beslisdatum :: Beslissing -> Datum -PRAGMA "" "is genomen op" +PRAGMA "" " is genomen op " MEANING "Beslissingen worden genomen op een zekere datum." PURPOSE RELATION beslisdatum REF "Artikel 2 lid 3" {+Volgens de wet mogen werknemers ten hoogste eenmaal per twee jaren, nadat de werkgever een verzoek om aanpassing van de arbeidsduur heeft ingewilligd of afgewezen, opnieuw een verzoek indienen. Om dit te kunnen toetsen moet de datum waarop beslissingen worden genomen, worden geregistreerd.+} --[Aanpassingen]-- nieuw :: Aanpassing -> Arbeidsduur -PRAGMA "" "leidt tot een nieuwe arbeidsduur van" +PRAGMA "" " leidt tot een nieuwe arbeidsduur van " MEANING "De arbeidsduur na aanpassing moet in de beslissing worden vermeld." PURPOSE RELATION nieuw REF "Artikel 2 lid 3" {+De nieuwe arbeidsduur moet eenduidig uit de aanpassing blijken.+} ingang :: Aanpassing -> Datum -PRAGMA "" "gaat in op" +PRAGMA "" " gaat in op " MEANING "Het tijdstip van ingang moet in de aanpassing worden vermeld." PURPOSE RELATION ingang REF "Artikel 2 lid 3" {+De aanpassing van de arbeidsduur moet worden ingediend onder opgave van een beoogd tijdstip van ingang.+} omvang :: Aanpassing -> Omvang -PRAGMA "" "betreft een verandering ter grootte van" +PRAGMA "" " betreft een verandering ter grootte van " MEANING "De omvang van de aanpassing van de arbeidsduur moet worden vermeld." PURPOSE RELATION omvang REF "Artikel 2 lid 3" {+De aanpassing moet worden ingediend onder opgave van de omvang van de aanpassing van de arbeidsduur per week of, als de arbeidsduur over een ander tijdvak is overeengekomen over dat tijdvak en de gewenste spreiding van de uren over de week of het anderszins overeengekomen tijdvak.+} @@ -214,7 +214,7 @@ PURPOSE RULE "Vandaag is 1 (enkele) dag" {+ Om handelingen op een zekere datum uit te kunnen voeren, en omdat we dat in Ampersand moeten kunnen berekenen, voeren we een Concept ``Vandaag'' in (bestaande uit 1 atoom "vandaag").+} RULE "Vandaag is 1 (enkele) dag": I[Vandaag] = "VANDAAG" vandaag :: Vandaag * Datum [UNI] -PRAGMA "" "is de datum" +PRAGMA "" " is de datum " POPULATION Vandaag CONTAINS ["VANDAAG"] ROLE ExecEngine MAINTAINS "Stel datum van vandaag vast" @@ -288,7 +288,7 @@ PURPOSE RELATION vierMaandenOfMeer REF "Artikel 2 lid 3" {+Omdat de wet een termijn van vier maanden noemt, en omdat we in Ampersand (nog) niet kunnen rekenen, voeren we een relatie “vierMaandenOfMeer” in. Deze dient als stub voor het rekenwerk.+} vierMaandenOfMeer :: Datum * Datum -PRAGMA "" "ligt minstens vier maanden voor" +PRAGMA "" " ligt minstens vier maanden voor " MEANING "De relatie 'vierMaandenOfMeer' bevat alleen paren van datums waarvan de eerste minstens vier maanden voor de tweede valt." vierMaandenOfMeerTrigger :: Datum * Datum ROLE ExecEngine MAINTAINS "Bereken vier maanden of meer" @@ -325,7 +325,7 @@ VIOLATION (TXT "{EX} InsPair;uitersteBeslisdatum;Verzoek;", SRC I, TXT ";Datum;" PURPOSE RELATION minstensEenJaar REF "Artikel 2 lid 1" {+Omdat de wet de voorwaarde stelt dat de werknemer die tot aanpassing van zijn arbeidsduur verzoekt, tenminste 1 jaar voor de ingangsdatum van de aanpassing in dienst moet zijn, willen we dat automatisch kunnen uitrekenen. Daarom voeren we een relatie ``minstensEenJaar'' in.+} minstensEenJaar :: Datum * Datum -PRAGMA "" "ligt minstens een jaar voor" +PRAGMA "" " ligt minstens een jaar voor " MEANING "De relatie 'minstensEenJaar' geeft weer of er minstens een jaar zijn verstreken tussen twee tijdstippen." minstensEenJaarTrigger :: Datum * Datum PURPOSE RULE "Berekenen van de termijn van een jaar conform artikel 2 lid 1" @@ -340,7 +340,7 @@ VIOLATION (TXT "{EX} InsPair;minstensEenJaarTrigger;Datum;", SRC I, TXT ";Datum; PURPOSE RELATION minstensTweeJaar REF "Artikel 2 lid 3" {+Omdat de wet de voorwaarde stelt dat de werknemer die tot aanpassing van zijn arbeidsduur verzoekt, tenminste 2 jaar na een voorafgaand besluit wacht met het indienen van een nieuw verzoek, willen we dat automatisch kunnen uitrekenen. Daarom voeren we een relatie ``minstensTweeJaar'' in.+} minstensTweeJaar :: Datum * Datum -PRAGMA "" "ligt minstens twee jaar voor " +PRAGMA "" " ligt minstens twee jaar voor " MEANING "De relatie 'minstensTweeJaar' geeft weer of er minstens twee jaren zijn verstreken tussen twee tijdstippen." minstensTweeJaarTrigger :: Datum * Datum PURPOSE RULE "Berekenen van de termijn van twee jaar"