(* Rapport.sml * Copyright 1996 Peter Sestoft. Må kopieres og modificeres jvfr. GNU General Public License *) open Basis infix && infix 1 &&& (* konkatenering af to *) infix 0 ||| (* valg mellem to *) infix 2 >>> (* valg eller ikke af en *) fun (s1 &&& s2) () = s1 () && s2 () fun &&* ss () = List.foldl (fn (s, res) => res && s ()) Tom ss fun (p >>> s) () = if ssh p then s () else Tom fun ||* ss () = vaelgfra ss () (* lige valg blandt alle *) local (* lige valg blandt strenge, men undgå at vælge samme for ofte *) val valgNummer = ref 0 val sidstegang = Array.array(117, ~999999) (* ikke brugt endnu *) fun vaelgny ss = let val _ = valgNummer := !valgNummer + 1; val mulig = vaelgfra ss val klasse = Polyhash.hash mulig mod 117 in if Array.sub(sidstegang, klasse) + 30 > !valgNummer then (vaelgny ss) else (Array.update(sidstegang, klasse, !valgNummer); Str mulig) end in fun ||$* ss () = vaelgny ss end fun (s1 ||| s2) () = vaelgfra #[s1, s2] () (* lige valg blandt to *) fun $ s () = Str s local (* afsnitsoverskrifter *) type item = int * string * ordsek (* niveau * anker og titel *) datatype afsnit = A of item * afsnit list type partial = afsnit list val niveau = ref 0 (* afsnittets niveau: 0, 1, 2, ... *) val overskrifter = ref ([] : partial) fun overskrift 0 s = Format.overskrift0 s | overskrift 1 s = Format.overskrift1 s fun slutunder (partial : partial) : partial = let fun loop [] sidste res = res | loop ((afs as A((niv, anker, ovs), [])) :: rest) sidste res = if niv = sidste then loop rest sidste (afs :: res) else (A((niv, anker, ovs), res) :: rest) in loop partial (!niveau) [] end in fun begyndafsnit () = niveau := !niveau + 1 fun slutafsnit () = (overskrifter := slutunder (!overskrifter); niveau := !niveau - 1) fun nytafsnit (ovsk : ordsek) = let val (anker, ovsk') = Format.lavAnker ovsk in overskrifter := A((!niveau, anker, ovsk), []) :: !overskrifter; overskrift (!niveau) ovsk' end fun indhold () = let fun afsnit (A((niv, anker, s), uafs)) = Format.li (Format.href anker s) && underafsnit uafs and underafsnit [] = Tom | underafsnit uafs = Format.ul (List.foldl (fn (uaf, res) => res && afsnit uaf) Tom uafs) in overskrift 0 (Str "Indholdsfortegnelse") && underafsnit (rev (!overskrifter)) && Format.streg () end end val generator = "http://www.matfys.kvl.dk/~sestoft/center.html" val kolofon = Format.streg &&& nytafsnit o $ "Kolofon" &&& $"Dette er forslag nummer" &&& Basis.skrivseed &&& $"produceret den" &&& Format.dato &&& $"af den fuldautomatiske rapportgenerator" &&& $"ved" &&& Format.href generator o $ generator &&& $"." &&& $"Rapporten er trykt på genbrugspapir" &&& $"og overholder gældende EU-normer for klarhed og relevans." fun forfattere () = nytafsnit (Str "Appendiks: Arbejdsgruppens medlemmer") && Str "Arbejdsgruppen bag rapporten bestod af" && Format.ul (mksek (5 + terning 5) (Format.li o Format.begyndelse o Navne.person)) && Format.afsnit () && Str "Endvidere rettes en tak til" && Navne.person () && Str "og" && Navne.person () && Str "for konstruktiv kritik." fun nominal () = #3 (Led.nominal NONE) val adverbial = 0.3 >>> ||$* #["ad omveje", "aldrig", "blot", "delvis", "dybest set", "effektivt", "eventuelt", "fortrinsvis", "først og fremmest", "generelt", "gradvis", "ikke", "ikke nødvendigvis", "indadtil", "indirekte", "i det lange løb", "i ringe grad", "isoleret set", "kun", "kun sjældent", "langt oftere", "løst sagt", "med tiden", "midlertidigt", "muligvis", "måske", "måske ikke", "noget indirekte", "nok ikke", "ofte", "partielt", "potentielt", "ret typisk", "ret utvetydigt", "sjældent", "så at sige", "temmelig entydigt", "tendentielt", "utvivlsomt", "kun vanskeligt", "væsentligst"] val verbPraesIndAkt = ||$* #["accentuerer", "afmystificerer", "angår", "belyser", "begrunder", "berører", "beskriver", "besværliggør", "effektiviserer", "eksternaliserer", "erstatter", "forandrer", "foregriber", "fornyer", "forstærker", "fortrænger", "fremmer", "hæmmer", "implicerer", "involverer", "karakteriserer", "kendetegner", "klarlægger", "komplicerer", "modarbejder", "moderniserer", "modsvarer", "omdefinerer", "problematiserer", "profilerer", "påvirker", "reducerer", "styrker", "støtter", "svækker", "udnytter", "udvikler", "understøtter", "vedrører"] val konjunktion = ||$* #["da", "da", "eftersom", "eftersom", "fordi", "forudsat", "hvis", "ikke mindst fordi", "mens", "netop fordi", "når", "når blot", "på trods af at", "selvom", "selvom", "skønt", "såfremt"] val ledsaetning = nominal &&& adverbial &&& verbPraesIndAkt &&& nominal val ledsaetning2 = verbPraesIndAkt &&& nominal &&& adverbial &&& nominal val hovedsaetning = nominal &&& verbPraesIndAkt &&& adverbial &&& nominal val konstatering = (||* #[$"det er" &&& ||$* #["beklageligt", "bevist", "forståeligt", "klart", "indiskutabelt", "nødvendigt", "oplagt", "påfaldende", "velkendt"], ||$* #["anerkendte", "enkelte", "de fleste", "danske", "isolerede", "omhyggelige", "samtlige", "troværdige", "uafhængige", "udenlandske", "visse", "vores"] &&& ||$* #["analyser", "forskere", "iagttagere", "resultater", "studier", "undersøgelser"] &&& ||$* #["antyder", "demonstrerer", "fastslår", "lader formode", "påpeger", "viser"] ] &&& $"at" &&& ledsaetning ||| hovedsaetning) &&& ||* #[$ "," &&& konjunktion &&& ledsaetning &&& 0.05 >>> ($"," &&& $"og" &&& konjunktion &&& ledsaetning), $"," &&& ($"der" ||| $"som") &&& 0.5 >>> ||$* #["af denne årsag", "derfor", "følgelig", "samtidig", "sideløbende", "således", "trods dette"] &&& adverbial &&& verbPraesIndAkt &&& nominal, 0.3 >>> ($"." &&& $"For det første fordi" &&& ledsaetning &&& $"," &&& $"og for det andet fordi" &&& ledsaetning) ] val konstatering = Format.begyndelse o konstatering &&& $"." val raesonnement = konjunktion &&& ledsaetning &&& $"," &&& ( ||$* #["bør", "kan", "må", "skal"] &&& $"det" &&& ||$* #["antages", "betones", "betvivles", "forudsættes", "konstateres", "pointeres", "påpeges", "understreges"] ||| ||$* #["bør", "kan", "må", "skal"] &&& ||$* #["arbejdsgruppen", "man", "udvalget", "vi"] &&& ||$* #["acceptere", "anerkende", "antage", "beklage", "sikre", "forudsætte", "konstatere"] ) &&& $"at" &&& (ledsaetning ||| $"dette" &&& adverbial &&& verbPraesIndAkt &&& nominal) val raesonnement = Format.begyndelse o raesonnement &&& $"." val konsekvens = ||* #[$"det" &&& ||$* #["følger", "indses", "konkluderes", "ses"], ||$* #["arbejdsgruppen", "man", "udvalget", "vi"] &&& ||$* #["konkluderer", "ser", "slutter"], $"der" &&& $"gælder" ] &&& ||$* #["altså", "da", "derfor", "endda", "endvidere", "nu", "straks", "således", "tillige", "uden videre", "ret umiddelbart", "umiddelbart"] &&& $"," &&& $"at" &&& ledsaetning &&& 0.7 >>> ($"," &&& $"og" &&& $"at" &&& ledsaetning) ||| ||$* #["altså", "af disse grunde", "derfor", "klart nok", "følgelig", "således"] &&& ledsaetning2 val konsekvens = Format.begyndelse o konsekvens &&& $"." (* Krumspring for at sikre at friske grafer genereres: *) local val billednr = ref 0 fun skrivnr url = (billednr := !billednr + 1; concat [url, "?billed=", strseed(), "-", Int.toString (!billednr)]) in fun billede url () = Format.afsnit () && Format.center (Format.billede (skrivnr url)) end fun mkafsnit () = Format.afsnit () && nytafsnit (Format.begyndelse (nominal ())) && konstatering () && mksek (3 + terning 5) (||* #[konstatering, raesonnement, konsekvens]) && (0.25 >>> (billede "lagkage" ||| billede "kurver")) () fun baggrund () = (nytafsnit (Str "Baggrund") before begyndafsnit ()) && mksek (2 + terning 3) mkafsnit before slutafsnit () fun titelnom () = let val (form, koen, nom, _) = Substant.vaelg (SOME (ubs, flt)) in Led.adj form koen && nom end val centernavn = titelnom &&& ||$* #["og", "samt"] &&& titelnom val samarbejde = Format.afsnit &&& $"Centret vil være en oplagt partner for det nyligt" &&& $"foreslåede center for" &&& centernavn &&& $"," &&& $"ligesom der bør kunne opnås en frugtbar symbiose med" &&& $"centret for" &&& centernavn &&& $"." fun oprettelse center = Format.begyndelse o ( ||$* #["de anførte", "ovenstående", "de opregnede"] &&& ||$* #["argumenter", "betragtninger", "forhold", "grunde", "konstateringer", "overvejelser", "ræsonnementer"] &&& ||$* #["fører", "leder"] &&& 0.5 >>> ||$* #["logisk", "nødvendigvis", "os", "uomgængeligt"] &&& 0.3 >>> $"frem" &&& $"til den konklusion at der" &&& ||$* #["er behov for", "må oprettes", "bør etableres"] &&& $"et virtuelt center for" &&& (fn _ => center) &&& $".") fun anbefaling center () = (nytafsnit (Str "Anbefaling") before begyndafsnit ()) && oprettelse center () && samarbejde () before slutafsnit () fun diskussion () = (nytafsnit (Str "Diskussion") before begyndafsnit ()) && mksek (2 + terning 3) mkafsnit before slutafsnit () fun rapport () = let val center = centernavn () val tekst = (baggrund &&& diskussion &&& anbefaling center &&& forfattere &&& kolofon) () in Format.html (Str "Forslag til virtuelt center for" && center) (indhold () && tekst) end