From dfd3255a715f5a7d7a5927f5dabe5c4a31f121c6 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Mon, 14 Aug 2023 23:54:27 +0800 Subject: [PATCH 01/49] comments from well-typed --- lib/haskell/natural4/app/Main.hs | 2 +- lib/haskell/natural4/src/LS/Interpreter.hs | 20 ++++++++++++++++++- lib/haskell/natural4/src/LS/Rule.hs | 2 ++ lib/haskell/natural4/src/LS/Types.hs | 1 + lib/haskell/natural4/src/LS/XPile/Logging.hs | 11 +++++++++- .../natural4/src/LS/XPile/Purescript.hs | 18 +++++++++++++++-- .../natural4/src/LS/XPile/Typescript.hs | 2 +- 7 files changed, 50 insertions(+), 6 deletions(-) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index fe374913a..e7b33111a 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -95,7 +95,7 @@ main = do workuuid = SFL4.workdir opts <> "/" <> SFL4.uuiddir opts -- Bits that have to do with natural language processing and generation - nlgLangs <- unsafeInterleaveIO allLangs + nlgLangs <- unsafeInterleaveIO allLangs -- [TODO] Edsko is not a fan and has a whole talk about why we should not use this. strLangs <- unsafeInterleaveIO $ printLangs allLangs (engE,engErr) <- xpLog <$> langEng -- [NOTE] the Production Haskell book gives better ways to integrate Logging with IO diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 8d8db7853..513450a72 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -887,4 +887,22 @@ attrsAsMethods rs = do xpReturn (DL.filter (not . T.null) $ T.strip <$> T.splitOn "'s" (T.replace "'s" "'s" $ mt2text $ DL.init mt) , mt2text [DL.last mt]) - + + +-- * Data Flow Analysis +-- +-- the previous generation of Nubbed Decision Roots worked for +-- boolean propositions. Now we want to analyze the roots that involve +-- more complicated RelationalPredicates, involving not only booleans +-- but also numbers. + +-- | entryPoints returns those data elements that are not used by any other. +-- +entryPoints :: Interpreted -> XPileLog [RelationalPredicate] +entryPoints l4i = do + mutter "entryPoints running." + + + + return [] + diff --git a/lib/haskell/natural4/src/LS/Rule.hs b/lib/haskell/natural4/src/LS/Rule.hs index aae6d23ed..b3ef91f5e 100644 --- a/lib/haskell/natural4/src/LS/Rule.hs +++ b/lib/haskell/natural4/src/LS/Rule.hs @@ -64,6 +64,8 @@ import Text.Megaparsec (<|>), ) +-- | [TODO] refactoring: these should be broken out into their own (new)types and have Rule include them all. +-- We should take advantage of NoFieldSelectors to reduce the hazards here data Rule = Regulative { subj :: BoolStructP -- man AND woman AND child , rkeyword :: RegKeywords -- Every | Party | TokAll diff --git a/lib/haskell/natural4/src/LS/Types.hs b/lib/haskell/natural4/src/LS/Types.hs index 90f1402e1..dc10d1bd9 100644 --- a/lib/haskell/natural4/src/LS/Types.hs +++ b/lib/haskell/natural4/src/LS/Types.hs @@ -401,6 +401,7 @@ data InterpreterOptions = IOpts } deriving (Eq, Ord, Show) +-- [TODO] consider using typeclass Default https://hackage.haskell.org/package/data-default defaultInterpreterOptions :: InterpreterOptions defaultInterpreterOptions = IOpts { enums2decls = False diff --git a/lib/haskell/natural4/src/LS/XPile/Logging.hs b/lib/haskell/natural4/src/LS/XPile/Logging.hs index b46a5336c..5a490be57 100644 --- a/lib/haskell/natural4/src/LS/XPile/Logging.hs +++ b/lib/haskell/natural4/src/LS/XPile/Logging.hs @@ -140,11 +140,20 @@ type XPileLogTE m a = XPileLogT m (Either XPileLogW a) -- in case you need that. You can also define your own type along -- these lines. type XPileLog = XPileLogT Identity + +-- | placeholder for arbitrary environment. This should be replaced by +-- what your actual environment is. Currently there are modules that +-- make up variants of an XPileLog monad; this is an example of how to +-- do that. But we should generalize all that and have an XPileLogR a. type XPileLogR = HashMap String String + +-- | mutterings are basically lists of strings. Any structure in here should be up to the conventions of your logging style; in this project we frequently use org-mode conventions living inside these strings. type XPileLogW = [XPileLogW']; type XPileLogW' = String type XPileLogS = HashMap String String --- | XPileLog as a monad transformer, allowing specialization of the base monad to something besides Identity +-- | XPileLog as a monad transformer, allowing specialization of the base monad to something besides Identity. +-- +-- [TODO] newtypes are preferred! type XPileLogT m = RWST XPileLogR XPileLogW XPileLogS m diff --git a/lib/haskell/natural4/src/LS/XPile/Purescript.hs b/lib/haskell/natural4/src/LS/XPile/Purescript.hs index 2889c18a2..d34ef4b00 100644 --- a/lib/haskell/natural4/src/LS/XPile/Purescript.hs +++ b/lib/haskell/natural4/src/LS/XPile/Purescript.hs @@ -11,7 +11,12 @@ Largely a wrapper. Most of the functionality is in the anyall lib. -} -module LS.XPile.Purescript where +-- [TODO] export list +module LS.XPile.Purescript + -- * These are the top-level entry points for the Purescript transpiler + ( asPurescript + , translate2PS) +where import AnyAll qualified as AA import AnyAll.BoolStruct (alwaysLabeled) @@ -203,7 +208,16 @@ biggestS env rl = do then [] else pure $ onlys ! fst (DL.head sorted) -asPurescript :: NLGEnv -> [Rule] -> XPileLogE String +-- | top level entry point for purescript generation +-- +-- [TODO] how do we modularize and abstract from the NLG and the GF interaction here? +-- 1. because other modules might want to take advantage of NLG too. +-- 2. because maybe we want to decouple and decline NLG here for simplicity. + +asPurescript + :: NLGEnv -- ^ Used to produce more human readable versions of the questions + -> [Rule] + -> XPileLogE String asPurescript env rl = do let nlgEnvStr = env |> gfLang |> showLanguage l4i = env |> interpreted diff --git a/lib/haskell/natural4/src/LS/XPile/Typescript.hs b/lib/haskell/natural4/src/LS/XPile/Typescript.hs index 3cd0f1410..a47c420da 100644 --- a/lib/haskell/natural4/src/LS/XPile/Typescript.hs +++ b/lib/haskell/natural4/src/LS/XPile/Typescript.hs @@ -349,7 +349,7 @@ hc2ts l4i _hc2@HC { hHead = RPParamText pt } = pretty (PT4 pt l4 hc2ts l4i hc2@HC { hHead = RPnary _rprel [] } = error "TypeScript: headless RPnary encountered" hc2ts l4i hc2@HC { hHead = RPnary _rprel rps } = hc2ts l4i hc2 {hHead = head rps} <+> "// hc2ts RPnary" - +-- | for debugging at the moment only. toPlainTS :: Interpreted -> XPileLog (Doc ann) toPlainTS l4i = do return $ vvsep [ "//" <+> viaShow valpred From 3ca1f7bf20190963738fff248f935be4dc83e0b3 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 00:34:53 +0800 Subject: [PATCH 02/49] move the rule decision graph into XPileLog --- lib/haskell/natural4/doc/Interpreter.dot | 136 ++-- lib/haskell/natural4/doc/Interpreter.svg | 857 ++++++++++----------- lib/haskell/natural4/package.yaml | 1 - lib/haskell/natural4/src/LS/Interpreter.hs | 57 +- lib/haskell/natural4/src/LS/Lib.hs | 12 +- lib/haskell/natural4/src/LS/XPile/Org.hs | 15 +- 6 files changed, 541 insertions(+), 537 deletions(-) diff --git a/lib/haskell/natural4/doc/Interpreter.dot b/lib/haskell/natural4/doc/Interpreter.dot index 3dcf55fc1..ad259e6d5 100644 --- a/lib/haskell/natural4/doc/Interpreter.dot +++ b/lib/haskell/natural4/doc/Interpreter.dot @@ -1,89 +1,87 @@ strict digraph deps { node [colorscheme=set312, style=filled]; - subgraph cluster_2 { - label = "src/LS/Interpreter.hs"; - "unleaf" [label= "unleaf", color=2]; - "topsortedClasses" [label= "topsortedClasses", color=2]; - "symbolTable" [label= "symbolTable", color=2]; - "stitchRules" [label= "stitchRules", color=2]; - "ruleNameStr" [label= "ruleNameStr", color=2]; - "ruleDecisionGraph" [label= "ruleDecisionGraph", color=2]; - "relPredRefsAll" [label= "relPredRefsAll", color=2]; - "relPredRefs" [label= "relPredRefs", color=2]; - "onlyTheItems" [label= "onlyTheItems", color=2]; - "onlyItemNamed" [label= "onlyItemNamed", color=2]; - "musings" [label= "musings", color=2]; - "l4interpret" [label= "l4interpret", color=2]; - "itemsByRule" [label= "itemsByRule", color=2]; - "isRuleAlias" [label= "isRuleAlias", color=2]; - "groupedByAOTree" [label= "groupedByAOTree", color=2]; - "getRuleByName" [label= "getRuleByName", color=2]; - "getRuleByLabelName" [label= "getRuleByLabelName", color=2]; - "getRuleByLabel" [label= "getRuleByLabel", color=2]; - "getInheritances" [label= "getInheritances", color=2]; - "getCTkeys" [label= "getCTkeys", color=2]; - "getAttrTypesIn" [label= "getAttrTypesIn", color=2]; - "getAndOrTree" [label= "getAndOrTree", color=2]; - "extractRPMT2Text" [label= "extractRPMT2Text", color=2]; - "exposedRoots" [label= "exposedRoots", color=2]; - "expandTraceDebugging" [label= "expandTraceDebugging", color=2]; - "expandTrace" [label= "expandTrace", color=2]; - "expandRulesByLabel" [label= "expandRulesByLabel", color=2]; - "expandRule" [label= "expandRule", color=2]; - "expandRP" [label= "expandRP", color=2]; - "expandMT" [label= "expandMT", color=2]; - "expandClauses\'" [label= "expandClauses\'", color=2]; - "expandClauses" [label= "expandClauses", color=2]; - "expandClause" [label= "expandClause", color=2]; - "expandBody" [label= "expandBody", color=2]; - "expandBSR\'" [label= "expandBSR\'", color=2]; - "expandBSR" [label= "expandBSR", color=2]; - "decisionRoots" [label= "decisionRoots", color=2]; - "classHierarchy" [label= "classHierarchy", color=2]; - "classGraph" [label= "classGraph", color=2]; - "bsr2bsmt" [label= "bsr2bsmt", color=2]; - "bsmtOfClauses" [label= "bsmtOfClauses", color=2]; - "biggestItem" [label= "biggestItem", color=2]; - "attrType" [label= "attrType", color=2]; - "allCTkeys" [label= "allCTkeys", color=2]; - } - subgraph cluster_1 { - label = "src/LS/XPile/SVG.hs"; - "asAAsvg" [label= "asAAsvg", color=1]; + label = "src/LS/Interpreter.hs"; + "unleaf" [label= "unleaf", color=1]; + "topsortedClasses" [label= "topsortedClasses", color=1]; + "symbolTable" [label= "symbolTable", color=1]; + "ruleNameStr" [label= "ruleNameStr", color=1]; + "ruleLocalsOut" [label= "ruleLocalsOut", color=1]; + "ruleLocalsIn" [label= "ruleLocalsIn", color=1]; + "ruleLocals" [label= "ruleLocals", color=1]; + "ruleDecisionGraph" [label= "ruleDecisionGraph", color=1]; + "relPredRefsAll" [label= "relPredRefsAll", color=1]; + "relPredRefs" [label= "relPredRefs", color=1]; + "qaHornsT" [label= "qaHornsT", color=1]; + "qaHornsR" [label= "qaHornsR", color=1]; + "onlyTheItems" [label= "onlyTheItems", color=1]; + "onlyItemNamed" [label= "onlyItemNamed", color=1]; + "l4interpret" [label= "l4interpret", color=1]; + "itemsByRule" [label= "itemsByRule", color=1]; + "isRuleAlias" [label= "isRuleAlias", color=1]; + "groupedByAOTree" [label= "groupedByAOTree", color=1]; + "globalFacts" [label= "globalFacts", color=1]; + "getRuleByName" [label= "getRuleByName", color=1]; + "getRuleByLabelName" [label= "getRuleByLabelName", color=1]; + "getRuleByLabel" [label= "getRuleByLabel", color=1]; + "getMarkings" [label= "getMarkings", color=1]; + "getInheritances" [label= "getInheritances", color=1]; + "getCTkeys" [label= "getCTkeys", color=1]; + "getAttrTypesIn" [label= "getAttrTypesIn", color=1]; + "getAndOrTree" [label= "getAndOrTree", color=1]; + "extractRPMT2Text" [label= "extractRPMT2Text", color=1]; + "extractEnums" [label= "extractEnums", color=1]; + "exposedRoots" [label= "exposedRoots", color=1]; + "expandTraceDebugging" [label= "expandTraceDebugging", color=1]; + "expandTrace" [label= "expandTrace", color=1]; + "expandRulesByLabel" [label= "expandRulesByLabel", color=1]; + "expandRule" [label= "expandRule", color=1]; + "expandRP" [label= "expandRP", color=1]; + "expandMT" [label= "expandMT", color=1]; + "expandClauses\'" [label= "expandClauses\'", color=1]; + "expandClauses" [label= "expandClauses", color=1]; + "expandClause" [label= "expandClause", color=1]; + "expandBody" [label= "expandBody", color=1]; + "expandBSR\'" [label= "expandBSR\'", color=1]; + "expandBSRM" [label= "expandBSRM", color=1]; + "expandBSR" [label= "expandBSR", color=1]; + "entryPoints" [label= "entryPoints", color=1]; + "defaultToSuperType" [label= "defaultToSuperType", color=1]; + "defaultToSuperClass" [label= "defaultToSuperClass", color=1]; + "decisionRoots" [label= "decisionRoots", color=1]; + "classHierarchy" [label= "classHierarchy", color=1]; + "classGraph" [label= "classGraph", color=1]; + "bsr2bsmt" [label= "bsr2bsmt", color=1]; + "bsmtOfClauses" [label= "bsmtOfClauses", color=1]; + "attrsAsMethods" [label= "attrsAsMethods", color=1]; + "attrType" [label= "attrType", color=1]; + "allCTkeys" [label= "allCTkeys", color=1]; } "allCTkeys" -> "allCTkeys"; "allCTkeys" -> "getCTkeys"; -"asAAsvg" -> "expandBSR"; -"asAAsvg" -> "exposedRoots"; -"asAAsvg" -> "groupedByAOTree"; -"asAAsvg" -> "isRuleAlias"; -"biggestItem" -> "itemsByRule"; "bsmtOfClauses" -> "bsr2bsmt"; "bsmtOfClauses" -> "expandClauses"; "bsmtOfClauses" -> "expandTrace"; "bsr2bsmt" -> "bsr2bsmt"; -"classGraph" -> "classGraph"; "classHierarchy" -> "classHierarchy"; +"classHierarchy" -> "defaultToSuperType"; +"defaultToSuperType" -> "defaultToSuperClass"; "expandBSR" -> "expandBSR\'"; "expandBSR" -> "expandTrace"; +"expandBSRM" -> "expandBSR"; "expandBSR\'" -> "expandBSR\'"; "expandBSR\'" -> "expandRP"; -"expandBSR\'" -> "expandTrace"; "expandClause" -> "expandBSR\'"; -"expandClause" -> "expandTrace"; "expandClauses" -> "expandClauses\'"; "expandClauses" -> "expandTrace"; "expandClauses\'" -> "expandRP"; "expandClauses\'" -> "expandTrace"; "expandClauses\'" -> "unleaf"; "expandMT" -> "expandClause"; -"expandMT" -> "expandTrace"; "expandRP" -> "expandBSR\'"; "expandRP" -> "expandMT"; -"expandRP" -> "expandTrace"; "expandRule" -> "expandRulesByLabel"; "expandRulesByLabel" -> "expandRule"; "expandTrace" -> "expandTraceDebugging"; @@ -98,25 +96,23 @@ strict digraph deps { "getAndOrTree" -> "getRuleByName"; "getAttrTypesIn" -> "getAttrTypesIn"; "getAttrTypesIn" -> "getCTkeys"; +"getInheritances" -> "defaultToSuperClass"; "getInheritances" -> "getCTkeys"; -"groupedByAOTree" -> "decisionRoots"; "groupedByAOTree" -> "getAndOrTree"; -"groupedByAOTree" -> "ruleDecisionGraph"; "itemsByRule" -> "getAndOrTree"; +"l4interpret" -> "attrsAsMethods"; "l4interpret" -> "classHierarchy"; "l4interpret" -> "symbolTable"; -"musings" -> "classGraph"; -"musings" -> "expandBSR"; -"musings" -> "expandRule"; -"musings" -> "exposedRoots"; -"musings" -> "getAndOrTree"; -"musings" -> "groupedByAOTree"; -"musings" -> "isRuleAlias"; -"musings" -> "ruleDecisionGraph"; "onlyItemNamed" -> "itemsByRule"; "onlyTheItems" -> "getAndOrTree"; +"qaHornsR" -> "expandBSR"; +"qaHornsR" -> "exposedRoots"; +"qaHornsR" -> "groupedByAOTree"; +"qaHornsT" -> "qaHornsR"; "relPredRefsAll" -> "relPredRefs"; "ruleDecisionGraph" -> "relPredRefsAll"; +"ruleLocals" -> "ruleLocalsIn"; +"ruleLocals" -> "ruleLocalsOut"; "topsortedClasses" -> "getAttrTypesIn"; "topsortedClasses" -> "getCTkeys"; "topsortedClasses" -> "getInheritances"; diff --git a/lib/haskell/natural4/doc/Interpreter.svg b/lib/haskell/natural4/doc/Interpreter.svg index d9bce4e61..03d6e3402 100644 --- a/lib/haskell/natural4/doc/Interpreter.svg +++ b/lib/haskell/natural4/doc/Interpreter.svg @@ -4,692 +4,687 @@ - - + + deps - + -cluster_2 - -src/LS/Interpreter.hs - - cluster_1 - -src/LS/XPile/SVG.hs + +src/LS/Interpreter.hs unleaf - -unleaf + +unleaf - + unleaf->unleaf - - + + topsortedClasses - -topsortedClasses + +topsortedClasses - + getInheritances - -getInheritances + +getInheritances - + topsortedClasses->getInheritances - - + + - + getCTkeys - -getCTkeys + +getCTkeys - + topsortedClasses->getCTkeys - - + + - + getAttrTypesIn - -getAttrTypesIn + +getAttrTypesIn - + topsortedClasses->getAttrTypesIn - - + + symbolTable - -symbolTable + +symbolTable - + -stitchRules - -stitchRules +ruleNameStr + +ruleNameStr - + -ruleNameStr - -ruleNameStr +ruleLocalsOut + +ruleLocalsOut - + +ruleLocalsIn + +ruleLocalsIn + + + +ruleLocals + +ruleLocals + + + +ruleLocals->ruleLocalsOut + + + + + +ruleLocals->ruleLocalsIn + + + + + ruleDecisionGraph - -ruleDecisionGraph + +ruleDecisionGraph - + relPredRefsAll - -relPredRefsAll + +relPredRefsAll - + ruleDecisionGraph->relPredRefsAll - - + + - + relPredRefs - -relPredRefs + +relPredRefs - + relPredRefsAll->relPredRefs - - - - - -onlyTheItems - -onlyTheItems + + - - -getAndOrTree - -getAndOrTree - - - -onlyTheItems->getAndOrTree - - - - - -onlyItemNamed - -onlyItemNamed - - - -itemsByRule - -itemsByRule - - - -onlyItemNamed->itemsByRule - - - - + -musings - -musings +qaHornsT + +qaHornsT - - -musings->ruleDecisionGraph - - - - - -isRuleAlias - -isRuleAlias + + +qaHornsR + +qaHornsR - - -musings->isRuleAlias - - + + +qaHornsT->qaHornsR + + - + groupedByAOTree - -groupedByAOTree + +groupedByAOTree - - -musings->groupedByAOTree - - - - - -musings->getAndOrTree - - + + +qaHornsR->groupedByAOTree + + - + exposedRoots - -exposedRoots - - - -musings->exposedRoots - - + +exposedRoots - - -expandRule - -expandRule - - - -musings->expandRule - - + + +qaHornsR->exposedRoots + + - + expandBSR - -expandBSR + +expandBSR - - -musings->expandBSR - - + + +qaHornsR->expandBSR + + - - -classGraph - -classGraph + + +onlyTheItems + +onlyTheItems - - -musings->classGraph - - + + +getAndOrTree + +getAndOrTree + + + +onlyTheItems->getAndOrTree + + + + + +onlyItemNamed + +onlyItemNamed + + + +itemsByRule + +itemsByRule + + + +onlyItemNamed->itemsByRule + + - + l4interpret - -l4interpret + +l4interpret - + l4interpret->symbolTable - - + + - + classHierarchy - -classHierarchy + +classHierarchy - + l4interpret->classHierarchy - - + + + + + +attrsAsMethods + +attrsAsMethods + + + +l4interpret->attrsAsMethods + + - + itemsByRule->getAndOrTree - - + + - - -groupedByAOTree->ruleDecisionGraph - - + + +isRuleAlias + +isRuleAlias - + groupedByAOTree->getAndOrTree - - - - - -decisionRoots - -decisionRoots + + - - -groupedByAOTree->decisionRoots - - + + +globalFacts + +globalFacts - + getRuleByName - -getRuleByName + +getRuleByName - + getRuleByLabelName - -getRuleByLabelName + +getRuleByLabelName - + getRuleByLabel - -getRuleByLabel + +getRuleByLabel + + + +getMarkings + +getMarkings - + getInheritances->getCTkeys - - + + + + + +defaultToSuperClass + +defaultToSuperClass + + + +getInheritances->defaultToSuperClass + + - + getAttrTypesIn->getCTkeys - - + + - + getAttrTypesIn->getAttrTypesIn - - + + - + getAndOrTree->getRuleByName - - + + - + getAndOrTree->getAndOrTree - - + + - + extractRPMT2Text - -extractRPMT2Text + +extractRPMT2Text - + getAndOrTree->extractRPMT2Text - - + + - + expandTrace - -expandTrace + +expandTrace - + getAndOrTree->expandTrace - - + + - + expandClauses - -expandClauses + +expandClauses - + getAndOrTree->expandClauses - - + + - + bsmtOfClauses - -bsmtOfClauses + +bsmtOfClauses - + getAndOrTree->bsmtOfClauses - - + + + + + +extractEnums + +extractEnums - + exposedRoots->ruleDecisionGraph - - + + - + exposedRoots->isRuleAlias - - + + + + + +decisionRoots + +decisionRoots - + exposedRoots->decisionRoots - - + + - + expandTraceDebugging - -expandTraceDebugging + +expandTraceDebugging - + expandTrace->expandTraceDebugging - - + + - + expandRulesByLabel - -expandRulesByLabel + +expandRulesByLabel + + + +expandRule + +expandRule - + expandRulesByLabel->expandRule - - + + - + expandRule->expandRulesByLabel - - + + - + expandRP - -expandRP - - - -expandRP->expandTrace - - + +expandRP - + expandMT - -expandMT + +expandMT - + expandRP->expandMT - - + + - + expandBSR\' - -expandBSR' + +expandBSR' - + expandRP->expandBSR\' - - - - - -expandMT->expandTrace - - + + - + expandClause - -expandClause + +expandClause - + expandMT->expandClause - - + + - + expandClauses\' - -expandClauses' + +expandClauses' - + expandClauses\'->unleaf - - + + - + expandClauses\'->expandTrace - - + + - + expandClauses\'->expandRP - - + + - + expandClauses->expandTrace - - + + - + expandClauses->expandClauses\' - - - - - -expandClause->expandTrace - - + + - + expandClause->expandBSR\' - - + + - + expandBody - -expandBody - - - -expandBSR\'->expandTrace - - + +expandBody - + expandBSR\'->expandRP - - + + - + expandBSR\'->expandBSR\' - - + + + + + +expandBSRM + +expandBSRM + + + +expandBSRM->expandBSR + + - + expandBSR->expandTrace - - + + - + expandBSR->expandBSR\' - - + + + + + +entryPoints + +entryPoints + + + +defaultToSuperType + +defaultToSuperType + + + +defaultToSuperType->defaultToSuperClass + + + + + +classHierarchy->defaultToSuperType + + - + classHierarchy->classHierarchy - - + + - - -classGraph->classGraph - - + + +classGraph + +classGraph - + bsr2bsmt - -bsr2bsmt + +bsr2bsmt - + bsr2bsmt->bsr2bsmt - - + + - + bsmtOfClauses->expandTrace - - + + - + bsmtOfClauses->expandClauses - - + + - + bsmtOfClauses->bsr2bsmt - - - - - -biggestItem - -biggestItem - - - -biggestItem->itemsByRule - - + + - + attrType - -attrType + +attrType - + allCTkeys - -allCTkeys + +allCTkeys allCTkeys->getCTkeys - - + + allCTkeys->allCTkeys - - - - - -asAAsvg - -asAAsvg - - - -asAAsvg->isRuleAlias - - - - - -asAAsvg->groupedByAOTree - - - - - -asAAsvg->exposedRoots - - - - - -asAAsvg->expandBSR - - + + diff --git a/lib/haskell/natural4/package.yaml b/lib/haskell/natural4/package.yaml index ce1ca62d6..7c4495967 100644 --- a/lib/haskell/natural4/package.yaml +++ b/lib/haskell/natural4/package.yaml @@ -71,7 +71,6 @@ dependencies: - string-interpolate - prettyprinter-interp - json - - jsonlogic language: GHC2021 diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 513450a72..c8c877ade 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -94,7 +94,8 @@ qaHornsR l4i = [ ( ruleLabelName <$> uniqrs , expanded) | (grpval, uniqrs) <- groupedByAOTree l4i $ -- NUBBED - exposedRoots l4i -- EXPOSED + let (eRout, eRerr) = xpLog $ exposedRoots l4i -- EXPOSED + in eRout , not $ null grpval , expanded <- expandBSR l4i 1 <$> maybeToList (getBSR (DL.head uniqrs)) ] @@ -281,12 +282,11 @@ groupedByAOTree l4i rs = -- The SVG outputter likes to exclude things that have only a single element and are therefore visually uninteresting. -- We want the SVG Xpiler to reuse this code as authoritative. -exposedRoots :: Interpreted -> [Rule] -exposedRoots l4i = - let rs = origrules l4i - decisionGraph = ruleDecisionGraph l4i rs - decisionroots = decisionRoots decisionGraph - in [ r | r <- decisionroots, not $ isRuleAlias l4i (ruleLabelName r) ] +exposedRoots :: Interpreted -> XPileLog [Rule] +exposedRoots l4i = do + decisionGraph <- ruleDecisionGraph l4i + decisionroots <- decisionRoots decisionGraph + return [ r | r <- decisionroots, not $ isRuleAlias l4i (ruleLabelName r) ] -- | the (inner) type of a particular class's attribute attrType :: ClsTab -> EntityType -> Maybe TypeSig @@ -338,19 +338,20 @@ type RuleGraph = Gr Rule RuleGraphEdgeLabel type RuleIDMap = Map.HashMap Rule Int -- | which decision rules depend on which other decision rules? -ruleDecisionGraph :: Interpreted -> [Rule] -> RuleGraph -ruleDecisionGraph l4i rs = +ruleDecisionGraph :: Interpreted -> XPileLog RuleGraph +ruleDecisionGraph l4i = do let ruleIDmap = Map.fromList (Prelude.zip decisionRules [1..]) - in mkGraph - (swap <$> Map.toList ruleIDmap) -- the nodes - (relPredRefsAll l4i rs ruleIDmap) + mkGraph + (swap <$> Map.toList ruleIDmap) -- the nodes + <$> relPredRefsAll l4i ruleIDmap where decisionRules = [ r | r <- rs, not . null . getBSR $ r ] - + rs = origrules l4i + -- | walk all relationalpredicates in a set of rules, and return the list of edges showing how one rule relies on another. -relPredRefsAll :: Interpreted -> [Rule] -> RuleIDMap -> [LEdge RuleGraphEdgeLabel] -relPredRefsAll l4i rs ridmap = - concatMap (relPredRefs l4i rs ridmap) rs +relPredRefsAll :: Interpreted -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] +relPredRefsAll l4i ridmap = + concat <$> mapM (relPredRefs l4i ridmap) (origrules l4i) -- | in a particular rule, walk all the relational predicates available, and show outdegree links -- that correspond to known BSR heads from the entire ruleset. @@ -360,19 +361,19 @@ relPredRefsAll l4i rs ridmap = -- so we show that rule R1 relies on, or refers to, rule R2: R1 -> R2. -- there is some overlap here with the idea of scopetabs in the symbol table, but let's just do it -- the brute way first and then refactor later once we have a better idea if this approach even works. -relPredRefs :: Interpreted -> [Rule] -> RuleIDMap -> Rule -> [LEdge RuleGraphEdgeLabel] -relPredRefs _l4i rs ridmap r = +relPredRefs :: Interpreted -> RuleIDMap -> Rule -> XPileLog [LEdge RuleGraphEdgeLabel] +relPredRefs l4i ridmap r = do let headElements :: Map.HashMap MultiTerm Rule -- does this get recomputed each time or cached? -- given a term, see which rule defines it headElements = Map.fromList $ [ (headName,r') - | r' <- rs + | r' <- origrules l4i , headName <- getDecisionHeads r' ] -- given a rule, see which terms it relies on bodyElements = concatMap rp2bodytexts (concatMap AA.extractLeaves (getBSR r)) -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. - in [ (rid, targetRuleId', ()) + return [ (rid, targetRuleId', ()) | bElem <- bodyElements , let targetRule = Map.lookup bElem headElements , isJust targetRule @@ -392,15 +393,15 @@ relPredRefs _l4i rs ridmap r = -- -- Examine the rulegraph for rules which have no indegrees, as far as decisioning goes. -decisionRoots :: RuleGraph -> [Rule] -decisionRoots rg = +decisionRoots :: RuleGraph -> XPileLog [Rule] +decisionRoots rg = do let rg' = dereflexed - in - catMaybes [ lab rg' r - | r <- nodes rg' - , indeg rg' r == 0 --- , outdeg rg' r > 0 - ] + return $ + catMaybes [ lab rg' r + | r <- nodes rg' + , indeg rg' r == 0 + -- , outdeg rg' r > 0 + ] where -- remove reflexive edges that go from node n to node n dereflexed :: RuleGraph diff --git a/lib/haskell/natural4/src/LS/Lib.hs b/lib/haskell/natural4/src/LS/Lib.hs index e29fc5de0..b975acfff 100644 --- a/lib/haskell/natural4/src/LS/Lib.hs +++ b/lib/haskell/natural4/src/LS/Lib.hs @@ -170,8 +170,16 @@ getConfig o = do } -parseRules :: Opts Unwrapped -> IO [Either (ParseErrorBundle MyStream Void) [Rule]] -parseRules o = do +-- | Each stanza gets parsed separately, which is why we have a top-level IO [Rule]. +-- +-- At some point we added functionality that allowed sub-rules to be defined inline within a top-level rule, which is why we now have IO [... [Rule]]. +-- +-- Note that sub-rules are themselves rules, which is why we only have one Rule type here. +-- +-- Shouldn't the idea of sub-rules and top-level rules be reflected in a type hierarchy? +-- +parseRules :: Opts Unwrapped -> IO [Either (ParseErrorBundle MyStream Void) [Rule]] -- [TODO] why inner [Rule] and not just a plain Rule? Give explanation in comment. +parseRules o = do runConfig <- getConfig o let files = getNoLabel $ file o if null files diff --git a/lib/haskell/natural4/src/LS/XPile/Org.hs b/lib/haskell/natural4/src/LS/XPile/Org.hs index bdd0807ef..0792877d6 100644 --- a/lib/haskell/natural4/src/LS/XPile/Org.hs +++ b/lib/haskell/natural4/src/LS/XPile/Org.hs @@ -22,6 +22,7 @@ import LS.Interpreter extractEnums, defaultToSuperClass, defaultToSuperType, attrsAsMethods, + entryPoints, ) import LS.RelationalPredicates ( partitionExistentials, getBSR ) @@ -68,7 +69,8 @@ musings :: Interpreted -> [Rule] -> Doc ann musings l4i rs = let cg = classGraph (classtable l4i) [] expandedRules = nub $ concatMap (expandRule rs) rs - decisionGraph = ruleDecisionGraph l4i rs + (decisionGraph, dGerr) = xpLog (ruleDecisionGraph l4i) + (eRout, eRerr) = xpLog (exposedRoots l4i) in vvsep [ "* musings" , "** Global Facts" srchs (globalFacts l4i) @@ -117,13 +119,16 @@ musings l4i rs = , "we dump expressions of the form DECIDE class's record's attribute IS someValue WHEN someCondition" , let aam = xpLog $ attrsAsMethods rs -- [TODO] this duplicates work done in the Interpreter -- find a way to coherently log common errors from the Interpreter itself, clean up l4i's valuePreds in srchs (fst aam) vsep (pretty <$> snd aam) + , "** Dataflow modelling" + , "*** entryPoints" let (ePout, ePerr) = xpLog (entryPoints l4i) in srchs ePout vsep (pretty <$> ePerr) , "** the Rule Decision Graph" , orgexample (pretty (prettify (first ruleLabelName decisionGraph))) + , "*** logging output" vsep (pretty <$> dGerr) , "** Decision Roots" , "rules which are not just RuleAlises, and which are not relied on by any other rule" - , srchs (ruleLabelName <$> exposedRoots l4i) - + , srchs (ruleLabelName <$> eRout) + , "*** error output from exposedRoots" vsep (pretty <$> eRerr) , "*** Nubbed, Exposed, Decision Roots" , "Each ruleset can be organized into multiple trees. Each tree contains rules." , "The leaves of the trees contain datapoints we need to collect from the user, typically by asking the user for that data in some interactive Q&A form style." @@ -162,8 +167,8 @@ musings l4i rs = , hasClauses r , hasGiven r ] - | ((grpval, uniqrs),n :: Int) <- Prelude.zip (groupedByAOTree l4i $ -- NUBBED - exposedRoots l4i -- EXPOSED + | ((grpval, uniqrs),n :: Int) <- Prelude.zip (groupedByAOTree l4i -- NUBBED + eRout -- EXPOSED ) [1..] , not $ null uniqrs ] From 87c930f2eb30d6cb5bb76c5b30d4d2a70e819085 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 00:37:49 +0800 Subject: [PATCH 03/49] add debugging --- lib/haskell/natural4/src/LS/Interpreter.hs | 5 +++++ lib/haskell/natural4/stack.yaml | 1 - lib/haskell/natural4/stack.yaml.lock | 7 ------- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index c8c877ade..d7b6b83ce 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -341,6 +341,7 @@ type RuleIDMap = Map.HashMap Rule Int ruleDecisionGraph :: Interpreted -> XPileLog RuleGraph ruleDecisionGraph l4i = do let ruleIDmap = Map.fromList (Prelude.zip decisionRules [1..]) + mutterdhsf 4 "ruleDecisionGraph: decisionRules from getBSR" pShowNoColorS decisionRules mkGraph (swap <$> Map.toList ruleIDmap) -- the nodes <$> relPredRefsAll l4i ruleIDmap @@ -372,6 +373,10 @@ relPredRefs l4i ridmap r = do ] -- given a rule, see which terms it relies on bodyElements = concatMap rp2bodytexts (concatMap AA.extractLeaves (getBSR r)) + + mutterdhsf 5 "relPredRefs: headElements" pShowNoColorS headElements + mutterdhsf 5 "relPredRefs: bodyElements" pShowNoColorS bodyElements + -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. return [ (rid, targetRuleId', ()) | bElem <- bodyElements diff --git a/lib/haskell/natural4/stack.yaml b/lib/haskell/natural4/stack.yaml index 36e527480..47ab6ca13 100644 --- a/lib/haskell/natural4/stack.yaml +++ b/lib/haskell/natural4/stack.yaml @@ -51,7 +51,6 @@ extra-deps: - cgi-3001.5.0.1 - multipart-0.2.1@sha256:c96322a5bb34c29738ba82345d071a8e07d752648de3522f1c04d96df955ea0d,1150 -- jsonlogic-0.1.0.0 allow-newer: true diff --git a/lib/haskell/natural4/stack.yaml.lock b/lib/haskell/natural4/stack.yaml.lock index e67af1a42..2ec76be11 100644 --- a/lib/haskell/natural4/stack.yaml.lock +++ b/lib/haskell/natural4/stack.yaml.lock @@ -87,13 +87,6 @@ packages: size: 383 original: hackage: multipart-0.2.1@sha256:c96322a5bb34c29738ba82345d071a8e07d752648de3522f1c04d96df955ea0d,1150 -- completed: - hackage: jsonlogic-0.1.0.0@sha256:79b5f48ef3f52d0b8c84cf6b7383a7bb5ffd97a15c2683b947335b370c4183aa,2932 - pantry-tree: - sha256: 3c13d5a13a02f581652e1223767ca1d9b0de30fecef5272af6d2a00806e55f77 - size: 3341 - original: - hackage: jsonlogic-0.1.0.0 snapshots: - completed: sha256: 5a59b2a405b3aba3c00188453be172b85893cab8ebc352b1ef58b0eae5d248a2 From 41e3839a83d4c0df9967e2f62ccea00055992623 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 01:15:18 +0800 Subject: [PATCH 04/49] start to expand analysis of rule decision graph to other RP types --- lib/haskell/natural4/src/LS/Interpreter.hs | 18 +++++++++++++----- .../natural4/src/LS/RelationalPredicates.hs | 12 +++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index d7b6b83ce..2524eb974 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -372,14 +372,22 @@ relPredRefs l4i ridmap r = do , headName <- getDecisionHeads r' ] -- given a rule, see which terms it relies on - bodyElements = concatMap rp2bodytexts (concatMap AA.extractLeaves (getBSR r)) + myGetBSR = getBSR r + myLeaves = concatMap AA.extractLeaves myGetBSR + bodyElements = concatMap rp2bodytexts myLeaves - mutterdhsf 5 "relPredRefs: headElements" pShowNoColorS headElements - mutterdhsf 5 "relPredRefs: bodyElements" pShowNoColorS bodyElements + mutterd 4 (T.unpack $ mt2text $ ruleLabelName r) + mutterdhsf 5 "relPredRefs: headElements" pShowNoColorS headElements + + mutterdhsf 5 "relPredRefs: original rule" pShowNoColorS r + mutterdhsf 5 "relPredRefs: getBSR" pShowNoColorS myGetBSR + mutterdhsf 5 "relPredRefs: extractLeaves" pShowNoColorS myLeaves + mutterdhsf 5 "relPredRefs: bodyElements" pShowNoColorS bodyElements -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. - return [ (rid, targetRuleId', ()) - | bElem <- bodyElements + sequence + [ (rid, targetRuleId', ()) <$ mutterd 6 ("returning " <> show rid <> ", " <> show targetRuleId') + | bElem <- bodyElements , let targetRule = Map.lookup bElem headElements , isJust targetRule , let targetRule' = fromJust targetRule -- safe due to above isJust test diff --git a/lib/haskell/natural4/src/LS/RelationalPredicates.hs b/lib/haskell/natural4/src/LS/RelationalPredicates.hs index 356c2ec57..0a2fefdd8 100644 --- a/lib/haskell/natural4/src/LS/RelationalPredicates.hs +++ b/lib/haskell/natural4/src/LS/RelationalPredicates.hs @@ -978,8 +978,18 @@ pBSR = debugName "pBSR" $ getBSR :: Rule -> Maybe BoolStructR getBSR Hornlike{..} = Just $ AA.simplifyBoolStruct $ AA.mkAll Nothing $ catMaybes [ hbody | HC _hhead hbody <- clauses ] - [ bsr | HC (RPBoolStructR _rp1 _rprel bsr) _hbody <- clauses ] + concat [ go headRP + | HC headRP _body <- clauses ] + where + go :: RelationalPredicate -> [BoolStructR] + go c = case c of + RPBoolStructR _rp1 _rprel bsr -> [bsr] + RPnary RPis (r:rps) -> concat (go <$> rps) + RPnary rprel rps -> concat (go <$> rps) + RPMT mt -> pure $ AA.mkLeaf (RPMT mt) + _ -> [] + -- | monochrom on IRC commented that I'm basically doing Prolog's `cut`, here. -- I would have used (<||>) but that's already in use by the permutation parser () :: Foldable t => t a -> t a -> t a From 3e239261a0b1a760e68043b3f4ee17750703dc70 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 01:43:50 +0800 Subject: [PATCH 05/49] start work on a data flow graph which will help us transpile to operationalization --- lib/haskell/natural4/src/LS/Interpreter.hs | 9 +++++ .../natural4/src/LS/RelationalPredicates.hs | 4 +-- lib/haskell/natural4/src/LS/XPile/DataFlow.hs | 34 +++++++++++++++++++ lib/haskell/natural4/src/LS/XPile/Org.hs | 4 +-- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 lib/haskell/natural4/src/LS/XPile/DataFlow.hs diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 2524eb974..ee7414b91 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -426,6 +426,15 @@ decisionRoots rg = do toreturn +-- | extract a data flow graph +-- suitable for drawing as SVG +-- from the rulegraph. +-- +-- we're interested in a data flow graph whose leaves are the leaf elements in the rulegraph; +-- the intermediate nodes can be the rules; and +-- the graph roots out at the decisionRoots. + + -- | return the internal conditions of the rule, if any, as an and-or tree. -- -- a Regulative rule exposes its `who` and `cond` attributes, rewritten so the subject of the rule is prefixed to the WHO. diff --git a/lib/haskell/natural4/src/LS/RelationalPredicates.hs b/lib/haskell/natural4/src/LS/RelationalPredicates.hs index 0a2fefdd8..86674b4a3 100644 --- a/lib/haskell/natural4/src/LS/RelationalPredicates.hs +++ b/lib/haskell/natural4/src/LS/RelationalPredicates.hs @@ -985,8 +985,8 @@ getBSR Hornlike{..} = Just $ AA.simplifyBoolStruct $ AA.mkAll Nothing $ go :: RelationalPredicate -> [BoolStructR] go c = case c of RPBoolStructR _rp1 _rprel bsr -> [bsr] - RPnary RPis (r:rps) -> concat (go <$> rps) - RPnary rprel rps -> concat (go <$> rps) + RPnary RPis (r:rps) -> concatMap go rps -- we assume r is the subject of the rule and doesn't bear further scrutiny + RPnary rprel rps -> concatMap go rps RPMT mt -> pure $ AA.mkLeaf (RPMT mt) _ -> [] diff --git a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs new file mode 100644 index 000000000..3cc830f29 --- /dev/null +++ b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +{-| transpiler to show dataflow for both arithmetic and boolean logic -} + +module LS.XPile.DataFlow where + +import LS.XPile.Logging +import LS.Interpreter + +-- fgl +import Data.Graph.Inductive.Graph +import Data.Graph.Inductive.PatriciaTree (Gr) + +-- graphviz +import Data.GraphViz +import Data.GraphViz.Printing (renderDot) + +type FlowNodeName = String +type DataFlowGraph = Gr FlowNodeName () + +dataFlowAsDot :: Interpreted -> XPileLogE String +dataFlowAsDot l4i = do + let graph = mkGraph + (nodesRepresentingRules ++ nodesRepresentingLeaves) + (edgesBetweenRules ++ edgesFromLeavesToRules) + return "/* coming soon: this will be a data flow diagram */" + where + nodesRepresentingRules = [] + nodesRepresentingLeaves = [] + edgesBetweenRules = [] + edgesFromLeavesToRules = [] + diff --git a/lib/haskell/natural4/src/LS/XPile/Org.hs b/lib/haskell/natural4/src/LS/XPile/Org.hs index 0792877d6..e1347c3cf 100644 --- a/lib/haskell/natural4/src/LS/XPile/Org.hs +++ b/lib/haskell/natural4/src/LS/XPile/Org.hs @@ -70,7 +70,7 @@ musings l4i rs = let cg = classGraph (classtable l4i) [] expandedRules = nub $ concatMap (expandRule rs) rs (decisionGraph, dGerr) = xpLog (ruleDecisionGraph l4i) - (eRout, eRerr) = xpLog (exposedRoots l4i) + (eRout, eRerr) = xpLog (exposedRoots l4i) in vvsep [ "* musings" , "** Global Facts" srchs (globalFacts l4i) @@ -128,7 +128,7 @@ musings l4i rs = , "** Decision Roots" , "rules which are not just RuleAlises, and which are not relied on by any other rule" , srchs (ruleLabelName <$> eRout) - , "*** error output from exposedRoots" vsep (pretty <$> eRerr) + , "*** logging output from exposedRoots" vsep (pretty <$> eRerr) , "*** Nubbed, Exposed, Decision Roots" , "Each ruleset can be organized into multiple trees. Each tree contains rules." , "The leaves of the trees contain datapoints we need to collect from the user, typically by asking the user for that data in some interactive Q&A form style." From eddabed151a3077a1f932e3a9abc08c9b8a17990 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 11:23:04 +0800 Subject: [PATCH 06/49] move ruleGraph construction earlier into the Interpreter --- lib/haskell/natural4/src/LS/Interpreter.hs | 41 ++++---- lib/haskell/natural4/src/LS/Rule.hs | 21 +++- lib/haskell/natural4/src/LS/XPile/DataFlow.hs | 99 +++++++++++++++++-- lib/haskell/natural4/src/LS/XPile/Org.hs | 6 +- 4 files changed, 130 insertions(+), 37 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index ee7414b91..96873885e 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -63,11 +63,14 @@ l4interpret iopts rs = let ct = classHierarchy rs st = symbolTable iopts rs (vp, vpErr) = xpLog $ attrsAsMethods rs + (rDGout, rDGerr) = xpLog $ ruleDecisionGraph rs in L4I { classtable = ct , scopetable = st , origrules = rs , valuePreds = fromRight [] vp + , ruleGraph = rDGout + , ruleGraphErr = rDGerr } -- | Provide the fully expanded, exposed, decision roots of all rules in the ruleset, @@ -284,7 +287,7 @@ groupedByAOTree l4i rs = exposedRoots :: Interpreted -> XPileLog [Rule] exposedRoots l4i = do - decisionGraph <- ruleDecisionGraph l4i + let decisionGraph = ruleGraph l4i decisionroots <- decisionRoots decisionGraph return [ r | r <- decisionroots, not $ isRuleAlias l4i (ruleLabelName r) ] @@ -323,36 +326,24 @@ getAttrTypesIn ct classname = ] --- | structure the rules as a graph. --- in the simple case, the graph is one or more trees, each rooted at a "top-level" rule which is not "used" by any another rule. --- if we walk the roots, we will sooner or later encounter all the decision elements relevant to each root. --- in a less simple case, the graph is cyclic! everything depends on everything else! but we can recognize that as an error condition. --- --- note that a regulative rule R1 HENCE R2 is recorded as a single rule, even if we think of the R2 as a separate rule --- perhaps we should have a notion of anonymous rules, that are internally labelled and structured, so R2 is equal to R1 in the graph. - -type RuleGraphEdgeLabel = () -type RuleGraph = Gr Rule RuleGraphEdgeLabel - -- | used by `ruleDecisionGraph`; a map from a rule to a unique integer identifier for that rule, used in the `RuleGraph` type RuleIDMap = Map.HashMap Rule Int -- | which decision rules depend on which other decision rules? -ruleDecisionGraph :: Interpreted -> XPileLog RuleGraph -ruleDecisionGraph l4i = do +ruleDecisionGraph :: RuleSet -> XPileLog RuleGraph +ruleDecisionGraph rs = do let ruleIDmap = Map.fromList (Prelude.zip decisionRules [1..]) mutterdhsf 4 "ruleDecisionGraph: decisionRules from getBSR" pShowNoColorS decisionRules mkGraph (swap <$> Map.toList ruleIDmap) -- the nodes - <$> relPredRefsAll l4i ruleIDmap + <$> relPredRefsAll rs ruleIDmap where decisionRules = [ r | r <- rs, not . null . getBSR $ r ] - rs = origrules l4i -- | walk all relationalpredicates in a set of rules, and return the list of edges showing how one rule relies on another. -relPredRefsAll :: Interpreted -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] -relPredRefsAll l4i ridmap = - concat <$> mapM (relPredRefs l4i ridmap) (origrules l4i) +relPredRefsAll :: RuleSet -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] +relPredRefsAll rs ridmap = + concat <$> mapM (relPredRefs rs ridmap) rs -- | in a particular rule, walk all the relational predicates available, and show outdegree links -- that correspond to known BSR heads from the entire ruleset. @@ -362,13 +353,13 @@ relPredRefsAll l4i ridmap = -- so we show that rule R1 relies on, or refers to, rule R2: R1 -> R2. -- there is some overlap here with the idea of scopetabs in the symbol table, but let's just do it -- the brute way first and then refactor later once we have a better idea if this approach even works. -relPredRefs :: Interpreted -> RuleIDMap -> Rule -> XPileLog [LEdge RuleGraphEdgeLabel] -relPredRefs l4i ridmap r = do +relPredRefs :: RuleSet -> RuleIDMap -> Rule -> XPileLog [LEdge RuleGraphEdgeLabel] +relPredRefs rs ridmap r = do let headElements :: Map.HashMap MultiTerm Rule -- does this get recomputed each time or cached? -- given a term, see which rule defines it headElements = Map.fromList $ [ (headName,r') - | r' <- origrules l4i + | r' <- rs , headName <- getDecisionHeads r' ] -- given a rule, see which terms it relies on @@ -384,8 +375,10 @@ relPredRefs l4i ridmap r = do mutterdhsf 5 "relPredRefs: extractLeaves" pShowNoColorS myLeaves mutterdhsf 5 "relPredRefs: bodyElements" pShowNoColorS bodyElements + -- [BUG] at some point we lose the moon + -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. - sequence + toreturn <- sequence [ (rid, targetRuleId', ()) <$ mutterd 6 ("returning " <> show rid <> ", " <> show targetRuleId') | bElem <- bodyElements , let targetRule = Map.lookup bElem headElements @@ -397,6 +390,8 @@ relPredRefs l4i ridmap r = do rid = ridmap ! r ] + mutterdhsf 5 "relPredRefs: returning" pShowNoColorS toreturn + return toreturn -- | Which rules are "top-level", "entry-point" rules? -- diff --git a/lib/haskell/natural4/src/LS/Rule.hs b/lib/haskell/natural4/src/LS/Rule.hs index b3ef91f5e..82e21ec6b 100644 --- a/lib/haskell/natural4/src/LS/Rule.hs +++ b/lib/haskell/natural4/src/LS/Rule.hs @@ -63,6 +63,8 @@ import Text.Megaparsec (), (<|>), ) +import Data.Graph.Inductive (Gr) +import LS.XPile.Logging (XPileLogW) -- | [TODO] refactoring: these should be broken out into their own (new)types and have Rule include them all. -- We should take advantage of NoFieldSelectors to reduce the hazards here @@ -386,8 +388,25 @@ data Interpreted = L4I { -- | valuepredicates contain the bulk of the top-level decision logic, and can be easily expressed as instance or class methosd. , valuePreds :: [ValuePredicate] + + -- | rule decision graph gets used by multiple transpilers, so it lives here + , ruleGraph :: RuleGraph + , ruleGraphErr :: XPileLogW } - deriving (Eq, Ord, Show) + deriving (Eq, Show) + +-- | structure the rules as a graph. +-- in the simple case, the graph is one or more trees, each rooted at a "top-level" rule which is not "used" by any another rule. +-- if we walk the roots, we will sooner or later encounter all the decision elements relevant to each root. +-- in a less simple case, the graph is cyclic! everything depends on everything else! but we can recognize that as an error condition. +-- +-- note that a regulative rule R1 HENCE R2 is recorded as a single rule, even if we think of the R2 as a separate rule +-- perhaps we should have a notion of anonymous rules, that are internally labelled and structured, so R2 is equal to R1 in the graph. + +type RuleGraphEdgeLabel = () +type RuleGraph = Gr Rule RuleGraphEdgeLabel + + multiterm2bsr :: Rule -> BoolStructR multiterm2bsr = AA.mkLeaf . RPParamText . multiterm2pt . name diff --git a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs index 3cc830f29..a497d45df 100644 --- a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs +++ b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs @@ -7,7 +7,11 @@ module LS.XPile.DataFlow where import LS.XPile.Logging +import LS import LS.Interpreter +import LS.Rule + +import qualified Data.Map as Map -- if you want to upgrade this to Hashmap, go ahead -- fgl import Data.Graph.Inductive.Graph @@ -16,19 +20,94 @@ import Data.Graph.Inductive.PatriciaTree (Gr) -- graphviz import Data.GraphViz import Data.GraphViz.Printing (renderDot) +import Data.GraphViz.Attributes.Complete + +-- * Conceptually, a FlowNode is either a rule or a leaf/ground term referenced by a rule. +-- +-- Suppose the top-level rule is: +-- +-- @DECIDE happy IF warm AND sunny@ +-- +-- The top-level node corresponds to "happy". And there are two dependencies: @warm@ and @sunny@. +-- +-- Let's say @warm@ is a ground term: we have no further information +-- about @warm@. We need a human to provide a valuation of that fact. +-- In our graph it is a leaf node. +-- +-- Let's say @sunny@ is itself a rule: @sunny IF daytime AND NOT cloudy@. +-- +-- And it bottoms out there: both @daytime@ and @cloudy@ are ground terms. +-- +-- So our dataflow graph has: +-- +-- @ +-- warm -> happy +-- sunny -> happy +-- daytime -> sunny +-- cloudy -> sunny +-- @ +-- +-- Note that we are throwing away the logic -- we have lost the "NOT" on the "cloudy". +-- +-- The same idea applies to arithmetic rules: we might have @DECIDE happiness IS baselineHappiness + situationalHappiness@, where the terms are numeric-typed; the same shape of graph obtains. +-- +-- Our task is to return that graph. + +-- | we use RuleNames to label the nodes in the rule diagram. +type FlowNode = RuleName -type FlowNodeName = String -type DataFlowGraph = Gr FlowNodeName () +-- | it is our responsibility to maintain a mapping between node label and node number for use with fgl. +type FlowMap = Map.Map FlowNode Int -dataFlowAsDot :: Interpreted -> XPileLogE String +-- | We don't need edge labels. In the future, if we really wanted to, we could encode the control logic into an edge label, such that NOT is a 1, AND is a 2, etc etc. +type DataFlowGraph = Gr FlowNode () + +-- | This is the top-level entry point for this file; we produce a dotfile and rely on other elements of the L4 runtime to produce SVG from the Dot. +dataFlowAsDot :: Interpreted -> XPileLog String dataFlowAsDot l4i = do - let graph = mkGraph - (nodesRepresentingRules ++ nodesRepresentingLeaves) - (edgesBetweenRules ++ edgesFromLeavesToRules) + + -- https://hackage.haskell.org/package/fgl-5.8.1.1/docs/Data-Graph-Inductive-Graph.html#v:mkGraph + let dfg :: DataFlowGraph + dfg = mkGraph + (Map.toList ruleNodes ++ Map.toList leafNodes) + ruleEdges + + let dot :: DotGraph Node + dot = graphToDot (flowParams dfg) dfg + + -- if you look at Petri.hs you will see its graph construction delves deep into the logical relationship between rules. + -- That code was written before we had the Intepreter available to analyze rules for us. + -- So, we grab one tree of rules at a time from the RuleGraph provided by the interpreter, and dump those; + -- then we dump the ground term leaves in those rules. + return "/* coming soon: this will be a data flow diagram */" + where - nodesRepresentingRules = [] - nodesRepresentingLeaves = [] - edgesBetweenRules = [] - edgesFromLeavesToRules = [] + ruleNodes = Map.fromList ( zip [1..] [ [MTT "pretend rule R1" ] -- 1 + , [MTT "pretend rule R2" ] -- 2 + ] ) + leafNodes = Map.fromList ( zip [1..] [ [MTT "pretend leaf L1" ] -- 1 + , [MTT "pretend leaf L2" ] -- 2 + , [MTT "pretend leaf L3" ] -- 3 + , [MTT "pretend leaf L4" ] -- 4 + ] ) + ruleEdges = [ (1, 1, ()), + (1, 2, ()), + (2, 3, ()), + (2, 4, ()) ] + + -- see Petri.hs for a more complex example of styling the graphviz output + flowParams :: DataFlowGraph -> GraphvizParams Int FlowNode () Int FlowNode + flowParams g = Params + { isDirected = True + , globalAttributes = [GraphAttrs [Compound True]] + , clusterBy = C 1 . N -- in future we may want to partition all leaf nodes into a separate cluster to better identify them + , isDotCluster = const False + , clusterID = const (Str "clusterId") + , fmtCluster = const [NodeAttrs [ shape Circle ] ] + , fmtNode = const [] + , fmtEdge = const [] + } + + diff --git a/lib/haskell/natural4/src/LS/XPile/Org.hs b/lib/haskell/natural4/src/LS/XPile/Org.hs index e1347c3cf..1b67d4eb8 100644 --- a/lib/haskell/natural4/src/LS/XPile/Org.hs +++ b/lib/haskell/natural4/src/LS/XPile/Org.hs @@ -27,7 +27,7 @@ import LS.Interpreter import LS.RelationalPredicates ( partitionExistentials, getBSR ) import LS.Rule - ( Interpreted(classtable, scopetable), + ( Interpreted(..), Rule(..), hasGiven, hasClauses, @@ -69,7 +69,7 @@ musings :: Interpreted -> [Rule] -> Doc ann musings l4i rs = let cg = classGraph (classtable l4i) [] expandedRules = nub $ concatMap (expandRule rs) rs - (decisionGraph, dGerr) = xpLog (ruleDecisionGraph l4i) + decisionGraph = ruleGraph l4i (eRout, eRerr) = xpLog (exposedRoots l4i) in vvsep [ "* musings" , "** Global Facts" srchs (globalFacts l4i) @@ -123,7 +123,7 @@ musings l4i rs = , "*** entryPoints" let (ePout, ePerr) = xpLog (entryPoints l4i) in srchs ePout vsep (pretty <$> ePerr) , "** the Rule Decision Graph" , orgexample (pretty (prettify (first ruleLabelName decisionGraph))) - , "*** logging output" vsep (pretty <$> dGerr) + , "*** logging output" vsep (pretty <$> ruleGraphErr l4i) , "** Decision Roots" , "rules which are not just RuleAlises, and which are not relied on by any other rule" From 8d55bbb00d1c651d43fc76c661ed8e413b3c465c Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 11:42:00 +0800 Subject: [PATCH 07/49] minor cleanups. broke tests due to extension of L4I Interpreted type --- lib/haskell/natural4/src/LS/Rule.hs | 16 ++++++++++++++-- lib/haskell/natural4/src/LS/XPile/DataFlow.hs | 11 +++++++++++ lib/haskell/natural4/test/LS/NLGSpec.hs | 12 ++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Rule.hs b/lib/haskell/natural4/src/LS/Rule.hs index 82e21ec6b..82492c4d8 100644 --- a/lib/haskell/natural4/src/LS/Rule.hs +++ b/lib/haskell/natural4/src/LS/Rule.hs @@ -12,6 +12,7 @@ import Control.Monad.Writer.Lazy (WriterT (runWriterT)) import Data.Aeson (ToJSON) import Data.Bifunctor (second) import Data.Hashable (Hashable) +import qualified Data.HashMap.Strict as Map import Data.List.NonEmpty (NonEmpty) import Data.Set qualified as Set import Data.Text qualified as Text @@ -21,7 +22,7 @@ import GHC.Generics (Generic) import LS.Types ( BoolStructP, BoolStructR, - ClsTab, + ClsTab(..), DList, Deontic (DMust), Depth, @@ -63,7 +64,7 @@ import Text.Megaparsec (), (<|>), ) -import Data.Graph.Inductive (Gr) +import Data.Graph.Inductive (Gr, empty) import LS.XPile.Logging (XPileLogW) -- | [TODO] refactoring: these should be broken out into their own (new)types and have Rule include them all. @@ -395,6 +396,17 @@ data Interpreted = L4I { } deriving (Eq, Show) +-- | default L4I +defaultL4I :: Interpreted +defaultL4I = L4I + { classtable = CT Map.empty + , scopetable = Map.empty + , origrules = mempty + , valuePreds = mempty + , ruleGraph = empty + , ruleGraphErr = mempty + } + -- | structure the rules as a graph. -- in the simple case, the graph is one or more trees, each rooted at a "top-level" rule which is not "used" by any another rule. -- if we walk the roots, we will sooner or later encounter all the decision elements relevant to each root. diff --git a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs index a497d45df..47588d54f 100644 --- a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs +++ b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs @@ -19,6 +19,14 @@ import Data.Graph.Inductive.PatriciaTree (Gr) -- graphviz import Data.GraphViz + ( shape, + graphToDot, + Shape(Circle), + GraphID(Str), + NodeCluster(N, C), + GlobalAttributes(NodeAttrs, GraphAttrs), + GraphvizParams(..), + DotGraph ) import Data.GraphViz.Printing (renderDot) import Data.GraphViz.Attributes.Complete @@ -80,6 +88,9 @@ dataFlowAsDot l4i = do -- So, we grab one tree of rules at a time from the RuleGraph provided by the interpreter, and dump those; -- then we dump the ground term leaves in those rules. + let rG = ruleGraph l4i + mutterdhsf 3 "dataFlowasDot: first, let's dump the rulegraph" pShowNoColorS rG + return "/* coming soon: this will be a data flow diagram */" where diff --git a/lib/haskell/natural4/test/LS/NLGSpec.hs b/lib/haskell/natural4/test/LS/NLGSpec.hs index 035d62072..c3614dff0 100644 --- a/lib/haskell/natural4/test/LS/NLGSpec.hs +++ b/lib/haskell/natural4/test/LS/NLGSpec.hs @@ -22,6 +22,7 @@ import LS.NLP.NLG ) import LS.Rule ( Interpreted (..), + defaultL4I, Rule ( DefNameAlias, DefTypically, @@ -83,6 +84,7 @@ import Test.Hspec shouldBe, ) import qualified Data.Text as Text +import qualified Data.Graph.Inductive as Graph (empty) spec :: Spec spec = do @@ -900,7 +902,7 @@ becomingAwareBSR = Leaf ) pdpa1withUnexpandedUponInterp :: Interpreted -pdpa1withUnexpandedUponInterp = L4I +pdpa1withUnexpandedUponInterp = defaultL4I { classtable = CT Map.empty , scopetable = fromList [ ([ MTT "becoming aware" ] @@ -922,8 +924,10 @@ mustsing5Interp :: Interpreted mustsing5Interp = mustsingInterp qualifiesBSRdrinks mustsing5Rules mustsing6Interp = mustsingInterp qualifiesBSRnotdrink mustsing6Rules +-- [TODO] some tests are broken because the L4I shouldn't be hardcoded -- it should result from running the interpreter on some input ruleset; hence populating the ruleGraph field correctly. + mustsingInterp :: BoolStructR -> [Rule] -> Interpreted -mustsingInterp variableBSR variableOrigRules = L4I +mustsingInterp variableBSR variableOrigRules = defaultL4I { classtable = CT Map.empty , scopetable = fromList [ ([ MTT "Qualifies" ] @@ -962,7 +966,7 @@ mustsingInterp variableBSR variableOrigRules = L4I ] , origrules = variableOrigRules } rodentsInterp :: Interpreted -rodentsInterp = L4I +rodentsInterp = defaultL4I { classtable = CT Map.empty , scopetable = fromList [ @@ -997,7 +1001,7 @@ rodentsInterp = L4I ], origrules = rodentsRules } pdpafullInterp :: Interpreted -pdpafullInterp = L4I {classtable = CT (fromList []), scopetable = fromList [([MTT "NDB Qualification"],fromList [([MTT "it is a Notifiable Data Breach"],((Nothing,[]),[HC {hHead = RPMT [MTT "it is a Notifiable Data Breach"], hBody = Just (All Nothing [Leaf (RPMT [MTT "a data breach",MTT "occurred"]),Not (Leaf (RPMT [MTT "the data breach occurred only within an organisation"])),Any Nothing [Leaf (RPMT [MTT "it results in, or is likely to result in, significant harm to an affected individual"]),Leaf (RPMT [MTT "it is, or is likely to be, of a significant scale"])]])}]))]),([MTT "Notification"],fromList [([MTT "Notification"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "Notification"] RPis (All Nothing [Leaf (RPMT [MTT "Notify PDPC"]),Leaf (RPMT [MTT "Notify Individuals"])]), hBody = Nothing}]))]),([MTT "a data breach",MTT "occurred"],fromList [([MTT "a data breach",MTT "occurred"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "a data breach",MTT "occurred"] RPis (Any Nothing [Any (Just (PrePost "any unauthorised" "of personal data")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])],Any (Just (PrePost "loss of storage medium on which personal data is stored in circumstances where the unauthorised" "of the personal data is likely to occur")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])]]), hBody = Nothing}]))]),([MTT "it is, or is likely to be, of a significant scale"],fromList [([MTT "it is, or is likely to be, of a significant scale"],((Nothing,[]),[HC {hHead = RPMT [MTT "it is, or is likely to be, of a significant scale"], hBody = Just (Leaf (RPConstraint [MTT "the number of affected individuals"] RPgt [MTT "the prescribed threshold of affected individuals"]))}]))]),([MTT "it results in, or is likely to result in, significant harm to an affected individual"],fromList [([MTT "it results in, or is likely to result in, significant harm to an affected individual"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "it results in, or is likely to result in, significant harm to an affected individual"] RPis (All Nothing [Leaf (RPMT [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"]),Not (Any Nothing [Leaf (RPMT [MTT "the organisation has taken any action ",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"]),Leaf (RPMT [MTT "the organisation already implemented any technological measure",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"])])]), hBody = Nothing}]))]),([MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"],fromList [([MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"] RPis (All Nothing [Any (Just (Pre "the data breach relates to the individual's")) [Leaf (RPMT [MTT "full name"]),Leaf (RPMT [MTT "alias"]),Leaf (RPMT [MTT "identification number"])],Leaf (RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"])]), hBody = Nothing}]))]),([MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"],fromList [([MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"],((Nothing,[]),[HC {hHead = RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"], hBody = Just (Any Nothing [Leaf (RPMT [MTI 1,MTT "The amount of any wages, salary, fee, commission, bonus, gratuity, allowance or other remuneration paid or payable to the individual by any person, whether under a contract of service or a contract for services."]),Leaf (RPMT [MTI 2,MTT "The income of the individual from the sale of any goods or property."]),Leaf (RPMT [MTI 3,MTT "The number of any credit card, charge card or debit card issued to or in the name of the individual."]),Leaf (RPMT [MTI 4,MTT "The number assigned to any account the individual has with any organisation that is a bank or finance company."]),Any (Just (Pre "5 Any information that identifies, or is likely to lead to the identification of, the individual as a child or young person who \8212")) [Leaf (RPMT [MTT "5.a",MTT "is or had been the subject of any investigation under the CYPA;"]),Leaf (RPMT [MTT "5.b",MTT "is or had been arrested, on or after 1 July 2020, for an offence committed under any written law;"]),Leaf (RPMT [MTT "5.c",MTT "is or had been taken into care or custody by the Director-General of Social Welfare, a protector, any officer generally or specially authorised in that behalf in writing by the Director-General or protector or a police officer under the CYPA;"]),Leaf (RPMT [MTT "5.d",MTT "is attending or had attended a family programme in relation to an application to be made under section 50 of the CYPA;"]),Leaf (RPMT [MTT "5.e",MTT "is or was the subject of an order made by a court under the CYPA; or"]),Leaf (RPMT [MTT "5.f",MTT "is or had been concerned in any proceedings in any court or on appeal from any court, whether the individual is the person against or in respect of whom the proceedings are taken or a witness in those proceedings."])],Any (Just (Pre "6 Any information that identifies, or is likely to lead to the identification of \8212 b")) [Leaf (RPMT [MTT "6.a",MTT "the individual who has been or is the subject of any investigation, examination, assessment or treatment under the VAA relating to whether the individual is a vulnerable adult experiencing or at risk of abuse, neglect or self-neglect;"]),Leaf (RPMT [MTT "6.b",MTT "the individual as a vulnerable adult who has been committed to a place of temporary care and protection or place of safety or to the care of a fit person under the VAA;"]),Leaf (RPMT [MTT "6.c",MTT "the individual as a vulnerable adult who is the subject of an order made by a court under the VAA;"]),Leaf (RPMT [MTT "6.d",MTT "a place of temporary care and protection or place of safety in which an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is committed, or the location of such a place of temporary care and protection or place of safety; or"]),Leaf (RPMT [MTT "6.e",MTT "a fit person under whose care an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is placed, or the location of the premises of such a fit person."])],Any (Just (Pre "7 Any private key of or relating to the individual that is used or may be used \8212")) [Leaf (RPMT [MTT "7.a",MTT "to create a secure electronic record or secure electronic signature;"]),Leaf (RPMT [MTT "7.b",MTT "to verify the integrity of a secure electronic record; or"]),Leaf (RPMT [MTT "7.c",MTT "to verify the authenticity or integrity of a secure electronic signature."])],Leaf (RPMT [MTI 8,MTT "The net worth of the individual."]),Leaf (RPMT [MTI 9,MTT "The deposit of moneys by the individual with any organisation."]),Leaf (RPMT [MTI 10,MTT "The withdrawal by the individual of moneys deposited with any organisation."]),Leaf (RPMT [MTI 11,MTT "The granting by an organisation of advances, loans and other facilities by which the individual, being a customer of the organisation, has access to funds or financial guarantees."]),Leaf (RPMT [MTI 12,MTT "The incurring by the organisation of any liabilities other than those mentioned in paragraph 11 on behalf of the individual."]),Leaf (RPMT [MTI 13,MTT "The payment of any moneys, or transfer of any property, by any person to the individual, including the amount of the moneys paid or the value of the property transferred, as the case may be."]),Leaf (RPMT [MTI 14,MTT "The creditworthiness of the individual."]),Leaf (RPMT [MTI 15,MTT "The individual\8217s investment in any capital markets products."]),Any (Just (Pre "16 The existence, and amount due or outstanding, of any debt \8212")) [Leaf (RPMT [MTT "16.a",MTT "owed by the individual to an organisation; or"]),Leaf (RPMT [MTT "16.b",MTT "owed by an organisation to the individual."])],Any (Just (Pre "17 Any of the following:")) [Leaf (RPMT [MTT "17.a",MTT "the terms and conditions of any accident and health policy or life policy (called in this item the applicable policy) of which the individual is the policy owner or under which the individual is a beneficiary;"]),Leaf (RPMT [MTT "17.b",MTT "the premium payable by the policy owner under the applicable policy;"]),Leaf (RPMT [MTT "17.c",MTT "the benefits payable to any beneficiary under the applicable policy;"]),Leaf (RPMT [MTT "17.d",MTT "any information relating to any claim on, or payment under, the applicable policy, including the condition of the health of the individual and the diagnosis, treatment, prevention or alleviation of any ailment, condition, disability, disease, disorder or injury that the individual has suffered or is suffering from;"]),Leaf (RPMT [MTT "17.e",MTT "any other information that the individual is the policy owner of, or a beneficiary under, an applicable policy."])],Any (Just (Pre "18 The assessment, diagnosis, treatment, prevention or alleviation by a health professional of any of the following affecting the individual:")) [Leaf (RPMT [MTT "18.a",MTT "any sexually-transmitted disease such as Chlamydial Genital Infection, Gonorrhoea and Syphilis;"]),Leaf (RPMT [MTT "18.b",MTT "Human Immunodeficiency Virus Infection;"]),Leaf (RPMT [MTT "mental illness;"]),Leaf (RPMT [MTT "18.c",MTT "schizophrenia or delusional disorder;"]),Leaf (RPMT [MTT "18.d",MTT "substance abuse and addiction, including drug addiction and alcoholism"])],Any (Just (Pre "19 The provision of treatment to the individual for or in respect of \8212")) [Leaf (RPMT [MTT "19.a",MTT "the donation or receipt of a human egg or human sperm; or"]),Leaf (RPMT [MTT "19.b",MTT "any contraceptive operation or procedure or abortion."])],Any (Just (Pre "20 Any of the following:")) [Leaf (RPMT [MTT "20.a",MTT "subject to section 4(4)(b) of the Act, the donation and removal of any organ from the body of the deceased individual for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.b",MTT "the donation and removal of any specified organ from the individual, being a living organ donor, for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.c",MTT "the transplantation of any organ mentioned in sub-paragraph (a) or (b) into the body of the individual."])],Leaf (RPMT [MTI 21,MTT "Subject to section 4(4)(b) of the Act, the suicide or attempted suicide of the individual."]),Leaf (RPMT [MTI 22,MTT "Domestic abuse, child abuse or sexual abuse involving or alleged to involve the individual."]),Any (Just (Pre "23 Any of the following:")) [Leaf (RPMT [MTT "23.a",MTT "information that the individual is or had been adopted pursuant to an adoption order made under the Adoption of Children Act (Cap. 4), or is or had been the subject of an application for an adoption order;"]),Leaf (RPMT [MTT "23.b",MTT "the identity of the natural father or mother of the individual;"]),Leaf (RPMT [MTT "23.c",MTT "the identity of the adoptive father or mother of the individual;"]),Leaf (RPMT [MTT "23.d",MTT "the identity of any applicant for an adoption order;"]),Leaf (RPMT [MTT "23.e",MTT "the identity of any person whose consent is necessary under that Act for an adoption order to be made, whether or not the court has dispensed with the consent of that person in accordance with that Act;"]),Leaf (RPMT [MTT "23.f",MTT "any other information that the individual is or had been an adopted child or relating to the adoption of the individual."])]])}]))]),([MTT "the prescribed threshold of affected individuals"],fromList [([MTT "the prescribed threshold of affected individuals"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "the prescribed threshold of affected individuals"] RPis (Leaf (RPMT [MTI 500])), hBody = Nothing}]))])], origrules = pdpafullRules} +pdpafullInterp = defaultL4I {classtable = CT (fromList []), scopetable = fromList [([MTT "NDB Qualification"],fromList [([MTT "it is a Notifiable Data Breach"],((Nothing,[]),[HC {hHead = RPMT [MTT "it is a Notifiable Data Breach"], hBody = Just (All Nothing [Leaf (RPMT [MTT "a data breach",MTT "occurred"]),Not (Leaf (RPMT [MTT "the data breach occurred only within an organisation"])),Any Nothing [Leaf (RPMT [MTT "it results in, or is likely to result in, significant harm to an affected individual"]),Leaf (RPMT [MTT "it is, or is likely to be, of a significant scale"])]])}]))]),([MTT "Notification"],fromList [([MTT "Notification"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "Notification"] RPis (All Nothing [Leaf (RPMT [MTT "Notify PDPC"]),Leaf (RPMT [MTT "Notify Individuals"])]), hBody = Nothing}]))]),([MTT "a data breach",MTT "occurred"],fromList [([MTT "a data breach",MTT "occurred"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "a data breach",MTT "occurred"] RPis (Any Nothing [Any (Just (PrePost "any unauthorised" "of personal data")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])],Any (Just (PrePost "loss of storage medium on which personal data is stored in circumstances where the unauthorised" "of the personal data is likely to occur")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])]]), hBody = Nothing}]))]),([MTT "it is, or is likely to be, of a significant scale"],fromList [([MTT "it is, or is likely to be, of a significant scale"],((Nothing,[]),[HC {hHead = RPMT [MTT "it is, or is likely to be, of a significant scale"], hBody = Just (Leaf (RPConstraint [MTT "the number of affected individuals"] RPgt [MTT "the prescribed threshold of affected individuals"]))}]))]),([MTT "it results in, or is likely to result in, significant harm to an affected individual"],fromList [([MTT "it results in, or is likely to result in, significant harm to an affected individual"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "it results in, or is likely to result in, significant harm to an affected individual"] RPis (All Nothing [Leaf (RPMT [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"]),Not (Any Nothing [Leaf (RPMT [MTT "the organisation has taken any action ",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"]),Leaf (RPMT [MTT "the organisation already implemented any technological measure",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"])])]), hBody = Nothing}]))]),([MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"],fromList [([MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"] RPis (All Nothing [Any (Just (Pre "the data breach relates to the individual's")) [Leaf (RPMT [MTT "full name"]),Leaf (RPMT [MTT "alias"]),Leaf (RPMT [MTT "identification number"])],Leaf (RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"])]), hBody = Nothing}]))]),([MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"],fromList [([MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"],((Nothing,[]),[HC {hHead = RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"], hBody = Just (Any Nothing [Leaf (RPMT [MTI 1,MTT "The amount of any wages, salary, fee, commission, bonus, gratuity, allowance or other remuneration paid or payable to the individual by any person, whether under a contract of service or a contract for services."]),Leaf (RPMT [MTI 2,MTT "The income of the individual from the sale of any goods or property."]),Leaf (RPMT [MTI 3,MTT "The number of any credit card, charge card or debit card issued to or in the name of the individual."]),Leaf (RPMT [MTI 4,MTT "The number assigned to any account the individual has with any organisation that is a bank or finance company."]),Any (Just (Pre "5 Any information that identifies, or is likely to lead to the identification of, the individual as a child or young person who \8212")) [Leaf (RPMT [MTT "5.a",MTT "is or had been the subject of any investigation under the CYPA;"]),Leaf (RPMT [MTT "5.b",MTT "is or had been arrested, on or after 1 July 2020, for an offence committed under any written law;"]),Leaf (RPMT [MTT "5.c",MTT "is or had been taken into care or custody by the Director-General of Social Welfare, a protector, any officer generally or specially authorised in that behalf in writing by the Director-General or protector or a police officer under the CYPA;"]),Leaf (RPMT [MTT "5.d",MTT "is attending or had attended a family programme in relation to an application to be made under section 50 of the CYPA;"]),Leaf (RPMT [MTT "5.e",MTT "is or was the subject of an order made by a court under the CYPA; or"]),Leaf (RPMT [MTT "5.f",MTT "is or had been concerned in any proceedings in any court or on appeal from any court, whether the individual is the person against or in respect of whom the proceedings are taken or a witness in those proceedings."])],Any (Just (Pre "6 Any information that identifies, or is likely to lead to the identification of \8212 b")) [Leaf (RPMT [MTT "6.a",MTT "the individual who has been or is the subject of any investigation, examination, assessment or treatment under the VAA relating to whether the individual is a vulnerable adult experiencing or at risk of abuse, neglect or self-neglect;"]),Leaf (RPMT [MTT "6.b",MTT "the individual as a vulnerable adult who has been committed to a place of temporary care and protection or place of safety or to the care of a fit person under the VAA;"]),Leaf (RPMT [MTT "6.c",MTT "the individual as a vulnerable adult who is the subject of an order made by a court under the VAA;"]),Leaf (RPMT [MTT "6.d",MTT "a place of temporary care and protection or place of safety in which an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is committed, or the location of such a place of temporary care and protection or place of safety; or"]),Leaf (RPMT [MTT "6.e",MTT "a fit person under whose care an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is placed, or the location of the premises of such a fit person."])],Any (Just (Pre "7 Any private key of or relating to the individual that is used or may be used \8212")) [Leaf (RPMT [MTT "7.a",MTT "to create a secure electronic record or secure electronic signature;"]),Leaf (RPMT [MTT "7.b",MTT "to verify the integrity of a secure electronic record; or"]),Leaf (RPMT [MTT "7.c",MTT "to verify the authenticity or integrity of a secure electronic signature."])],Leaf (RPMT [MTI 8,MTT "The net worth of the individual."]),Leaf (RPMT [MTI 9,MTT "The deposit of moneys by the individual with any organisation."]),Leaf (RPMT [MTI 10,MTT "The withdrawal by the individual of moneys deposited with any organisation."]),Leaf (RPMT [MTI 11,MTT "The granting by an organisation of advances, loans and other facilities by which the individual, being a customer of the organisation, has access to funds or financial guarantees."]),Leaf (RPMT [MTI 12,MTT "The incurring by the organisation of any liabilities other than those mentioned in paragraph 11 on behalf of the individual."]),Leaf (RPMT [MTI 13,MTT "The payment of any moneys, or transfer of any property, by any person to the individual, including the amount of the moneys paid or the value of the property transferred, as the case may be."]),Leaf (RPMT [MTI 14,MTT "The creditworthiness of the individual."]),Leaf (RPMT [MTI 15,MTT "The individual\8217s investment in any capital markets products."]),Any (Just (Pre "16 The existence, and amount due or outstanding, of any debt \8212")) [Leaf (RPMT [MTT "16.a",MTT "owed by the individual to an organisation; or"]),Leaf (RPMT [MTT "16.b",MTT "owed by an organisation to the individual."])],Any (Just (Pre "17 Any of the following:")) [Leaf (RPMT [MTT "17.a",MTT "the terms and conditions of any accident and health policy or life policy (called in this item the applicable policy) of which the individual is the policy owner or under which the individual is a beneficiary;"]),Leaf (RPMT [MTT "17.b",MTT "the premium payable by the policy owner under the applicable policy;"]),Leaf (RPMT [MTT "17.c",MTT "the benefits payable to any beneficiary under the applicable policy;"]),Leaf (RPMT [MTT "17.d",MTT "any information relating to any claim on, or payment under, the applicable policy, including the condition of the health of the individual and the diagnosis, treatment, prevention or alleviation of any ailment, condition, disability, disease, disorder or injury that the individual has suffered or is suffering from;"]),Leaf (RPMT [MTT "17.e",MTT "any other information that the individual is the policy owner of, or a beneficiary under, an applicable policy."])],Any (Just (Pre "18 The assessment, diagnosis, treatment, prevention or alleviation by a health professional of any of the following affecting the individual:")) [Leaf (RPMT [MTT "18.a",MTT "any sexually-transmitted disease such as Chlamydial Genital Infection, Gonorrhoea and Syphilis;"]),Leaf (RPMT [MTT "18.b",MTT "Human Immunodeficiency Virus Infection;"]),Leaf (RPMT [MTT "mental illness;"]),Leaf (RPMT [MTT "18.c",MTT "schizophrenia or delusional disorder;"]),Leaf (RPMT [MTT "18.d",MTT "substance abuse and addiction, including drug addiction and alcoholism"])],Any (Just (Pre "19 The provision of treatment to the individual for or in respect of \8212")) [Leaf (RPMT [MTT "19.a",MTT "the donation or receipt of a human egg or human sperm; or"]),Leaf (RPMT [MTT "19.b",MTT "any contraceptive operation or procedure or abortion."])],Any (Just (Pre "20 Any of the following:")) [Leaf (RPMT [MTT "20.a",MTT "subject to section 4(4)(b) of the Act, the donation and removal of any organ from the body of the deceased individual for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.b",MTT "the donation and removal of any specified organ from the individual, being a living organ donor, for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.c",MTT "the transplantation of any organ mentioned in sub-paragraph (a) or (b) into the body of the individual."])],Leaf (RPMT [MTI 21,MTT "Subject to section 4(4)(b) of the Act, the suicide or attempted suicide of the individual."]),Leaf (RPMT [MTI 22,MTT "Domestic abuse, child abuse or sexual abuse involving or alleged to involve the individual."]),Any (Just (Pre "23 Any of the following:")) [Leaf (RPMT [MTT "23.a",MTT "information that the individual is or had been adopted pursuant to an adoption order made under the Adoption of Children Act (Cap. 4), or is or had been the subject of an application for an adoption order;"]),Leaf (RPMT [MTT "23.b",MTT "the identity of the natural father or mother of the individual;"]),Leaf (RPMT [MTT "23.c",MTT "the identity of the adoptive father or mother of the individual;"]),Leaf (RPMT [MTT "23.d",MTT "the identity of any applicant for an adoption order;"]),Leaf (RPMT [MTT "23.e",MTT "the identity of any person whose consent is necessary under that Act for an adoption order to be made, whether or not the court has dispensed with the consent of that person in accordance with that Act;"]),Leaf (RPMT [MTT "23.f",MTT "any other information that the individual is or had been an adopted child or relating to the adoption of the individual."])]])}]))]),([MTT "the prescribed threshold of affected individuals"],fromList [([MTT "the prescribed threshold of affected individuals"],((Nothing,[]),[HC {hHead = RPBoolStructR [MTT "the prescribed threshold of affected individuals"] RPis (Leaf (RPMT [MTI 500])), hBody = Nothing}]))])], origrules = pdpafullRules} pdpafullRules :: [Rule] pdpafullRules = [Regulative {subj = Leaf ((MTT "Organisation" :| [],Nothing) :| []), rkeyword = REvery, who = Just (Not (Leaf (RPMT [MTT "is",MTT "a Public Agency"]))), cond = Just (Any Nothing [Leaf (RPConstraint [MTT "the data breach occurred"] (RPTC TOn) [MTT "1 Feb 2022"]),Leaf (RPConstraint [MTT "the data breach occurred"] (RPTC TAfter) [MTT "1 Feb 2022"])]), deontic = DMust, action = Leaf ((MTT "assess" :| [MTT "if it is a Notifiable Data Breach"],Nothing) :| [(MTT "by" :| [MTT "evaluating",MTT "NDB Qualification"],Nothing)]), temporal = Just (TemporalConstraint TBefore (Just 30) "days"), hence = Just (RuleAlias [MTT "Notification"]), lest = Just (RuleAlias [MTT "PDPC query with demand"]), rlabel = Just ("\167",1,"Assessment"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 8, srccol = 24, version = Nothing}), upon = Just ((MTT "becoming aware a data breach may have occurred" :| [],Nothing) :| []), given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "the PDPC" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Nothing, deontic = DMay, action = Leaf ((MTT "query" :| [MTT "You"],Nothing) :| [(MTT "with" :| [MTT "a demand"],Nothing),(MTT "for" :| [MTT "an explanation of your inaction"],Nothing)]), temporal = Nothing, hence = Just (RuleAlias [MTT "Respond to PDPC"]), lest = Nothing, rlabel = Just ("\167",1,"PDPC query with demand"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 7, srccol = 37, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "You" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Nothing, deontic = DMust, action = Leaf ((MTT "respond to" :| [MTT "the PDPC"],Nothing) :| [(MTT "with" :| [MTT "an explanation of your inaction"],Nothing)]), temporal = Nothing, hence = Nothing, lest = Nothing, rlabel = Just ("\167",1,"Respond to PDPC"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 7, srccol = 45, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},defaultHorn {name = [MTT "it is a Notifiable Data Breach"], super = Nothing, keyword = Decide, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPMT [MTT "it is a Notifiable Data Breach"], hBody = Just (All Nothing [Leaf (RPMT [MTT "a data breach",MTT "occurred"]),Not (Leaf (RPMT [MTT "the data breach occurred only within an organisation"])),Any Nothing [Leaf (RPMT [MTT "it results in, or is likely to result in, significant harm to an affected individual"]),Leaf (RPMT [MTT "it is, or is likely to be, of a significant scale"])]])}], rlabel = Just ("\167",1,"NDB Qualification"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 8, srccol = 72, version = Nothing}), defaults = [], symtab = []},defaultHorn {name = [MTT "it is, or is likely to be, of a significant scale"], super = Nothing, keyword = Decide, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPMT [MTT "it is, or is likely to be, of a significant scale"], hBody = Just (Leaf (RPConstraint [MTT "the number of affected individuals"] RPgt [MTT "the prescribed threshold of affected individuals"]))}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 8, srccol = 123, version = Nothing}), defaults = [], symtab = []},defaultHorn {name = [MTT "the prescribed threshold of affected individuals"], super = Nothing, keyword = Means, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPBoolStructR [MTT "the prescribed threshold of affected individuals"] RPis (Leaf (RPMT [MTI 500])), hBody = Nothing}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 17, srccol = 126, version = Nothing}), defaults = [], symtab = []},defaultHorn {name = [MTT "Notification"], super = Nothing, keyword = Means, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPBoolStructR [MTT "Notification"] RPis (All Nothing [Leaf (RPMT [MTT "Notify PDPC"]),Leaf (RPMT [MTT "Notify Individuals"])]), hBody = Nothing}], rlabel = Just ("\167",1,"Notification"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 134, version = Nothing}), defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "You" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Just (All Nothing [Leaf (RPMT [MTT "it is a Notifiable Data Breach"]),Not (Leaf (RPMT [MTT "you are a Public Agency"]))]), deontic = DMust, action = Leaf ((MTT "NOTIFY" :| [MTT "the PDPC"],Nothing) :| [(MTT "in" :| [MTT "the form and manner specified at www.pdpc.gov.sg"],Nothing),(MTT "with" :| [MTT "a Notification Message"],Nothing),(MTT "containing" :| [MTT "a list of individuals for whom notification waiver is sought"],Nothing),(MTT "and" :| [MTT "justification for why"],Nothing)]), temporal = Just (TemporalConstraint TBefore (Just 3) "DAYS"), hence = Just (RuleAlias [MTT "PDPC prohibit notify individuals"]), lest = Nothing, rlabel = Just ("\167",2,"Notify PDPC"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 139, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "the PDPC" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Nothing, deontic = DMay, action = Leaf ((MTT "NOTIFY" :| [MTT "you"],Nothing) :| [(MTT "with" :| [MTT "a list of individuals to exclude from notification"],Nothing)]), temporal = Nothing, hence = Just (RuleAlias [MTT "Cannot notify individuals"]), lest = Nothing, rlabel = Just ("\167",2,"PDPC prohibit notify individuals"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 155, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "YOU" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Nothing, deontic = DShant, action = Leaf ((MTT "NOTIFY" :| [MTT "each of the Notifiable Individuals"],Nothing) :| [(MTT "who" :| [MTT "are on the affected list"],Nothing)]), temporal = Nothing, hence = Nothing, lest = Nothing, rlabel = Just ("\167",2,"Cannot notify individuals"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 163, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "You" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Just (All Nothing [Leaf (RPMT [MTT "it is a Notifiable Data Breach"]),Not (Leaf (RPMT [MTT "you are a Public Agency"]))]), deontic = DMust, action = Leaf ((MTT "NOTIFY" :| [MTT "each of the Notifiable Individuals"],Nothing) :| [(MTT "in" :| [MTT "any manner that is reasonable in the circumstances"],Nothing),(MTT "with" :| [MTT "a message obeying a certain format"],Nothing)]), temporal = Just (TemporalConstraint TBefore (Just 3) "days"), hence = Nothing, lest = Just (RuleAlias [MTT "Notify and explain"]), rlabel = Just ("\167",2,"Notify Individuals"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 175, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},Regulative {subj = Leaf ((MTT "You" :| [],Nothing) :| []), rkeyword = RParty, who = Nothing, cond = Nothing, deontic = DMust, action = Leaf ((MTT "notify" :| [MTT "each of the Notifiable Individuals"],Nothing) :| []), temporal = Nothing, hence = Nothing, lest = Nothing, rlabel = Just ("\167",2,"Notify and explain"), lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 191, version = Nothing}), upon = Nothing, given = Nothing, having = Nothing, wwhere = [], defaults = [], symtab = []},defaultHorn {name = [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"], super = Nothing, keyword = Decide, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"], hBody = Just (Any Nothing [Leaf (RPMT [MTI 1,MTT "The amount of any wages, salary, fee, commission, bonus, gratuity, allowance or other remuneration paid or payable to the individual by any person, whether under a contract of service or a contract for services."]),Leaf (RPMT [MTI 2,MTT "The income of the individual from the sale of any goods or property."]),Leaf (RPMT [MTI 3,MTT "The number of any credit card, charge card or debit card issued to or in the name of the individual."]),Leaf (RPMT [MTI 4,MTT "The number assigned to any account the individual has with any organisation that is a bank or finance company."]),Any (Just (Pre "5 Any information that identifies, or is likely to lead to the identification of, the individual as a child or young person who \8212")) [Leaf (RPMT [MTT "5.a",MTT "is or had been the subject of any investigation under the CYPA;"]),Leaf (RPMT [MTT "5.b",MTT "is or had been arrested, on or after 1 July 2020, for an offence committed under any written law;"]),Leaf (RPMT [MTT "5.c",MTT "is or had been taken into care or custody by the Director-General of Social Welfare, a protector, any officer generally or specially authorised in that behalf in writing by the Director-General or protector or a police officer under the CYPA;"]),Leaf (RPMT [MTT "5.d",MTT "is attending or had attended a family programme in relation to an application to be made under section 50 of the CYPA;"]),Leaf (RPMT [MTT "5.e",MTT "is or was the subject of an order made by a court under the CYPA; or"]),Leaf (RPMT [MTT "5.f",MTT "is or had been concerned in any proceedings in any court or on appeal from any court, whether the individual is the person against or in respect of whom the proceedings are taken or a witness in those proceedings."])],Any (Just (Pre "6 Any information that identifies, or is likely to lead to the identification of \8212 b")) [Leaf (RPMT [MTT "6.a",MTT "the individual who has been or is the subject of any investigation, examination, assessment or treatment under the VAA relating to whether the individual is a vulnerable adult experiencing or at risk of abuse, neglect or self-neglect;"]),Leaf (RPMT [MTT "6.b",MTT "the individual as a vulnerable adult who has been committed to a place of temporary care and protection or place of safety or to the care of a fit person under the VAA;"]),Leaf (RPMT [MTT "6.c",MTT "the individual as a vulnerable adult who is the subject of an order made by a court under the VAA;"]),Leaf (RPMT [MTT "6.d",MTT "a place of temporary care and protection or place of safety in which an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is committed, or the location of such a place of temporary care and protection or place of safety; or"]),Leaf (RPMT [MTT "6.e",MTT "a fit person under whose care an individual or a vulnerable adult mentioned in sub-paragraph (a), (b) or (c) is placed, or the location of the premises of such a fit person."])],Any (Just (Pre "7 Any private key of or relating to the individual that is used or may be used \8212")) [Leaf (RPMT [MTT "7.a",MTT "to create a secure electronic record or secure electronic signature;"]),Leaf (RPMT [MTT "7.b",MTT "to verify the integrity of a secure electronic record; or"]),Leaf (RPMT [MTT "7.c",MTT "to verify the authenticity or integrity of a secure electronic signature."])],Leaf (RPMT [MTI 8,MTT "The net worth of the individual."]),Leaf (RPMT [MTI 9,MTT "The deposit of moneys by the individual with any organisation."]),Leaf (RPMT [MTI 10,MTT "The withdrawal by the individual of moneys deposited with any organisation."]),Leaf (RPMT [MTI 11,MTT "The granting by an organisation of advances, loans and other facilities by which the individual, being a customer of the organisation, has access to funds or financial guarantees."]),Leaf (RPMT [MTI 12,MTT "The incurring by the organisation of any liabilities other than those mentioned in paragraph 11 on behalf of the individual."]),Leaf (RPMT [MTI 13,MTT "The payment of any moneys, or transfer of any property, by any person to the individual, including the amount of the moneys paid or the value of the property transferred, as the case may be."]),Leaf (RPMT [MTI 14,MTT "The creditworthiness of the individual."]),Leaf (RPMT [MTI 15,MTT "The individual\8217s investment in any capital markets products."]),Any (Just (Pre "16 The existence, and amount due or outstanding, of any debt \8212")) [Leaf (RPMT [MTT "16.a",MTT "owed by the individual to an organisation; or"]),Leaf (RPMT [MTT "16.b",MTT "owed by an organisation to the individual."])],Any (Just (Pre "17 Any of the following:")) [Leaf (RPMT [MTT "17.a",MTT "the terms and conditions of any accident and health policy or life policy (called in this item the applicable policy) of which the individual is the policy owner or under which the individual is a beneficiary;"]),Leaf (RPMT [MTT "17.b",MTT "the premium payable by the policy owner under the applicable policy;"]),Leaf (RPMT [MTT "17.c",MTT "the benefits payable to any beneficiary under the applicable policy;"]),Leaf (RPMT [MTT "17.d",MTT "any information relating to any claim on, or payment under, the applicable policy, including the condition of the health of the individual and the diagnosis, treatment, prevention or alleviation of any ailment, condition, disability, disease, disorder or injury that the individual has suffered or is suffering from;"]),Leaf (RPMT [MTT "17.e",MTT "any other information that the individual is the policy owner of, or a beneficiary under, an applicable policy."])],Any (Just (Pre "18 The assessment, diagnosis, treatment, prevention or alleviation by a health professional of any of the following affecting the individual:")) [Leaf (RPMT [MTT "18.a",MTT "any sexually-transmitted disease such as Chlamydial Genital Infection, Gonorrhoea and Syphilis;"]),Leaf (RPMT [MTT "18.b",MTT "Human Immunodeficiency Virus Infection;"]),Leaf (RPMT [MTT "mental illness;"]),Leaf (RPMT [MTT "18.c",MTT "schizophrenia or delusional disorder;"]),Leaf (RPMT [MTT "18.d",MTT "substance abuse and addiction, including drug addiction and alcoholism"])],Any (Just (Pre "19 The provision of treatment to the individual for or in respect of \8212")) [Leaf (RPMT [MTT "19.a",MTT "the donation or receipt of a human egg or human sperm; or"]),Leaf (RPMT [MTT "19.b",MTT "any contraceptive operation or procedure or abortion."])],Any (Just (Pre "20 Any of the following:")) [Leaf (RPMT [MTT "20.a",MTT "subject to section 4(4)(b) of the Act, the donation and removal of any organ from the body of the deceased individual for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.b",MTT "the donation and removal of any specified organ from the individual, being a living organ donor, for the purpose of its transplantation into the body of another individual;"]),Leaf (RPMT [MTT "20.c",MTT "the transplantation of any organ mentioned in sub-paragraph (a) or (b) into the body of the individual."])],Leaf (RPMT [MTI 21,MTT "Subject to section 4(4)(b) of the Act, the suicide or attempted suicide of the individual."]),Leaf (RPMT [MTI 22,MTT "Domestic abuse, child abuse or sexual abuse involving or alleged to involve the individual."]),Any (Just (Pre "23 Any of the following:")) [Leaf (RPMT [MTT "23.a",MTT "information that the individual is or had been adopted pursuant to an adoption order made under the Adoption of Children Act (Cap. 4), or is or had been the subject of an application for an adoption order;"]),Leaf (RPMT [MTT "23.b",MTT "the identity of the natural father or mother of the individual;"]),Leaf (RPMT [MTT "23.c",MTT "the identity of the adoptive father or mother of the individual;"]),Leaf (RPMT [MTT "23.d",MTT "the identity of any applicant for an adoption order;"]),Leaf (RPMT [MTT "23.e",MTT "the identity of any person whose consent is necessary under that Act for an adoption order to be made, whether or not the court has dispensed with the consent of that person in accordance with that Act;"]),Leaf (RPMT [MTT "23.f",MTT "any other information that the individual is or had been an adopted child or relating to the adoption of the individual."])]])}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 8, srccol = 233, version = Nothing}), defaults = [], symtab = []},DefNameAlias {name = [MTT "You"], detail = [MTT "Organisation"], nlhint = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 26, version = Nothing})},DefTypically {name = [MTT "is",MTT "a Public Agency"], defaults = [RPConstraint [MTT "is",MTT "a Public Agency"] RPis [MTT "not"]], srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 27, version = Nothing})},DefNameAlias {name = [MTT "NDB"], detail = [MTT "it is a Notifiable Data Breach"], nlhint = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 9, srccol = 74, version = Nothing})},defaultHorn {name = [MTT "a data breach",MTT "occurred"], super = Nothing, keyword = Means, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPBoolStructR [MTT "a data breach",MTT "occurred"] RPis (Any Nothing [Any (Just (PrePost "any unauthorised" "of personal data")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])],Any (Just (PrePost "loss of storage medium on which personal data is stored in circumstances where the unauthorised" "of the personal data is likely to occur")) [Leaf (RPMT [MTT "access"]),Leaf (RPMT [MTT "use"]),Leaf (RPMT [MTT "disclosure"]),Leaf (RPMT [MTT "copying"]),Leaf (RPMT [MTT "modification"]),Leaf (RPMT [MTT "disposal"])]]), hBody = Nothing}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 10, srccol = 74, version = Nothing}), defaults = [], symtab = []},defaultHorn {name = [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"], super = Nothing, keyword = Means, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPBoolStructR [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"] RPis (All Nothing [Any (Just (Pre "the data breach relates to the individual's")) [Leaf (RPMT [MTT "full name"]),Leaf (RPMT [MTT "alias"]),Leaf (RPMT [MTT "identification number"])],Leaf (RPMT [MTT "the data breach relates to",MTT "any of the prescribed personal data or classes of personal data relating to the individual"])]), hBody = Nothing}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 12, srccol = 91, version = Nothing}), defaults = [], symtab = []},defaultHorn {name = [MTT "it results in, or is likely to result in, significant harm to an affected individual"], super = Nothing, keyword = Means, given = Nothing, giveth = Nothing, upon = Nothing, clauses = [HC {hHead = RPBoolStructR [MTT "it results in, or is likely to result in, significant harm to an affected individual"] RPis (All Nothing [Leaf (RPMT [MTT "the data breach is in relation to any prescribed personal data or class of personal data relating to the individual"]),Not (Any Nothing [Leaf (RPMT [MTT "the organisation has taken any action ",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"]),Leaf (RPMT [MTT "the organisation already implemented any technological measure",MTT "to render it unlikely that the notifiable data breach will result in significant harm to the individual"])])]), hBody = Nothing}], rlabel = Nothing, lsource = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 10, srccol = 90, version = Nothing}), defaults = [], symtab = []},DefNameAlias {name = [MTT "the PDPC Exclusion List"], detail = [MTT "with",MTT "a list of individuals to exclude from notification"], nlhint = Nothing, srcref = Just (SrcRef {url = "test/pdpa-full.csv", short = "test/pdpa-full.csv", srcrow = 11, srccol = 160, version = Nothing})}] From 3c84373f6527bf9f9c283960fb114565a6d30338 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 11:44:03 +0800 Subject: [PATCH 08/49] move DataFlow module to LS, not LS.XPile --- lib/haskell/natural4/src/LS/XPile/DataFlow.hs | 124 ------------------ lib/haskell/natural4/src/LS/XPile/Org.hs | 2 + 2 files changed, 2 insertions(+), 124 deletions(-) delete mode 100644 lib/haskell/natural4/src/LS/XPile/DataFlow.hs diff --git a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs b/lib/haskell/natural4/src/LS/XPile/DataFlow.hs deleted file mode 100644 index 47588d54f..000000000 --- a/lib/haskell/natural4/src/LS/XPile/DataFlow.hs +++ /dev/null @@ -1,124 +0,0 @@ -{-# LANGUAGE RecordWildCards #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE QuasiQuotes #-} - -{-| transpiler to show dataflow for both arithmetic and boolean logic -} - -module LS.XPile.DataFlow where - -import LS.XPile.Logging -import LS -import LS.Interpreter -import LS.Rule - -import qualified Data.Map as Map -- if you want to upgrade this to Hashmap, go ahead - --- fgl -import Data.Graph.Inductive.Graph -import Data.Graph.Inductive.PatriciaTree (Gr) - --- graphviz -import Data.GraphViz - ( shape, - graphToDot, - Shape(Circle), - GraphID(Str), - NodeCluster(N, C), - GlobalAttributes(NodeAttrs, GraphAttrs), - GraphvizParams(..), - DotGraph ) -import Data.GraphViz.Printing (renderDot) -import Data.GraphViz.Attributes.Complete - --- * Conceptually, a FlowNode is either a rule or a leaf/ground term referenced by a rule. --- --- Suppose the top-level rule is: --- --- @DECIDE happy IF warm AND sunny@ --- --- The top-level node corresponds to "happy". And there are two dependencies: @warm@ and @sunny@. --- --- Let's say @warm@ is a ground term: we have no further information --- about @warm@. We need a human to provide a valuation of that fact. --- In our graph it is a leaf node. --- --- Let's say @sunny@ is itself a rule: @sunny IF daytime AND NOT cloudy@. --- --- And it bottoms out there: both @daytime@ and @cloudy@ are ground terms. --- --- So our dataflow graph has: --- --- @ --- warm -> happy --- sunny -> happy --- daytime -> sunny --- cloudy -> sunny --- @ --- --- Note that we are throwing away the logic -- we have lost the "NOT" on the "cloudy". --- --- The same idea applies to arithmetic rules: we might have @DECIDE happiness IS baselineHappiness + situationalHappiness@, where the terms are numeric-typed; the same shape of graph obtains. --- --- Our task is to return that graph. - --- | we use RuleNames to label the nodes in the rule diagram. -type FlowNode = RuleName - --- | it is our responsibility to maintain a mapping between node label and node number for use with fgl. -type FlowMap = Map.Map FlowNode Int - --- | We don't need edge labels. In the future, if we really wanted to, we could encode the control logic into an edge label, such that NOT is a 1, AND is a 2, etc etc. -type DataFlowGraph = Gr FlowNode () - --- | This is the top-level entry point for this file; we produce a dotfile and rely on other elements of the L4 runtime to produce SVG from the Dot. -dataFlowAsDot :: Interpreted -> XPileLog String -dataFlowAsDot l4i = do - - -- https://hackage.haskell.org/package/fgl-5.8.1.1/docs/Data-Graph-Inductive-Graph.html#v:mkGraph - let dfg :: DataFlowGraph - dfg = mkGraph - (Map.toList ruleNodes ++ Map.toList leafNodes) - ruleEdges - - let dot :: DotGraph Node - dot = graphToDot (flowParams dfg) dfg - - -- if you look at Petri.hs you will see its graph construction delves deep into the logical relationship between rules. - -- That code was written before we had the Intepreter available to analyze rules for us. - -- So, we grab one tree of rules at a time from the RuleGraph provided by the interpreter, and dump those; - -- then we dump the ground term leaves in those rules. - - let rG = ruleGraph l4i - mutterdhsf 3 "dataFlowasDot: first, let's dump the rulegraph" pShowNoColorS rG - - return "/* coming soon: this will be a data flow diagram */" - - where - ruleNodes = Map.fromList ( zip [1..] [ [MTT "pretend rule R1" ] -- 1 - , [MTT "pretend rule R2" ] -- 2 - ] ) - leafNodes = Map.fromList ( zip [1..] [ [MTT "pretend leaf L1" ] -- 1 - , [MTT "pretend leaf L2" ] -- 2 - , [MTT "pretend leaf L3" ] -- 3 - , [MTT "pretend leaf L4" ] -- 4 - ] ) - ruleEdges = [ (1, 1, ()), - (1, 2, ()), - (2, 3, ()), - (2, 4, ()) ] - - -- see Petri.hs for a more complex example of styling the graphviz output - flowParams :: DataFlowGraph -> GraphvizParams Int FlowNode () Int FlowNode - flowParams g = Params - { isDirected = True - , globalAttributes = [GraphAttrs [Compound True]] - , clusterBy = C 1 . N -- in future we may want to partition all leaf nodes into a separate cluster to better identify them - , isDotCluster = const False - , clusterID = const (Str "clusterId") - , fmtCluster = const [NodeAttrs [ shape Circle ] ] - , fmtNode = const [] - , fmtEdge = const [] - } - - - diff --git a/lib/haskell/natural4/src/LS/XPile/Org.hs b/lib/haskell/natural4/src/LS/XPile/Org.hs index 1b67d4eb8..917478ca4 100644 --- a/lib/haskell/natural4/src/LS/XPile/Org.hs +++ b/lib/haskell/natural4/src/LS/XPile/Org.hs @@ -25,6 +25,8 @@ import LS.Interpreter entryPoints, ) +import LS.DataFlow + import LS.RelationalPredicates ( partitionExistentials, getBSR ) import LS.Rule ( Interpreted(..), From a98e205c2ce41c2928936714dd539a3e3fcdf069 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 12:08:21 +0800 Subject: [PATCH 09/49] output the decision rule graph to workdir --- lib/haskell/natural4/app/Main.hs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index e7b33111a..30eb3133d 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -28,6 +28,7 @@ import LS.Interpreter l4interpret, onlyTheItems, ) +import LS.DataFlow import LS.NLP.NLG ( allLangs, expandRulesForNLG, @@ -193,6 +194,7 @@ main = do (totsFN, (asTSpretty, asTSerr)) = (workuuid <> "/" <> "ts", xpLog $ asTypescript l4i) (togroundsFN, asGrounds) = (workuuid <> "/" <> "grounds", show $ groundrules rc rules) (toOrgFN, asOrg) = (workuuid <> "/" <> "org", toOrg l4i rules) + (toDFGFN, (asDFG, asDFGerr)) = (workuuid <> "/" <> "dfg", xpLog $ dataFlowAsDot l4i) (toNL_FN, asNatLang) = (workuuid <> "/" <> "natlang", toNatLang l4i) (toMaudeFN, asMaude) = (workuuid <> "/" <> "maude", Maude.rules2maudeStr rules) (tonativeFN, asNative) = (workuuid <> "/" <> "native", unlines @@ -232,6 +234,7 @@ main = do -- however, we can flag specific exclusions by adding the --tomd option which, counterintuitively, disables tomd when (toworkdir && not (null $ SFL4.uuiddir opts) && (null $ SFL4.only opts)) $ do + when (SFL4.tonative opts) $ mywritefile2 True toDFGFN iso8601 "dot" asDFG asDFGerr when (SFL4.tonative opts) $ mywritefile True toOrgFN iso8601 "org" asOrg when (SFL4.tonative opts) $ mywritefile True tonativeFN iso8601 "hs" asNative when ( SFL4.tocorel4 opts) $ mywritefile2 True tocorel4FN iso8601 "l4" (commentIfError "--" asCoreL4) asCoreL4Err From a8fa62a500b2851ac1c80a01843c30eb0cb96290 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 12:25:02 +0800 Subject: [PATCH 10/49] preparing to construct the rule decision graph in two passes --- lib/haskell/natural4/src/LS/Interpreter.hs | 48 ++++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 96873885e..579f42558 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -330,15 +330,46 @@ getAttrTypesIn ct classname = type RuleIDMap = Map.HashMap Rule Int -- | which decision rules depend on which other decision rules? +-- And which ground terms don't expand any further? +-- +-- We answer these questions in two passes. +-- +-- First, we construct a rulegraph of only rules and their relations. In a conventional programming language we might call this the interprocedural graph. +-- In the first version of this codebase we stopped here and just returned the graph of rules, which is why the type is called `RuleGraph`. +-- +-- But that's not enough! We want to know about the leaf nodes, the ground terms, as well. +-- So, in a second pass, we traverse the rulegraph from the first pass, and return all the leaf nodes found in the RelationalPredicates; +-- then we eliminate all the tokens which appear in the graph from the first pass. That should leave us with only leaf nodes. +-- +-- With that clarity, we elevate the leaf nodes into stub rules and return a rule graph of the combined rules + ground terms. +-- +-- If, downstream, you want to distinguish between rule and ground term, we will have to figure out some annotation or foolproof convention by which we can observe that distinction. +-- ruleDecisionGraph :: RuleSet -> XPileLog RuleGraph ruleDecisionGraph rs = do - let ruleIDmap = Map.fromList (Prelude.zip decisionRules [1..]) - mutterdhsf 4 "ruleDecisionGraph: decisionRules from getBSR" pShowNoColorS decisionRules - mkGraph - (swap <$> Map.toList ruleIDmap) -- the nodes - <$> relPredRefsAll rs ruleIDmap + + mutterdhsf 4 "ruleDecisionGraph: (1.1) for first pass, decisionrules" pShowNoColorS decisionRules + + let ruleOnlyMap = Map.fromList (Prelude.zip decisionRules [1..]) + mutterdhsf 4 "ruleDecisionGraph: (1.2) ruleOnlyMap" pShowNoColorS ruleOnlyMap + + ruleOnlyGraph <- mkGraph + (swap <$> Map.toList ruleOnlyMap) -- the nodes + <$> relPredRefsAll rs ruleOnlyMap + + mutterdhsf 4 "ruleDecisionGraph: (1.3) ruleOnlyGraph" pShowNoColorS ruleOnlyGraph + + return ruleOnlyGraph + where + -- filter for just those rules which involve decisions decisionRules = [ r | r <- rs, not . null . getBSR $ r ] + + -- we want to represent the leaf nodes in the rule decision graph, so we elevate those to the status of rules by including them in the map + groundTerms :: Map.HashMap Rule Int -> [RuleName] + groundTerms knownRules = [] + -- find all the body elements which + -- | walk all relationalpredicates in a set of rules, and return the list of edges showing how one rule relies on another. relPredRefsAll :: RuleSet -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] @@ -378,7 +409,7 @@ relPredRefs rs ridmap r = do -- [BUG] at some point we lose the moon -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. - toreturn <- sequence + origtoreturn <- sequence [ (rid, targetRuleId', ()) <$ mutterd 6 ("returning " <> show rid <> ", " <> show targetRuleId') | bElem <- bodyElements , let targetRule = Map.lookup bElem headElements @@ -390,8 +421,9 @@ relPredRefs rs ridmap r = do rid = ridmap ! r ] - mutterdhsf 5 "relPredRefs: returning" pShowNoColorS toreturn - return toreturn + mutterdhsf 5 "relPredRefs: originally we would have returned" pShowNoColorS origtoreturn + -- mutterdhsf 5 "relPredRefs: with the leaf nodes intact, we return" pShowNoColorS toreturn + return origtoreturn -- | Which rules are "top-level", "entry-point" rules? -- From 89f23e753446a2779c7de320fdd704d3bcc20a00 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 12:44:21 +0800 Subject: [PATCH 11/49] bugfix in rp2bodytexts; this breaks 1 additional test --- lib/haskell/natural4/src/LS/Types.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/haskell/natural4/src/LS/Types.hs b/lib/haskell/natural4/src/LS/Types.hs index dc10d1bd9..ede294442 100644 --- a/lib/haskell/natural4/src/LS/Types.hs +++ b/lib/haskell/natural4/src/LS/Types.hs @@ -331,7 +331,7 @@ rp2mt (RPnary rel rps) = MTT (rel2txt rel) : concatMap rp2mt rps rp2bodytexts :: RelationalPredicate -> [MultiTerm] rp2bodytexts (RPParamText pt) = [pt2multiterm pt] rp2bodytexts (RPMT mt) = [mt] -rp2bodytexts (RPConstraint mt1 rel mt2) = [mt1, [MTT $ rel2op rel], mt2] +rp2bodytexts (RPConstraint mt1 rel mt2) = [mt1 ++ [MTT $ rel2op rel] ++ mt2] rp2bodytexts (RPBoolStructR mt1 rel bsr) = [mt1 ++ MTT (rel2op rel) : bod | bod <- concatMap rp2bodytexts (AA.extractLeaves bsr) ] rp2bodytexts (RPnary rel rps) = [MTT (rel2op rel), MTT "("] : concatMap rp2bodytexts rps ++ [[MTT ")"]] From 92a80689dfd4ec56632c640266fcd953bb3c975f Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 13:10:39 +0800 Subject: [PATCH 12/49] filter for the leaf nodes and factor out the noisy logging mutters --- lib/haskell/natural4/src/LS/Interpreter.hs | 30 ++++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 579f42558..9997d147e 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -32,7 +32,7 @@ import Data.Either (partitionEithers, fromRight) import Data.Graph.Inductive import Data.HashMap.Strict ((!)) import Data.HashMap.Strict qualified as Map -import Data.List (find) +import Data.List (find, (\\)) import Data.List qualified as DL import Data.List.NonEmpty as NE import Data.Maybe @@ -348,16 +348,35 @@ type RuleIDMap = Map.HashMap Rule Int ruleDecisionGraph :: RuleSet -> XPileLog RuleGraph ruleDecisionGraph rs = do - mutterdhsf 4 "ruleDecisionGraph: (1.1) for first pass, decisionrules" pShowNoColorS decisionRules + "(1.1) for first pass, decisionrules" --> decisionRules let ruleOnlyMap = Map.fromList (Prelude.zip decisionRules [1..]) - mutterdhsf 4 "ruleDecisionGraph: (1.2) ruleOnlyMap" pShowNoColorS ruleOnlyMap + "(1.2) ruleOnlyMap" --> ruleOnlyMap + mutterd 3 "ruleDecisionGraph: (1.3) ruleOnlyGraph construction log using relPredRefsAll" ruleOnlyGraph <- mkGraph (swap <$> Map.toList ruleOnlyMap) -- the nodes <$> relPredRefsAll rs ruleOnlyMap - mutterdhsf 4 "ruleDecisionGraph: (1.3) ruleOnlyGraph" pShowNoColorS ruleOnlyGraph + "(1.4) ruleOnlyGraph result" --> ruleOnlyGraph + + mutterd 3 "as a flex, just to show what's going on, we extract all the leaf terms, if we can, by starting with all the terms entirely. Well, MultiTerms." + + let allTerms = DL.nub $ concat (concatMap rp2bodytexts . concatMap AA.extractLeaves . getBSR <$> rs) + "(2.1) allTerms" --> allTerms + + mutterd 3 "we filter for the leaf terms by excluding all the ruleNames that we know from the original ruleset. This may not be a perfect match with the MultiTerms used in the rule graph. [TODO]" + + let (ruleNames, ruleLabelNames) = (ruleName <$> rs, ruleLabelName <$> rs) + "ruleNames to omit" --> ruleNames + "(what if we used ~ruleLabelName~ instead of ~ruleName~?)" --> ruleLabelNames + + let difference = allTerms \\ ruleNames + "ruleDecisionGraph: that leaves" --> difference + + mutterd 3 "let's elevate all the leaf terms to stubby little rules in their own right" + + mutterd 3 "then we attach those terms into the graph" return ruleOnlyGraph @@ -370,6 +389,7 @@ ruleDecisionGraph rs = do groundTerms knownRules = [] -- find all the body elements which + (-->) str hs = mutterdhsf 3 ("ruleDecisionGraph: " <> str) pShowNoColorS hs -- | walk all relationalpredicates in a set of rules, and return the list of edges showing how one rule relies on another. relPredRefsAll :: RuleSet -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] @@ -391,7 +411,7 @@ relPredRefs rs ridmap r = do headElements = Map.fromList $ [ (headName,r') | r' <- rs - , headName <- getDecisionHeads r' + , headName <- getDecisionHeads r' -- [TODO] this is quadratic ] -- given a rule, see which terms it relies on myGetBSR = getBSR r From fc4830cd7af09cf6bf68fc28968a3b6aa63998ce Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 13:30:49 +0800 Subject: [PATCH 13/49] attach leaf nodes into the expanded rule graph as reflexive nodes lol this can't be the right way --- lib/haskell/natural4/src/LS/Interpreter.hs | 53 +++++++++++++--------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 9997d147e..8dc6e0da6 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -343,42 +343,53 @@ type RuleIDMap = Map.HashMap Rule Int -- -- With that clarity, we elevate the leaf nodes into stub rules and return a rule graph of the combined rules + ground terms. -- --- If, downstream, you want to distinguish between rule and ground term, we will have to figure out some annotation or foolproof convention by which we can observe that distinction. +-- If, downstream, you want to distinguish between rule and ground term, just look for the rules which have a single Leaf in the BSR which is reflexive to the same rule. -- ruleDecisionGraph :: RuleSet -> XPileLog RuleGraph ruleDecisionGraph rs = do - "(1.1) for first pass, decisionrules" --> decisionRules + "(1.1) for first pass, we begin with decisionrules" ***-> decisionRules let ruleOnlyMap = Map.fromList (Prelude.zip decisionRules [1..]) - "(1.2) ruleOnlyMap" --> ruleOnlyMap + "(1.2) ruleOnlyMap" ***-> ruleOnlyMap mutterd 3 "ruleDecisionGraph: (1.3) ruleOnlyGraph construction log using relPredRefsAll" - ruleOnlyGraph <- mkGraph - (swap <$> Map.toList ruleOnlyMap) -- the nodes - <$> relPredRefsAll rs ruleOnlyMap + + ruleOnlyGraph :: RuleGraph <- mkGraph + (swap <$> Map.toList ruleOnlyMap) -- the nodes + <$> relPredRefsAll rs ruleOnlyMap -- The <$> lifts into the XPileLog monad - "(1.4) ruleOnlyGraph result" --> ruleOnlyGraph + "(1.4) ruleOnlyGraph result" ***-> ruleOnlyGraph mutterd 3 "as a flex, just to show what's going on, we extract all the leaf terms, if we can, by starting with all the terms entirely. Well, MultiTerms." let allTerms = DL.nub $ concat (concatMap rp2bodytexts . concatMap AA.extractLeaves . getBSR <$> rs) - "(2.1) allTerms" --> allTerms + "(2.1) allTerms" ***-> allTerms - mutterd 3 "we filter for the leaf terms by excluding all the ruleNames that we know from the original ruleset. This may not be a perfect match with the MultiTerms used in the rule graph. [TODO]" + mutterd 3 "(2.2) we filter for the leaf terms by excluding all the ruleNames that we know from the original ruleset. This may not be a perfect match with the MultiTerms used in the rule graph. [TODO]" let (ruleNames, ruleLabelNames) = (ruleName <$> rs, ruleLabelName <$> rs) - "ruleNames to omit" --> ruleNames - "(what if we used ~ruleLabelName~ instead of ~ruleName~?)" --> ruleLabelNames - - let difference = allTerms \\ ruleNames - "ruleDecisionGraph: that leaves" --> difference - - mutterd 3 "let's elevate all the leaf terms to stubby little rules in their own right" - - mutterd 3 "then we attach those terms into the graph" - - return ruleOnlyGraph + "(2.3) ruleNames to omit" ***-> ruleNames + "(2.3 alt) what if we used ~ruleLabelName~ instead of ~ruleName~?)" ***-> ruleLabelNames + + let difference = (allTerms \\ ruleNames) \\ [[ MTT "OTHERWISE" ]] -- special case: Otherwise drops out + "(2.4) that leaves" ***-> difference + + mutterd 3 "(2.5) let's elevate all the leaf terms to stubby little rules in their own right" + let stubRules = [ defaultHorn { name = rulename, keyword = Define, srcref = Nothing + , clauses = [ HC { hHead = RPMT rulename + , hBody = Just $ AA.mkLeaf (RPMT rulename) } -- [NOTE] so leaf nodes are reflexive, let's just say we meant for it to be that way, cuz they "bottom out" + ] } + | rulename <- ruleNames ] + + mutterd 3 "(2.6) then we rebuild the graph with those rules included" + let expandedRuleMap = Map.fromList (Prelude.zip (decisionRules ++ stubRules) [1..]) + expandedRuleGraph :: RuleGraph <- mkGraph + (swap <$> Map.toList expandedRuleMap) + <$> relPredRefsAll (rs ++ stubRules) expandedRuleMap + + "(2.7) expandedRuleGraph" ***-> expandedRuleGraph + return expandedRuleGraph where -- filter for just those rules which involve decisions @@ -389,7 +400,7 @@ ruleDecisionGraph rs = do groundTerms knownRules = [] -- find all the body elements which - (-->) str hs = mutterdhsf 3 ("ruleDecisionGraph: " <> str) pShowNoColorS hs + (***->) str hs = mutterdhsf 3 ("ruleDecisionGraph: " <> str) pShowNoColorS hs -- | walk all relationalpredicates in a set of rules, and return the list of edges showing how one rule relies on another. relPredRefsAll :: RuleSet -> RuleIDMap -> XPileLog [LEdge RuleGraphEdgeLabel] From 12407401f9f0457da2ef552b6a6f5cf2b3417910 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 13:43:27 +0800 Subject: [PATCH 14/49] bug remaining in ruleGraph, the stub rules are still not coming out of relPredRefs --- lib/haskell/natural4/src/LS/Interpreter.hs | 33 ++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 8dc6e0da6..bce9273b2 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -343,7 +343,7 @@ type RuleIDMap = Map.HashMap Rule Int -- -- With that clarity, we elevate the leaf nodes into stub rules and return a rule graph of the combined rules + ground terms. -- --- If, downstream, you want to distinguish between rule and ground term, just look for the rules which have a single Leaf in the BSR which is reflexive to the same rule. +-- If, downstream, you want to distinguish between rule and ground term, just look for those nodes in the graph which are leaves! -- ruleDecisionGraph :: RuleSet -> XPileLog RuleGraph ruleDecisionGraph rs = do @@ -377,9 +377,7 @@ ruleDecisionGraph rs = do mutterd 3 "(2.5) let's elevate all the leaf terms to stubby little rules in their own right" let stubRules = [ defaultHorn { name = rulename, keyword = Define, srcref = Nothing - , clauses = [ HC { hHead = RPMT rulename - , hBody = Just $ AA.mkLeaf (RPMT rulename) } -- [NOTE] so leaf nodes are reflexive, let's just say we meant for it to be that way, cuz they "bottom out" - ] } + , clauses = stubClause rulename } | rulename <- ruleNames ] mutterd 3 "(2.6) then we rebuild the graph with those rules included" @@ -387,11 +385,25 @@ ruleDecisionGraph rs = do expandedRuleGraph :: RuleGraph <- mkGraph (swap <$> Map.toList expandedRuleMap) <$> relPredRefsAll (rs ++ stubRules) expandedRuleMap - + "(2.7) expandedRuleGraph" ***-> expandedRuleGraph - return expandedRuleGraph + + mutterd 3 "(3.1) finally we strip the reflexive BSR from the stub rules while leaving the nodes themselves in place." + + let prunedRuleGraph = nmap (\r@Hornlike{..} -> if clauses == stubClause name then r { clauses = [] } else r ) expandedRuleGraph + "(2.7) prunedRuleGraph" ***-> prunedRuleGraph + + return prunedRuleGraph where + -- [NOTE] for the purposes of generating the graph in the 2nd pass, + -- leaf nodes are reflexive. Let's just say we meant for it to be that way, cuz they "bottom out", lol. + -- This gets removed in the third pass. + stubClause rulename = + [ HC { hHead = RPMT rulename + , hBody = Just $ AA.mkLeaf (RPMT rulename) } + ] + -- filter for just those rules which involve decisions decisionRules = [ r | r <- rs, not . null . getBSR $ r ] @@ -440,8 +452,8 @@ relPredRefs rs ridmap r = do -- [BUG] at some point we lose the moon -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. - origtoreturn <- sequence - [ (rid, targetRuleId', ()) <$ mutterd 6 ("returning " <> show rid <> ", " <> show targetRuleId') + toreturn <- sequence + [ (rid, targetRuleId', ()) <$ mutterd 6 ("relPredRefs list comp: returning " <> show rid <> ", " <> show targetRuleId') | bElem <- bodyElements , let targetRule = Map.lookup bElem headElements , isJust targetRule @@ -452,9 +464,8 @@ relPredRefs rs ridmap r = do rid = ridmap ! r ] - mutterdhsf 5 "relPredRefs: originally we would have returned" pShowNoColorS origtoreturn - -- mutterdhsf 5 "relPredRefs: with the leaf nodes intact, we return" pShowNoColorS toreturn - return origtoreturn + mutterdhsf 5 "relPredRefs: returning" pShowNoColorS toreturn + return toreturn -- | Which rules are "top-level", "entry-point" rules? -- From fed88aaf9cfb325e54c85b7aebbea2a6cded1511 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Tue, 15 Aug 2023 20:25:31 +0800 Subject: [PATCH 15/49] at first glance i think the data flow is being set up correctly, next dot --- lib/haskell/natural4/app/Main.hs | 2 +- lib/haskell/natural4/src/LS/Interpreter.hs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index 30eb3133d..39e3ade22 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -194,7 +194,7 @@ main = do (totsFN, (asTSpretty, asTSerr)) = (workuuid <> "/" <> "ts", xpLog $ asTypescript l4i) (togroundsFN, asGrounds) = (workuuid <> "/" <> "grounds", show $ groundrules rc rules) (toOrgFN, asOrg) = (workuuid <> "/" <> "org", toOrg l4i rules) - (toDFGFN, (asDFG, asDFGerr)) = (workuuid <> "/" <> "dfg", xpLog $ dataFlowAsDot l4i) + (toDFGFN, (asDFG, asDFGerr)) = (workuuid <> "/" <> "dataflow", xpLog $ dataFlowAsDot l4i) (toNL_FN, asNatLang) = (workuuid <> "/" <> "natlang", toNatLang l4i) (toMaudeFN, asMaude) = (workuuid <> "/" <> "maude", Maude.rules2maudeStr rules) (tonativeFN, asNative) = (workuuid <> "/" <> "native", unlines diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index bce9273b2..c613126f0 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -378,7 +378,7 @@ ruleDecisionGraph rs = do mutterd 3 "(2.5) let's elevate all the leaf terms to stubby little rules in their own right" let stubRules = [ defaultHorn { name = rulename, keyword = Define, srcref = Nothing , clauses = stubClause rulename } - | rulename <- ruleNames ] + | rulename <- difference ] mutterd 3 "(2.6) then we rebuild the graph with those rules included" let expandedRuleMap = Map.fromList (Prelude.zip (decisionRules ++ stubRules) [1..]) @@ -390,8 +390,8 @@ ruleDecisionGraph rs = do mutterd 3 "(3.1) finally we strip the reflexive BSR from the stub rules while leaving the nodes themselves in place." - let prunedRuleGraph = nmap (\r@Hornlike{..} -> if clauses == stubClause name then r { clauses = [] } else r ) expandedRuleGraph - "(2.7) prunedRuleGraph" ***-> prunedRuleGraph + let prunedRuleGraph = nmap (\r -> if hasClauses r && clauses r == stubClause (name r) then r { clauses = [] } else r ) expandedRuleGraph + "(3.2.7) prunedRuleGraph" ***-> prunedRuleGraph return prunedRuleGraph @@ -450,7 +450,7 @@ relPredRefs rs ridmap r = do mutterdhsf 5 "relPredRefs: bodyElements" pShowNoColorS bodyElements -- [BUG] at some point we lose the moon - + mutterd 5 "relPredReffs: will exclude various things not found in headElements" -- given a rule R, for each term relied on by rule R, identify all the subsidiary rules which define those terms. toreturn <- sequence [ (rid, targetRuleId', ()) <$ mutterd 6 ("relPredRefs list comp: returning " <> show rid <> ", " <> show targetRuleId') From 5b2053a391232ce9d27f2b3f84250aeb284f615f Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Wed, 16 Aug 2023 00:20:55 +0800 Subject: [PATCH 16/49] fixed `dereflexed`, now happy with how the dotfiles are looking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ┌─[20230816-00:20:13] [mengwong@rosegold:~/natural4] └─[0] stack run -- --workdir workdir test/examples/forinsurancelimbs-latest.csv natural4: will output asASP natural4: output to workdir done ┌─[20230816-00:20:14] [mengwong@rosegold:~/natural4] └─[0] dot -Tsvg workdir/no-uuid/dataflow/LATEST.dot > workdir/no-uuid/dataflow/LATEST.svg ┌─[20230816-00:20:17] [mengwong@rosegold:~/natural4] └─[0] open workdir/no-uuid/dataflow/LATEST.svg ┌─[20230816-00:20:19] [mengwong@rosegold:~/natural4] └─[0] --- lib/haskell/natural4/src/LS/Interpreter.hs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index c613126f0..e12d7deee 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -390,7 +390,7 @@ ruleDecisionGraph rs = do mutterd 3 "(3.1) finally we strip the reflexive BSR from the stub rules while leaving the nodes themselves in place." - let prunedRuleGraph = nmap (\r -> if hasClauses r && clauses r == stubClause (name r) then r { clauses = [] } else r ) expandedRuleGraph + let prunedRuleGraph = dereflexed $ nmap (\r -> if hasClauses r && clauses r == stubClause (name r) then r { clauses = [] } else r ) expandedRuleGraph "(3.2.7) prunedRuleGraph" ***-> prunedRuleGraph return prunedRuleGraph @@ -477,22 +477,18 @@ relPredRefs rs ridmap r = do decisionRoots :: RuleGraph -> XPileLog [Rule] decisionRoots rg = do - let rg' = dereflexed + let rg' = dereflexed rg return $ catMaybes [ lab rg' r | r <- nodes rg' , indeg rg' r == 0 -- , outdeg rg' r > 0 ] - where - -- remove reflexive edges that go from node n to node n - dereflexed :: RuleGraph - dereflexed = - let toreturn = foldr (\n g -> delEdge (n,n) g) rg (nodes rg) - in --- trace ("dereflexed before: " ++ prettify rg) $ --- trace ("dereflexed after: " ++ prettify toreturn) $ - toreturn + +-- remove reflexive edges that go from node n to node n +dereflexed :: RuleGraph -> RuleGraph +dereflexed rg = + foldr (\n g -> delEdge (n,n) g) rg (nodes rg) -- | extract a data flow graph From 2937f8bc949d45eb487a910f0ab1dee5e7422f45 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Wed, 16 Aug 2023 20:18:04 +0800 Subject: [PATCH 17/49] minor documentation fix --- lib/haskell/natural4/src/LS/Interpreter.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index e12d7deee..26419592c 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -420,7 +420,7 @@ relPredRefsAll rs ridmap = concat <$> mapM (relPredRefs rs ridmap) rs -- | in a particular rule, walk all the relational predicates available, and show outdegree links --- that correspond to known BSR heads from the entire ruleset. +-- that correspond to known rule heads from the entire ruleset. -- -- in other words, if a rule R1 says something like (a WHEN b OR c), it defines a, and relies on b and c; -- if we find a rule R2 which defines (c MEANS c1 AND c2), then it defines c, and relies on c1 and c2. From aa5956ccc22ffa87dca81dc9a377fc84f88f18a3 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Thu, 3 Aug 2023 13:47:19 +0800 Subject: [PATCH 18/49] new words and constructions --- lib/haskell/natural4/grammars/CustomSyntax.gf | 13 +- .../natural4/grammars/CustomSyntaxChi.gf | 8 +- .../natural4/grammars/CustomSyntaxEng.gf | 13 +- .../natural4/grammars/CustomSyntaxMay.gf | 10 +- lib/haskell/natural4/grammars/InsLex.gf | 561 +++++++++++++++++ lib/haskell/natural4/grammars/InsLexEng.gf | 562 ++++++++++++++++++ lib/haskell/natural4/grammars/NL4.gf | 1 + lib/haskell/natural4/grammars/NL4Base.gf | 13 +- lib/haskell/natural4/grammars/NL4BaseChi.gf | 1 + lib/haskell/natural4/grammars/NL4BaseEng.gf | 5 + .../natural4/grammars/NL4BaseFunctor.gf | 20 + lib/haskell/natural4/grammars/NL4BaseMay.gf | 1 + lib/haskell/natural4/grammars/NL4Eng.gf | 1 + .../natural4/grammars/StandardLexiconChi.gf | 2 +- 14 files changed, 1194 insertions(+), 17 deletions(-) create mode 100644 lib/haskell/natural4/grammars/InsLex.gf create mode 100644 lib/haskell/natural4/grammars/InsLexEng.gf diff --git a/lib/haskell/natural4/grammars/CustomSyntax.gf b/lib/haskell/natural4/grammars/CustomSyntax.gf index 4cafe558a..11b10ff91 100644 --- a/lib/haskell/natural4/grammars/CustomSyntax.gf +++ b/lib/haskell/natural4/grammars/CustomSyntax.gf @@ -1,12 +1,13 @@ abstract CustomSyntax = Numeral , Grammar [ - N, N2, CN, UseN, NP, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP , V, VV, V2, VS, VP - , A, A2, AP, AdjCN, PositA + , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompNP, CompAP, CompAdv -- is a public agency , Prep, PrepNP, AdvVP - , AdA, AdAdv + , AdA, AdAdv, Card, CAdv, AdN, AdNum, AdnCAdv + , Dig, Digits, NumDigits, IDig, IIDig, D_0, D_1, D_2, D_3, D_4, D_5, D_6, D_7, D_8, D_9 , ListAdv, BaseAdv, ConsAdv, ConjAdv , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP @@ -16,13 +17,14 @@ abstract CustomSyntax = , Structural [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep , VV, must_VV + , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN ] , Extend [ VPS, MkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS , VPI, MkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS -- , GenRP -- nice to have in the future? - , ByVP + , ByVP, N, CompoundN , S, PredVPS , NP, GerundNP ] ** { @@ -55,7 +57,9 @@ abstract CustomSyntax = MayHave : VP -> VPS ; -- getting "may have occurred" with pure RGL is a pain ReferenceNP : NP -> S ; -- it is NP — reference to a previous NP + WhileDoing : VP -> Adv ; -- while travelling in a public transport -- ExpletiveVP : VP -> S ; -- it is raining — dummy subject it (TODO: restrict usage of this and above from HS) + CNwhereS : CN -> NP -> VPS -> CN ; -- premise where school activities take place presAnt, -- has occurred presSimul, -- occurs @@ -68,6 +72,7 @@ abstract CustomSyntax = theSg : Det ; thePl : Det ; aSg : Det ; + aPl : Det ; your : Det ; about_Prep : Prep ; diff --git a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf index 3d438b113..2407c75ca 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf @@ -1,11 +1,12 @@ concrete CustomSyntaxChi of CustomSyntax = NumeralChi , GrammarChi [ - N, N2, CN, UseN, NP, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP , V, VV, V2, VS, VP, AdvVP , A, A2, AP, PositA , Comp, Adv, VP, UseComp, CompAP, CompAdv -- is a public agency - , AdA, AdAdv -- only (within the organisation) + , AdA, AdAdv, Card, CAdv, AdN, AdNum, AdnCAdv + , Dig, Digits, NumDigits, IDig, IIDig, D_0, D_1, D_2, D_3, D_4, D_5, D_6, D_7, D_8, D_9 -- only (within the organisation) , ListAdv, BaseAdv, ConsAdv, ConjAdv , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP @@ -14,12 +15,13 @@ concrete CustomSyntaxChi of CustomSyntax = ] , StructuralChi [ VV, must_VV + , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN ] , ExtendChi [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS - , ByVP + , ByVP, N, CompoundN , S, PredVPS , NP, GerundNP -- by performing NDB qualification ] diff --git a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf index fa67649f8..23c3c9694 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf @@ -1,12 +1,13 @@ concrete CustomSyntaxEng of CustomSyntax = NumeralEng , GrammarEng [ - N, N2, CN, UseN, NP, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP , V, VV, V2, VS, VP - , A, A2, AP, AdjCN, PositA + , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompAP, CompNP, CompAdv -- is a public agency , Prep, PrepNP, AdvVP - , AdA, AdAdv -- only (within the organisation) + , AdA, AdAdv, Card, CAdv, AdN, AdNum, AdnCAdv + , Dig, Digits, NumDigits, IDig, IIDig, D_0, D_1, D_2, D_3, D_4, D_5, D_6, D_7, D_8, D_9 -- only (within the organisation) , ListAdv, BaseAdv, ConsAdv, ConjAdv , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP @@ -16,12 +17,13 @@ concrete CustomSyntaxEng of CustomSyntax = , StructuralEng [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep , VV, must_VV + , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN ] , ExtendEng [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS - , ByVP + , ByVP, N, CompoundN , S, PredVPS , NP, GerundNP -- by performing NDB qualification ] @@ -94,6 +96,8 @@ concrete CustomSyntaxEng of CustomSyntax = in vps ** {s = \\_,_ => may_have_occurred} ; -- : NP -> S ; -- it is NP — reference to a previous NP ReferenceNP np = mkS (mkCl it_NP ) ; + WhileDoing vp = cc2 (ss "while") (GerundAdv vp) ; + CNwhereS cn np vps = SentCN cn (cc2 (ss "where") (PredVPS np vps)) ; presSimul = mkTemp presentTense simultaneousAnt ; presAnt = mkTemp presentTense anteriorAnt ; @@ -104,6 +108,7 @@ concrete CustomSyntaxEng of CustomSyntax = theSg = theSg_Det ; thePl = thePl_Det ; aSg = aSg_Det ; + aPl = aPl_Det ; your = mkDet youSg_Pron ; about_Prep = ParadigmsEng.mkPrep "about" ; diff --git a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf index 2b4b6f25b..12b86ccb2 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf @@ -1,13 +1,14 @@ concrete CustomSyntaxMay of CustomSyntax = NumeralMay , GrammarMay [ - N, N2, CN, UseN, NP, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP , V, VV, V2, VS, VP - , A, A2, AP, AdjCN, PositA + , A, A2, AP, AdjCN, PositA, ComplA2 -- , ProgrVP -- becoming aware , Comp, Adv, VP, UseComp, CompAP, CompNP, CompAdv -- is a public agency , Prep, PrepNP, AdvVP - , AdA, AdAdv -- only (within the organisation) + , AdA, AdAdv, Card, CAdv, AdN, AdNum, AdnCAdv + , Dig, Digits, NumDigits, IDig, IIDig, D_0, D_1, D_2, D_3, D_4, D_5, D_6, D_7, D_8, D_9 -- only (within the organisation) , ListAdv, BaseAdv, ConsAdv, ConjAdv , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP @@ -17,12 +18,13 @@ concrete CustomSyntaxMay of CustomSyntax = , StructuralMay [ Prep, for_Prep, from_Prep, on_Prep, after_Prep, possess_Prep , VV, must_VV + , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN ] , ExtendMay [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS - , ByVP + , ByVP, N, CompoundN , S, PredVPS , NP, GerundNP -- by performing NDB qualification ] diff --git a/lib/haskell/natural4/grammars/InsLex.gf b/lib/haskell/natural4/grammars/InsLex.gf new file mode 100644 index 000000000..ee4f93d07 --- /dev/null +++ b/lib/haskell/natural4/grammars/InsLex.gf @@ -0,0 +1,561 @@ +abstract InsLex = NL4Base ** { + fun + _leg_N : N ; + _line_N : N ; + _SA_PN : PN ; + _contract_N : N ; + _b_N : N ; + _then_Adv : Adv ; + _Life_PN : PN ; + _subject_A : A ; + _state_N : N ; + _result_from_V2 : V2 ; + _up_Prep : Prep ; + _authority_N : N ; + _first_Adv : Adv ; + _plan1_N : N ; + _play_V2 : V2 ; + _organise_V : V ; + _hockey_N : N ; + _than_Prep : Prep ; + _date_N : N ; + _Republic_PN : PN ; + _between_Prep : Prep ; + _tsapp_N : N ; + _work_N : N ; + _planF_PN : PN ; +-- _while_Conj : Conj ; + _after_Prep : Prep ; + _mean_as_V2 : V2 ; + _Schedule_PN : PN ; + _mental_A : A ; + _total_A : A ; + _register_V : V ; + _1014_PN : PN ; + _surgical_A : A ; + _set_in_V2 : V2 ; + _canoe_V : V ; + _govern_V : V ; + _benefit_V : V ; + _tcm_N : N ; + _occur_before_V2 : V2 ; + _convenience_N : N ; + _exception_V : V ; + _benTCM_PN : PN ; + _address_N : N ; + _hearing_N : N ; + _sport_N : N ; + _verifier_N : N ; + _expense_N : N ; + _UPON_PN : PN ; + _first_A : A ; + _pedestrian_N : N ; + _license_V : V ; + _supervise_V : V ; + _airline_N : N ; + _assure_for_V2 : V2 ; + _from_Prep : Prep ; + _planB_PN : PN ; + _transport_N : N ; + _Influenza_PN : PN ; + _can_claim_add_N : N ; + _benfcpa_N : N ; + _military_N : N ; + _majority_N : N ; + _sssure_for_V2 : V2 ; + _lead_to_V2 : V2 ; + _minimum_N : N ; + _benefpaidout_N : N ; + _reasoner_N : N ; + _suffer_V : V ; + _planf_N : N ; + _time_N : N ; + _employee_N : N ; + _other_A : A ; + _benADD_PN : PN ; + _Leg_PN : PN ; + _try_VV : VV ; + _federation_N : N ; + _suffer_V2 : V2 ; + _policysubscription_N : N ; + _vehicle_N : N ; + _add_A : A ; + _revolution_N : N ; + _step_V2 : V2 ; + _firstclaimyear_N : N ; + _schedule_N : N ; + _limb_N : N ; + _treatment_N : N ; + _name_N : N ; + _within_Prep : Prep ; + _fractured_A : A ; + _assure_in_V2 : V2 ; + _pothole_V : V ; + _physical_A : A ; + _passenger_N : N ; + _met_common_requirement_for_add_V2 : V2 ; + _H7N_PN : PN ; + _step_N : N ; + _incurable_A : A ; + _transform_into_V2 : V2 ; + _Nipah_PN : PN ; + _maximum_A : A ; + _number_N : N ; + _birthdate_N : N ; + _happen_after_V2 : V2 ; + _H7N9_PN : PN ; + _y_PN : PN ; + _hrr_N : N ; + _plan_N : N ; + _Type_PN : PN ; + _successful_A : A ; + _skydive_V : V ; + _auditorium_N : N ; + _sail_V : V ; + _tcmpb_N : N ; + _into_Prep : Prep ; + _as_Adv : Adv ; + _mean_VS : VS ; + _define_V2 : V2 ; + _death_N : N ; + _life_assured_die_N : N ; + _occur_during_V2 : V2 ; + _commercial_A : A ; + _dc_N : N ; + _injury_N : N ; + _active_A : A ; + _money_N : N ; + _bicycle_N : N ; + _Accident_PN : PN ; + _eligibility_N : N ; + _patella_N : N ; + _Reductions_PN : PN ; + _Accidental_PN : PN ; + _year_N : N ; + _only_Adv : Adv ; + _mountaineer_V : V ; + _relevant_A : A ; + _least_Adv : Adv ; + _assure_V : V ; + _due_A : A ; + _behaviour_N : N ; + _holder_PN : PN ; + _to_Prep : Prep ; + _planaf_N : N ; + _equal_A : A ; + _plan3_PN : PN ; + _disease_N : N ; + _Expense_PN : PN ; + _hotel_N : N ; + _occur_at_V2 : V2 ; + _have_V2 : V2 ; + _kind_N : N ; + _benefit_N : N ; + _task_N : N ; + _Disease_PN : PN ; + _part_N : N ; + _bus_N : N ; + _rule_N : N ; + _pregnancy_N : N ; + _cost_N : N ; + _countqualifye_V2 : V2 ; + _sumassure_V : V ; + _alcohol_N : N ; + _n_N : N ; + _assure_per_V2 : V2 ; + _parachute_V : V ; + _confinement_N : N ; + _mall_N : N ; + _fully_Adv : Adv ; + _act_N : N ; + _geographical_A : A ; + _less_A : A ; + _attempt_N : N ; + _benADDs_PN : PN ; + _take_in_V2 : V2 ; + _weapon_N : N ; + _payable_A : A ; + _exception_N : N ; + _N_PN : PN ; + _past_A : A ; + _p_PN : PN ; + _diving_PN : PN ; + _TABLE_PN : PN ; + _registered_A : A ; + _H7N7_V : V ; + _lens_N : N ; + _establish_V : V ; + _box_in_V2 : V2 ; + _1012_PN : PN ; + _hernia_V : V ; + _for_Prep : Prep ; + _adjust_for_V2 : V2 ; + _risk_N : N ; + _save_V2 : V2 ; + _burn_N : N ; + _possible_A : A ; + _basic_A : A ; + _pland_Adv : Adv ; + _register_with_V2 : V2 ; + _suicide_N : N ; + _stepupsumassure_V : V ; + _declare_VS : VS ; + _diagnosis_N : N ; + _month_N : N ; + _Details_PN : PN ; + _radiation_N : N ; + _motocross_PN : PN ; + _Ministry_PN : PN ; + _cover_in_V2 : V2 ; + _degree_N : N ; + _third_A : A ; + _nuclear_A : A ; + _sustain_V2 : V2 ; + _phalanx_N : N ; + _use_N : N ; + _sum_N : N ; + _make_within_V2 : V2 ; + _circumstance_N : N ; + _customer_N : N ; + _met_common_requirement_for_add_V : V ; + _Accidents_PN : PN ; + _life_assured_suffers_injury_does_not_die_within_30_day_N : N ; + _infectious_A : A ; + _pay_for_V2 : V2 ; + _per_Prep : Prep ; + _fire_N : N ; + _form_N : N ; + _claim_for_V2 : V2 ; + _get_from_V2 : V2 ; + _suffer_in_V2 : V2 ; + _toe_N : N ; + _fare_N : N ; + _exercise_N : N ; + _totally_Adv : Adv ; + _fever_N : N ; + _up_Adv : Adv ; + _ear_N : N ; + _insanity_N : N ; + _tail_N : N ; + _normal_A : A ; + _Plan14_PN : PN ; + _Claim_PN : PN ; + _across_Prep : Prep ; + _defect_N : N ; + _cover_V2 : V2 ; + _Yellow_PN : PN ; + _predicate_N : N ; + _private_A : A ; + _question_N : N ; + _Health_PN : PN ; + _shortening_N : N ; + _lose_V2 : V2 ; + _riot_V : V ; + _nature_N : N ; + _outcome_N : N ; + _way_N : N ; + _on_its_way_Adv : Adv ; + _Injury_PN : PN ; + _hand_N : N ; + _CoV_PN : PN ; + _previous_A : A ; + _low_A : A ; + _damagetype_N : N ; + _activity_N : N ; + _planC_PN : PN ; + _foot_N : N ; + _radioactivity_N : N ; + _Triple_PN : PN ; + _benmr_N : N ; + _333A_PN : PN ; + _eye_N : N ; + _home_N : N ; + _before_Prep : Prep ; + _asssure_V : V ; + _virus_N : N ; + _drug_N : N ; + _polilcy_N : N ; + _car_N : N ; + _M_PN : PN ; + _mind_N : N ; + _m_N : N ; + _stepuppercentage_N : N ; + _include_V2 : V2 ; + _Event_PN : PN ; + _start_V : V ; + _policy_N : N ; + _1013_PN : PN ; + _Medicine_PN : PN ; + _accident_N : N ; + _possibility_N : N ; + _human_A : A ; + _payout_N : N ; + _school_N : N ; + _during_Prep : Prep ; + _addpercentageforinjury_N : N ; + _Cap_PN : PN ; + _sum_list_PN : PN ; + _viral_A : A ; + _place_N : N ; + _mean_V2 : V2 ; + _vcjd_N : N ; + _hence_Adv : Adv ; + _with_Prep : Prep ; + _that_Conj : Conj ; + _cave_V : V ; + _policyholder_N : N ; + _middle_A : A ; + _Subscribed_PN : PN ; + _string_N : N ; + _pland_N : N ; + _high_A : A ; + _pay_V2 : V2 ; + _Insurer_PN : PN ; + _adjustment_N : N ; + _give_V2 : V2 ; + _qualifie_N : N ; + _logical_A : A ; + _triple_A : A ; + _timeyear_N : N ; + _Adjustment_PN : PN ; + _dTime_PN : PN ; + _e_N : N ; + _lose_through_V2 : V2 ; + _cm_N : N ; + _biological_A : A ; + _recognise_V : V ; + _HAS_PN : PN ; + _diving_A : A ; + _before_Conj : Conj ; + _adjusted_A : A ; + _MIN_PN : PN ; + _Types_PN : PN ; + _day_N : N ; + _MR_PN : PN ; + _apply_V : V ; + _Date_PN : PN ; + _benRA_PN : PN ; + _life_N : N ; + _dangerous_A : A ; + _x_PN : PN ; + _japanese_A : A ; + _union_N : N ; + _policyHolder_PN : PN ; + _claim_N : N ; + _association_N : N ; + _case_N : N ; + _head_N : N ; + _upscaled_A : A ; + _martial_A : A ; + _if_Conj : Conj ; + _valid_A : A ; + _soon_Adv : Adv ; + _strain_N : N ; + _PolicyHolder_PN : PN ; + _speech_N : N ; + _y_N : N ; + _event_N : N ; + _at_Adv : Adv ; + _c_N : N ; + _Dismemberment_PN : PN ; + _1013_N : N ; + _both_Conj : Conj ; + _v_N : N ; + _include_V : V ; + _unsound_A : A ; + _thumb_N : N ; + _Removal_PN : PN ; + _amount_N : N ; + _addsa_N : N ; + _permanently_Adv : Adv ; + _chemical_A : A ; + _Melioidosis_PN : PN ; + _circ_PN : PN ; + _Benefit_PN : PN ; + _particular_A : A ; + _planAF_PN : PN ; + _at_Prep : Prep ; + _accepted_A : A ; + _war_N : N ; + _adjust_V : V ; + _or_Conj : Conj ; + _duty_N : N ; + _finger_N : N ; + _deduce_VS : VS ; + _occur_V : V ; + _accidental_A : A ; + _medical_A : A ; + _cover_V : V ; + _ponder_V2 : V2 ; + _mean_V : V ; + _climbing_N : N ; + _theatre_N : N ; + _Wife_PN : PN ; + _Service_PN : PN ; + _illness_N : N ; + _hospital_N : N ; + _more_A : A ; + _claimant_N : N ; + _unnecessary_A : A ; + _H5N1_PN : PN ; + _premise_N : N ; + _premise_where_N2 : N2 ; + _operation_N : N ; + _give_V : V ; + _ps_N : N ; + _LE_PN : PN ; + _RETURN_PN : PN ; + _under_Prep : Prep ; + _BSA_PN : PN ; + _unsuccessful_A : A ; + _Head_PN : PN ; + _die_from_V2 : V2 ; + _hand_V : V ; + _Legionnaires_PN : PN ; + _contamination_N : N ; + _when_Conj : Conj ; + _section_N : N ; + _Section_PN : PN ; + _removal_N : N ; + _traditional_A : A ; + _claim_V : V ; + _disabled_A : A ; + _non_N : N ; + _condition_N : N ; + _disability_N : N ; + _SG_PN : PN ; + _polo_N : N ; + _military_A : A ; + _Ontology_PN : PN ; + _hang_VV : VV ; + _through_Prep : Prep ; + _PlanAF_PN : PN ; + _refund_V2 : V2 ; + _hfmd_A : A ; + _PS_PN : PN ; + _terrorism_N : N ; + _have_give_V2 : V2 ; + _unlawful_A : A ; + _H9N2_PN : PN ; + _AIDS_PN : PN ; + _involve_V2 : V2 ; + _person_N : N ; + _double_A : A ; + _physician_N : N ; + _add_N : N ; + _police_N : N ; + _LA_PN : PN ; + _competitive_A : A ; + _jaw_N : N ; + _H7N7_N : N ; + _Death_PN : PN ; + _policyholder_V : V ; + _Teeth_PN : PN ; + _bool_N : N ; + _benefit_V2 : V2 ; + _race_V : V ; + _regulation_N : N ; + _of_Prep : Prep ; + _husband_N : N ; + _competition_N : N ; + _planE_PN : PN ; + _by_Prep : Prep ; + _declaration_N : N ; + _incident_N : N ; + _dead_A : A ; + _type_N : N ; + _aircraft_N : N ; + _Limit_PN : PN ; + _little_A : A ; + _waterborne_A : A ; + _p_N : N ; + _damageevent_N : N ; + _and_Conj : Conj ; + _Policy_PN : PN ; + _national_A : A ; + _cover_as_V2 : V2 ; + _assure_of_V2 : V2 ; + _acc_injury_or_death_happens_within_12_mos_of_accident_N : N ; + _infection_N : N ; + _claim_V2 : V2 ; + _Flu_PN : PN ; + _pay_as_V2 : V2 ; + _travel_as_V2 : V2 ; + _h7n9_N : N ; + _age_N : N ; + _hear_in_V2 : V2 ; + _MAP_PN : PN ; + _professional_A : A ; + _assure_across_V2 : V2 ; + _diagnose_with_V2 : V2 ; + _assure_V2 : V2 ; + _multiple_A : A ; + _glide_V : V ; + _current_A : A ; + _plan4_PN : PN ; + _vessel_N : N ; + _racing_N : N ; + _fit_A : A ; + _located_in_A2 : A2 ; + _percentage_N : N ; + _service_N : N ; + _Singapore_PN : PN ; + _in_Prep : Prep ; + _Step_PN : PN ; + _body_N : N ; + _out_Prep : Prep ; + _plana_N : N ; + _subscribe_V : V ; + _Mumps_PN : PN ; + _over_Prep : Prep ; + _sight_N : N ; + _description_N : N ; + _travel_in_V2 : V2 ; + _great_A : A ; + _practitioner_N : N ; + _loss_N : N ; + _training_N : N ; + _as_Prep : Prep ; + _take_V2 : V2 ; + _public_A : A ; + _train_V : V ; + _result_N : N ; + _limit_N : N ; + _windsurf_V : V ; + _area_N : N ; + _reckless_A : A ; + _list_N : N ; + _on_Prep : Prep ; +-- _as_Conj : Conj ; + _holder_N : N ; + _assured_N : N ; + _alive_A : A ; + _juvenile_A : A ; + _intentional_A : A ; + _permanent_A : A ; + _d_N : N ; + _riding_N : N ; + _Conditions_PN : PN ; + _reduction_N : N ; + _claimable_A : A ; + _addSA_PN : PN ; + _pay_V : V ; + _wrestle_in_V2 : V2 ; + _start_VS : VS ; + _tooth_N : N ; + _declare_V2 : V2 ; + _initial_A : A ; + _hunt_V : V ; + _but_Conj : Conj ; + _Assured_PN : PN ; + _ADD_PN : PN ; + _f_N : N ; + _travel_by_V2 : V2 ; + _qualifies_for_add_PN : PN ; + _member_N : N ; + _happen_within_V2 : V2 ; + _Address_PN : PN ; + _circumstancedescription_N : N ; + _dType_PN : PN ; + _schema_PN : PN ; +} \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/InsLexEng.gf b/lib/haskell/natural4/grammars/InsLexEng.gf new file mode 100644 index 000000000..d76a4d3a1 --- /dev/null +++ b/lib/haskell/natural4/grammars/InsLexEng.gf @@ -0,0 +1,562 @@ +concrete InsLexEng of InsLex = NL4BaseEng ** + open ParadigmsEng, Prelude in { + lin _practitioner_N = mkN "practitioner" ; + lin _insanity_N = mkN "insanity" ; + lin _plan_N = mkN "plan" ; + lin _amount_N = mkN "amount" ; + lin _SA_PN = mkPN "SA" ; + lin _cover_as_V2 = mkV2 (us_britishV "cover") (mkPrep "as") ; + lin _govern_V = us_britishV "govern" ; + lin _auditorium_N = mkN "auditorium" ; + lin _Health_PN = mkPN "Health" ; + lin _nuclear_A = mkA "nuclear" ; + lin _question_N = mkN "question" ; + lin _permanently_Adv = mkAdv "permanently" ; + lin _Nipah_PN = mkPN "Nipah" ; + lin _hospital_N = mkN "hospital" ; + lin _take_in_V2 = mkV2 (us_britishV "take") (mkPrep "in") ; + lin _asssure_V = us_britishV "asssure" ; + lin _Schedule_PN = mkPN "Schedule" ; + lin _disability_N = mkN "disability" ; + lin _addSA_PN = mkPN "addSA" ; + lin _cover_in_V2 = mkV2 (us_britishV "cover") (mkPrep "in") ; + lin _juvenile_A = mkA "juvenile" ; + lin _state_N = mkN "state" ; + lin _tail_N = mkN "tail" ; + lin _home_N = mkN "home" ; + lin _speech_N = mkN "speech" ; + lin _Disease_PN = mkPN "Disease" ; + lin _event_N = mkN "event" ; + lin _box_in_V2 = mkV2 (us_britishV "box") (mkPrep "in") ; + lin _or_Conj = mkConj "or" ; + lin _martial_A = mkA "martial" ; + lin _b_N = mkN "b" ; + lin _LE_PN = mkPN "LE" ; + lin _Type_PN = mkPN "Type" ; + lin _qualifie_N = mkN "qualifie" ; + lin _medical_A = mkA "medical" ; + lin _suffer_V = us_britishV "suffer" ; + lin _benefit_V = us_britishV "benefit" ; + lin _thumb_N = mkN "thumb" ; + lin _that_Conj = mkConj "that" ; + lin _pay_as_V2 = mkV2 (us_britishV "pay") (mkPrep "as") ; + lin _active_A = mkA "active" ; + lin _into_Prep = mkPrep "into" ; + lin _Injury_PN = mkPN "Injury" ; + lin _behaviour_N = mkN "behaviour" ; + lin _planAF_PN = mkPN "planAF" ; + lin _illness_N = mkN "illness" ; + lin _at_Prep = mkPrep "at" ; + lin _unsound_A = mkA "unsound" ; + lin _can_claim_add_N = mkN "can_claim_add" ; + lin _stepupsumassure_V = us_britishV "stepupsumassure" ; + lin _possible_A = mkA "possible" ; + lin _training_N = mkN "training" ; + lin _step_N = mkN "step" ; + lin _benRA_PN = mkPN "benRA" ; + lin _body_N = mkN "body" ; + lin _tooth_N = mkN "tooth" ; + lin _up_Adv = mkAdv "up" ; + lin _strain_N = mkN "strain" ; + lin _war_N = mkN "war" ; + lin _public_A = mkA "public" ; + lin _totally_Adv = mkAdv "totally" ; + lin _reckless_A = mkA "reckless" ; + lin _reduction_N = mkN "reduction" ; + lin _removal_N = mkN "removal" ; + lin _sport_N = mkN "sport" ; + lin _weapon_N = mkN "weapon" ; + lin _middle_A = mkA "middle" ; + lin _MAP_PN = mkPN "MAP" ; + lin _UPON_PN = mkPN "UPON" ; + lin _act_N = mkN "act" ; + lin _outcome_N = mkN "outcome" ; + lin _pregnancy_N = mkN "pregnancy" ; + lin _hand_V = us_britishV "hand" ; + lin _across_Prep = mkPrep "across" ; + lin _subscribe_V = us_britishV "subscribe" ; + lin _acc_injury_or_death_happens_within_12_mos_of_accident_N = mkN "acc_injury_or_death_happens_within_12_mos_of_accident" ; + lin _great_A = mkA "great" ; + lin _date_N = mkN "date" ; + lin _climbing_N = mkN "climbing" ; + lin _jaw_N = mkN "jaw" ; + lin _bus_N = mkN "bus" ; + lin _add_A = mkA "add" ; + lin _PolicyHolder_PN = mkPN "PolicyHolder" ; + lin _Teeth_PN = mkPN "Teeth" ; + lin _permanent_A = mkA "permanent" ; + lin _degree_N = mkN "degree" ; + lin _benmr_N = mkN "benmr" ; + lin _finger_N = mkN "finger" ; + lin _HAS_PN = mkPN "HAS" ; + lin _more_A = mkA "more" ; + lin _n_N = mkN "n" ; + lin _biological_A = mkA "biological" ; + lin _travel_as_V2 = mkV2 (us_britishV "travel") (mkPrep "as") ; + lin _happen_within_V2 = mkV2 (us_britishV "happen") (mkPrep "within") ; + lin _sumassure_V = us_britishV "sumassure" ; + lin _race_V = us_britishV "race" ; + lin _if_Conj = mkConj "if" ; + lin _radioactivity_N = mkN "radioactivity" ; + lin _at_Adv = mkAdv "at" ; + lin _first_Adv = mkAdv "first" ; + lin _assure_V = us_britishV "assure" ; + lin _unnecessary_A = mkA "unnecessary" ; + lin _plan1_N = mkN "plan1" ; + lin _minimum_N = mkN "minimum" ; + lin _planC_PN = mkPN "planC" ; + lin _bicycle_N = mkN "bicycle" ; + lin _day_N = mkN "day" ; + lin _drug_N = mkN "drug" ; + lin _Removal_PN = mkPN "Removal" ; + lin _majority_N = mkN "majority" ; + lin _geographical_A = mkA "geographical" ; + lin _confinement_N = mkN "confinement" ; + lin _take_V2 = mkV2 (us_britishV "take") ; + lin _PS_PN = mkPN "PS" ; + lin _Accidents_PN = mkPN "Accidents" ; + lin _and_Conj = mkConj "and" ; + lin _suffer_V2 = mkV2 (us_britishV "suffer") ; + lin _sum_N = mkN "sum" ; + lin _claim_V = us_britishV "claim" ; + lin _have_give_V2 = mkV2 (us_britishV "have") (mkPrep "give") ; + lin _customer_N = mkN "customer" ; + lin _1013_N = mkN "10.1.3" ; + lin _v_N = mkN "v" ; + lin _valid_A = mkA "valid" ; + lin _maximum_A = mkA "maximum" ; + lin _unlawful_A = mkA "unlawful" ; + lin _sail_V = us_britishV "sail" ; + lin _pay_V = us_britishV "pay" ; + lin _assure_across_V2 = mkV2 (us_britishV "assure") (mkPrep "across") ; + lin _sustain_V2 = mkV2 (us_britishV "sustain") ; + lin _while_Conj = mkConj "while" ; + lin _register_with_V2 = mkV2 (us_britishV "register") (mkPrep "with") ; + lin _cave_V = us_britishV "cave" ; + lin _rule_N = mkN "rule" ; + lin _regulation_N = mkN "regulation" ; + lin _damagetype_N = mkN "damagetype" ; + lin _part_N = mkN "part" ; + lin _Legionnaires_PN = mkPN "Legionnaires" ; + lin _claim_N = mkN "claim" ; + lin _money_N = mkN "money" ; + lin _dTime_PN = mkPN "dTime" ; + lin _birthdate_N = mkN "birthdate" ; + lin _1013_PN = mkPN "10.1.3" ; + lin _benfcpa_N = mkN "benfcpa" ; + lin _than_Prep = mkPrep "than" ; + lin _add_N = mkN "add" ; + lin _little_A = mkA "little" ; + lin _as_Conj = mkConj "as" ; + lin _mind_N = mkN "mind" ; + lin _claim_for_V2 = mkV2 (us_britishV "claim") (mkPrep "for") ; + lin _planaf_N = mkN "planaf" ; + lin _initial_A = mkA "initial" ; + lin _triple_A = mkA "triple" ; + lin _mean_V2 = mkV2 (us_britishV "mean") ; + lin _convenience_N = mkN "convenience" ; + lin _circumstancedescription_N = mkN "circumstancedescription" ; + lin _diving_PN = mkPN "diving" ; + lin _Benefit_PN = mkPN "Benefit" ; + lin _lose_through_V2 = mkV2 (us_britishV "lose") (mkPrep "through") ; + lin _up_Prep = mkPrep "up" ; + lin _japanese_A = mkA "japanese" ; + lin _car_N = mkN "car" ; + lin _upscaled_A = mkA "upscaled" ; + lin _RETURN_PN = mkPN "RETURN" ; + lin _H7N9_PN = mkPN "H7N9" ; + lin _claim_V2 = mkV2 (us_britishV "claim") ; + lin _hand_N = mkN "hand" ; + lin _adjust_for_V2 = mkV2 (us_britishV "adjust") (mkPrep "for") ; + lin _involve_V2 = mkV2 (us_britishV "involve") ; + lin _place_N = mkN "place" ; + lin _injury_N = mkN "injury" ; + lin _treatment_N = mkN "treatment" ; + lin _BSA_PN = mkPN "BSA" ; + lin _hrr_N = mkN "hrr" ; + lin _motocross_PN = mkPN "motocross" ; + lin _schema_PN = mkPN "schema" ; + lin _but_Conj = mkConj "but" ; + lin _case_N = mkN "case" ; + lin _planf_N = mkN "planf" ; + lin _h7n9_N = mkN "h7n9" ; + lin _on_its_way_Adv = ParadigmsEng.mkAdv "on its way" ; + lin _way_N = mkN "way" ; + lin _Medicine_PN = mkPN "Medicine" ; + lin _result_N = mkN "result" ; + lin _less_A = mkA "less" ; + lin _percentage_N = mkN "percentage" ; + lin _diving_A = mkA "diving" ; + lin _Types_PN = mkPN "Types" ; + lin _revolution_N = mkN "revolution" ; + lin _physician_N = mkN "physician" ; + lin _use_N = mkN "use" ; + lin _third_A = mkA "third" ; + lin _first_A = mkA "first" ; + lin _circ_PN = mkPN "circ" ; + lin _travel_by_V2 = mkV2 (us_britishV "travel") (mkPrep "by") ; + lin _burn_N = mkN "burn" ; + lin _shortening_N = mkN "shortening" ; + lin _wrestle_in_V2 = mkV2 (us_britishV "wrestle") (mkPrep "in") ; + lin _set_in_V2 = mkV2 (us_britishV "set") (mkPrep "in") ; + lin _Date_PN = mkPN "Date" ; + lin _windsurf_V = us_britishV "windsurf" ; + lin _travel_in_V2 = mkV2 (us_britishV "travel") (mkPrep "in") ; + lin _Adjustment_PN = mkPN "Adjustment" ; + lin _benADDs_PN = mkPN "benADDs" ; + lin _aircraft_N = mkN "aircraft" ; + lin _current_A = mkA "current" ; + lin _husband_N = mkN "husband" ; + lin _Dismemberment_PN = mkPN "Dismemberment" ; + lin _successful_A = mkA "successful" ; + lin _viral_A = mkA "viral" ; + lin _equal_A = mkA "equal" ; + lin _qualifies_for_add_PN = mkPN "qualifies_for_add" ; + lin _contamination_N = mkN "contamination" ; + lin _bool_N = mkN "bool" ; + lin _as_Prep = mkPrep "as" ; + lin _virus_N = mkN "virus" ; + lin _parachute_V = us_britishV "parachute" ; + lin _low_A = mkA "low" ; + lin _competitive_A = mkA "competitive" ; + lin _hotel_N = mkN "hotel" ; + lin _Limit_PN = mkPN "Limit" ; + lin _register_V = us_britishV "register" ; + lin _alive_A = mkA "alive" ; + lin _fever_N = mkN "fever" ; + lin _theatre_N = mkN "theatre" ; + lin _claimable_A = mkA "claimable" ; + lin _after_Prep = mkPrep "after" ; + lin _normal_A = mkA "normal" ; + lin _declare_VS = mkVS (us_britishV "declare") ; + lin _with_Prep = mkPrep "with" ; + lin _Assured_PN = mkPN "Assured" ; + lin _deduce_VS = mkVS (us_britishV "deduce") ; + lin _relevant_A = mkA "relevant" ; + lin _lead_to_V2 = mkV2 (us_britishV "lead") (mkPrep "to") ; + lin _exercise_N = mkN "exercise" ; + lin _head_N = mkN "head" ; + lin _mental_A = mkA "mental" ; + lin _police_N = mkN "police" ; + lin _Leg_PN = mkPN "Leg" ; + lin _section_N = mkN "section" ; + lin _license_V = us_britishV "license" ; + lin _dead_A = mkA "dead" ; + lin _CoV_PN = mkPN "CoV" ; + lin _physical_A = mkA "physical" ; + lin _assure_for_V2 = mkV2 (us_britishV "assure") (mkPrep "for") ; + lin _apply_V = us_britishV "apply" ; + lin _basic_A = mkA "basic" ; + lin _policyholder_V = us_britishV "policyholder" ; + lin _traditional_A = mkA "traditional" ; + lin _Step_PN = mkPN "Step" ; + lin _holder_PN = mkPN "holder" ; + lin _lens_N = mkN "lens" ; + lin _die_from_V2 = mkV2 (us_britishV "die") (mkPrep "from") ; + lin _H5N1_PN = mkPN "H5N1" ; + lin _surgical_A = mkA "surgical" ; + lin _nature_N = mkN "nature" ; + lin _countqualifye_V2 = mkV2 (us_britishV "count(qualifye") ; + lin _transform_into_V2 = mkV2 (us_britishV "transform") (mkPrep "into") ; + lin _only_Adv = mkAdv "only" ; + lin _benefit_V2 = mkV2 (us_britishV "benefit") ; + lin _fully_Adv = mkAdv "fully" ; + lin _MIN_PN = mkPN "MIN" ; + lin _step_V2 = mkV2 (us_britishV "step") ; + lin _terrorism_N = mkN "terrorism" ; + lin _commercial_A = mkA "commercial" ; + lin _include_V = us_britishV "include" ; + lin _name_N = mkN "name" ; + lin _hunt_V = us_britishV "hunt" ; + lin _PlanAF_PN = mkPN "PlanAF" ; + lin _operation_N = mkN "operation" ; + lin _333A_PN = mkPN "333A" ; + lin _previous_A = mkA "previous" ; + lin _give_V = us_britishV "give" ; + lin _other_A = mkA "other" ; + lin _addpercentageforinjury_N = mkN "addpercentageforinjury" ; + lin _line_N = mkN "line" ; + lin _activity_N = mkN "activity" ; + lin _adjust_V = us_britishV "adjust" ; + lin _eye_N = mkN "eye" ; + lin _Subscribed_PN = mkPN "Subscribed" ; + lin _x_PN = mkPN "x" ; + lin _hence_Adv = mkAdv "hence" ; + lin _occur_V = us_britishV "occur" ; + lin _Ontology_PN = mkPN "Ontology" ; + lin _start_V = us_britishV "start" ; + lin _Mumps_PN = mkPN "Mumps" ; + lin _string_N = mkN "string" ; + lin _plan4_PN = mkPN "plan4" ; + lin _alcohol_N = mkN "alcohol" ; + lin _H9N2_PN = mkPN "H9N2" ; + lin _organise_V = us_britishV "organise" ; + lin _benefit_N = mkN "benefit" ; + lin _type_N = mkN "type" ; + lin _waterborne_A = mkA "waterborne" ; + lin _when_Conj = mkConj "when" ; + lin _non_N = mkN "non" ; + lin _high_A = mkA "high" ; + lin _Event_PN = mkPN "Event" ; + lin _occur_at_V2 = mkV2 (us_britishV "occur") (mkPrep "at") ; + lin _fit_A = mkA "fit" ; + lin _least_Adv = mkAdv "least" ; + lin _policysubscription_N = mkN "policysubscription" ; + lin _union_N = mkN "union" ; + lin _diagnose_with_V2 = mkV2 (us_britishV "diagnose") (mkPrep "with") ; + lin _risk_N = mkN "risk" ; + lin _define_V2 = mkV2 (us_britishV "define") ; + lin _met_common_requirement_for_add_V2 = mkV2 (us_britishV "met_common_requirement_for_add") ; + lin _defect_N = mkN "defect" ; + lin _polo_N = mkN "polo" ; + lin _policyHolder_PN = mkPN "policyHolder" ; + lin _Cap_PN = mkPN "Cap" ; + lin _tcmpb_N = mkN "tcmpb" ; + lin _pedestrian_N = mkN "pedestrian" ; + lin _fire_N = mkN "fire" ; + lin _Accidental_PN = mkPN "Accidental" ; + lin _Life_PN = mkPN "Life" ; + lin _assure_in_V2 = mkV2 (us_britishV "assure") (mkPrep "in") ; + lin _kind_N = mkN "kind" ; + lin _double_A = mkA "double" ; + lin _claimant_N = mkN "claimant" ; + lin _suicide_N = mkN "suicide" ; + lin _Reductions_PN = mkPN "Reductions" ; + lin _occur_before_V2 = mkV2 (us_britishV "occur") (mkPrep "before") ; + lin _on_Prep = mkPrep "on" ; + lin _area_N = mkN "area" ; + lin _Head_PN = mkPN "Head" ; + lin _y_PN = mkPN "y" ; + lin _MR_PN = mkPN "MR" ; + lin _by_Prep = mkPrep "by" ; + lin _fractured_A = mkA "fractured" ; + lin _benefpaidout_N = mkN "benefpaidout" ; + lin _Conditions_PN = mkPN "Conditions" ; + lin _attempt_N = mkN "attempt" ; + lin _ADD_PN = mkPN "ADD" ; + lin _hearing_N = mkN "hearing" ; + lin _polilcy_N = mkN "polilcy" ; + lin _Claim_PN = mkPN "Claim" ; + lin _for_Prep = mkPrep "for" ; + lin _assure_per_V2 = mkV2 (us_britishV "assure") (mkPrep "per") ; + lin _radiation_N = mkN "radiation" ; + lin _declaration_N = mkN "declaration" ; + lin _occur_during_V2 = mkV2 (us_britishV "occur") (mkPrep "during") ; + lin _work_N = mkN "work" ; + lin _accidental_A = mkA "accidental" ; + lin _as_Adv = mkAdv "as" ; + lin _accident_N = mkN "accident" ; + lin _give_V2 = mkV2 (us_britishV "give") ; + lin _Republic_PN = mkPN "Republic" ; + lin _hear_in_V2 = mkV2 (us_britishV "hear") (mkPrep "in") ; + lin _get_from_V2 = mkV2 (us_britishV "get") (mkPrep "from") ; + lin _Plan14_PN = mkPN "Plan14" ; + lin _reasoner_N = mkN "reasoner" ; + lin _limit_N = mkN "limit" ; + lin _H7N7_V = us_britishV "H7N7" ; + lin _timeyear_N = mkN "timeyear" ; + lin _life_N = mkN "life" ; + lin _establish_V = us_britishV "establish" ; + lin _pland_Adv = mkAdv "pland" ; + lin _supervise_V = us_britishV "supervise" ; + lin _out_Prep = mkPrep "out" ; + lin _start_VS = mkVS (us_britishV "start") ; + lin _riot_V = us_britishV "riot" ; + lin _transport_N = mkN "transport" ; + lin _H7N7_N = mkN "H7N7" ; + lin _both_Conj = mkConj "both" ; + lin _leg_N = mkN "leg" ; + lin _firstclaimyear_N = mkN "firstclaimyear" ; + lin _Section_PN = mkPN "Section" ; + lin _list_N = mkN "list" ; + lin _recognise_V = us_britishV "recognise" ; + lin _planF_PN = mkPN "planF" ; + lin _benADD_PN = mkPN "benADD" ; + lin _SG_PN = mkPN "SG" ; + lin _AIDS_PN = mkPN "AIDS" ; + lin _human_A = mkA "human" ; + lin _cover_V = us_britishV "cover" ; + lin _address_N = mkN "address" ; + lin _Address_PN = mkPN "Address" ; + lin _duty_N = mkN "duty" ; + lin _patella_N = mkN "patella" ; + lin _schedule_N = mkN "schedule" ; + lin _particular_A = mkA "particular" ; + lin _passenger_N = mkN "passenger" ; + lin _where_Conj = mkConj "where" ; + lin _total_A = mkA "total" ; + lin _addsa_N = mkN "addsa" ; + lin _of_Prep = mkPrep "of" ; + lin _phalanx_N = mkN "phalanx" ; + lin _eligibility_N = mkN "eligibility" ; + lin _past_A = mkA "past" ; + lin _assure_V2 = mkV2 (us_britishV "assure") ; + lin _racing_N = mkN "racing" ; + lin _f_N = mkN "f" ; + lin _ponder_V2 = mkV2 (us_britishV "ponder") ; + lin _incident_N = mkN "incident" ; + lin _life_assured_die_N = mkN "life_assured_die" ; + lin _ps_N = mkN "ps" ; + lin _in_Prep = mkPrep "in" ; + lin _Expense_PN = mkPN "Expense" ; + lin _before_Conj = mkConj "before" ; + lin _p_N = mkN "p" ; + lin _1014_PN = mkPN "10.1.4" ; + lin _canoe_V = us_britishV "canoe" ; + lin _pothole_V = us_britishV "pothole" ; + lin _exception_N = mkN "exception" ; + lin _limb_N = mkN "limb" ; + lin _between_Prep = mkPrep "between" ; + lin _school_N = mkN "school" ; + lin _logical_A = mkA "logical" ; + lin _sight_N = mkN "sight" ; + lin _policyholder_N = mkN ("policyHolder"|"policyholder") ; + lin _refund_V2 = mkV2 (us_britishV "refund") ; + lin _cost_N = mkN "cost" ; + lin _located_in_A2 = mkA2 (mkA "located") (mkPrep "in") ; + lin _unsuccessful_A = mkA "unsuccessful" ; + lin _during_Prep = mkPrep "during" ; + lin _happen_after_V2 = mkV2 (us_britishV "happen") (mkPrep "after") ; + lin _hfmd_A = mkA "hfmd" ; + lin _tsapp_N = mkN "tsapp" ; + lin _possibility_N = mkN "possibility" ; + lin _ear_N = mkN "ear" ; + lin _TABLE_PN = mkPN "TABLE" ; + lin _authority_N = mkN "authority" ; + lin _federation_N = mkN "federation" ; + lin _Insurer_PN = mkPN "Insurer" ; + lin _Policy_PN = mkPN "Policy" ; + lin _Flu_PN = mkPN "Flu" ; + lin _condition_N = mkN "condition" ; + lin _LA_PN = mkPN "LA" ; + lin _hang_VV = mkVV (us_britishV "hang") ; + lin _over_Prep = mkPrep "over" ; + lin _benTCM_PN = mkPN "benTCM" ; + lin _pay_for_V2 = mkV2 (us_britishV "pay") (mkPrep "for") ; + lin _payable_A = mkA "payable" ; + lin _military_N = mkN "military" ; + lin _plana_N = mkN "plana" ; + lin _p_PN = mkPN "p" ; + lin _H7N_PN = mkPN "H7N" ; + lin _vessel_N = mkN "vessel" ; + lin _foot_N = mkN "foot" ; + lin _incurable_A = mkA "incurable" ; + lin _employee_N = mkN "employee" ; + lin _before_Prep = mkPrep "before" ; + lin _fare_N = mkN "fare" ; + lin _military_A = mkA "military" ; + lin _exception_V = us_britishV "exception" ; + lin _policy_N = mkN "policy" ; + lin _person_N = mkN "person" ; + lin _mean_VS = mkVS (us_britishV "mean") ; + lin _1012_PN = mkPN "10.1.2" ; + lin _include_V2 = mkV2 (us_britishV "include") ; + lin _within_Prep = mkPrep "within" ; + lin _pay_V2 = mkV2 (us_britishV "pay") ; + lin _Melioidosis_PN = mkPN "Melioidosis" ; + lin _chemical_A = mkA "chemical" ; + lin _N_PN = mkPN "N" ; + lin _pland_N = mkN "pland" ; + lin _cm_N = mkN "cm" ; + lin _intentional_A = mkA "intentional" ; + lin _predicate_N = mkN "predicate" ; + lin _dType_PN = mkPN "dType" ; + lin _try_VV = mkVV (us_britishV "try") ; + lin _result_from_V2 = mkV2 (us_britishV "result") (mkPrep "from") ; + lin _through_Prep = mkPrep "through" ; + lin _registered_A = mkA "registered" ; + lin _expense_N = mkN "expense" ; + lin _premise_N = mkN "premise" ; + lin _premise_where_N2 = mkN2 _premise_N (mkPrep "where") ; + lin _year_N = mkN "year" ; + lin _circumstance_N = mkN "circumstance" ; + lin _life_assured_suffers_injury_does_not_die_within_30_day_N = mkN "life_assured_suffers_injury_does_not_die_within_30_day" ; + lin _make_within_V2 = mkV2 (us_britishV "make") (mkPrep "within") ; + lin _description_N = mkN "description" ; + lin _diagnosis_N = mkN "diagnosis" ; + lin _train_V = us_britishV "train" ; + lin _Singapore_PN = mkPN "Singapore" ; + lin _glide_V = us_britishV "glide" ; + lin _sssure_for_V2 = mkV2 (us_britishV "sssure") (mkPrep "for") ; + lin _damageevent_N = mkN "damageevent" ; + lin _infection_N = mkN "infection" ; + lin _mean_V = us_britishV "mean" ; + lin _lose_V2 = mkV2 (us_britishV "lose") ; + lin _payout_N = mkN "payout" ; + lin _y_N = mkN "y" ; + lin _riding_N = mkN "riding" ; + lin _service_N = mkN "service" ; + lin _mean_as_V2 = mkV2 (us_britishV "mean") (mkPrep "as") ; + lin _association_N = mkN "association" ; + lin _hernia_V = us_britishV "hernia" ; + lin _month_N = mkN "month" ; + lin _competition_N = mkN "competition" ; + lin _Influenza_PN = mkPN "Influenza" ; + lin _c_N = mkN "c" ; + lin _skydive_V = us_britishV "skydive" ; + lin _m_N = mkN "m" ; + lin _private_A = mkA "private" ; + lin _accepted_A = mkA "accepted" ; + lin _age_N = mkN "age" ; + lin _Details_PN = mkPN "Details" ; + lin _contract_N = mkN "contract" ; + lin _member_N = mkN "member" ; + lin _e_N = mkN "e" ; + lin _number_N = mkN "number" ; + lin _Ministry_PN = mkPN "Ministry" ; + lin _mall_N = mkN "mall" ; + lin _Yellow_PN = mkPN "Yellow" ; + lin _verifier_N = mkN "verifier" ; + lin _under_Prep = mkPrep "under" ; + lin _due_A = mkA "due" ; + lin _multiple_A = mkA "multiple" ; + lin _vehicle_N = mkN "vehicle" ; + lin _d_N = mkN "d" ; + lin _cover_V2 = mkV2 (us_britishV "cover") ; + lin _hockey_N = mkN "hockey" ; + lin _declare_V2 = mkV2 (us_britishV "declare") ; + lin _play_V2 = mkV2 (us_britishV "play") ; + lin _planE_PN = mkPN "planE" ; + lin _national_A = mkA "national" ; + lin _per_Prep = mkPrep "per" ; + lin _planB_PN = mkPN "planB" ; + lin _stepuppercentage_N = mkN "stepuppercentage" ; + lin _adjusted_A = mkA "adjusted" ; + lin _disease_N = mkN "disease" ; + lin _Triple_PN = mkPN "Triple" ; + lin _disabled_A = mkA "disabled" ; + lin _subject_A = mkA "subject" ; + lin _holder_N = mkN "holder" ; + lin _then_Adv = mkAdv "then" ; + lin _task_N = mkN "task" ; + lin _save_V2 = mkV2 (us_britishV "save") ; + lin _adjustment_N = mkN "adjustment" ; + lin _airline_N = mkN "airline" ; + lin _to_Prep = mkPrep "to" ; + lin _infectious_A = mkA "infectious" ; + lin _death_N = mkN "death" ; + lin _time_N = mkN "time" ; + lin _professional_A = mkA "professional" ; + lin _assured_N = mkN "assured" ; + lin _form_N = mkN "form" ; + lin _dc_N = mkN "dc" ; + lin _sum_list_PN = mkPN "sum_list" ; + lin _have_V2 = mkV2 (us_britishV "have") ; + lin _toe_N = mkN "toe" ; + lin _soon_Adv = mkAdv "soon" ; + lin _plan3_PN = mkPN "plan3" ; + lin _Wife_PN = mkPN "Wife" ; + lin _tcm_N = mkN "tcm" ; + lin _Service_PN = mkPN "Service" ; + lin _loss_N = mkN "loss" ; + lin _Accident_PN = mkPN "Accident" ; + lin _Death_PN = mkPN "Death" ; + lin _suffer_in_V2 = mkV2 (us_britishV "suffer") (mkPrep "in") ; + lin _from_Prep = mkPrep "from" ; + lin _dangerous_A = mkA "dangerous" ; + lin _M_PN = mkPN "M" ; + lin _mountaineer_V = us_britishV "mountaineer" ; + lin _assure_of_V2 = mkV2 (us_britishV "assure") (mkPrep "of") ; + lin _met_common_requirement_for_add_V = us_britishV "met_common_requirement_for_add" ; + lin _vcjd_N = mkN "vcjd" ; +} \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/NL4.gf b/lib/haskell/natural4/grammars/NL4.gf index 6f0921a7b..80188bffe 100644 --- a/lib/haskell/natural4/grammars/NL4.gf +++ b/lib/haskell/natural4/grammars/NL4.gf @@ -1,4 +1,5 @@ abstract NL4 = StandardLexicon -- Manually curated set of common legal domain words (TODO: split into smaller domains? when does size of lexicon become an issue?) , DomainLexicon -- Automatically generated on the fly from whatever document we are processing + , InsLex ; \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/NL4Base.gf b/lib/haskell/natural4/grammars/NL4Base.gf index 9ec8e0c8c..f2338c992 100644 --- a/lib/haskell/natural4/grammars/NL4Base.gf +++ b/lib/haskell/natural4/grammars/NL4Base.gf @@ -63,9 +63,11 @@ abstract NL4Base = CustomSyntax ** { fun RPleafS : NP -> VPS -> Constraint ; - RPleafNP : NP -> Constraint ; -- to pair with PrePost to get a full sentence ??? RPleafVP : VPS -> Constraint ; + -- to pair with PrePost, which we assume to contain the actual predicate + RPleafNP : NP -> Constraint ; RPleafAP : AP -> Constraint ; + RPleafAdv : Adv -> Constraint ; ConjConstraint : Conj -> [Constraint] -> Constraint ; ConjPreConstraint : PrePost -> Conj -> [Constraint] -> Constraint ; ConjPrePostConstraint : PrePost -> PrePost -> Conj -> [Constraint] -> Constraint ; @@ -120,12 +122,20 @@ abstract NL4Base = CustomSyntax ** { MkYear : (x1,_,_,x4: YearComponent) -> Year ; Y0, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, Y9 : YearComponent ; + -- Ages and comparisons + Comparison_Card_Years : Card -> VPS ; + + -- Generic comparisons + LessThan, + GreaterThan : NP -> VPS ; + ----------------------------------------------------------------------------- -- Very specific things, yet uncategorised V2_PrePost : V2 -> PrePost ; -- consumes NP_PrePost : NP -> PrePost ; -- beverage AP_PrePost : AP -> PrePost ; -- any unauthorised Adv_PrePost : Adv -> PrePost ; -- of personal data + S_PrePost : NP -> VPS -> PrePost ; -- the vehicle is on its way APWho : AP -> Who ; -- alcoholic AdvWho : Adv -> Who ; -- in whole @@ -143,6 +153,7 @@ abstract NL4Base = CustomSyntax ** { recoverUnparsedTimeUnit : String -> TimeUnit ; recoverRPis : String -> String -> Constraint ; + recoverRPmath : String -> String -> String -> Constraint ; recoverUnparsedAdv : String -> Adv ; diff --git a/lib/haskell/natural4/grammars/NL4BaseChi.gf b/lib/haskell/natural4/grammars/NL4BaseChi.gf index 5731a37c2..0fb1a8c94 100644 --- a/lib/haskell/natural4/grammars/NL4BaseChi.gf +++ b/lib/haskell/natural4/grammars/NL4BaseChi.gf @@ -13,6 +13,7 @@ concrete NL4BaseChi of NL4Base = , (Extend=ExtendChi) , (Symbolic=SymbolicChi) , (Lexicon=LexiconChi) + , (Construction=ConstructionChi) , (CustomSyntax=CustomSyntaxChi) ** open Coordination, Prelude, ParadigmsChi, (R=ResChi) in { diff --git a/lib/haskell/natural4/grammars/NL4BaseEng.gf b/lib/haskell/natural4/grammars/NL4BaseEng.gf index 584391ec4..4d8fd6ea7 100644 --- a/lib/haskell/natural4/grammars/NL4BaseEng.gf +++ b/lib/haskell/natural4/grammars/NL4BaseEng.gf @@ -6,6 +6,7 @@ concrete NL4BaseEng of NL4Base = , (Extend=ExtendEng) , (Symbolic=SymbolicEng) , (Lexicon=LexiconEng) + , (Construction=ConstructionEng) , (CustomSyntax=CustomSyntaxEng) ** open Coordination, Prelude, ParadigmsEng, (R=ResEng) in { @@ -52,6 +53,10 @@ concrete NL4BaseEng of NL4Base = s = "·" ++ damage.s ++ "is" ++ toContents.s ; -- if constraint isn't parsed, use the original string qs = "Is" ++ damage.s ++ toContents.s ++ bindQM } ; + lin recoverRPmath gt age fifty = { + s = "·" ++ age.s ++ gt.s ++ fifty.s ; -- if constraint isn't parsed, use the original string + qs = "Is" ++ age.s ++ gt.s ++ fifty.s ++ bindQM + } ; lin recoverUnparsedConstraint string = recoverUnparsedPrePost string ; lin recoverUnparsedWho string = MkVPS presSimul POS (mkVP (invarV string.s)) ; diff --git a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf index 574667f11..c554d3fd4 100644 --- a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf +++ b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf @@ -5,6 +5,7 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open , Lexicon , CustomSyntax , Coordination + , Construction , Prelude in { @@ -139,6 +140,11 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open -- qs = qsStr (Extend.SQuestVPS it_NP (MkVPS presSimul POS (mkVP ap))) ++ bindQM qs = (mkUtt ap).s ++ bindQM } ; + RPleafAdv adv = { + s = (mkUtt adv).s ; + qs = (mkUtt adv).s ++ bindQM + } ; + BaseConstraint c d = { s = Coordination.twoStr c.s d.s ; qs = Coordination.twoStr c.qs d.qs @@ -226,6 +232,14 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open MkYear = cc4 ; + -- Ages + -- : Card -> VPS ; + Comparison_Card_Years card = MkVPS presSimul POS (Construction.has_age_VP card) ; + + -- Generic comparisons + -- LessThan, + -- GreaterThan : NP -> VPS ; + ----------------------------------------------------------------------------- -- Very specific things, yet uncategorised -- : AP -> Who ; -- hack @@ -253,6 +267,12 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open -- : Adv -> PrePost ; -- of personal data Adv_PrePost adv = {s,qs = (mkUtt adv).s} ; + -- : S -> PrePost ; -- the vehicle is on its way + S_PrePost np vps = { + s = (mkUtt (PredVPS np vps)).s ; + qs = (mkUtt (SQuestVPS np vps)).s + } ; + recoverUnparsedAdv string = lin Adv (cc2 {s="·"} string) ; -- override for Chi } diff --git a/lib/haskell/natural4/grammars/NL4BaseMay.gf b/lib/haskell/natural4/grammars/NL4BaseMay.gf index 25afae682..437060065 100644 --- a/lib/haskell/natural4/grammars/NL4BaseMay.gf +++ b/lib/haskell/natural4/grammars/NL4BaseMay.gf @@ -6,6 +6,7 @@ concrete NL4BaseMay of NL4Base = , (Extend=ExtendMay) , (Symbolic=SymbolicMay) , (Lexicon=LexiconMay) + , (Construction=ConstructionMay) , (CustomSyntax=CustomSyntaxMay) ** open Coordination, Prelude, ParadigmsMay, (R=ResMay) in { diff --git a/lib/haskell/natural4/grammars/NL4Eng.gf b/lib/haskell/natural4/grammars/NL4Eng.gf index ba7ff05d7..d08106155 100644 --- a/lib/haskell/natural4/grammars/NL4Eng.gf +++ b/lib/haskell/natural4/grammars/NL4Eng.gf @@ -1,4 +1,5 @@ concrete NL4Eng of NL4 = StandardLexiconEng , DomainLexiconEng + , InsLexEng ; \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/StandardLexiconChi.gf b/lib/haskell/natural4/grammars/StandardLexiconChi.gf index 474984e8f..0b4543836 100644 --- a/lib/haskell/natural4/grammars/StandardLexiconChi.gf +++ b/lib/haskell/natural4/grammars/StandardLexiconChi.gf @@ -42,7 +42,7 @@ concrete StandardLexiconChi of StandardLexicon = NL4BaseChi ** NP_caused_NP_to_VP_Prep_PrePost np water escape from = let cl : Cl = mkCl (mkVP cause_V2V ) ; - cls : ClSlash = mkClSlash cl ; + cls : ClSlash = mkClSlash cl ; qcl : QCl = hackQCl cls ; ss : SSlash = mkSSlash (mkTemp pastTense simultaneousAnt) positivePol cls ; qs : QS = mkQS pastTense qcl ; From 6d829028a18961fd2ad895132fd6bf915c3bcae9 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Thu, 3 Aug 2023 13:48:10 +0800 Subject: [PATCH 19/49] update generated files --- lib/haskell/natural4/grammars/NL4.pgf | Bin 184665 -> 222772 bytes lib/haskell/natural4/src/LS/NLP/NL4.hs | 1488 +++++++++++++++++++++--- 2 files changed, 1344 insertions(+), 144 deletions(-) diff --git a/lib/haskell/natural4/grammars/NL4.pgf b/lib/haskell/natural4/grammars/NL4.pgf index 6d2877de001732d28afd45415ad82e57d0e5a406..22fecf8bf1f24c51be06595b0a0c50a2aad8a9be 100644 GIT binary patch literal 222772 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≪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� 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 E2O6#rumAu6 diff --git a/lib/haskell/natural4/src/LS/NLP/NL4.hs b/lib/haskell/natural4/src/LS/NLP/NL4.hs index 88cda3a6e..2f7cab269 100644 --- a/lib/haskell/natural4/src/LS/NLP/NL4.hs +++ b/lib/haskell/natural4/src/LS/NLP/NL4.hs @@ -1,28 +1,9 @@ -{-# LANGUAGE GADTs #-} -{-# LANGUAGE UndecidableInstances #-} - +{-# LANGUAGE GADTs, UndecidableInstances #-} module LS.NLP.NL4 where -import Control.Monad.Identity - ( Identity (Identity, runIdentity), - MonadPlus (..), - ap, - ) +import Control.Monad.Identity (Identity ( Identity, runIdentity), MonadPlus (..), ap ) import Data.Monoid () -import PGF - ( Expr, - mkApp, - mkCId, - mkFloat, - mkInt, - mkStr, - showCId, - showExpr, - unApp, - unFloat, - unInt, - unStr, - ) +import PGF (Expr, mkApp, mkCId, mkFloat, mkInt, mkStr, showCId, showExpr, unApp, unFloat, unInt, unStr ) ---------------------------------------------------- -- automatic translation from GF to Haskell @@ -59,16 +40,26 @@ instance (Gf (Tree a)) => Show (Tree a) where show = showExpr [] . gf ---------------------------------------------------- +type GA = Tree GA_ +data GA_ +type GA2 = Tree GA2_ +data GA2_ type GAP = Tree GAP_ data GAP_ type GAction = Tree GAction_ data GAction_ type GAdA = Tree GAdA_ data GAdA_ +type GAdN = Tree GAdN_ +data GAdN_ type GAdv = Tree GAdv_ data GAdv_ +type GCAdv = Tree GCAdv_ +data GCAdv_ type GCN = Tree GCN_ data GCN_ +type GCard = Tree GCard_ +data GCard_ type GComp = Tree GComp_ data GComp_ type GCond = Tree GCond_ @@ -115,10 +106,16 @@ type GListWho = Tree GListWho_ data GListWho_ type GMonth = Tree GMonth_ data GMonth_ +type GN = Tree GN_ +data GN_ +type GN2 = Tree GN2_ +data GN2_ type GNP = Tree GNP_ data GNP_ type GNumeral = Tree GNumeral_ data GNumeral_ +type GPN = Tree GPN_ +data GPN_ type GPol = Tree GPol_ data GPol_ type GPrePost = Tree GPrePost_ @@ -155,6 +152,8 @@ type GTimeUnit = Tree GTimeUnit_ data GTimeUnit_ type GUpon = Tree GUpon_ data GUpon_ +type GV = Tree GV_ +data GV_ type GV2 = Tree GV2_ data GV2_ type GVP = Tree GVP_ @@ -173,20 +172,10 @@ type GYear = Tree GYear_ data GYear_ type GYearComponent = Tree GYearComponent_ data GYearComponent_ -type GA = Tree GA_ -data GA_ -type GA2 = Tree GA2_ -data GA2_ type GAnt = Tree GAnt_ data GAnt_ -type GN = Tree GN_ -data GN_ -type GN2 = Tree GN2_ -data GN2_ type GTense = Tree GTense_ data GTense_ -type GV = Tree GV_ -data GV_ type GString = Tree GString_ data GString_ type GInt = Tree GInt_ @@ -195,6 +184,86 @@ type GFloat = Tree GFloat_ data GFloat_ data Tree :: * -> * where + G_accepted_A :: Tree GA_ + G_accidental_A :: Tree GA_ + G_active_A :: Tree GA_ + G_add_A :: Tree GA_ + G_adjusted_A :: Tree GA_ + G_alive_A :: Tree GA_ + G_basic_A :: Tree GA_ + G_biological_A :: Tree GA_ + G_chemical_A :: Tree GA_ + G_claimable_A :: Tree GA_ + G_commercial_A :: Tree GA_ + G_competitive_A :: Tree GA_ + G_current_A :: Tree GA_ + G_dangerous_A :: Tree GA_ + G_dead_A :: Tree GA_ + G_disabled_A :: Tree GA_ + G_diving_A :: Tree GA_ + G_double_A :: Tree GA_ + G_due_A :: Tree GA_ + G_equal_A :: Tree GA_ + G_first_A :: Tree GA_ + G_fit_A :: Tree GA_ + G_fractured_A :: Tree GA_ + G_geographical_A :: Tree GA_ + G_great_A :: Tree GA_ + G_hfmd_A :: Tree GA_ + G_high_A :: Tree GA_ + G_human_A :: Tree GA_ + G_incurable_A :: Tree GA_ + G_infectious_A :: Tree GA_ + G_initial_A :: Tree GA_ + G_intentional_A :: Tree GA_ + G_japanese_A :: Tree GA_ + G_juvenile_A :: Tree GA_ + G_less_A :: Tree GA_ + G_little_A :: Tree GA_ + G_logical_A :: Tree GA_ + G_low_A :: Tree GA_ + G_martial_A :: Tree GA_ + G_maximum_A :: Tree GA_ + G_medical_A :: Tree GA_ + G_mental_A :: Tree GA_ + G_middle_A :: Tree GA_ + G_military_A :: Tree GA_ + G_more_A :: Tree GA_ + G_multiple_A :: Tree GA_ + G_national_A :: Tree GA_ + G_normal_A :: Tree GA_ + G_nuclear_A :: Tree GA_ + G_other_A :: Tree GA_ + G_particular_A :: Tree GA_ + G_past_A :: Tree GA_ + G_payable_A :: Tree GA_ + G_permanent_A :: Tree GA_ + G_physical_A :: Tree GA_ + G_possible_A :: Tree GA_ + G_previous_A :: Tree GA_ + G_private_A :: Tree GA_ + G_professional_A :: Tree GA_ + G_public_A :: Tree GA_ + G_reckless_A :: Tree GA_ + G_registered_A :: Tree GA_ + G_relevant_A :: Tree GA_ + G_subject_A :: Tree GA_ + G_successful_A :: Tree GA_ + G_surgical_A :: Tree GA_ + G_third_A :: Tree GA_ + G_total_A :: Tree GA_ + G_traditional_A :: Tree GA_ + G_triple_A :: Tree GA_ + G_unlawful_A :: Tree GA_ + G_unnecessary_A :: Tree GA_ + G_unsound_A :: Tree GA_ + G_unsuccessful_A :: Tree GA_ + G_upscaled_A :: Tree GA_ + G_valid_A :: Tree GA_ + G_viral_A :: Tree GA_ + G_waterborne_A :: Tree GA_ + G_located_in_A2 :: Tree GA2_ + GComplA2 :: GA2 -> GNP -> Tree GAP_ GConjAP :: GConj -> GListAP -> Tree GAP_ GInt_or_older :: GInt -> Tree GAP_ GPositA :: GA -> Tree GAP_ @@ -204,16 +273,39 @@ data Tree :: * -> * where GACTION :: GVP -> Tree GAction_ GrecoverUnparsedAction :: GString -> Tree GAction_ Gonly_AdA :: Tree GAdA_ + GAdnCAdv :: GCAdv -> Tree GAdN_ + Gat_least_AdN :: Tree GAdN_ + Gat_most_AdN :: Tree GAdN_ GAdAdv :: GAdA -> GAdv -> Tree GAdv_ GByVP :: GVP -> Tree GAdv_ GConjAdv :: GConj -> GListAdv -> Tree GAdv_ GPrepNP :: GPrep -> GNP -> Tree GAdv_ + GWhileDoing :: GVP -> Tree GAdv_ + G_as_Adv :: Tree GAdv_ + G_at_Adv :: Tree GAdv_ + G_first_Adv :: Tree GAdv_ + G_fully_Adv :: Tree GAdv_ + G_hence_Adv :: Tree GAdv_ + G_least_Adv :: Tree GAdv_ + G_on_its_way_Adv :: Tree GAdv_ + G_only_Adv :: Tree GAdv_ + G_permanently_Adv :: Tree GAdv_ + G_pland_Adv :: Tree GAdv_ + G_soon_Adv :: Tree GAdv_ + G_then_Adv :: Tree GAdv_ + G_totally_Adv :: Tree GAdv_ + G_up_Adv :: Tree GAdv_ Gin_part :: Tree GAdv_ Gin_whole :: Tree GAdv_ GrecoverUnparsedAdv :: GString -> Tree GAdv_ + Gless_CAdv :: Tree GCAdv_ + Gmore_CAdv :: Tree GCAdv_ GAdjCN :: GAP -> GCN -> Tree GCN_ + GCNwhereS :: GCN -> GNP -> GVPS -> Tree GCN_ GUseN :: GN -> Tree GCN_ LexCN :: String -> Tree GCN_ + GAdNum :: GAdN -> GCard -> Tree GCard_ + GNumDigits :: GDigits -> Tree GCard_ GCompAP :: GAP -> Tree GComp_ GCompAdv :: GAdv -> Tree GComp_ GCompNP :: GNP -> Tree GComp_ @@ -225,20 +317,31 @@ data Tree :: * -> * where GrecoverUnparsedCond :: GString -> Tree GCond_ GAND :: Tree GConj_ GOR :: Tree GConj_ + G_and_Conj :: Tree GConj_ + G_before_Conj :: Tree GConj_ + G_both_Conj :: Tree GConj_ + G_but_Conj :: Tree GConj_ + G_if_Conj :: Tree GConj_ + G_or_Conj :: Tree GConj_ + G_that_Conj :: Tree GConj_ + G_when_Conj :: Tree GConj_ GConjConstraint :: GConj -> GListConstraint -> Tree GConstraint_ GConjPreConstraint :: GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ GConjPrePostConstraint :: GPrePost -> GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ GRPleafAP :: GAP -> Tree GConstraint_ + GRPleafAdv :: GAdv -> Tree GConstraint_ GRPleafNP :: GNP -> Tree GConstraint_ GRPleafS :: GNP -> GVPS -> Tree GConstraint_ GRPleafVP :: GVPS -> Tree GConstraint_ GrecoverRPis :: GString -> GString -> Tree GConstraint_ + GrecoverRPmath :: GString -> GString -> GString -> Tree GConstraint_ GrecoverUnparsedConstraint :: GString -> Tree GConstraint_ GMkDate :: GDay -> GMonth -> GYear -> Tree GDate_ LexDay :: String -> Tree GDay_ GMAY :: Tree GDeontic_ GMUST :: Tree GDeontic_ GSHANT :: Tree GDeontic_ + GaPl :: Tree GDet_ GaSg :: Tree GDet_ GthePl :: Tree GDet_ GtheSg :: Tree GDet_ @@ -266,6 +369,9 @@ data Tree :: * -> * where GListVPS :: [GVPS] -> Tree GListVPS_ GListWho :: [GWho] -> Tree GListWho_ LexMonth :: String -> Tree GMonth_ + GCompoundN :: GN -> GN -> Tree GN_ + LexN :: String -> Tree GN_ + G_premise_where_N2 :: Tree GN2_ GConjNP :: GConj -> GListNP -> Tree GNP_ GContents :: Tree GNP_ GDetCN :: GDet -> GCN -> Tree GNP_ @@ -273,6 +379,7 @@ data Tree :: * -> * where GLoss_or_Damage :: Tree GNP_ GMassNP :: GCN -> Tree GNP_ GNDB_Qualification :: Tree GNP_ + GUsePN :: GPN -> Tree GNP_ Ganimal :: Tree GNP_ Gany_other_exclusion :: Tree GNP_ Gbirds :: Tree GNP_ @@ -292,6 +399,109 @@ data Tree :: * -> * where Gvermin :: Tree GNP_ Gwater :: Tree GNP_ Gnum :: GSub1000000 -> Tree GNumeral_ + G_1012_PN :: Tree GPN_ + G_1013_PN :: Tree GPN_ + G_1014_PN :: Tree GPN_ + G_333A_PN :: Tree GPN_ + G_ADD_PN :: Tree GPN_ + G_AIDS_PN :: Tree GPN_ + G_Accident_PN :: Tree GPN_ + G_Accidental_PN :: Tree GPN_ + G_Accidents_PN :: Tree GPN_ + G_Address_PN :: Tree GPN_ + G_Adjustment_PN :: Tree GPN_ + G_Assured_PN :: Tree GPN_ + G_BSA_PN :: Tree GPN_ + G_Benefit_PN :: Tree GPN_ + G_Cap_PN :: Tree GPN_ + G_Claim_PN :: Tree GPN_ + G_CoV_PN :: Tree GPN_ + G_Conditions_PN :: Tree GPN_ + G_Date_PN :: Tree GPN_ + G_Death_PN :: Tree GPN_ + G_Details_PN :: Tree GPN_ + G_Disease_PN :: Tree GPN_ + G_Dismemberment_PN :: Tree GPN_ + G_Event_PN :: Tree GPN_ + G_Expense_PN :: Tree GPN_ + G_Flu_PN :: Tree GPN_ + G_H5N1_PN :: Tree GPN_ + G_H7N9_PN :: Tree GPN_ + G_H7N_PN :: Tree GPN_ + G_H9N2_PN :: Tree GPN_ + G_HAS_PN :: Tree GPN_ + G_Head_PN :: Tree GPN_ + G_Health_PN :: Tree GPN_ + G_Influenza_PN :: Tree GPN_ + G_Injury_PN :: Tree GPN_ + G_Insurer_PN :: Tree GPN_ + G_LA_PN :: Tree GPN_ + G_LE_PN :: Tree GPN_ + G_Leg_PN :: Tree GPN_ + G_Legionnaires_PN :: Tree GPN_ + G_Life_PN :: Tree GPN_ + G_Limit_PN :: Tree GPN_ + G_MAP_PN :: Tree GPN_ + G_MIN_PN :: Tree GPN_ + G_MR_PN :: Tree GPN_ + G_M_PN :: Tree GPN_ + G_Medicine_PN :: Tree GPN_ + G_Melioidosis_PN :: Tree GPN_ + G_Ministry_PN :: Tree GPN_ + G_Mumps_PN :: Tree GPN_ + G_N_PN :: Tree GPN_ + G_Nipah_PN :: Tree GPN_ + G_Ontology_PN :: Tree GPN_ + G_PS_PN :: Tree GPN_ + G_Plan14_PN :: Tree GPN_ + G_PlanAF_PN :: Tree GPN_ + G_PolicyHolder_PN :: Tree GPN_ + G_Policy_PN :: Tree GPN_ + G_RETURN_PN :: Tree GPN_ + G_Reductions_PN :: Tree GPN_ + G_Removal_PN :: Tree GPN_ + G_Republic_PN :: Tree GPN_ + G_SA_PN :: Tree GPN_ + G_SG_PN :: Tree GPN_ + G_Schedule_PN :: Tree GPN_ + G_Section_PN :: Tree GPN_ + G_Service_PN :: Tree GPN_ + G_Singapore_PN :: Tree GPN_ + G_Step_PN :: Tree GPN_ + G_Subscribed_PN :: Tree GPN_ + G_TABLE_PN :: Tree GPN_ + G_Teeth_PN :: Tree GPN_ + G_Triple_PN :: Tree GPN_ + G_Type_PN :: Tree GPN_ + G_Types_PN :: Tree GPN_ + G_UPON_PN :: Tree GPN_ + G_Wife_PN :: Tree GPN_ + G_Yellow_PN :: Tree GPN_ + G_addSA_PN :: Tree GPN_ + G_benADD_PN :: Tree GPN_ + G_benADDs_PN :: Tree GPN_ + G_benRA_PN :: Tree GPN_ + G_benTCM_PN :: Tree GPN_ + G_circ_PN :: Tree GPN_ + G_dTime_PN :: Tree GPN_ + G_dType_PN :: Tree GPN_ + G_diving_PN :: Tree GPN_ + G_holder_PN :: Tree GPN_ + G_motocross_PN :: Tree GPN_ + G_p_PN :: Tree GPN_ + G_plan3_PN :: Tree GPN_ + G_plan4_PN :: Tree GPN_ + G_planAF_PN :: Tree GPN_ + G_planB_PN :: Tree GPN_ + G_planC_PN :: Tree GPN_ + G_planE_PN :: Tree GPN_ + G_planF_PN :: Tree GPN_ + G_policyHolder_PN :: Tree GPN_ + G_qualifies_for_add_PN :: Tree GPN_ + G_schema_PN :: Tree GPN_ + G_sum_list_PN :: Tree GPN_ + G_x_PN :: Tree GPN_ + G_y_PN :: Tree GPN_ GNEG :: Tree GPol_ GPOS :: Tree GPol_ GAP_PrePost :: GAP -> Tree GPrePost_ @@ -299,9 +509,34 @@ data Tree :: * -> * where GNP_PrePost :: GNP -> Tree GPrePost_ GNP_caused_NP_to_VP_Prep_PrePost :: GNP -> GNP -> GVP -> GPrep -> Tree GPrePost_ GNP_caused_by_PrePost :: GNP -> Tree GPrePost_ + GS_PrePost :: GNP -> GVPS -> Tree GPrePost_ GV2_PrePost :: GV2 -> Tree GPrePost_ GrecoverUnparsedPrePost :: GString -> Tree GPrePost_ GConjPrep :: GConj -> GListPrep -> Tree GPrep_ + G_across_Prep :: Tree GPrep_ + G_after_Prep :: Tree GPrep_ + G_as_Prep :: Tree GPrep_ + G_at_Prep :: Tree GPrep_ + G_before_Prep :: Tree GPrep_ + G_between_Prep :: Tree GPrep_ + G_by_Prep :: Tree GPrep_ + G_during_Prep :: Tree GPrep_ + G_for_Prep :: Tree GPrep_ + G_from_Prep :: Tree GPrep_ + G_in_Prep :: Tree GPrep_ + G_into_Prep :: Tree GPrep_ + G_of_Prep :: Tree GPrep_ + G_on_Prep :: Tree GPrep_ + G_out_Prep :: Tree GPrep_ + G_over_Prep :: Tree GPrep_ + G_per_Prep :: Tree GPrep_ + G_than_Prep :: Tree GPrep_ + G_through_Prep :: Tree GPrep_ + G_to_Prep :: Tree GPrep_ + G_under_Prep :: Tree GPrep_ + G_up_Prep :: Tree GPrep_ + G_with_Prep :: Tree GPrep_ + G_within_Prep :: Tree GPrep_ Gabout_Prep :: Tree GPrep_ Gafter_Prep :: Tree GPrep_ Gbefore_Prep :: Tree GPrep_ @@ -378,6 +613,49 @@ data Tree :: * -> * where GrecoverUnparsedTimeUnit :: GString -> Tree GTimeUnit_ GUPON :: GVP -> Tree GUpon_ GrecoverUnparsedUpon :: GString -> Tree GUpon_ + G_H7N7_V :: Tree GV_ + G_adjust_V :: Tree GV_ + G_apply_V :: Tree GV_ + G_asssure_V :: Tree GV_ + G_assure_V :: Tree GV_ + G_benefit_V :: Tree GV_ + G_canoe_V :: Tree GV_ + G_cave_V :: Tree GV_ + G_claim_V :: Tree GV_ + G_cover_V :: Tree GV_ + G_establish_V :: Tree GV_ + G_exception_V :: Tree GV_ + G_give_V :: Tree GV_ + G_glide_V :: Tree GV_ + G_govern_V :: Tree GV_ + G_hand_V :: Tree GV_ + G_hernia_V :: Tree GV_ + G_hunt_V :: Tree GV_ + G_include_V :: Tree GV_ + G_license_V :: Tree GV_ + G_mean_V :: Tree GV_ + G_met_common_requirement_for_add_V :: Tree GV_ + G_mountaineer_V :: Tree GV_ + G_occur_V :: Tree GV_ + G_organise_V :: Tree GV_ + G_parachute_V :: Tree GV_ + G_pay_V :: Tree GV_ + G_policyholder_V :: Tree GV_ + G_pothole_V :: Tree GV_ + G_race_V :: Tree GV_ + G_recognise_V :: Tree GV_ + G_register_V :: Tree GV_ + G_riot_V :: Tree GV_ + G_sail_V :: Tree GV_ + G_skydive_V :: Tree GV_ + G_start_V :: Tree GV_ + G_stepupsumassure_V :: Tree GV_ + G_subscribe_V :: Tree GV_ + G_suffer_V :: Tree GV_ + G_sumassure_V :: Tree GV_ + G_supervise_V :: Tree GV_ + G_train_V :: Tree GV_ + G_windsurf_V :: Tree GV_ LexV2 :: String -> Tree GV2_ GAdvVP :: GVP -> GAdv -> Tree GVP_ GComplV2 :: GV2 -> GNP -> Tree GVP_ @@ -388,8 +666,11 @@ data Tree :: * -> * where GUseComp :: GComp -> Tree GVP_ LexVP :: String -> Tree GVP_ GMkVPI :: GVP -> Tree GVPI_ + GComparison_Card_Years :: GCard -> Tree GVPS_ GConjPrePostVPS :: GString -> GString -> GConj -> GListVPS -> Tree GVPS_ GConjVPS :: GConj -> GListVPS -> Tree GVPS_ + GGreaterThan :: GNP -> Tree GVPS_ + GLessThan :: GNP -> Tree GVPS_ GMayHave :: GVP -> Tree GVPS_ GMkVPS :: GTemp -> GPol -> GVP -> Tree GVPS_ LexVS :: String -> Tree GVS_ @@ -403,13 +684,92 @@ data Tree :: * -> * where GrecoverUnparsedWho :: GString -> Tree GWho_ GMkYear :: GYearComponent -> GYearComponent -> GYearComponent -> GYearComponent -> Tree GYear_ LexYearComponent :: String -> Tree GYearComponent_ - LexN :: String -> Tree GN_ GString :: String -> Tree GString_ GInt :: Int -> Tree GInt_ GFloat :: Double -> Tree GFloat_ instance Eq (Tree a) where i == j = case (i,j) of + (G_accepted_A,G_accepted_A) -> and [ ] + (G_accidental_A,G_accidental_A) -> and [ ] + (G_active_A,G_active_A) -> and [ ] + (G_add_A,G_add_A) -> and [ ] + (G_adjusted_A,G_adjusted_A) -> and [ ] + (G_alive_A,G_alive_A) -> and [ ] + (G_basic_A,G_basic_A) -> and [ ] + (G_biological_A,G_biological_A) -> and [ ] + (G_chemical_A,G_chemical_A) -> and [ ] + (G_claimable_A,G_claimable_A) -> and [ ] + (G_commercial_A,G_commercial_A) -> and [ ] + (G_competitive_A,G_competitive_A) -> and [ ] + (G_current_A,G_current_A) -> and [ ] + (G_dangerous_A,G_dangerous_A) -> and [ ] + (G_dead_A,G_dead_A) -> and [ ] + (G_disabled_A,G_disabled_A) -> and [ ] + (G_diving_A,G_diving_A) -> and [ ] + (G_double_A,G_double_A) -> and [ ] + (G_due_A,G_due_A) -> and [ ] + (G_equal_A,G_equal_A) -> and [ ] + (G_first_A,G_first_A) -> and [ ] + (G_fit_A,G_fit_A) -> and [ ] + (G_fractured_A,G_fractured_A) -> and [ ] + (G_geographical_A,G_geographical_A) -> and [ ] + (G_great_A,G_great_A) -> and [ ] + (G_hfmd_A,G_hfmd_A) -> and [ ] + (G_high_A,G_high_A) -> and [ ] + (G_human_A,G_human_A) -> and [ ] + (G_incurable_A,G_incurable_A) -> and [ ] + (G_infectious_A,G_infectious_A) -> and [ ] + (G_initial_A,G_initial_A) -> and [ ] + (G_intentional_A,G_intentional_A) -> and [ ] + (G_japanese_A,G_japanese_A) -> and [ ] + (G_juvenile_A,G_juvenile_A) -> and [ ] + (G_less_A,G_less_A) -> and [ ] + (G_little_A,G_little_A) -> and [ ] + (G_logical_A,G_logical_A) -> and [ ] + (G_low_A,G_low_A) -> and [ ] + (G_martial_A,G_martial_A) -> and [ ] + (G_maximum_A,G_maximum_A) -> and [ ] + (G_medical_A,G_medical_A) -> and [ ] + (G_mental_A,G_mental_A) -> and [ ] + (G_middle_A,G_middle_A) -> and [ ] + (G_military_A,G_military_A) -> and [ ] + (G_more_A,G_more_A) -> and [ ] + (G_multiple_A,G_multiple_A) -> and [ ] + (G_national_A,G_national_A) -> and [ ] + (G_normal_A,G_normal_A) -> and [ ] + (G_nuclear_A,G_nuclear_A) -> and [ ] + (G_other_A,G_other_A) -> and [ ] + (G_particular_A,G_particular_A) -> and [ ] + (G_past_A,G_past_A) -> and [ ] + (G_payable_A,G_payable_A) -> and [ ] + (G_permanent_A,G_permanent_A) -> and [ ] + (G_physical_A,G_physical_A) -> and [ ] + (G_possible_A,G_possible_A) -> and [ ] + (G_previous_A,G_previous_A) -> and [ ] + (G_private_A,G_private_A) -> and [ ] + (G_professional_A,G_professional_A) -> and [ ] + (G_public_A,G_public_A) -> and [ ] + (G_reckless_A,G_reckless_A) -> and [ ] + (G_registered_A,G_registered_A) -> and [ ] + (G_relevant_A,G_relevant_A) -> and [ ] + (G_subject_A,G_subject_A) -> and [ ] + (G_successful_A,G_successful_A) -> and [ ] + (G_surgical_A,G_surgical_A) -> and [ ] + (G_third_A,G_third_A) -> and [ ] + (G_total_A,G_total_A) -> and [ ] + (G_traditional_A,G_traditional_A) -> and [ ] + (G_triple_A,G_triple_A) -> and [ ] + (G_unlawful_A,G_unlawful_A) -> and [ ] + (G_unnecessary_A,G_unnecessary_A) -> and [ ] + (G_unsound_A,G_unsound_A) -> and [ ] + (G_unsuccessful_A,G_unsuccessful_A) -> and [ ] + (G_upscaled_A,G_upscaled_A) -> and [ ] + (G_valid_A,G_valid_A) -> and [ ] + (G_viral_A,G_viral_A) -> and [ ] + (G_waterborne_A,G_waterborne_A) -> and [ ] + (G_located_in_A2,G_located_in_A2) -> and [ ] + (GComplA2 x1 x2,GComplA2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjAP x1 x2,GConjAP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GInt_or_older x1,GInt_or_older y1) -> and [ x1 == y1 ] (GPositA x1,GPositA y1) -> and [ x1 == y1 ] @@ -419,16 +779,39 @@ instance Eq (Tree a) where (GACTION x1,GACTION y1) -> and [ x1 == y1 ] (GrecoverUnparsedAction x1,GrecoverUnparsedAction y1) -> and [ x1 == y1 ] (Gonly_AdA,Gonly_AdA) -> and [ ] + (GAdnCAdv x1,GAdnCAdv y1) -> and [ x1 == y1 ] + (Gat_least_AdN,Gat_least_AdN) -> and [ ] + (Gat_most_AdN,Gat_most_AdN) -> and [ ] (GAdAdv x1 x2,GAdAdv y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GByVP x1,GByVP y1) -> and [ x1 == y1 ] (GConjAdv x1 x2,GConjAdv y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GPrepNP x1 x2,GPrepNP y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GWhileDoing x1,GWhileDoing y1) -> and [ x1 == y1 ] + (G_as_Adv,G_as_Adv) -> and [ ] + (G_at_Adv,G_at_Adv) -> and [ ] + (G_first_Adv,G_first_Adv) -> and [ ] + (G_fully_Adv,G_fully_Adv) -> and [ ] + (G_hence_Adv,G_hence_Adv) -> and [ ] + (G_least_Adv,G_least_Adv) -> and [ ] + (G_on_its_way_Adv,G_on_its_way_Adv) -> and [ ] + (G_only_Adv,G_only_Adv) -> and [ ] + (G_permanently_Adv,G_permanently_Adv) -> and [ ] + (G_pland_Adv,G_pland_Adv) -> and [ ] + (G_soon_Adv,G_soon_Adv) -> and [ ] + (G_then_Adv,G_then_Adv) -> and [ ] + (G_totally_Adv,G_totally_Adv) -> and [ ] + (G_up_Adv,G_up_Adv) -> and [ ] (Gin_part,Gin_part) -> and [ ] (Gin_whole,Gin_whole) -> and [ ] (GrecoverUnparsedAdv x1,GrecoverUnparsedAdv y1) -> and [ x1 == y1 ] + (Gless_CAdv,Gless_CAdv) -> and [ ] + (Gmore_CAdv,Gmore_CAdv) -> and [ ] (GAdjCN x1 x2,GAdjCN y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GCNwhereS x1 x2 x3,GCNwhereS y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GUseN x1,GUseN y1) -> and [ x1 == y1 ] (LexCN x,LexCN y) -> x == y + (GAdNum x1 x2,GAdNum y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GNumDigits x1,GNumDigits y1) -> and [ x1 == y1 ] (GCompAP x1,GCompAP y1) -> and [ x1 == y1 ] (GCompAdv x1,GCompAdv y1) -> and [ x1 == y1 ] (GCompNP x1,GCompNP y1) -> and [ x1 == y1 ] @@ -440,20 +823,31 @@ instance Eq (Tree a) where (GrecoverUnparsedCond x1,GrecoverUnparsedCond y1) -> and [ x1 == y1 ] (GAND,GAND) -> and [ ] (GOR,GOR) -> and [ ] + (G_and_Conj,G_and_Conj) -> and [ ] + (G_before_Conj,G_before_Conj) -> and [ ] + (G_both_Conj,G_both_Conj) -> and [ ] + (G_but_Conj,G_but_Conj) -> and [ ] + (G_if_Conj,G_if_Conj) -> and [ ] + (G_or_Conj,G_or_Conj) -> and [ ] + (G_that_Conj,G_that_Conj) -> and [ ] + (G_when_Conj,G_when_Conj) -> and [ ] (GConjConstraint x1 x2,GConjConstraint y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjPreConstraint x1 x2 x3,GConjPreConstraint y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GConjPrePostConstraint x1 x2 x3 x4,GConjPrePostConstraint y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GRPleafAP x1,GRPleafAP y1) -> and [ x1 == y1 ] + (GRPleafAdv x1,GRPleafAdv y1) -> and [ x1 == y1 ] (GRPleafNP x1,GRPleafNP y1) -> and [ x1 == y1 ] (GRPleafS x1 x2,GRPleafS y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GRPleafVP x1,GRPleafVP y1) -> and [ x1 == y1 ] (GrecoverRPis x1 x2,GrecoverRPis y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GrecoverRPmath x1 x2 x3,GrecoverRPmath y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GrecoverUnparsedConstraint x1,GrecoverUnparsedConstraint y1) -> and [ x1 == y1 ] (GMkDate x1 x2 x3,GMkDate y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (LexDay x,LexDay y) -> x == y (GMAY,GMAY) -> and [ ] (GMUST,GMUST) -> and [ ] (GSHANT,GSHANT) -> and [ ] + (GaPl,GaPl) -> and [ ] (GaSg,GaSg) -> and [ ] (GthePl,GthePl) -> and [ ] (GtheSg,GtheSg) -> and [ ] @@ -481,6 +875,9 @@ instance Eq (Tree a) where (GListVPS x1,GListVPS y1) -> and [x == y | (x,y) <- zip x1 y1] (GListWho x1,GListWho y1) -> and [x == y | (x,y) <- zip x1 y1] (LexMonth x,LexMonth y) -> x == y + (GCompoundN x1 x2,GCompoundN y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (LexN x,LexN y) -> x == y + (G_premise_where_N2,G_premise_where_N2) -> and [ ] (GConjNP x1 x2,GConjNP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GContents,GContents) -> and [ ] (GDetCN x1 x2,GDetCN y1 y2) -> and [ x1 == y1 , x2 == y2 ] @@ -488,6 +885,7 @@ instance Eq (Tree a) where (GLoss_or_Damage,GLoss_or_Damage) -> and [ ] (GMassNP x1,GMassNP y1) -> and [ x1 == y1 ] (GNDB_Qualification,GNDB_Qualification) -> and [ ] + (GUsePN x1,GUsePN y1) -> and [ x1 == y1 ] (Ganimal,Ganimal) -> and [ ] (Gany_other_exclusion,Gany_other_exclusion) -> and [ ] (Gbirds,Gbirds) -> and [ ] @@ -507,6 +905,109 @@ instance Eq (Tree a) where (Gvermin,Gvermin) -> and [ ] (Gwater,Gwater) -> and [ ] (Gnum x1,Gnum y1) -> and [ x1 == y1 ] + (G_1012_PN,G_1012_PN) -> and [ ] + (G_1013_PN,G_1013_PN) -> and [ ] + (G_1014_PN,G_1014_PN) -> and [ ] + (G_333A_PN,G_333A_PN) -> and [ ] + (G_ADD_PN,G_ADD_PN) -> and [ ] + (G_AIDS_PN,G_AIDS_PN) -> and [ ] + (G_Accident_PN,G_Accident_PN) -> and [ ] + (G_Accidental_PN,G_Accidental_PN) -> and [ ] + (G_Accidents_PN,G_Accidents_PN) -> and [ ] + (G_Address_PN,G_Address_PN) -> and [ ] + (G_Adjustment_PN,G_Adjustment_PN) -> and [ ] + (G_Assured_PN,G_Assured_PN) -> and [ ] + (G_BSA_PN,G_BSA_PN) -> and [ ] + (G_Benefit_PN,G_Benefit_PN) -> and [ ] + (G_Cap_PN,G_Cap_PN) -> and [ ] + (G_Claim_PN,G_Claim_PN) -> and [ ] + (G_CoV_PN,G_CoV_PN) -> and [ ] + (G_Conditions_PN,G_Conditions_PN) -> and [ ] + (G_Date_PN,G_Date_PN) -> and [ ] + (G_Death_PN,G_Death_PN) -> and [ ] + (G_Details_PN,G_Details_PN) -> and [ ] + (G_Disease_PN,G_Disease_PN) -> and [ ] + (G_Dismemberment_PN,G_Dismemberment_PN) -> and [ ] + (G_Event_PN,G_Event_PN) -> and [ ] + (G_Expense_PN,G_Expense_PN) -> and [ ] + (G_Flu_PN,G_Flu_PN) -> and [ ] + (G_H5N1_PN,G_H5N1_PN) -> and [ ] + (G_H7N9_PN,G_H7N9_PN) -> and [ ] + (G_H7N_PN,G_H7N_PN) -> and [ ] + (G_H9N2_PN,G_H9N2_PN) -> and [ ] + (G_HAS_PN,G_HAS_PN) -> and [ ] + (G_Head_PN,G_Head_PN) -> and [ ] + (G_Health_PN,G_Health_PN) -> and [ ] + (G_Influenza_PN,G_Influenza_PN) -> and [ ] + (G_Injury_PN,G_Injury_PN) -> and [ ] + (G_Insurer_PN,G_Insurer_PN) -> and [ ] + (G_LA_PN,G_LA_PN) -> and [ ] + (G_LE_PN,G_LE_PN) -> and [ ] + (G_Leg_PN,G_Leg_PN) -> and [ ] + (G_Legionnaires_PN,G_Legionnaires_PN) -> and [ ] + (G_Life_PN,G_Life_PN) -> and [ ] + (G_Limit_PN,G_Limit_PN) -> and [ ] + (G_MAP_PN,G_MAP_PN) -> and [ ] + (G_MIN_PN,G_MIN_PN) -> and [ ] + (G_MR_PN,G_MR_PN) -> and [ ] + (G_M_PN,G_M_PN) -> and [ ] + (G_Medicine_PN,G_Medicine_PN) -> and [ ] + (G_Melioidosis_PN,G_Melioidosis_PN) -> and [ ] + (G_Ministry_PN,G_Ministry_PN) -> and [ ] + (G_Mumps_PN,G_Mumps_PN) -> and [ ] + (G_N_PN,G_N_PN) -> and [ ] + (G_Nipah_PN,G_Nipah_PN) -> and [ ] + (G_Ontology_PN,G_Ontology_PN) -> and [ ] + (G_PS_PN,G_PS_PN) -> and [ ] + (G_Plan14_PN,G_Plan14_PN) -> and [ ] + (G_PlanAF_PN,G_PlanAF_PN) -> and [ ] + (G_PolicyHolder_PN,G_PolicyHolder_PN) -> and [ ] + (G_Policy_PN,G_Policy_PN) -> and [ ] + (G_RETURN_PN,G_RETURN_PN) -> and [ ] + (G_Reductions_PN,G_Reductions_PN) -> and [ ] + (G_Removal_PN,G_Removal_PN) -> and [ ] + (G_Republic_PN,G_Republic_PN) -> and [ ] + (G_SA_PN,G_SA_PN) -> and [ ] + (G_SG_PN,G_SG_PN) -> and [ ] + (G_Schedule_PN,G_Schedule_PN) -> and [ ] + (G_Section_PN,G_Section_PN) -> and [ ] + (G_Service_PN,G_Service_PN) -> and [ ] + (G_Singapore_PN,G_Singapore_PN) -> and [ ] + (G_Step_PN,G_Step_PN) -> and [ ] + (G_Subscribed_PN,G_Subscribed_PN) -> and [ ] + (G_TABLE_PN,G_TABLE_PN) -> and [ ] + (G_Teeth_PN,G_Teeth_PN) -> and [ ] + (G_Triple_PN,G_Triple_PN) -> and [ ] + (G_Type_PN,G_Type_PN) -> and [ ] + (G_Types_PN,G_Types_PN) -> and [ ] + (G_UPON_PN,G_UPON_PN) -> and [ ] + (G_Wife_PN,G_Wife_PN) -> and [ ] + (G_Yellow_PN,G_Yellow_PN) -> and [ ] + (G_addSA_PN,G_addSA_PN) -> and [ ] + (G_benADD_PN,G_benADD_PN) -> and [ ] + (G_benADDs_PN,G_benADDs_PN) -> and [ ] + (G_benRA_PN,G_benRA_PN) -> and [ ] + (G_benTCM_PN,G_benTCM_PN) -> and [ ] + (G_circ_PN,G_circ_PN) -> and [ ] + (G_dTime_PN,G_dTime_PN) -> and [ ] + (G_dType_PN,G_dType_PN) -> and [ ] + (G_diving_PN,G_diving_PN) -> and [ ] + (G_holder_PN,G_holder_PN) -> and [ ] + (G_motocross_PN,G_motocross_PN) -> and [ ] + (G_p_PN,G_p_PN) -> and [ ] + (G_plan3_PN,G_plan3_PN) -> and [ ] + (G_plan4_PN,G_plan4_PN) -> and [ ] + (G_planAF_PN,G_planAF_PN) -> and [ ] + (G_planB_PN,G_planB_PN) -> and [ ] + (G_planC_PN,G_planC_PN) -> and [ ] + (G_planE_PN,G_planE_PN) -> and [ ] + (G_planF_PN,G_planF_PN) -> and [ ] + (G_policyHolder_PN,G_policyHolder_PN) -> and [ ] + (G_qualifies_for_add_PN,G_qualifies_for_add_PN) -> and [ ] + (G_schema_PN,G_schema_PN) -> and [ ] + (G_sum_list_PN,G_sum_list_PN) -> and [ ] + (G_x_PN,G_x_PN) -> and [ ] + (G_y_PN,G_y_PN) -> and [ ] (GNEG,GNEG) -> and [ ] (GPOS,GPOS) -> and [ ] (GAP_PrePost x1,GAP_PrePost y1) -> and [ x1 == y1 ] @@ -514,9 +1015,34 @@ instance Eq (Tree a) where (GNP_PrePost x1,GNP_PrePost y1) -> and [ x1 == y1 ] (GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4,GNP_caused_NP_to_VP_Prep_PrePost y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GNP_caused_by_PrePost x1,GNP_caused_by_PrePost y1) -> and [ x1 == y1 ] + (GS_PrePost x1 x2,GS_PrePost y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GV2_PrePost x1,GV2_PrePost y1) -> and [ x1 == y1 ] (GrecoverUnparsedPrePost x1,GrecoverUnparsedPrePost y1) -> and [ x1 == y1 ] (GConjPrep x1 x2,GConjPrep y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (G_across_Prep,G_across_Prep) -> and [ ] + (G_after_Prep,G_after_Prep) -> and [ ] + (G_as_Prep,G_as_Prep) -> and [ ] + (G_at_Prep,G_at_Prep) -> and [ ] + (G_before_Prep,G_before_Prep) -> and [ ] + (G_between_Prep,G_between_Prep) -> and [ ] + (G_by_Prep,G_by_Prep) -> and [ ] + (G_during_Prep,G_during_Prep) -> and [ ] + (G_for_Prep,G_for_Prep) -> and [ ] + (G_from_Prep,G_from_Prep) -> and [ ] + (G_in_Prep,G_in_Prep) -> and [ ] + (G_into_Prep,G_into_Prep) -> and [ ] + (G_of_Prep,G_of_Prep) -> and [ ] + (G_on_Prep,G_on_Prep) -> and [ ] + (G_out_Prep,G_out_Prep) -> and [ ] + (G_over_Prep,G_over_Prep) -> and [ ] + (G_per_Prep,G_per_Prep) -> and [ ] + (G_than_Prep,G_than_Prep) -> and [ ] + (G_through_Prep,G_through_Prep) -> and [ ] + (G_to_Prep,G_to_Prep) -> and [ ] + (G_under_Prep,G_under_Prep) -> and [ ] + (G_up_Prep,G_up_Prep) -> and [ ] + (G_with_Prep,G_with_Prep) -> and [ ] + (G_within_Prep,G_within_Prep) -> and [ ] (Gabout_Prep,Gabout_Prep) -> and [ ] (Gafter_Prep,Gafter_Prep) -> and [ ] (Gbefore_Prep,Gbefore_Prep) -> and [ ] @@ -593,6 +1119,49 @@ instance Eq (Tree a) where (GrecoverUnparsedTimeUnit x1,GrecoverUnparsedTimeUnit y1) -> and [ x1 == y1 ] (GUPON x1,GUPON y1) -> and [ x1 == y1 ] (GrecoverUnparsedUpon x1,GrecoverUnparsedUpon y1) -> and [ x1 == y1 ] + (G_H7N7_V,G_H7N7_V) -> and [ ] + (G_adjust_V,G_adjust_V) -> and [ ] + (G_apply_V,G_apply_V) -> and [ ] + (G_asssure_V,G_asssure_V) -> and [ ] + (G_assure_V,G_assure_V) -> and [ ] + (G_benefit_V,G_benefit_V) -> and [ ] + (G_canoe_V,G_canoe_V) -> and [ ] + (G_cave_V,G_cave_V) -> and [ ] + (G_claim_V,G_claim_V) -> and [ ] + (G_cover_V,G_cover_V) -> and [ ] + (G_establish_V,G_establish_V) -> and [ ] + (G_exception_V,G_exception_V) -> and [ ] + (G_give_V,G_give_V) -> and [ ] + (G_glide_V,G_glide_V) -> and [ ] + (G_govern_V,G_govern_V) -> and [ ] + (G_hand_V,G_hand_V) -> and [ ] + (G_hernia_V,G_hernia_V) -> and [ ] + (G_hunt_V,G_hunt_V) -> and [ ] + (G_include_V,G_include_V) -> and [ ] + (G_license_V,G_license_V) -> and [ ] + (G_mean_V,G_mean_V) -> and [ ] + (G_met_common_requirement_for_add_V,G_met_common_requirement_for_add_V) -> and [ ] + (G_mountaineer_V,G_mountaineer_V) -> and [ ] + (G_occur_V,G_occur_V) -> and [ ] + (G_organise_V,G_organise_V) -> and [ ] + (G_parachute_V,G_parachute_V) -> and [ ] + (G_pay_V,G_pay_V) -> and [ ] + (G_policyholder_V,G_policyholder_V) -> and [ ] + (G_pothole_V,G_pothole_V) -> and [ ] + (G_race_V,G_race_V) -> and [ ] + (G_recognise_V,G_recognise_V) -> and [ ] + (G_register_V,G_register_V) -> and [ ] + (G_riot_V,G_riot_V) -> and [ ] + (G_sail_V,G_sail_V) -> and [ ] + (G_skydive_V,G_skydive_V) -> and [ ] + (G_start_V,G_start_V) -> and [ ] + (G_stepupsumassure_V,G_stepupsumassure_V) -> and [ ] + (G_subscribe_V,G_subscribe_V) -> and [ ] + (G_suffer_V,G_suffer_V) -> and [ ] + (G_sumassure_V,G_sumassure_V) -> and [ ] + (G_supervise_V,G_supervise_V) -> and [ ] + (G_train_V,G_train_V) -> and [ ] + (G_windsurf_V,G_windsurf_V) -> and [ ] (LexV2 x,LexV2 y) -> x == y (GAdvVP x1 x2,GAdvVP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GComplV2 x1 x2,GComplV2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] @@ -603,8 +1172,11 @@ instance Eq (Tree a) where (GUseComp x1,GUseComp y1) -> and [ x1 == y1 ] (LexVP x,LexVP y) -> x == y (GMkVPI x1,GMkVPI y1) -> and [ x1 == y1 ] + (GComparison_Card_Years x1,GComparison_Card_Years y1) -> and [ x1 == y1 ] (GConjPrePostVPS x1 x2 x3 x4,GConjPrePostVPS y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GConjVPS x1 x2,GConjVPS y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GGreaterThan x1,GGreaterThan y1) -> and [ x1 == y1 ] + (GLessThan x1,GLessThan y1) -> and [ x1 == y1 ] (GMayHave x1,GMayHave y1) -> and [ x1 == y1 ] (GMkVPS x1 x2 x3,GMkVPS y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (LexVS x,LexVS y) -> x == y @@ -618,13 +1190,187 @@ instance Eq (Tree a) where (GrecoverUnparsedWho x1,GrecoverUnparsedWho y1) -> and [ x1 == y1 ] (GMkYear x1 x2 x3 x4,GMkYear y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (LexYearComponent x,LexYearComponent y) -> x == y - (LexN x,LexN y) -> x == y (GString x, GString y) -> x == y (GInt x, GInt y) -> x == y (GFloat x, GFloat y) -> x == y _ -> False +instance Gf GA where + gf G_accepted_A = mkApp (mkCId "_accepted_A") [] + gf G_accidental_A = mkApp (mkCId "_accidental_A") [] + gf G_active_A = mkApp (mkCId "_active_A") [] + gf G_add_A = mkApp (mkCId "_add_A") [] + gf G_adjusted_A = mkApp (mkCId "_adjusted_A") [] + gf G_alive_A = mkApp (mkCId "_alive_A") [] + gf G_basic_A = mkApp (mkCId "_basic_A") [] + gf G_biological_A = mkApp (mkCId "_biological_A") [] + gf G_chemical_A = mkApp (mkCId "_chemical_A") [] + gf G_claimable_A = mkApp (mkCId "_claimable_A") [] + gf G_commercial_A = mkApp (mkCId "_commercial_A") [] + gf G_competitive_A = mkApp (mkCId "_competitive_A") [] + gf G_current_A = mkApp (mkCId "_current_A") [] + gf G_dangerous_A = mkApp (mkCId "_dangerous_A") [] + gf G_dead_A = mkApp (mkCId "_dead_A") [] + gf G_disabled_A = mkApp (mkCId "_disabled_A") [] + gf G_diving_A = mkApp (mkCId "_diving_A") [] + gf G_double_A = mkApp (mkCId "_double_A") [] + gf G_due_A = mkApp (mkCId "_due_A") [] + gf G_equal_A = mkApp (mkCId "_equal_A") [] + gf G_first_A = mkApp (mkCId "_first_A") [] + gf G_fit_A = mkApp (mkCId "_fit_A") [] + gf G_fractured_A = mkApp (mkCId "_fractured_A") [] + gf G_geographical_A = mkApp (mkCId "_geographical_A") [] + gf G_great_A = mkApp (mkCId "_great_A") [] + gf G_hfmd_A = mkApp (mkCId "_hfmd_A") [] + gf G_high_A = mkApp (mkCId "_high_A") [] + gf G_human_A = mkApp (mkCId "_human_A") [] + gf G_incurable_A = mkApp (mkCId "_incurable_A") [] + gf G_infectious_A = mkApp (mkCId "_infectious_A") [] + gf G_initial_A = mkApp (mkCId "_initial_A") [] + gf G_intentional_A = mkApp (mkCId "_intentional_A") [] + gf G_japanese_A = mkApp (mkCId "_japanese_A") [] + gf G_juvenile_A = mkApp (mkCId "_juvenile_A") [] + gf G_less_A = mkApp (mkCId "_less_A") [] + gf G_little_A = mkApp (mkCId "_little_A") [] + gf G_logical_A = mkApp (mkCId "_logical_A") [] + gf G_low_A = mkApp (mkCId "_low_A") [] + gf G_martial_A = mkApp (mkCId "_martial_A") [] + gf G_maximum_A = mkApp (mkCId "_maximum_A") [] + gf G_medical_A = mkApp (mkCId "_medical_A") [] + gf G_mental_A = mkApp (mkCId "_mental_A") [] + gf G_middle_A = mkApp (mkCId "_middle_A") [] + gf G_military_A = mkApp (mkCId "_military_A") [] + gf G_more_A = mkApp (mkCId "_more_A") [] + gf G_multiple_A = mkApp (mkCId "_multiple_A") [] + gf G_national_A = mkApp (mkCId "_national_A") [] + gf G_normal_A = mkApp (mkCId "_normal_A") [] + gf G_nuclear_A = mkApp (mkCId "_nuclear_A") [] + gf G_other_A = mkApp (mkCId "_other_A") [] + gf G_particular_A = mkApp (mkCId "_particular_A") [] + gf G_past_A = mkApp (mkCId "_past_A") [] + gf G_payable_A = mkApp (mkCId "_payable_A") [] + gf G_permanent_A = mkApp (mkCId "_permanent_A") [] + gf G_physical_A = mkApp (mkCId "_physical_A") [] + gf G_possible_A = mkApp (mkCId "_possible_A") [] + gf G_previous_A = mkApp (mkCId "_previous_A") [] + gf G_private_A = mkApp (mkCId "_private_A") [] + gf G_professional_A = mkApp (mkCId "_professional_A") [] + gf G_public_A = mkApp (mkCId "_public_A") [] + gf G_reckless_A = mkApp (mkCId "_reckless_A") [] + gf G_registered_A = mkApp (mkCId "_registered_A") [] + gf G_relevant_A = mkApp (mkCId "_relevant_A") [] + gf G_subject_A = mkApp (mkCId "_subject_A") [] + gf G_successful_A = mkApp (mkCId "_successful_A") [] + gf G_surgical_A = mkApp (mkCId "_surgical_A") [] + gf G_third_A = mkApp (mkCId "_third_A") [] + gf G_total_A = mkApp (mkCId "_total_A") [] + gf G_traditional_A = mkApp (mkCId "_traditional_A") [] + gf G_triple_A = mkApp (mkCId "_triple_A") [] + gf G_unlawful_A = mkApp (mkCId "_unlawful_A") [] + gf G_unnecessary_A = mkApp (mkCId "_unnecessary_A") [] + gf G_unsound_A = mkApp (mkCId "_unsound_A") [] + gf G_unsuccessful_A = mkApp (mkCId "_unsuccessful_A") [] + gf G_upscaled_A = mkApp (mkCId "_upscaled_A") [] + gf G_valid_A = mkApp (mkCId "_valid_A") [] + gf G_viral_A = mkApp (mkCId "_viral_A") [] + gf G_waterborne_A = mkApp (mkCId "_waterborne_A") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_accepted_A" -> G_accepted_A + Just (i,[]) | i == mkCId "_accidental_A" -> G_accidental_A + Just (i,[]) | i == mkCId "_active_A" -> G_active_A + Just (i,[]) | i == mkCId "_add_A" -> G_add_A + Just (i,[]) | i == mkCId "_adjusted_A" -> G_adjusted_A + Just (i,[]) | i == mkCId "_alive_A" -> G_alive_A + Just (i,[]) | i == mkCId "_basic_A" -> G_basic_A + Just (i,[]) | i == mkCId "_biological_A" -> G_biological_A + Just (i,[]) | i == mkCId "_chemical_A" -> G_chemical_A + Just (i,[]) | i == mkCId "_claimable_A" -> G_claimable_A + Just (i,[]) | i == mkCId "_commercial_A" -> G_commercial_A + Just (i,[]) | i == mkCId "_competitive_A" -> G_competitive_A + Just (i,[]) | i == mkCId "_current_A" -> G_current_A + Just (i,[]) | i == mkCId "_dangerous_A" -> G_dangerous_A + Just (i,[]) | i == mkCId "_dead_A" -> G_dead_A + Just (i,[]) | i == mkCId "_disabled_A" -> G_disabled_A + Just (i,[]) | i == mkCId "_diving_A" -> G_diving_A + Just (i,[]) | i == mkCId "_double_A" -> G_double_A + Just (i,[]) | i == mkCId "_due_A" -> G_due_A + Just (i,[]) | i == mkCId "_equal_A" -> G_equal_A + Just (i,[]) | i == mkCId "_first_A" -> G_first_A + Just (i,[]) | i == mkCId "_fit_A" -> G_fit_A + Just (i,[]) | i == mkCId "_fractured_A" -> G_fractured_A + Just (i,[]) | i == mkCId "_geographical_A" -> G_geographical_A + Just (i,[]) | i == mkCId "_great_A" -> G_great_A + Just (i,[]) | i == mkCId "_hfmd_A" -> G_hfmd_A + Just (i,[]) | i == mkCId "_high_A" -> G_high_A + Just (i,[]) | i == mkCId "_human_A" -> G_human_A + Just (i,[]) | i == mkCId "_incurable_A" -> G_incurable_A + Just (i,[]) | i == mkCId "_infectious_A" -> G_infectious_A + Just (i,[]) | i == mkCId "_initial_A" -> G_initial_A + Just (i,[]) | i == mkCId "_intentional_A" -> G_intentional_A + Just (i,[]) | i == mkCId "_japanese_A" -> G_japanese_A + Just (i,[]) | i == mkCId "_juvenile_A" -> G_juvenile_A + Just (i,[]) | i == mkCId "_less_A" -> G_less_A + Just (i,[]) | i == mkCId "_little_A" -> G_little_A + Just (i,[]) | i == mkCId "_logical_A" -> G_logical_A + Just (i,[]) | i == mkCId "_low_A" -> G_low_A + Just (i,[]) | i == mkCId "_martial_A" -> G_martial_A + Just (i,[]) | i == mkCId "_maximum_A" -> G_maximum_A + Just (i,[]) | i == mkCId "_medical_A" -> G_medical_A + Just (i,[]) | i == mkCId "_mental_A" -> G_mental_A + Just (i,[]) | i == mkCId "_middle_A" -> G_middle_A + Just (i,[]) | i == mkCId "_military_A" -> G_military_A + Just (i,[]) | i == mkCId "_more_A" -> G_more_A + Just (i,[]) | i == mkCId "_multiple_A" -> G_multiple_A + Just (i,[]) | i == mkCId "_national_A" -> G_national_A + Just (i,[]) | i == mkCId "_normal_A" -> G_normal_A + Just (i,[]) | i == mkCId "_nuclear_A" -> G_nuclear_A + Just (i,[]) | i == mkCId "_other_A" -> G_other_A + Just (i,[]) | i == mkCId "_particular_A" -> G_particular_A + Just (i,[]) | i == mkCId "_past_A" -> G_past_A + Just (i,[]) | i == mkCId "_payable_A" -> G_payable_A + Just (i,[]) | i == mkCId "_permanent_A" -> G_permanent_A + Just (i,[]) | i == mkCId "_physical_A" -> G_physical_A + Just (i,[]) | i == mkCId "_possible_A" -> G_possible_A + Just (i,[]) | i == mkCId "_previous_A" -> G_previous_A + Just (i,[]) | i == mkCId "_private_A" -> G_private_A + Just (i,[]) | i == mkCId "_professional_A" -> G_professional_A + Just (i,[]) | i == mkCId "_public_A" -> G_public_A + Just (i,[]) | i == mkCId "_reckless_A" -> G_reckless_A + Just (i,[]) | i == mkCId "_registered_A" -> G_registered_A + Just (i,[]) | i == mkCId "_relevant_A" -> G_relevant_A + Just (i,[]) | i == mkCId "_subject_A" -> G_subject_A + Just (i,[]) | i == mkCId "_successful_A" -> G_successful_A + Just (i,[]) | i == mkCId "_surgical_A" -> G_surgical_A + Just (i,[]) | i == mkCId "_third_A" -> G_third_A + Just (i,[]) | i == mkCId "_total_A" -> G_total_A + Just (i,[]) | i == mkCId "_traditional_A" -> G_traditional_A + Just (i,[]) | i == mkCId "_triple_A" -> G_triple_A + Just (i,[]) | i == mkCId "_unlawful_A" -> G_unlawful_A + Just (i,[]) | i == mkCId "_unnecessary_A" -> G_unnecessary_A + Just (i,[]) | i == mkCId "_unsound_A" -> G_unsound_A + Just (i,[]) | i == mkCId "_unsuccessful_A" -> G_unsuccessful_A + Just (i,[]) | i == mkCId "_upscaled_A" -> G_upscaled_A + Just (i,[]) | i == mkCId "_valid_A" -> G_valid_A + Just (i,[]) | i == mkCId "_viral_A" -> G_viral_A + Just (i,[]) | i == mkCId "_waterborne_A" -> G_waterborne_A + + + _ -> error ("no A " ++ show t) + +instance Gf GA2 where + gf G_located_in_A2 = mkApp (mkCId "_located_in_A2") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_located_in_A2" -> G_located_in_A2 + + + _ -> error ("no A2 " ++ show t) + instance Gf GAP where + gf (GComplA2 x1 x2) = mkApp (mkCId "ComplA2") [gf x1, gf x2] gf (GConjAP x1 x2) = mkApp (mkCId "ConjAP") [gf x1, gf x2] gf (GInt_or_older x1) = mkApp (mkCId "Int_or_older") [gf x1] gf (GPositA x1) = mkApp (mkCId "PositA") [gf x1] @@ -634,6 +1380,7 @@ instance Gf GAP where fg t = case unApp t of + Just (i,[x1,x2]) | i == mkCId "ComplA2" -> GComplA2 (fg x1) (fg x2) Just (i,[x1,x2]) | i == mkCId "ConjAP" -> GConjAP (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "Int_or_older" -> GInt_or_older (fg x1) Just (i,[x1]) | i == mkCId "PositA" -> GPositA (fg x1) @@ -660,16 +1407,45 @@ instance Gf GAdA where fg t = case unApp t of - Just (i,[]) | i == mkCId "only_AdA" -> Gonly_AdA + Just (i,[]) | i == mkCId "only_AdA" -> Gonly_AdA _ -> error ("no AdA " ++ show t) +instance Gf GAdN where + gf (GAdnCAdv x1) = mkApp (mkCId "AdnCAdv") [gf x1] + gf Gat_least_AdN = mkApp (mkCId "at_least_AdN") [] + gf Gat_most_AdN = mkApp (mkCId "at_most_AdN") [] + + fg t = + case unApp t of + Just (i,[x1]) | i == mkCId "AdnCAdv" -> GAdnCAdv (fg x1) + Just (i,[]) | i == mkCId "at_least_AdN" -> Gat_least_AdN + Just (i,[]) | i == mkCId "at_most_AdN" -> Gat_most_AdN + + + _ -> error ("no AdN " ++ show t) + instance Gf GAdv where gf (GAdAdv x1 x2) = mkApp (mkCId "AdAdv") [gf x1, gf x2] gf (GByVP x1) = mkApp (mkCId "ByVP") [gf x1] gf (GConjAdv x1 x2) = mkApp (mkCId "ConjAdv") [gf x1, gf x2] gf (GPrepNP x1 x2) = mkApp (mkCId "PrepNP") [gf x1, gf x2] + gf (GWhileDoing x1) = mkApp (mkCId "WhileDoing") [gf x1] + gf G_as_Adv = mkApp (mkCId "_as_Adv") [] + gf G_at_Adv = mkApp (mkCId "_at_Adv") [] + gf G_first_Adv = mkApp (mkCId "_first_Adv") [] + gf G_fully_Adv = mkApp (mkCId "_fully_Adv") [] + gf G_hence_Adv = mkApp (mkCId "_hence_Adv") [] + gf G_least_Adv = mkApp (mkCId "_least_Adv") [] + gf G_on_its_way_Adv = mkApp (mkCId "_on_its_way_Adv") [] + gf G_only_Adv = mkApp (mkCId "_only_Adv") [] + gf G_permanently_Adv = mkApp (mkCId "_permanently_Adv") [] + gf G_pland_Adv = mkApp (mkCId "_pland_Adv") [] + gf G_soon_Adv = mkApp (mkCId "_soon_Adv") [] + gf G_then_Adv = mkApp (mkCId "_then_Adv") [] + gf G_totally_Adv = mkApp (mkCId "_totally_Adv") [] + gf G_up_Adv = mkApp (mkCId "_up_Adv") [] gf Gin_part = mkApp (mkCId "in_part") [] gf Gin_whole = mkApp (mkCId "in_whole") [] gf (GrecoverUnparsedAdv x1) = mkApp (mkCId "recoverUnparsedAdv") [gf x1] @@ -680,26 +1456,67 @@ instance Gf GAdv where Just (i,[x1]) | i == mkCId "ByVP" -> GByVP (fg x1) Just (i,[x1,x2]) | i == mkCId "ConjAdv" -> GConjAdv (fg x1) (fg x2) Just (i,[x1,x2]) | i == mkCId "PrepNP" -> GPrepNP (fg x1) (fg x2) - Just (i,[]) | i == mkCId "in_part" -> Gin_part - Just (i,[]) | i == mkCId "in_whole" -> Gin_whole + Just (i,[x1]) | i == mkCId "WhileDoing" -> GWhileDoing (fg x1) + Just (i,[]) | i == mkCId "_as_Adv" -> G_as_Adv + Just (i,[]) | i == mkCId "_at_Adv" -> G_at_Adv + Just (i,[]) | i == mkCId "_first_Adv" -> G_first_Adv + Just (i,[]) | i == mkCId "_fully_Adv" -> G_fully_Adv + Just (i,[]) | i == mkCId "_hence_Adv" -> G_hence_Adv + Just (i,[]) | i == mkCId "_least_Adv" -> G_least_Adv + Just (i,[]) | i == mkCId "_on_its_way_Adv" -> G_on_its_way_Adv + Just (i,[]) | i == mkCId "_only_Adv" -> G_only_Adv + Just (i,[]) | i == mkCId "_permanently_Adv" -> G_permanently_Adv + Just (i,[]) | i == mkCId "_pland_Adv" -> G_pland_Adv + Just (i,[]) | i == mkCId "_soon_Adv" -> G_soon_Adv + Just (i,[]) | i == mkCId "_then_Adv" -> G_then_Adv + Just (i,[]) | i == mkCId "_totally_Adv" -> G_totally_Adv + Just (i,[]) | i == mkCId "_up_Adv" -> G_up_Adv + Just (i,[]) | i == mkCId "in_part" -> Gin_part + Just (i,[]) | i == mkCId "in_whole" -> Gin_whole Just (i,[x1]) | i == mkCId "recoverUnparsedAdv" -> GrecoverUnparsedAdv (fg x1) _ -> error ("no Adv " ++ show t) +instance Gf GCAdv where + gf Gless_CAdv = mkApp (mkCId "less_CAdv") [] + gf Gmore_CAdv = mkApp (mkCId "more_CAdv") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "less_CAdv" -> Gless_CAdv + Just (i,[]) | i == mkCId "more_CAdv" -> Gmore_CAdv + + + _ -> error ("no CAdv " ++ show t) + instance Gf GCN where gf (GAdjCN x1 x2) = mkApp (mkCId "AdjCN") [gf x1, gf x2] + gf (GCNwhereS x1 x2 x3) = mkApp (mkCId "CNwhereS") [gf x1, gf x2, gf x3] gf (GUseN x1) = mkApp (mkCId "UseN") [gf x1] gf (LexCN x) = mkApp (mkCId x) [] fg t = case unApp t of Just (i,[x1,x2]) | i == mkCId "AdjCN" -> GAdjCN (fg x1) (fg x2) + Just (i,[x1,x2,x3]) | i == mkCId "CNwhereS" -> GCNwhereS (fg x1) (fg x2) (fg x3) Just (i,[x1]) | i == mkCId "UseN" -> GUseN (fg x1) Just (i,[]) -> LexCN (showCId i) _ -> error ("no CN " ++ show t) +instance Gf GCard where + gf (GAdNum x1 x2) = mkApp (mkCId "AdNum") [gf x1, gf x2] + gf (GNumDigits x1) = mkApp (mkCId "NumDigits") [gf x1] + + fg t = + case unApp t of + Just (i,[x1,x2]) | i == mkCId "AdNum" -> GAdNum (fg x1) (fg x2) + Just (i,[x1]) | i == mkCId "NumDigits" -> GNumDigits (fg x1) + + + _ -> error ("no Card " ++ show t) + instance Gf GComp where gf (GCompAP x1) = mkApp (mkCId "CompAP") [gf x1] gf (GCompAdv x1) = mkApp (mkCId "CompAdv") [gf x1] @@ -737,11 +1554,27 @@ instance Gf GCond where instance Gf GConj where gf GAND = mkApp (mkCId "AND") [] gf GOR = mkApp (mkCId "OR") [] + gf G_and_Conj = mkApp (mkCId "_and_Conj") [] + gf G_before_Conj = mkApp (mkCId "_before_Conj") [] + gf G_both_Conj = mkApp (mkCId "_both_Conj") [] + gf G_but_Conj = mkApp (mkCId "_but_Conj") [] + gf G_if_Conj = mkApp (mkCId "_if_Conj") [] + gf G_or_Conj = mkApp (mkCId "_or_Conj") [] + gf G_that_Conj = mkApp (mkCId "_that_Conj") [] + gf G_when_Conj = mkApp (mkCId "_when_Conj") [] fg t = case unApp t of - Just (i,[]) | i == mkCId "AND" -> GAND - Just (i,[]) | i == mkCId "OR" -> GOR + Just (i,[]) | i == mkCId "AND" -> GAND + Just (i,[]) | i == mkCId "OR" -> GOR + Just (i,[]) | i == mkCId "_and_Conj" -> G_and_Conj + Just (i,[]) | i == mkCId "_before_Conj" -> G_before_Conj + Just (i,[]) | i == mkCId "_both_Conj" -> G_both_Conj + Just (i,[]) | i == mkCId "_but_Conj" -> G_but_Conj + Just (i,[]) | i == mkCId "_if_Conj" -> G_if_Conj + Just (i,[]) | i == mkCId "_or_Conj" -> G_or_Conj + Just (i,[]) | i == mkCId "_that_Conj" -> G_that_Conj + Just (i,[]) | i == mkCId "_when_Conj" -> G_when_Conj _ -> error ("no Conj " ++ show t) @@ -751,10 +1584,12 @@ instance Gf GConstraint where gf (GConjPreConstraint x1 x2 x3) = mkApp (mkCId "ConjPreConstraint") [gf x1, gf x2, gf x3] gf (GConjPrePostConstraint x1 x2 x3 x4) = mkApp (mkCId "ConjPrePostConstraint") [gf x1, gf x2, gf x3, gf x4] gf (GRPleafAP x1) = mkApp (mkCId "RPleafAP") [gf x1] + gf (GRPleafAdv x1) = mkApp (mkCId "RPleafAdv") [gf x1] gf (GRPleafNP x1) = mkApp (mkCId "RPleafNP") [gf x1] gf (GRPleafS x1 x2) = mkApp (mkCId "RPleafS") [gf x1, gf x2] gf (GRPleafVP x1) = mkApp (mkCId "RPleafVP") [gf x1] gf (GrecoverRPis x1 x2) = mkApp (mkCId "recoverRPis") [gf x1, gf x2] + gf (GrecoverRPmath x1 x2 x3) = mkApp (mkCId "recoverRPmath") [gf x1, gf x2, gf x3] gf (GrecoverUnparsedConstraint x1) = mkApp (mkCId "recoverUnparsedConstraint") [gf x1] fg t = @@ -763,10 +1598,12 @@ instance Gf GConstraint where Just (i,[x1,x2,x3]) | i == mkCId "ConjPreConstraint" -> GConjPreConstraint (fg x1) (fg x2) (fg x3) Just (i,[x1,x2,x3,x4]) | i == mkCId "ConjPrePostConstraint" -> GConjPrePostConstraint (fg x1) (fg x2) (fg x3) (fg x4) Just (i,[x1]) | i == mkCId "RPleafAP" -> GRPleafAP (fg x1) + Just (i,[x1]) | i == mkCId "RPleafAdv" -> GRPleafAdv (fg x1) Just (i,[x1]) | i == mkCId "RPleafNP" -> GRPleafNP (fg x1) Just (i,[x1,x2]) | i == mkCId "RPleafS" -> GRPleafS (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "RPleafVP" -> GRPleafVP (fg x1) Just (i,[x1,x2]) | i == mkCId "recoverRPis" -> GrecoverRPis (fg x1) (fg x2) + Just (i,[x1,x2,x3]) | i == mkCId "recoverRPmath" -> GrecoverRPmath (fg x1) (fg x2) (fg x3) Just (i,[x1]) | i == mkCId "recoverUnparsedConstraint" -> GrecoverUnparsedConstraint (fg x1) @@ -798,14 +1635,15 @@ instance Gf GDeontic where fg t = case unApp t of - Just (i,[]) | i == mkCId "MAY" -> GMAY - Just (i,[]) | i == mkCId "MUST" -> GMUST - Just (i,[]) | i == mkCId "SHANT" -> GSHANT + Just (i,[]) | i == mkCId "MAY" -> GMAY + Just (i,[]) | i == mkCId "MUST" -> GMUST + Just (i,[]) | i == mkCId "SHANT" -> GSHANT _ -> error ("no Deontic " ++ show t) instance Gf GDet where + gf GaPl = mkApp (mkCId "aPl") [] gf GaSg = mkApp (mkCId "aSg") [] gf GthePl = mkApp (mkCId "thePl") [] gf GtheSg = mkApp (mkCId "theSg") [] @@ -813,10 +1651,11 @@ instance Gf GDet where fg t = case unApp t of - Just (i,[]) | i == mkCId "aSg" -> GaSg - Just (i,[]) | i == mkCId "thePl" -> GthePl - Just (i,[]) | i == mkCId "theSg" -> GtheSg - Just (i,[]) | i == mkCId "your" -> Gyour + Just (i,[]) | i == mkCId "aPl" -> GaPl + Just (i,[]) | i == mkCId "aSg" -> GaSg + Just (i,[]) | i == mkCId "thePl" -> GthePl + Just (i,[]) | i == mkCId "theSg" -> GtheSg + Just (i,[]) | i == mkCId "your" -> Gyour _ -> error ("no Det " ++ show t) @@ -842,14 +1681,14 @@ instance Gf GDigit where fg t = case unApp t of - Just (i,[]) | i == mkCId "n2" -> Gn2 - Just (i,[]) | i == mkCId "n3" -> Gn3 - Just (i,[]) | i == mkCId "n4" -> Gn4 - Just (i,[]) | i == mkCId "n5" -> Gn5 - Just (i,[]) | i == mkCId "n6" -> Gn6 - Just (i,[]) | i == mkCId "n7" -> Gn7 - Just (i,[]) | i == mkCId "n8" -> Gn8 - Just (i,[]) | i == mkCId "n9" -> Gn9 + Just (i,[]) | i == mkCId "n2" -> Gn2 + Just (i,[]) | i == mkCId "n3" -> Gn3 + Just (i,[]) | i == mkCId "n4" -> Gn4 + Just (i,[]) | i == mkCId "n5" -> Gn5 + Just (i,[]) | i == mkCId "n6" -> Gn6 + Just (i,[]) | i == mkCId "n7" -> Gn7 + Just (i,[]) | i == mkCId "n8" -> Gn8 + Just (i,[]) | i == mkCId "n9" -> Gn9 _ -> error ("no Digit " ++ show t) @@ -1007,6 +1846,27 @@ instance Gf GMonth where Just (i,[]) -> LexMonth (showCId i) _ -> error ("no Month " ++ show t) +instance Gf GN where + gf (GCompoundN x1 x2) = mkApp (mkCId "CompoundN") [gf x1, gf x2] + gf (LexN x) = mkApp (mkCId x) [] + + fg t = + case unApp t of + Just (i,[x1,x2]) | i == mkCId "CompoundN" -> GCompoundN (fg x1) (fg x2) + + Just (i,[]) -> LexN (showCId i) + _ -> error ("no N " ++ show t) + +instance Gf GN2 where + gf G_premise_where_N2 = mkApp (mkCId "_premise_where_N2") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_premise_where_N2" -> G_premise_where_N2 + + + _ -> error ("no N2 " ++ show t) + instance Gf GNP where gf (GConjNP x1 x2) = mkApp (mkCId "ConjNP") [gf x1, gf x2] gf GContents = mkApp (mkCId "Contents") [] @@ -1015,6 +1875,7 @@ instance Gf GNP where gf GLoss_or_Damage = mkApp (mkCId "Loss_or_Damage") [] gf (GMassNP x1) = mkApp (mkCId "MassNP") [gf x1] gf GNDB_Qualification = mkApp (mkCId "NDB_Qualification") [] + gf (GUsePN x1) = mkApp (mkCId "UsePN") [gf x1] gf Ganimal = mkApp (mkCId "animal") [] gf Gany_other_exclusion = mkApp (mkCId "any_other_exclusion") [] gf Gbirds = mkApp (mkCId "birds") [] @@ -1037,30 +1898,31 @@ instance Gf GNP where fg t = case unApp t of Just (i,[x1,x2]) | i == mkCId "ConjNP" -> GConjNP (fg x1) (fg x2) - Just (i,[]) | i == mkCId "Contents" -> GContents + Just (i,[]) | i == mkCId "Contents" -> GContents Just (i,[x1,x2]) | i == mkCId "DetCN" -> GDetCN (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "GerundNP" -> GGerundNP (fg x1) - Just (i,[]) | i == mkCId "Loss_or_Damage" -> GLoss_or_Damage + Just (i,[]) | i == mkCId "Loss_or_Damage" -> GLoss_or_Damage Just (i,[x1]) | i == mkCId "MassNP" -> GMassNP (fg x1) - Just (i,[]) | i == mkCId "NDB_Qualification" -> GNDB_Qualification - Just (i,[]) | i == mkCId "animal" -> Ganimal - Just (i,[]) | i == mkCId "any_other_exclusion" -> Gany_other_exclusion - Just (i,[]) | i == mkCId "birds" -> Gbirds - Just (i,[]) | i == mkCId "cancelled" -> Gcancelled - Just (i,[]) | i == mkCId "claim" -> Gclaim - Just (i,[]) | i == mkCId "condition" -> Gcondition - Just (i,[]) | i == mkCId "household_appliance" -> Ghousehold_appliance - Just (i,[]) | i == mkCId "insects" -> Ginsects - Just (i,[]) | i == mkCId "plumbing_heating_or_AC" -> Gplumbing_heating_or_AC - Just (i,[]) | i == mkCId "premium" -> Gpremium + Just (i,[]) | i == mkCId "NDB_Qualification" -> GNDB_Qualification + Just (i,[x1]) | i == mkCId "UsePN" -> GUsePN (fg x1) + Just (i,[]) | i == mkCId "animal" -> Ganimal + Just (i,[]) | i == mkCId "any_other_exclusion" -> Gany_other_exclusion + Just (i,[]) | i == mkCId "birds" -> Gbirds + Just (i,[]) | i == mkCId "cancelled" -> Gcancelled + Just (i,[]) | i == mkCId "claim" -> Gclaim + Just (i,[]) | i == mkCId "condition" -> Gcondition + Just (i,[]) | i == mkCId "household_appliance" -> Ghousehold_appliance + Just (i,[]) | i == mkCId "insects" -> Ginsects + Just (i,[]) | i == mkCId "plumbing_heating_or_AC" -> Gplumbing_heating_or_AC + Just (i,[]) | i == mkCId "premium" -> Gpremium Just (i,[x1]) | i == mkCId "result_from" -> Gresult_from (fg x1) - Just (i,[]) | i == mkCId "rodents" -> Grodents - Just (i,[]) | i == mkCId "signed" -> Gsigned - Just (i,[]) | i == mkCId "stay_during_policy_period" -> Gstay_during_policy_period - Just (i,[]) | i == mkCId "stay_overnight" -> Gstay_overnight - Just (i,[]) | i == mkCId "swimming_pool" -> Gswimming_pool - Just (i,[]) | i == mkCId "vermin" -> Gvermin - Just (i,[]) | i == mkCId "water" -> Gwater + Just (i,[]) | i == mkCId "rodents" -> Grodents + Just (i,[]) | i == mkCId "signed" -> Gsigned + Just (i,[]) | i == mkCId "stay_during_policy_period" -> Gstay_during_policy_period + Just (i,[]) | i == mkCId "stay_overnight" -> Gstay_overnight + Just (i,[]) | i == mkCId "swimming_pool" -> Gswimming_pool + Just (i,[]) | i == mkCId "vermin" -> Gvermin + Just (i,[]) | i == mkCId "water" -> Gwater _ -> error ("no NP " ++ show t) @@ -1075,14 +1937,228 @@ instance Gf GNumeral where _ -> error ("no Numeral " ++ show t) +instance Gf GPN where + gf G_1012_PN = mkApp (mkCId "_1012_PN") [] + gf G_1013_PN = mkApp (mkCId "_1013_PN") [] + gf G_1014_PN = mkApp (mkCId "_1014_PN") [] + gf G_333A_PN = mkApp (mkCId "_333A_PN") [] + gf G_ADD_PN = mkApp (mkCId "_ADD_PN") [] + gf G_AIDS_PN = mkApp (mkCId "_AIDS_PN") [] + gf G_Accident_PN = mkApp (mkCId "_Accident_PN") [] + gf G_Accidental_PN = mkApp (mkCId "_Accidental_PN") [] + gf G_Accidents_PN = mkApp (mkCId "_Accidents_PN") [] + gf G_Address_PN = mkApp (mkCId "_Address_PN") [] + gf G_Adjustment_PN = mkApp (mkCId "_Adjustment_PN") [] + gf G_Assured_PN = mkApp (mkCId "_Assured_PN") [] + gf G_BSA_PN = mkApp (mkCId "_BSA_PN") [] + gf G_Benefit_PN = mkApp (mkCId "_Benefit_PN") [] + gf G_Cap_PN = mkApp (mkCId "_Cap_PN") [] + gf G_Claim_PN = mkApp (mkCId "_Claim_PN") [] + gf G_CoV_PN = mkApp (mkCId "_CoV_PN") [] + gf G_Conditions_PN = mkApp (mkCId "_Conditions_PN") [] + gf G_Date_PN = mkApp (mkCId "_Date_PN") [] + gf G_Death_PN = mkApp (mkCId "_Death_PN") [] + gf G_Details_PN = mkApp (mkCId "_Details_PN") [] + gf G_Disease_PN = mkApp (mkCId "_Disease_PN") [] + gf G_Dismemberment_PN = mkApp (mkCId "_Dismemberment_PN") [] + gf G_Event_PN = mkApp (mkCId "_Event_PN") [] + gf G_Expense_PN = mkApp (mkCId "_Expense_PN") [] + gf G_Flu_PN = mkApp (mkCId "_Flu_PN") [] + gf G_H5N1_PN = mkApp (mkCId "_H5N1_PN") [] + gf G_H7N9_PN = mkApp (mkCId "_H7N9_PN") [] + gf G_H7N_PN = mkApp (mkCId "_H7N_PN") [] + gf G_H9N2_PN = mkApp (mkCId "_H9N2_PN") [] + gf G_HAS_PN = mkApp (mkCId "_HAS_PN") [] + gf G_Head_PN = mkApp (mkCId "_Head_PN") [] + gf G_Health_PN = mkApp (mkCId "_Health_PN") [] + gf G_Influenza_PN = mkApp (mkCId "_Influenza_PN") [] + gf G_Injury_PN = mkApp (mkCId "_Injury_PN") [] + gf G_Insurer_PN = mkApp (mkCId "_Insurer_PN") [] + gf G_LA_PN = mkApp (mkCId "_LA_PN") [] + gf G_LE_PN = mkApp (mkCId "_LE_PN") [] + gf G_Leg_PN = mkApp (mkCId "_Leg_PN") [] + gf G_Legionnaires_PN = mkApp (mkCId "_Legionnaires_PN") [] + gf G_Life_PN = mkApp (mkCId "_Life_PN") [] + gf G_Limit_PN = mkApp (mkCId "_Limit_PN") [] + gf G_MAP_PN = mkApp (mkCId "_MAP_PN") [] + gf G_MIN_PN = mkApp (mkCId "_MIN_PN") [] + gf G_MR_PN = mkApp (mkCId "_MR_PN") [] + gf G_M_PN = mkApp (mkCId "_M_PN") [] + gf G_Medicine_PN = mkApp (mkCId "_Medicine_PN") [] + gf G_Melioidosis_PN = mkApp (mkCId "_Melioidosis_PN") [] + gf G_Ministry_PN = mkApp (mkCId "_Ministry_PN") [] + gf G_Mumps_PN = mkApp (mkCId "_Mumps_PN") [] + gf G_N_PN = mkApp (mkCId "_N_PN") [] + gf G_Nipah_PN = mkApp (mkCId "_Nipah_PN") [] + gf G_Ontology_PN = mkApp (mkCId "_Ontology_PN") [] + gf G_PS_PN = mkApp (mkCId "_PS_PN") [] + gf G_Plan14_PN = mkApp (mkCId "_Plan14_PN") [] + gf G_PlanAF_PN = mkApp (mkCId "_PlanAF_PN") [] + gf G_PolicyHolder_PN = mkApp (mkCId "_PolicyHolder_PN") [] + gf G_Policy_PN = mkApp (mkCId "_Policy_PN") [] + gf G_RETURN_PN = mkApp (mkCId "_RETURN_PN") [] + gf G_Reductions_PN = mkApp (mkCId "_Reductions_PN") [] + gf G_Removal_PN = mkApp (mkCId "_Removal_PN") [] + gf G_Republic_PN = mkApp (mkCId "_Republic_PN") [] + gf G_SA_PN = mkApp (mkCId "_SA_PN") [] + gf G_SG_PN = mkApp (mkCId "_SG_PN") [] + gf G_Schedule_PN = mkApp (mkCId "_Schedule_PN") [] + gf G_Section_PN = mkApp (mkCId "_Section_PN") [] + gf G_Service_PN = mkApp (mkCId "_Service_PN") [] + gf G_Singapore_PN = mkApp (mkCId "_Singapore_PN") [] + gf G_Step_PN = mkApp (mkCId "_Step_PN") [] + gf G_Subscribed_PN = mkApp (mkCId "_Subscribed_PN") [] + gf G_TABLE_PN = mkApp (mkCId "_TABLE_PN") [] + gf G_Teeth_PN = mkApp (mkCId "_Teeth_PN") [] + gf G_Triple_PN = mkApp (mkCId "_Triple_PN") [] + gf G_Type_PN = mkApp (mkCId "_Type_PN") [] + gf G_Types_PN = mkApp (mkCId "_Types_PN") [] + gf G_UPON_PN = mkApp (mkCId "_UPON_PN") [] + gf G_Wife_PN = mkApp (mkCId "_Wife_PN") [] + gf G_Yellow_PN = mkApp (mkCId "_Yellow_PN") [] + gf G_addSA_PN = mkApp (mkCId "_addSA_PN") [] + gf G_benADD_PN = mkApp (mkCId "_benADD_PN") [] + gf G_benADDs_PN = mkApp (mkCId "_benADDs_PN") [] + gf G_benRA_PN = mkApp (mkCId "_benRA_PN") [] + gf G_benTCM_PN = mkApp (mkCId "_benTCM_PN") [] + gf G_circ_PN = mkApp (mkCId "_circ_PN") [] + gf G_dTime_PN = mkApp (mkCId "_dTime_PN") [] + gf G_dType_PN = mkApp (mkCId "_dType_PN") [] + gf G_diving_PN = mkApp (mkCId "_diving_PN") [] + gf G_holder_PN = mkApp (mkCId "_holder_PN") [] + gf G_motocross_PN = mkApp (mkCId "_motocross_PN") [] + gf G_p_PN = mkApp (mkCId "_p_PN") [] + gf G_plan3_PN = mkApp (mkCId "_plan3_PN") [] + gf G_plan4_PN = mkApp (mkCId "_plan4_PN") [] + gf G_planAF_PN = mkApp (mkCId "_planAF_PN") [] + gf G_planB_PN = mkApp (mkCId "_planB_PN") [] + gf G_planC_PN = mkApp (mkCId "_planC_PN") [] + gf G_planE_PN = mkApp (mkCId "_planE_PN") [] + gf G_planF_PN = mkApp (mkCId "_planF_PN") [] + gf G_policyHolder_PN = mkApp (mkCId "_policyHolder_PN") [] + gf G_qualifies_for_add_PN = mkApp (mkCId "_qualifies_for_add_PN") [] + gf G_schema_PN = mkApp (mkCId "_schema_PN") [] + gf G_sum_list_PN = mkApp (mkCId "_sum_list_PN") [] + gf G_x_PN = mkApp (mkCId "_x_PN") [] + gf G_y_PN = mkApp (mkCId "_y_PN") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_1012_PN" -> G_1012_PN + Just (i,[]) | i == mkCId "_1013_PN" -> G_1013_PN + Just (i,[]) | i == mkCId "_1014_PN" -> G_1014_PN + Just (i,[]) | i == mkCId "_333A_PN" -> G_333A_PN + Just (i,[]) | i == mkCId "_ADD_PN" -> G_ADD_PN + Just (i,[]) | i == mkCId "_AIDS_PN" -> G_AIDS_PN + Just (i,[]) | i == mkCId "_Accident_PN" -> G_Accident_PN + Just (i,[]) | i == mkCId "_Accidental_PN" -> G_Accidental_PN + Just (i,[]) | i == mkCId "_Accidents_PN" -> G_Accidents_PN + Just (i,[]) | i == mkCId "_Address_PN" -> G_Address_PN + Just (i,[]) | i == mkCId "_Adjustment_PN" -> G_Adjustment_PN + Just (i,[]) | i == mkCId "_Assured_PN" -> G_Assured_PN + Just (i,[]) | i == mkCId "_BSA_PN" -> G_BSA_PN + Just (i,[]) | i == mkCId "_Benefit_PN" -> G_Benefit_PN + Just (i,[]) | i == mkCId "_Cap_PN" -> G_Cap_PN + Just (i,[]) | i == mkCId "_Claim_PN" -> G_Claim_PN + Just (i,[]) | i == mkCId "_CoV_PN" -> G_CoV_PN + Just (i,[]) | i == mkCId "_Conditions_PN" -> G_Conditions_PN + Just (i,[]) | i == mkCId "_Date_PN" -> G_Date_PN + Just (i,[]) | i == mkCId "_Death_PN" -> G_Death_PN + Just (i,[]) | i == mkCId "_Details_PN" -> G_Details_PN + Just (i,[]) | i == mkCId "_Disease_PN" -> G_Disease_PN + Just (i,[]) | i == mkCId "_Dismemberment_PN" -> G_Dismemberment_PN + Just (i,[]) | i == mkCId "_Event_PN" -> G_Event_PN + Just (i,[]) | i == mkCId "_Expense_PN" -> G_Expense_PN + Just (i,[]) | i == mkCId "_Flu_PN" -> G_Flu_PN + Just (i,[]) | i == mkCId "_H5N1_PN" -> G_H5N1_PN + Just (i,[]) | i == mkCId "_H7N9_PN" -> G_H7N9_PN + Just (i,[]) | i == mkCId "_H7N_PN" -> G_H7N_PN + Just (i,[]) | i == mkCId "_H9N2_PN" -> G_H9N2_PN + Just (i,[]) | i == mkCId "_HAS_PN" -> G_HAS_PN + Just (i,[]) | i == mkCId "_Head_PN" -> G_Head_PN + Just (i,[]) | i == mkCId "_Health_PN" -> G_Health_PN + Just (i,[]) | i == mkCId "_Influenza_PN" -> G_Influenza_PN + Just (i,[]) | i == mkCId "_Injury_PN" -> G_Injury_PN + Just (i,[]) | i == mkCId "_Insurer_PN" -> G_Insurer_PN + Just (i,[]) | i == mkCId "_LA_PN" -> G_LA_PN + Just (i,[]) | i == mkCId "_LE_PN" -> G_LE_PN + Just (i,[]) | i == mkCId "_Leg_PN" -> G_Leg_PN + Just (i,[]) | i == mkCId "_Legionnaires_PN" -> G_Legionnaires_PN + Just (i,[]) | i == mkCId "_Life_PN" -> G_Life_PN + Just (i,[]) | i == mkCId "_Limit_PN" -> G_Limit_PN + Just (i,[]) | i == mkCId "_MAP_PN" -> G_MAP_PN + Just (i,[]) | i == mkCId "_MIN_PN" -> G_MIN_PN + Just (i,[]) | i == mkCId "_MR_PN" -> G_MR_PN + Just (i,[]) | i == mkCId "_M_PN" -> G_M_PN + Just (i,[]) | i == mkCId "_Medicine_PN" -> G_Medicine_PN + Just (i,[]) | i == mkCId "_Melioidosis_PN" -> G_Melioidosis_PN + Just (i,[]) | i == mkCId "_Ministry_PN" -> G_Ministry_PN + Just (i,[]) | i == mkCId "_Mumps_PN" -> G_Mumps_PN + Just (i,[]) | i == mkCId "_N_PN" -> G_N_PN + Just (i,[]) | i == mkCId "_Nipah_PN" -> G_Nipah_PN + Just (i,[]) | i == mkCId "_Ontology_PN" -> G_Ontology_PN + Just (i,[]) | i == mkCId "_PS_PN" -> G_PS_PN + Just (i,[]) | i == mkCId "_Plan14_PN" -> G_Plan14_PN + Just (i,[]) | i == mkCId "_PlanAF_PN" -> G_PlanAF_PN + Just (i,[]) | i == mkCId "_PolicyHolder_PN" -> G_PolicyHolder_PN + Just (i,[]) | i == mkCId "_Policy_PN" -> G_Policy_PN + Just (i,[]) | i == mkCId "_RETURN_PN" -> G_RETURN_PN + Just (i,[]) | i == mkCId "_Reductions_PN" -> G_Reductions_PN + Just (i,[]) | i == mkCId "_Removal_PN" -> G_Removal_PN + Just (i,[]) | i == mkCId "_Republic_PN" -> G_Republic_PN + Just (i,[]) | i == mkCId "_SA_PN" -> G_SA_PN + Just (i,[]) | i == mkCId "_SG_PN" -> G_SG_PN + Just (i,[]) | i == mkCId "_Schedule_PN" -> G_Schedule_PN + Just (i,[]) | i == mkCId "_Section_PN" -> G_Section_PN + Just (i,[]) | i == mkCId "_Service_PN" -> G_Service_PN + Just (i,[]) | i == mkCId "_Singapore_PN" -> G_Singapore_PN + Just (i,[]) | i == mkCId "_Step_PN" -> G_Step_PN + Just (i,[]) | i == mkCId "_Subscribed_PN" -> G_Subscribed_PN + Just (i,[]) | i == mkCId "_TABLE_PN" -> G_TABLE_PN + Just (i,[]) | i == mkCId "_Teeth_PN" -> G_Teeth_PN + Just (i,[]) | i == mkCId "_Triple_PN" -> G_Triple_PN + Just (i,[]) | i == mkCId "_Type_PN" -> G_Type_PN + Just (i,[]) | i == mkCId "_Types_PN" -> G_Types_PN + Just (i,[]) | i == mkCId "_UPON_PN" -> G_UPON_PN + Just (i,[]) | i == mkCId "_Wife_PN" -> G_Wife_PN + Just (i,[]) | i == mkCId "_Yellow_PN" -> G_Yellow_PN + Just (i,[]) | i == mkCId "_addSA_PN" -> G_addSA_PN + Just (i,[]) | i == mkCId "_benADD_PN" -> G_benADD_PN + Just (i,[]) | i == mkCId "_benADDs_PN" -> G_benADDs_PN + Just (i,[]) | i == mkCId "_benRA_PN" -> G_benRA_PN + Just (i,[]) | i == mkCId "_benTCM_PN" -> G_benTCM_PN + Just (i,[]) | i == mkCId "_circ_PN" -> G_circ_PN + Just (i,[]) | i == mkCId "_dTime_PN" -> G_dTime_PN + Just (i,[]) | i == mkCId "_dType_PN" -> G_dType_PN + Just (i,[]) | i == mkCId "_diving_PN" -> G_diving_PN + Just (i,[]) | i == mkCId "_holder_PN" -> G_holder_PN + Just (i,[]) | i == mkCId "_motocross_PN" -> G_motocross_PN + Just (i,[]) | i == mkCId "_p_PN" -> G_p_PN + Just (i,[]) | i == mkCId "_plan3_PN" -> G_plan3_PN + Just (i,[]) | i == mkCId "_plan4_PN" -> G_plan4_PN + Just (i,[]) | i == mkCId "_planAF_PN" -> G_planAF_PN + Just (i,[]) | i == mkCId "_planB_PN" -> G_planB_PN + Just (i,[]) | i == mkCId "_planC_PN" -> G_planC_PN + Just (i,[]) | i == mkCId "_planE_PN" -> G_planE_PN + Just (i,[]) | i == mkCId "_planF_PN" -> G_planF_PN + Just (i,[]) | i == mkCId "_policyHolder_PN" -> G_policyHolder_PN + Just (i,[]) | i == mkCId "_qualifies_for_add_PN" -> G_qualifies_for_add_PN + Just (i,[]) | i == mkCId "_schema_PN" -> G_schema_PN + Just (i,[]) | i == mkCId "_sum_list_PN" -> G_sum_list_PN + Just (i,[]) | i == mkCId "_x_PN" -> G_x_PN + Just (i,[]) | i == mkCId "_y_PN" -> G_y_PN + + + _ -> error ("no PN " ++ show t) + instance Gf GPol where gf GNEG = mkApp (mkCId "NEG") [] gf GPOS = mkApp (mkCId "POS") [] fg t = case unApp t of - Just (i,[]) | i == mkCId "NEG" -> GNEG - Just (i,[]) | i == mkCId "POS" -> GPOS + Just (i,[]) | i == mkCId "NEG" -> GNEG + Just (i,[]) | i == mkCId "POS" -> GPOS _ -> error ("no Pol " ++ show t) @@ -1093,6 +2169,7 @@ instance Gf GPrePost where gf (GNP_PrePost x1) = mkApp (mkCId "NP_PrePost") [gf x1] gf (GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4) = mkApp (mkCId "NP_caused_NP_to_VP_Prep_PrePost") [gf x1, gf x2, gf x3, gf x4] gf (GNP_caused_by_PrePost x1) = mkApp (mkCId "NP_caused_by_PrePost") [gf x1] + gf (GS_PrePost x1 x2) = mkApp (mkCId "S_PrePost") [gf x1, gf x2] gf (GV2_PrePost x1) = mkApp (mkCId "V2_PrePost") [gf x1] gf (GrecoverUnparsedPrePost x1) = mkApp (mkCId "recoverUnparsedPrePost") [gf x1] @@ -1103,6 +2180,7 @@ instance Gf GPrePost where Just (i,[x1]) | i == mkCId "NP_PrePost" -> GNP_PrePost (fg x1) Just (i,[x1,x2,x3,x4]) | i == mkCId "NP_caused_NP_to_VP_Prep_PrePost" -> GNP_caused_NP_to_VP_Prep_PrePost (fg x1) (fg x2) (fg x3) (fg x4) Just (i,[x1]) | i == mkCId "NP_caused_by_PrePost" -> GNP_caused_by_PrePost (fg x1) + Just (i,[x1,x2]) | i == mkCId "S_PrePost" -> GS_PrePost (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "V2_PrePost" -> GV2_PrePost (fg x1) Just (i,[x1]) | i == mkCId "recoverUnparsedPrePost" -> GrecoverUnparsedPrePost (fg x1) @@ -1111,6 +2189,30 @@ instance Gf GPrePost where instance Gf GPrep where gf (GConjPrep x1 x2) = mkApp (mkCId "ConjPrep") [gf x1, gf x2] + gf G_across_Prep = mkApp (mkCId "_across_Prep") [] + gf G_after_Prep = mkApp (mkCId "_after_Prep") [] + gf G_as_Prep = mkApp (mkCId "_as_Prep") [] + gf G_at_Prep = mkApp (mkCId "_at_Prep") [] + gf G_before_Prep = mkApp (mkCId "_before_Prep") [] + gf G_between_Prep = mkApp (mkCId "_between_Prep") [] + gf G_by_Prep = mkApp (mkCId "_by_Prep") [] + gf G_during_Prep = mkApp (mkCId "_during_Prep") [] + gf G_for_Prep = mkApp (mkCId "_for_Prep") [] + gf G_from_Prep = mkApp (mkCId "_from_Prep") [] + gf G_in_Prep = mkApp (mkCId "_in_Prep") [] + gf G_into_Prep = mkApp (mkCId "_into_Prep") [] + gf G_of_Prep = mkApp (mkCId "_of_Prep") [] + gf G_on_Prep = mkApp (mkCId "_on_Prep") [] + gf G_out_Prep = mkApp (mkCId "_out_Prep") [] + gf G_over_Prep = mkApp (mkCId "_over_Prep") [] + gf G_per_Prep = mkApp (mkCId "_per_Prep") [] + gf G_than_Prep = mkApp (mkCId "_than_Prep") [] + gf G_through_Prep = mkApp (mkCId "_through_Prep") [] + gf G_to_Prep = mkApp (mkCId "_to_Prep") [] + gf G_under_Prep = mkApp (mkCId "_under_Prep") [] + gf G_up_Prep = mkApp (mkCId "_up_Prep") [] + gf G_with_Prep = mkApp (mkCId "_with_Prep") [] + gf G_within_Prep = mkApp (mkCId "_within_Prep") [] gf Gabout_Prep = mkApp (mkCId "about_Prep") [] gf Gafter_Prep = mkApp (mkCId "after_Prep") [] gf Gbefore_Prep = mkApp (mkCId "before_Prep") [] @@ -1124,15 +2226,39 @@ instance Gf GPrep where fg t = case unApp t of Just (i,[x1,x2]) | i == mkCId "ConjPrep" -> GConjPrep (fg x1) (fg x2) - Just (i,[]) | i == mkCId "about_Prep" -> Gabout_Prep - Just (i,[]) | i == mkCId "after_Prep" -> Gafter_Prep - Just (i,[]) | i == mkCId "before_Prep" -> Gbefore_Prep - Just (i,[]) | i == mkCId "for_Prep" -> Gfor_Prep - Just (i,[]) | i == mkCId "from_Prep" -> Gfrom_Prep - Just (i,[]) | i == mkCId "on_Prep" -> Gon_Prep - Just (i,[]) | i == mkCId "possess_Prep" -> Gpossess_Prep - Just (i,[]) | i == mkCId "to_Prep" -> Gto_Prep - Just (i,[]) | i == mkCId "within_Prep" -> Gwithin_Prep + Just (i,[]) | i == mkCId "_across_Prep" -> G_across_Prep + Just (i,[]) | i == mkCId "_after_Prep" -> G_after_Prep + Just (i,[]) | i == mkCId "_as_Prep" -> G_as_Prep + Just (i,[]) | i == mkCId "_at_Prep" -> G_at_Prep + Just (i,[]) | i == mkCId "_before_Prep" -> G_before_Prep + Just (i,[]) | i == mkCId "_between_Prep" -> G_between_Prep + Just (i,[]) | i == mkCId "_by_Prep" -> G_by_Prep + Just (i,[]) | i == mkCId "_during_Prep" -> G_during_Prep + Just (i,[]) | i == mkCId "_for_Prep" -> G_for_Prep + Just (i,[]) | i == mkCId "_from_Prep" -> G_from_Prep + Just (i,[]) | i == mkCId "_in_Prep" -> G_in_Prep + Just (i,[]) | i == mkCId "_into_Prep" -> G_into_Prep + Just (i,[]) | i == mkCId "_of_Prep" -> G_of_Prep + Just (i,[]) | i == mkCId "_on_Prep" -> G_on_Prep + Just (i,[]) | i == mkCId "_out_Prep" -> G_out_Prep + Just (i,[]) | i == mkCId "_over_Prep" -> G_over_Prep + Just (i,[]) | i == mkCId "_per_Prep" -> G_per_Prep + Just (i,[]) | i == mkCId "_than_Prep" -> G_than_Prep + Just (i,[]) | i == mkCId "_through_Prep" -> G_through_Prep + Just (i,[]) | i == mkCId "_to_Prep" -> G_to_Prep + Just (i,[]) | i == mkCId "_under_Prep" -> G_under_Prep + Just (i,[]) | i == mkCId "_up_Prep" -> G_up_Prep + Just (i,[]) | i == mkCId "_with_Prep" -> G_with_Prep + Just (i,[]) | i == mkCId "_within_Prep" -> G_within_Prep + Just (i,[]) | i == mkCId "about_Prep" -> Gabout_Prep + Just (i,[]) | i == mkCId "after_Prep" -> Gafter_Prep + Just (i,[]) | i == mkCId "before_Prep" -> Gbefore_Prep + Just (i,[]) | i == mkCId "for_Prep" -> Gfor_Prep + Just (i,[]) | i == mkCId "from_Prep" -> Gfrom_Prep + Just (i,[]) | i == mkCId "on_Prep" -> Gon_Prep + Just (i,[]) | i == mkCId "possess_Prep" -> Gpossess_Prep + Just (i,[]) | i == mkCId "to_Prep" -> Gto_Prep + Just (i,[]) | i == mkCId "within_Prep" -> Gwithin_Prep _ -> error ("no Prep " ++ show t) @@ -1172,7 +2298,7 @@ instance Gf GSub10 where fg t = case unApp t of Just (i,[x1]) | i == mkCId "pot0" -> Gpot0 (fg x1) - Just (i,[]) | i == mkCId "pot01" -> Gpot01 + Just (i,[]) | i == mkCId "pot01" -> Gpot01 _ -> error ("no Sub10 " ++ show t) @@ -1189,8 +2315,8 @@ instance Gf GSub100 where case unApp t of Just (i,[x1]) | i == mkCId "pot0as1" -> Gpot0as1 (fg x1) Just (i,[x1]) | i == mkCId "pot1" -> Gpot1 (fg x1) - Just (i,[]) | i == mkCId "pot110" -> Gpot110 - Just (i,[]) | i == mkCId "pot111" -> Gpot111 + Just (i,[]) | i == mkCId "pot110" -> Gpot110 + Just (i,[]) | i == mkCId "pot111" -> Gpot111 Just (i,[x1,x2]) | i == mkCId "pot1plus" -> Gpot1plus (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "pot1to19" -> Gpot1to19 (fg x1) @@ -1207,7 +2333,7 @@ instance Gf GSub1000 where case unApp t of Just (i,[x1]) | i == mkCId "pot1as2" -> Gpot1as2 (fg x1) Just (i,[x1]) | i == mkCId "pot2" -> Gpot2 (fg x1) - Just (i,[]) | i == mkCId "pot21" -> Gpot21 + Just (i,[]) | i == mkCId "pot21" -> Gpot21 Just (i,[x1,x2]) | i == mkCId "pot2plus" -> Gpot2plus (fg x1) (fg x2) @@ -1224,7 +2350,7 @@ instance Gf GSub1000000 where case unApp t of Just (i,[x1]) | i == mkCId "pot2as3" -> Gpot2as3 (fg x1) Just (i,[x1]) | i == mkCId "pot3" -> Gpot3 (fg x1) - Just (i,[]) | i == mkCId "pot31" -> Gpot31 + Just (i,[]) | i == mkCId "pot31" -> Gpot31 Just (i,[x1]) | i == mkCId "pot3float" -> Gpot3float (fg x1) Just (i,[x1,x2]) | i == mkCId "pot3plus" -> Gpot3plus (fg x1) (fg x2) @@ -1242,7 +2368,7 @@ instance Gf GSub1000000000 where case unApp t of Just (i,[x1]) | i == mkCId "pot3as4" -> Gpot3as4 (fg x1) Just (i,[x1]) | i == mkCId "pot4" -> Gpot4 (fg x1) - Just (i,[]) | i == mkCId "pot41" -> Gpot41 + Just (i,[]) | i == mkCId "pot41" -> Gpot41 Just (i,[x1]) | i == mkCId "pot4float" -> Gpot4float (fg x1) Just (i,[x1,x2]) | i == mkCId "pot4plus" -> Gpot4plus (fg x1) (fg x2) @@ -1260,7 +2386,7 @@ instance Gf GSub1000000000000 where case unApp t of Just (i,[x1]) | i == mkCId "pot4as5" -> Gpot4as5 (fg x1) Just (i,[x1]) | i == mkCId "pot5" -> Gpot5 (fg x1) - Just (i,[]) | i == mkCId "pot51" -> Gpot51 + Just (i,[]) | i == mkCId "pot51" -> Gpot51 Just (i,[x1]) | i == mkCId "pot5float" -> Gpot5float (fg x1) Just (i,[x1,x2]) | i == mkCId "pot5plus" -> Gpot5plus (fg x1) (fg x2) @@ -1283,7 +2409,7 @@ instance Gf GSubj where Just (i,[x1]) | i == mkCId "PARTY" -> GPARTY (fg x1) Just (i,[x1,x2]) | i == mkCId "SubjWho" -> GSubjWho (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "THE" -> GTHE (fg x1) - Just (i,[]) | i == mkCId "You" -> GYou + Just (i,[]) | i == mkCId "You" -> GYou Just (i,[x1]) | i == mkCId "recoverUnparsedSubj" -> GrecoverUnparsedSubj (fg x1) @@ -1299,12 +2425,12 @@ instance Gf GTComparison where fg t = case unApp t of - Just (i,[]) | i == mkCId "AFTER" -> GAFTER - Just (i,[]) | i == mkCId "BEFORE" -> GBEFORE - Just (i,[]) | i == mkCId "BY" -> GBY + Just (i,[]) | i == mkCId "AFTER" -> GAFTER + Just (i,[]) | i == mkCId "BEFORE" -> GBEFORE + Just (i,[]) | i == mkCId "BY" -> GBY Just (i,[x1,x2]) | i == mkCId "ConjTComparison" -> GConjTComparison (fg x1) (fg x2) - Just (i,[]) | i == mkCId "ON" -> GON - Just (i,[]) | i == mkCId "VAGUE" -> GVAGUE + Just (i,[]) | i == mkCId "ON" -> GON + Just (i,[]) | i == mkCId "VAGUE" -> GVAGUE _ -> error ("no TComparison " ++ show t) @@ -1316,9 +2442,9 @@ instance Gf GTemp where fg t = case unApp t of - Just (i,[]) | i == mkCId "pastSimul" -> GpastSimul - Just (i,[]) | i == mkCId "presAnt" -> GpresAnt - Just (i,[]) | i == mkCId "presSimul" -> GpresSimul + Just (i,[]) | i == mkCId "pastSimul" -> GpastSimul + Just (i,[]) | i == mkCId "presAnt" -> GpresAnt + Just (i,[]) | i == mkCId "presSimul" -> GpresSimul _ -> error ("no Temp " ++ show t) @@ -1371,9 +2497,9 @@ instance Gf GTimeUnit where fg t = case unApp t of - Just (i,[]) | i == mkCId "Day_Unit" -> GDay_Unit - Just (i,[]) | i == mkCId "Month_Unit" -> GMonth_Unit - Just (i,[]) | i == mkCId "Year_Unit" -> GYear_Unit + Just (i,[]) | i == mkCId "Day_Unit" -> GDay_Unit + Just (i,[]) | i == mkCId "Month_Unit" -> GMonth_Unit + Just (i,[]) | i == mkCId "Year_Unit" -> GYear_Unit Just (i,[x1]) | i == mkCId "recoverUnparsedTimeUnit" -> GrecoverUnparsedTimeUnit (fg x1) @@ -1391,6 +2517,100 @@ instance Gf GUpon where _ -> error ("no Upon " ++ show t) +instance Gf GV where + gf G_H7N7_V = mkApp (mkCId "_H7N7_V") [] + gf G_adjust_V = mkApp (mkCId "_adjust_V") [] + gf G_apply_V = mkApp (mkCId "_apply_V") [] + gf G_asssure_V = mkApp (mkCId "_asssure_V") [] + gf G_assure_V = mkApp (mkCId "_assure_V") [] + gf G_benefit_V = mkApp (mkCId "_benefit_V") [] + gf G_canoe_V = mkApp (mkCId "_canoe_V") [] + gf G_cave_V = mkApp (mkCId "_cave_V") [] + gf G_claim_V = mkApp (mkCId "_claim_V") [] + gf G_cover_V = mkApp (mkCId "_cover_V") [] + gf G_establish_V = mkApp (mkCId "_establish_V") [] + gf G_exception_V = mkApp (mkCId "_exception_V") [] + gf G_give_V = mkApp (mkCId "_give_V") [] + gf G_glide_V = mkApp (mkCId "_glide_V") [] + gf G_govern_V = mkApp (mkCId "_govern_V") [] + gf G_hand_V = mkApp (mkCId "_hand_V") [] + gf G_hernia_V = mkApp (mkCId "_hernia_V") [] + gf G_hunt_V = mkApp (mkCId "_hunt_V") [] + gf G_include_V = mkApp (mkCId "_include_V") [] + gf G_license_V = mkApp (mkCId "_license_V") [] + gf G_mean_V = mkApp (mkCId "_mean_V") [] + gf G_met_common_requirement_for_add_V = mkApp (mkCId "_met_common_requirement_for_add_V") [] + gf G_mountaineer_V = mkApp (mkCId "_mountaineer_V") [] + gf G_occur_V = mkApp (mkCId "_occur_V") [] + gf G_organise_V = mkApp (mkCId "_organise_V") [] + gf G_parachute_V = mkApp (mkCId "_parachute_V") [] + gf G_pay_V = mkApp (mkCId "_pay_V") [] + gf G_policyholder_V = mkApp (mkCId "_policyholder_V") [] + gf G_pothole_V = mkApp (mkCId "_pothole_V") [] + gf G_race_V = mkApp (mkCId "_race_V") [] + gf G_recognise_V = mkApp (mkCId "_recognise_V") [] + gf G_register_V = mkApp (mkCId "_register_V") [] + gf G_riot_V = mkApp (mkCId "_riot_V") [] + gf G_sail_V = mkApp (mkCId "_sail_V") [] + gf G_skydive_V = mkApp (mkCId "_skydive_V") [] + gf G_start_V = mkApp (mkCId "_start_V") [] + gf G_stepupsumassure_V = mkApp (mkCId "_stepupsumassure_V") [] + gf G_subscribe_V = mkApp (mkCId "_subscribe_V") [] + gf G_suffer_V = mkApp (mkCId "_suffer_V") [] + gf G_sumassure_V = mkApp (mkCId "_sumassure_V") [] + gf G_supervise_V = mkApp (mkCId "_supervise_V") [] + gf G_train_V = mkApp (mkCId "_train_V") [] + gf G_windsurf_V = mkApp (mkCId "_windsurf_V") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_H7N7_V" -> G_H7N7_V + Just (i,[]) | i == mkCId "_adjust_V" -> G_adjust_V + Just (i,[]) | i == mkCId "_apply_V" -> G_apply_V + Just (i,[]) | i == mkCId "_asssure_V" -> G_asssure_V + Just (i,[]) | i == mkCId "_assure_V" -> G_assure_V + Just (i,[]) | i == mkCId "_benefit_V" -> G_benefit_V + Just (i,[]) | i == mkCId "_canoe_V" -> G_canoe_V + Just (i,[]) | i == mkCId "_cave_V" -> G_cave_V + Just (i,[]) | i == mkCId "_claim_V" -> G_claim_V + Just (i,[]) | i == mkCId "_cover_V" -> G_cover_V + Just (i,[]) | i == mkCId "_establish_V" -> G_establish_V + Just (i,[]) | i == mkCId "_exception_V" -> G_exception_V + Just (i,[]) | i == mkCId "_give_V" -> G_give_V + Just (i,[]) | i == mkCId "_glide_V" -> G_glide_V + Just (i,[]) | i == mkCId "_govern_V" -> G_govern_V + Just (i,[]) | i == mkCId "_hand_V" -> G_hand_V + Just (i,[]) | i == mkCId "_hernia_V" -> G_hernia_V + Just (i,[]) | i == mkCId "_hunt_V" -> G_hunt_V + Just (i,[]) | i == mkCId "_include_V" -> G_include_V + Just (i,[]) | i == mkCId "_license_V" -> G_license_V + Just (i,[]) | i == mkCId "_mean_V" -> G_mean_V + Just (i,[]) | i == mkCId "_met_common_requirement_for_add_V" -> G_met_common_requirement_for_add_V + Just (i,[]) | i == mkCId "_mountaineer_V" -> G_mountaineer_V + Just (i,[]) | i == mkCId "_occur_V" -> G_occur_V + Just (i,[]) | i == mkCId "_organise_V" -> G_organise_V + Just (i,[]) | i == mkCId "_parachute_V" -> G_parachute_V + Just (i,[]) | i == mkCId "_pay_V" -> G_pay_V + Just (i,[]) | i == mkCId "_policyholder_V" -> G_policyholder_V + Just (i,[]) | i == mkCId "_pothole_V" -> G_pothole_V + Just (i,[]) | i == mkCId "_race_V" -> G_race_V + Just (i,[]) | i == mkCId "_recognise_V" -> G_recognise_V + Just (i,[]) | i == mkCId "_register_V" -> G_register_V + Just (i,[]) | i == mkCId "_riot_V" -> G_riot_V + Just (i,[]) | i == mkCId "_sail_V" -> G_sail_V + Just (i,[]) | i == mkCId "_skydive_V" -> G_skydive_V + Just (i,[]) | i == mkCId "_start_V" -> G_start_V + Just (i,[]) | i == mkCId "_stepupsumassure_V" -> G_stepupsumassure_V + Just (i,[]) | i == mkCId "_subscribe_V" -> G_subscribe_V + Just (i,[]) | i == mkCId "_suffer_V" -> G_suffer_V + Just (i,[]) | i == mkCId "_sumassure_V" -> G_sumassure_V + Just (i,[]) | i == mkCId "_supervise_V" -> G_supervise_V + Just (i,[]) | i == mkCId "_train_V" -> G_train_V + Just (i,[]) | i == mkCId "_windsurf_V" -> G_windsurf_V + + + _ -> error ("no V " ++ show t) + instance Gf GV2 where gf (LexV2 x) = mkApp (mkCId x) [] @@ -1434,15 +2654,21 @@ instance Gf GVPI where _ -> error ("no VPI " ++ show t) instance Gf GVPS where + gf (GComparison_Card_Years x1) = mkApp (mkCId "Comparison_Card_Years") [gf x1] gf (GConjPrePostVPS x1 x2 x3 x4) = mkApp (mkCId "ConjPrePostVPS") [gf x1, gf x2, gf x3, gf x4] gf (GConjVPS x1 x2) = mkApp (mkCId "ConjVPS") [gf x1, gf x2] + gf (GGreaterThan x1) = mkApp (mkCId "GreaterThan") [gf x1] + gf (GLessThan x1) = mkApp (mkCId "LessThan") [gf x1] gf (GMayHave x1) = mkApp (mkCId "MayHave") [gf x1] gf (GMkVPS x1 x2 x3) = mkApp (mkCId "MkVPS") [gf x1, gf x2, gf x3] fg t = case unApp t of + Just (i,[x1]) | i == mkCId "Comparison_Card_Years" -> GComparison_Card_Years (fg x1) Just (i,[x1,x2,x3,x4]) | i == mkCId "ConjPrePostVPS" -> GConjPrePostVPS (fg x1) (fg x2) (fg x3) (fg x4) Just (i,[x1,x2]) | i == mkCId "ConjVPS" -> GConjVPS (fg x1) (fg x2) + Just (i,[x1]) | i == mkCId "GreaterThan" -> GGreaterThan (fg x1) + Just (i,[x1]) | i == mkCId "LessThan" -> GLessThan (fg x1) Just (i,[x1]) | i == mkCId "MayHave" -> GMayHave (fg x1) Just (i,[x1,x2,x3]) | i == mkCId "MkVPS" -> GMkVPS (fg x1) (fg x2) (fg x3) @@ -1510,22 +2736,6 @@ instance Gf GYearComponent where -instance Gf GA where - gf _ = undefined - fg _ = undefined - - - - - -instance Gf GA2 where - gf _ = undefined - fg _ = undefined - - - - - instance Gf GAnt where gf _ = undefined fg _ = undefined @@ -1534,22 +2744,6 @@ instance Gf GAnt where -instance Gf GN where - gf _ = undefined - fg _ = undefined - - - - - -instance Gf GN2 where - gf _ = undefined - fg _ = undefined - - - - - instance Gf GTense where gf _ = undefined fg _ = undefined @@ -1557,16 +2751,9 @@ instance Gf GTense where - -instance Gf GV where - gf _ = undefined - fg _ = undefined - - - - instance Compos Tree where compos r a f t = case t of + GComplA2 x1 x2 -> r GComplA2 `a` f x1 `a` f x2 GConjAP x1 x2 -> r GConjAP `a` f x1 `a` f x2 GInt_or_older x1 -> r GInt_or_older `a` f x1 GPositA x1 -> r GPositA `a` f x1 @@ -1574,13 +2761,18 @@ instance Compos Tree where Gensuing x1 -> r Gensuing `a` f x1 GACTION x1 -> r GACTION `a` f x1 GrecoverUnparsedAction x1 -> r GrecoverUnparsedAction `a` f x1 + GAdnCAdv x1 -> r GAdnCAdv `a` f x1 GAdAdv x1 x2 -> r GAdAdv `a` f x1 `a` f x2 GByVP x1 -> r GByVP `a` f x1 GConjAdv x1 x2 -> r GConjAdv `a` f x1 `a` f x2 GPrepNP x1 x2 -> r GPrepNP `a` f x1 `a` f x2 + GWhileDoing x1 -> r GWhileDoing `a` f x1 GrecoverUnparsedAdv x1 -> r GrecoverUnparsedAdv `a` f x1 GAdjCN x1 x2 -> r GAdjCN `a` f x1 `a` f x2 + GCNwhereS x1 x2 x3 -> r GCNwhereS `a` f x1 `a` f x2 `a` f x3 GUseN x1 -> r GUseN `a` f x1 + GAdNum x1 x2 -> r GAdNum `a` f x1 `a` f x2 + GNumDigits x1 -> r GNumDigits `a` f x1 GCompAP x1 -> r GCompAP `a` f x1 GCompAdv x1 -> r GCompAdv `a` f x1 GCompNP x1 -> r GCompNP `a` f x1 @@ -1594,18 +2786,22 @@ instance Compos Tree where GConjPreConstraint x1 x2 x3 -> r GConjPreConstraint `a` f x1 `a` f x2 `a` f x3 GConjPrePostConstraint x1 x2 x3 x4 -> r GConjPrePostConstraint `a` f x1 `a` f x2 `a` f x3 `a` f x4 GRPleafAP x1 -> r GRPleafAP `a` f x1 + GRPleafAdv x1 -> r GRPleafAdv `a` f x1 GRPleafNP x1 -> r GRPleafNP `a` f x1 GRPleafS x1 x2 -> r GRPleafS `a` f x1 `a` f x2 GRPleafVP x1 -> r GRPleafVP `a` f x1 GrecoverRPis x1 x2 -> r GrecoverRPis `a` f x1 `a` f x2 + GrecoverRPmath x1 x2 x3 -> r GrecoverRPmath `a` f x1 `a` f x2 `a` f x3 GrecoverUnparsedConstraint x1 -> r GrecoverUnparsedConstraint `a` f x1 GMkDate x1 x2 x3 -> r GMkDate `a` f x1 `a` f x2 `a` f x3 GIDig x1 -> r GIDig `a` f x1 GIIDig x1 x2 -> r GIIDig `a` f x1 `a` f x2 + GCompoundN x1 x2 -> r GCompoundN `a` f x1 `a` f x2 GConjNP x1 x2 -> r GConjNP `a` f x1 `a` f x2 GDetCN x1 x2 -> r GDetCN `a` f x1 `a` f x2 GGerundNP x1 -> r GGerundNP `a` f x1 GMassNP x1 -> r GMassNP `a` f x1 + GUsePN x1 -> r GUsePN `a` f x1 Gresult_from x1 -> r Gresult_from `a` f x1 Gnum x1 -> r Gnum `a` f x1 GAP_PrePost x1 -> r GAP_PrePost `a` f x1 @@ -1613,6 +2809,7 @@ instance Compos Tree where GNP_PrePost x1 -> r GNP_PrePost `a` f x1 GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4 -> r GNP_caused_NP_to_VP_Prep_PrePost `a` f x1 `a` f x2 `a` f x3 `a` f x4 GNP_caused_by_PrePost x1 -> r GNP_caused_by_PrePost `a` f x1 + GS_PrePost x1 x2 -> r GS_PrePost `a` f x1 `a` f x2 GV2_PrePost x1 -> r GV2_PrePost `a` f x1 GrecoverUnparsedPrePost x1 -> r GrecoverUnparsedPrePost `a` f x1 GConjPrep x1 x2 -> r GConjPrep `a` f x1 `a` f x2 @@ -1672,8 +2869,11 @@ instance Compos Tree where GComplVSthat x1 x2 -> r GComplVSthat `a` f x1 `a` f x2 GUseComp x1 -> r GUseComp `a` f x1 GMkVPI x1 -> r GMkVPI `a` f x1 + GComparison_Card_Years x1 -> r GComparison_Card_Years `a` f x1 GConjPrePostVPS x1 x2 x3 x4 -> r GConjPrePostVPS `a` f x1 `a` f x2 `a` f x3 `a` f x4 GConjVPS x1 x2 -> r GConjVPS `a` f x1 `a` f x2 + GGreaterThan x1 -> r GGreaterThan `a` f x1 + GLessThan x1 -> r GLessThan `a` f x1 GMayHave x1 -> r GMayHave `a` f x1 GMkVPS x1 x2 x3 -> r GMkVPS `a` f x1 `a` f x2 `a` f x3 GAPWho x1 -> r GAPWho `a` f x1 From 8c02b46f29ec3022b36d3deb5bf148072e15b415 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Thu, 3 Aug 2023 13:48:29 +0800 Subject: [PATCH 20/49] handle more RPConstraints --- lib/haskell/natural4/src/LS/NLP/NLG.hs | 91 ++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/lib/haskell/natural4/src/LS/NLP/NLG.hs b/lib/haskell/natural4/src/LS/NLP/NLG.hs index 2fc0b8105..ef4c1401b 100644 --- a/lib/haskell/natural4/src/LS/NLP/NLG.hs +++ b/lib/haskell/natural4/src/LS/NLP/NLG.hs @@ -5,7 +5,7 @@ module LS.NLP.NLG where import AnyAll qualified as AA import Control.Monad (when) -import Data.Char qualified as Char (toLower) +import Data.Char qualified as Char (toLower, isDigit) import Data.Foldable qualified as F import Data.HashMap.Strict (elems, keys, lookup, toList) import Data.HashMap.Strict qualified as Map @@ -51,7 +51,7 @@ import LS.Types MTExpr (MTT), MultiTerm, ParamText, - RPRel (RPTC, RPis), + RPRel (..), RelationalPredicate ( RPBoolStructR, RPConstraint, @@ -570,8 +570,73 @@ parseConstraint env (RPConstraint a RPis b) = case (nps,vps) of nps = parseAnyNoRecover "NP" env aTxt vps = parseAnyNoRecover "VPS" env $ Text.unwords ["is", bTxt] - tString :: Text.Text -> GString - tString = GString . Text.unpack +parseConstraint env (RPConstraint a RPgt b) = case (nps,vps) of + (np:_, vp:_) -> GRPleafS (fg np) (fg vp) + _ -> GrecoverRPmath (tString ">") (tString aTxt) (tString bTxt) + where + aTxt0 = Text.strip $ mt2text a + aTxt = case dp 6 aTxt0 of + "'s age" -> tk 6 aTxt0 -- policy holder's age -> policy holder + _ -> aTxt0 + + bTxt0 = Text.strip $ mt2text b + bTxt = case (dp 6 aTxt0, dp 5 bTxt0) of + ("'s age", "years") -> Text.unwords ["is more than", splitDigits bTxt0, "old"] + _ -> Text.unwords ["is greater than", bTxt0] + + nps = parseAnyNoRecover "NP" env aTxt + vps = parseAnyNoRecover "VPS" env bTxt + +parseConstraint env (RPConstraint a RPlt b) = case (nps,vps) of + (np:_, vp:_) -> GRPleafS (fg np) (fg vp) + _ -> GrecoverRPmath (tString "<") (tString aTxt) (tString bTxt) + where + aTxt0 = Text.strip $ mt2text a + aTxt = case dp 6 aTxt0 of + "'s age" -> tk 6 aTxt0 -- policy holder's age -> policy holder + _ -> aTxt0 + + bTxt0 = Text.strip $ mt2text b + bTxt = case (dp 6 aTxt0, dp 5 bTxt0) of + ("'s age", "years") -> Text.unwords ["is less than", splitDigits bTxt0, "old"] + _ -> Text.unwords ["is less than", bTxt0] + + nps = parseAnyNoRecover "NP" env aTxt + vps = parseAnyNoRecover "VPS" env bTxt + +parseConstraint env (RPConstraint a RPlte b) = case (nps,vps) of + (np:_, vp:_) -> GRPleafS (fg np) (fg vp) + _ -> GrecoverRPmath (tString "<") (tString aTxt) (tString bTxt) + where + aTxt0 = Text.strip $ mt2text a + aTxt = case dp 6 aTxt0 of + "'s age" -> tk 6 aTxt0 -- policy holder's age -> policy holder + _ -> aTxt0 + + bTxt0 = Text.strip $ mt2text b + bTxt = case (dp 6 aTxt0, dp 5 bTxt0) of + ("'s age", "years") -> Text.unwords ["is at most", splitDigits bTxt0, "old"] + _ -> Text.unwords ["is at most", bTxt0] + + nps = parseAnyNoRecover "NP" env aTxt + vps = parseAnyNoRecover "VPS" env bTxt + +parseConstraint env (RPConstraint a RPgte b) = case (nps,vps) of + (np:_, vp:_) -> GRPleafS (fg np) (fg vp) + _ -> GrecoverRPmath (tString "<") (tString aTxt) (tString bTxt) + where + aTxt0 = Text.strip $ mt2text a + aTxt = case dp 6 aTxt0 of + "'s age" -> tk 6 aTxt0 -- policy holder's age -> policy holder + _ -> aTxt0 + + bTxt0 = Text.strip $ mt2text b + bTxt = case (dp 6 aTxt0, dp 5 bTxt0) of + ("'s age", "years") -> Text.unwords ["is at least", splitDigits bTxt0, "old"] + _ -> Text.unwords ["is at least", bTxt0] + + nps = parseAnyNoRecover "NP" env aTxt + vps = parseAnyNoRecover "VPS" env bTxt parseConstraint env rp = fg tree where @@ -614,6 +679,24 @@ typeError cat actualCats = error $ unwords ["category", cat, "not a valid GF cat tString :: Text.Text -> GString tString = GString . Text.unpack + +splitDigits :: Text.Text -> Text.Text +splitDigits txt = Text.unwords (splitDigit <$> Text.words txt) + where + splitDigit d = if Text.all Char.isDigit d + then Text.intercalate " &+ " (Text.groupBy (\x y -> False) d) + else d + +tk, dp :: Int -> Text.Text -> Text.Text +tk i = Text.pack . tk' i . Text.unpack +dp i = Text.pack . dp' i . Text.unpack + + +tk', dp' :: Int -> String -> String +tk' i = reverse . drop i . reverse -- tk 2 "hello" == "hel" +dp' i = reverse . take i . reverse -- dp 2 "hello" == "lo" + + ----------------------------------------------------------------------------- -- Expand a set of rules From 2c781a8351ccfbf54396b25b9ad56287219eb5a9 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Thu, 3 Aug 2023 14:30:20 +0800 Subject: [PATCH 21/49] new structures so whole 10.3 parses --- lib/haskell/natural4/grammars/CustomSyntax.gf | 2 +- .../natural4/grammars/CustomSyntaxChi.gf | 2 +- .../natural4/grammars/CustomSyntaxEng.gf | 2 +- .../natural4/grammars/CustomSyntaxMay.gf | 2 +- lib/haskell/natural4/grammars/InsLex.gf | 20 ++-- lib/haskell/natural4/grammars/InsLexEng.gf | 27 +++-- lib/haskell/natural4/grammars/NL4.pgf | Bin 222772 -> 223264 bytes lib/haskell/natural4/grammars/NL4Base.gf | 16 +-- .../natural4/grammars/NL4BaseFunctor.gf | 2 +- lib/haskell/natural4/src/LS/NLP/NL4.hs | 113 +++++++++++------- lib/haskell/natural4/src/LS/NLP/NLG.hs | 6 +- 11 files changed, 108 insertions(+), 84 deletions(-) diff --git a/lib/haskell/natural4/grammars/CustomSyntax.gf b/lib/haskell/natural4/grammars/CustomSyntax.gf index 11b10ff91..feac8d4d6 100644 --- a/lib/haskell/natural4/grammars/CustomSyntax.gf +++ b/lib/haskell/natural4/grammars/CustomSyntax.gf @@ -12,7 +12,7 @@ abstract CustomSyntax = , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS - , S, QS, Conj + , S, QS, Conj, Subj, SubjS ] , Structural [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep diff --git a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf index 2407c75ca..3e8b2f7e5 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf @@ -11,7 +11,7 @@ concrete CustomSyntaxChi of CustomSyntax = , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS - , S, QS, Conj + , S, QS, Conj, Subj, SubjS ] , StructuralChi [ VV, must_VV diff --git a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf index 23c3c9694..a354776cf 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf @@ -12,7 +12,7 @@ concrete CustomSyntaxEng of CustomSyntax = , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS - , S, QS, Conj + , S, QS, Conj, Subj, SubjS ] , StructuralEng [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep diff --git a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf index 12b86ccb2..c456c3bd5 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf @@ -13,7 +13,7 @@ concrete CustomSyntaxMay of CustomSyntax = , ListAP, BaseAP, ConsAP, ConjAP , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS - , S, QS, Conj + , S, QS, Conj, Subj, SubjS ] , StructuralMay [ Prep, for_Prep, from_Prep, on_Prep, after_Prep, possess_Prep diff --git a/lib/haskell/natural4/grammars/InsLex.gf b/lib/haskell/natural4/grammars/InsLex.gf index ee4f93d07..51783b0e7 100644 --- a/lib/haskell/natural4/grammars/InsLex.gf +++ b/lib/haskell/natural4/grammars/InsLex.gf @@ -24,7 +24,7 @@ abstract InsLex = NL4Base ** { _tsapp_N : N ; _work_N : N ; _planF_PN : PN ; --- _while_Conj : Conj ; + _while_Subj : Subj ; _after_Prep : Prep ; _mean_as_V2 : V2 ; _Schedule_PN : PN ; @@ -301,7 +301,7 @@ abstract InsLex = NL4Base ** { _vcjd_N : N ; _hence_Adv : Adv ; _with_Prep : Prep ; - _that_Conj : Conj ; + _that_Subj : Subj ; _cave_V : V ; _policyholder_N : N ; _middle_A : A ; @@ -326,7 +326,7 @@ abstract InsLex = NL4Base ** { _recognise_V : V ; _HAS_PN : PN ; _diving_A : A ; - _before_Conj : Conj ; + _before_Subj : Subj ; _adjusted_A : A ; _MIN_PN : PN ; _Types_PN : PN ; @@ -347,7 +347,7 @@ abstract InsLex = NL4Base ** { _head_N : N ; _upscaled_A : A ; _martial_A : A ; - _if_Conj : Conj ; + _if_Subj : Subj ; _valid_A : A ; _soon_Adv : Adv ; _strain_N : N ; @@ -359,7 +359,7 @@ abstract InsLex = NL4Base ** { _c_N : N ; _Dismemberment_PN : PN ; _1013_N : N ; - _both_Conj : Conj ; + _both_Subj : Subj ; _v_N : N ; _include_V : V ; _unsound_A : A ; @@ -378,7 +378,7 @@ abstract InsLex = NL4Base ** { _accepted_A : A ; _war_N : N ; _adjust_V : V ; - _or_Conj : Conj ; + _or_Subj : Subj ; _duty_N : N ; _finger_N : N ; _deduce_VS : VS ; @@ -413,7 +413,7 @@ abstract InsLex = NL4Base ** { _hand_V : V ; _Legionnaires_PN : PN ; _contamination_N : N ; - _when_Conj : Conj ; + _when_Subj : Subj ; _section_N : N ; _Section_PN : PN ; _removal_N : N ; @@ -470,7 +470,7 @@ abstract InsLex = NL4Base ** { _waterborne_A : A ; _p_N : N ; _damageevent_N : N ; - _and_Conj : Conj ; + _and_Subj : Subj ; _Policy_PN : PN ; _national_A : A ; _cover_as_V2 : V2 ; @@ -526,7 +526,7 @@ abstract InsLex = NL4Base ** { _reckless_A : A ; _list_N : N ; _on_Prep : Prep ; --- _as_Conj : Conj ; + _as_Subj : Subj ; _holder_N : N ; _assured_N : N ; _alive_A : A ; @@ -546,7 +546,7 @@ abstract InsLex = NL4Base ** { _declare_V2 : V2 ; _initial_A : A ; _hunt_V : V ; - _but_Conj : Conj ; + _but_Subj : Subj ; _Assured_PN : PN ; _ADD_PN : PN ; _f_N : N ; diff --git a/lib/haskell/natural4/grammars/InsLexEng.gf b/lib/haskell/natural4/grammars/InsLexEng.gf index d76a4d3a1..dacbfaa47 100644 --- a/lib/haskell/natural4/grammars/InsLexEng.gf +++ b/lib/haskell/natural4/grammars/InsLexEng.gf @@ -1,5 +1,6 @@ concrete InsLexEng of InsLex = NL4BaseEng ** open ParadigmsEng, Prelude in { + oper mkSubj : Str -> Subj = \s -> lin Subj (ss s) ; lin _practitioner_N = mkN "practitioner" ; lin _insanity_N = mkN "insanity" ; lin _plan_N = mkN "plan" ; @@ -28,7 +29,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _Disease_PN = mkPN "Disease" ; lin _event_N = mkN "event" ; lin _box_in_V2 = mkV2 (us_britishV "box") (mkPrep "in") ; - lin _or_Conj = mkConj "or" ; + lin _or_Subj = mkSubj "or" ; lin _martial_A = mkA "martial" ; lin _b_N = mkN "b" ; lin _LE_PN = mkPN "LE" ; @@ -38,7 +39,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _suffer_V = us_britishV "suffer" ; lin _benefit_V = us_britishV "benefit" ; lin _thumb_N = mkN "thumb" ; - lin _that_Conj = mkConj "that" ; + lin _that_Subj = mkSubj "that" ; lin _pay_as_V2 = mkV2 (us_britishV "pay") (mkPrep "as") ; lin _active_A = mkA "active" ; lin _into_Prep = mkPrep "into" ; @@ -96,7 +97,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _happen_within_V2 = mkV2 (us_britishV "happen") (mkPrep "within") ; lin _sumassure_V = us_britishV "sumassure" ; lin _race_V = us_britishV "race" ; - lin _if_Conj = mkConj "if" ; + lin _if_Subj = mkSubj "if" ; lin _radioactivity_N = mkN "radioactivity" ; lin _at_Adv = mkAdv "at" ; lin _first_Adv = mkAdv "first" ; @@ -115,7 +116,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _take_V2 = mkV2 (us_britishV "take") ; lin _PS_PN = mkPN "PS" ; lin _Accidents_PN = mkPN "Accidents" ; - lin _and_Conj = mkConj "and" ; + lin _and_Subj = mkSubj "and" ; lin _suffer_V2 = mkV2 (us_britishV "suffer") ; lin _sum_N = mkN "sum" ; lin _claim_V = us_britishV "claim" ; @@ -130,7 +131,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _pay_V = us_britishV "pay" ; lin _assure_across_V2 = mkV2 (us_britishV "assure") (mkPrep "across") ; lin _sustain_V2 = mkV2 (us_britishV "sustain") ; - lin _while_Conj = mkConj "while" ; + lin _while_Subj = mkSubj "while" ; lin _register_with_V2 = mkV2 (us_britishV "register") (mkPrep "with") ; lin _cave_V = us_britishV "cave" ; lin _rule_N = mkN "rule" ; @@ -147,7 +148,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _than_Prep = mkPrep "than" ; lin _add_N = mkN "add" ; lin _little_A = mkA "little" ; - lin _as_Conj = mkConj "as" ; + lin _as_Subj = mkSubj "as" ; lin _mind_N = mkN "mind" ; lin _claim_for_V2 = mkV2 (us_britishV "claim") (mkPrep "for") ; lin _planaf_N = mkN "planaf" ; @@ -176,7 +177,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _hrr_N = mkN "hrr" ; lin _motocross_PN = mkPN "motocross" ; lin _schema_PN = mkPN "schema" ; - lin _but_Conj = mkConj "but" ; + lin _but_Subj = mkSubj "but" ; lin _case_N = mkN "case" ; lin _planf_N = mkN "planf" ; lin _h7n9_N = mkN "h7n9" ; @@ -294,7 +295,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _benefit_N = mkN "benefit" ; lin _type_N = mkN "type" ; lin _waterborne_A = mkA "waterborne" ; - lin _when_Conj = mkConj "when" ; + lin _when_Subj = mkSubj "when" ; lin _non_N = mkN "non" ; lin _high_A = mkA "high" ; lin _Event_PN = mkPN "Event" ; @@ -341,7 +342,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _assure_per_V2 = mkV2 (us_britishV "assure") (mkPrep "per") ; lin _radiation_N = mkN "radiation" ; lin _declaration_N = mkN "declaration" ; - lin _occur_during_V2 = mkV2 (us_britishV "occur") (mkPrep "during") ; + lin _occur_during_V2 = mkV2 (us_britishV "occur") _during_Prep ; lin _work_N = mkN "work" ; lin _accidental_A = mkA "accidental" ; lin _as_Adv = mkAdv "as" ; @@ -364,7 +365,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _riot_V = us_britishV "riot" ; lin _transport_N = mkN "transport" ; lin _H7N7_N = mkN "H7N7" ; - lin _both_Conj = mkConj "both" ; + lin _both_Subj = mkSubj "both" ; lin _leg_N = mkN "leg" ; lin _firstclaimyear_N = mkN "firstclaimyear" ; lin _Section_PN = mkPN "Section" ; @@ -383,7 +384,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _schedule_N = mkN "schedule" ; lin _particular_A = mkA "particular" ; lin _passenger_N = mkN "passenger" ; - lin _where_Conj = mkConj "where" ; + lin _where_Subj = mkSubj "where" ; lin _total_A = mkA "total" ; lin _addsa_N = mkN "addsa" ; lin _of_Prep = mkPrep "of" ; @@ -399,7 +400,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _ps_N = mkN "ps" ; lin _in_Prep = mkPrep "in" ; lin _Expense_PN = mkPN "Expense" ; - lin _before_Conj = mkConj "before" ; + lin _before_Subj = mkSubj "before" ; lin _p_N = mkN "p" ; lin _1014_PN = mkPN "10.1.4" ; lin _canoe_V = us_britishV "canoe" ; @@ -415,7 +416,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _cost_N = mkN "cost" ; lin _located_in_A2 = mkA2 (mkA "located") (mkPrep "in") ; lin _unsuccessful_A = mkA "unsuccessful" ; - lin _during_Prep = mkPrep "during" ; + lin _during_Prep = mkPrep ("during"|"DURING") ; lin _happen_after_V2 = mkV2 (us_britishV "happen") (mkPrep "after") ; lin _hfmd_A = mkA "hfmd" ; lin _tsapp_N = mkN "tsapp" ; diff --git a/lib/haskell/natural4/grammars/NL4.pgf b/lib/haskell/natural4/grammars/NL4.pgf index 22fecf8bf1f24c51be06595b0a0c50a2aad8a9be..25fd215ff6e59488ced4f204329bb7117f5789c8 100644 GIT binary patch delta 67288 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 diff --git a/lib/haskell/natural4/grammars/NL4Base.gf b/lib/haskell/natural4/grammars/NL4Base.gf index f2338c992..3a055e0e1 100644 --- a/lib/haskell/natural4/grammars/NL4Base.gf +++ b/lib/haskell/natural4/grammars/NL4Base.gf @@ -12,39 +12,39 @@ abstract NL4Base = CustomSyntax ** { Action ; Who ; [Who]{2} ; - Subj ; + Subject ; Deontic ; Upon ; fun -- for fancy NLG - Regulative : Subj -> Deontic -> Action -> Text ; + Regulative : Subject -> Deontic -> Action -> Text ; advUPON : Upon -> Text ; -- actually include the word Upon -- for web forms qWHO, - sWHO : Subj -> Who -> Text ; + sWHO : Subject -> Who -> Text ; qUPON, -- TODO rethink types when adding more langs -- TODO2 do we allow upon to take full sentence or just VP*? - sUPON : Subj -> Upon -> Text ; + sUPON : Subject -> Upon -> Text ; qCOND, sCOND : Cond -> Text ; -- general Regulative stuff EVERY, PARTY, - AN, THE : CN -> Subj ; -- EVERY Person + AN, THE : CN -> Subject ; -- EVERY Person WHO : Temp -> Pol -> VP -> Who ; -- WHO walks ACTION : VP -> Action ; MUST, MAY, SHANT : Deontic ; AND, OR : Conj ; - SubjWho : Subj -> Who -> Subj ; + SubjWho : Subject -> Who -> Subject ; ConjWho : Conj -> [Who] -> Who ; ConjPreWho : PrePost -> Conj -> [Who] -> Who ; -- TODO need to find examples in the wild ConjPrePostWho : (_,_ : PrePost) -> Conj -> [Who] -> Who ; - You : Subj ; + You : Subject ; UPON : VP -> Upon ; -- upon becoming @@ -148,7 +148,7 @@ abstract NL4Base = CustomSyntax ** { recoverUnparsedWho : String -> Who ; recoverUnparsedCond : String -> Cond ; recoverUnparsedUpon : String -> Upon ; - recoverUnparsedSubj : String -> Subj ; + recoverUnparsedSubj : String -> Subject ; recoverUnparsedAction : String -> Action ; recoverUnparsedTimeUnit : String -> TimeUnit ; diff --git a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf index c554d3fd4..3cf4362db 100644 --- a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf +++ b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf @@ -18,7 +18,7 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open Action = Extend.VPI ; Who = Extend.VPS ; [Who] = Extend.ListVPS ; - Subj = Syntax.NP ; + Subject = Syntax.NP ; Deontic = Syntax.VV ; Upon = Syntax.VP ; diff --git a/lib/haskell/natural4/src/LS/NLP/NL4.hs b/lib/haskell/natural4/src/LS/NLP/NL4.hs index 2f7cab269..7018bec54 100644 --- a/lib/haskell/natural4/src/LS/NLP/NL4.hs +++ b/lib/haskell/natural4/src/LS/NLP/NL4.hs @@ -140,6 +140,8 @@ type GSub1000000000000 = Tree GSub1000000000000_ data GSub1000000000000_ type GSubj = Tree GSubj_ data GSubj_ +type GSubject = Tree GSubject_ +data GSubject_ type GTComparison = Tree GTComparison_ data GTComparison_ type GTemp = Tree GTemp_ @@ -280,6 +282,7 @@ data Tree :: * -> * where GByVP :: GVP -> Tree GAdv_ GConjAdv :: GConj -> GListAdv -> Tree GAdv_ GPrepNP :: GPrep -> GNP -> Tree GAdv_ + GSubjS :: GSubj -> GS -> Tree GAdv_ GWhileDoing :: GVP -> Tree GAdv_ G_as_Adv :: Tree GAdv_ G_at_Adv :: Tree GAdv_ @@ -317,14 +320,6 @@ data Tree :: * -> * where GrecoverUnparsedCond :: GString -> Tree GCond_ GAND :: Tree GConj_ GOR :: Tree GConj_ - G_and_Conj :: Tree GConj_ - G_before_Conj :: Tree GConj_ - G_both_Conj :: Tree GConj_ - G_but_Conj :: Tree GConj_ - G_if_Conj :: Tree GConj_ - G_or_Conj :: Tree GConj_ - G_that_Conj :: Tree GConj_ - G_when_Conj :: Tree GConj_ GConjConstraint :: GConj -> GListConstraint -> Tree GConstraint_ GConjPreConstraint :: GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ GConjPrePostConstraint :: GPrePost -> GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ @@ -579,13 +574,23 @@ data Tree :: * -> * where Gpot51 :: Tree GSub1000000000000_ Gpot5float :: GFloat -> Tree GSub1000000000000_ Gpot5plus :: GSub1000 -> GSub1000000000 -> Tree GSub1000000000000_ - GAN :: GCN -> Tree GSubj_ - GEVERY :: GCN -> Tree GSubj_ - GPARTY :: GCN -> Tree GSubj_ - GSubjWho :: GSubj -> GWho -> Tree GSubj_ - GTHE :: GCN -> Tree GSubj_ - GYou :: Tree GSubj_ - GrecoverUnparsedSubj :: GString -> Tree GSubj_ + G_and_Subj :: Tree GSubj_ + G_as_Subj :: Tree GSubj_ + G_before_Subj :: Tree GSubj_ + G_both_Subj :: Tree GSubj_ + G_but_Subj :: Tree GSubj_ + G_if_Subj :: Tree GSubj_ + G_or_Subj :: Tree GSubj_ + G_that_Subj :: Tree GSubj_ + G_when_Subj :: Tree GSubj_ + G_while_Subj :: Tree GSubj_ + GAN :: GCN -> Tree GSubject_ + GEVERY :: GCN -> Tree GSubject_ + GPARTY :: GCN -> Tree GSubject_ + GSubjWho :: GSubject -> GWho -> Tree GSubject_ + GTHE :: GCN -> Tree GSubject_ + GYou :: Tree GSubject_ + GrecoverUnparsedSubj :: GString -> Tree GSubject_ GAFTER :: Tree GTComparison_ GBEFORE :: Tree GTComparison_ GBY :: Tree GTComparison_ @@ -597,16 +602,16 @@ data Tree :: * -> * where GpresSimul :: Tree GTemp_ GTemporalConstraint :: GTComparison -> GDigits -> GTimeUnit -> Tree GTemporal_ GTemporalConstraintNoDigits :: GTComparison -> GTimeUnit -> Tree GTemporal_ - GRegulative :: GSubj -> GDeontic -> GAction -> Tree GText_ + GRegulative :: GSubject -> GDeontic -> GAction -> Tree GText_ GadvUPON :: GUpon -> Tree GText_ GqCOND :: GCond -> Tree GText_ GqCONSTR :: GConstraint -> Tree GText_ GqPREPOST :: GPrePost -> Tree GText_ - GqUPON :: GSubj -> GUpon -> Tree GText_ - GqWHO :: GSubj -> GWho -> Tree GText_ + GqUPON :: GSubject -> GUpon -> Tree GText_ + GqWHO :: GSubject -> GWho -> Tree GText_ GsCOND :: GCond -> Tree GText_ - GsUPON :: GSubj -> GUpon -> Tree GText_ - GsWHO :: GSubj -> GWho -> Tree GText_ + GsUPON :: GSubject -> GUpon -> Tree GText_ + GsWHO :: GSubject -> GWho -> Tree GText_ GDay_Unit :: Tree GTimeUnit_ GMonth_Unit :: Tree GTimeUnit_ GYear_Unit :: Tree GTimeUnit_ @@ -786,6 +791,7 @@ instance Eq (Tree a) where (GByVP x1,GByVP y1) -> and [ x1 == y1 ] (GConjAdv x1 x2,GConjAdv y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GPrepNP x1 x2,GPrepNP y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GSubjS x1 x2,GSubjS y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GWhileDoing x1,GWhileDoing y1) -> and [ x1 == y1 ] (G_as_Adv,G_as_Adv) -> and [ ] (G_at_Adv,G_at_Adv) -> and [ ] @@ -823,14 +829,6 @@ instance Eq (Tree a) where (GrecoverUnparsedCond x1,GrecoverUnparsedCond y1) -> and [ x1 == y1 ] (GAND,GAND) -> and [ ] (GOR,GOR) -> and [ ] - (G_and_Conj,G_and_Conj) -> and [ ] - (G_before_Conj,G_before_Conj) -> and [ ] - (G_both_Conj,G_both_Conj) -> and [ ] - (G_but_Conj,G_but_Conj) -> and [ ] - (G_if_Conj,G_if_Conj) -> and [ ] - (G_or_Conj,G_or_Conj) -> and [ ] - (G_that_Conj,G_that_Conj) -> and [ ] - (G_when_Conj,G_when_Conj) -> and [ ] (GConjConstraint x1 x2,GConjConstraint y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjPreConstraint x1 x2 x3,GConjPreConstraint y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GConjPrePostConstraint x1 x2 x3 x4,GConjPrePostConstraint y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] @@ -1085,6 +1083,16 @@ instance Eq (Tree a) where (Gpot51,Gpot51) -> and [ ] (Gpot5float x1,Gpot5float y1) -> and [ x1 == y1 ] (Gpot5plus x1 x2,Gpot5plus y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (G_and_Subj,G_and_Subj) -> and [ ] + (G_as_Subj,G_as_Subj) -> and [ ] + (G_before_Subj,G_before_Subj) -> and [ ] + (G_both_Subj,G_both_Subj) -> and [ ] + (G_but_Subj,G_but_Subj) -> and [ ] + (G_if_Subj,G_if_Subj) -> and [ ] + (G_or_Subj,G_or_Subj) -> and [ ] + (G_that_Subj,G_that_Subj) -> and [ ] + (G_when_Subj,G_when_Subj) -> and [ ] + (G_while_Subj,G_while_Subj) -> and [ ] (GAN x1,GAN y1) -> and [ x1 == y1 ] (GEVERY x1,GEVERY y1) -> and [ x1 == y1 ] (GPARTY x1,GPARTY y1) -> and [ x1 == y1 ] @@ -1431,6 +1439,7 @@ instance Gf GAdv where gf (GByVP x1) = mkApp (mkCId "ByVP") [gf x1] gf (GConjAdv x1 x2) = mkApp (mkCId "ConjAdv") [gf x1, gf x2] gf (GPrepNP x1 x2) = mkApp (mkCId "PrepNP") [gf x1, gf x2] + gf (GSubjS x1 x2) = mkApp (mkCId "SubjS") [gf x1, gf x2] gf (GWhileDoing x1) = mkApp (mkCId "WhileDoing") [gf x1] gf G_as_Adv = mkApp (mkCId "_as_Adv") [] gf G_at_Adv = mkApp (mkCId "_at_Adv") [] @@ -1456,6 +1465,7 @@ instance Gf GAdv where Just (i,[x1]) | i == mkCId "ByVP" -> GByVP (fg x1) Just (i,[x1,x2]) | i == mkCId "ConjAdv" -> GConjAdv (fg x1) (fg x2) Just (i,[x1,x2]) | i == mkCId "PrepNP" -> GPrepNP (fg x1) (fg x2) + Just (i,[x1,x2]) | i == mkCId "SubjS" -> GSubjS (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "WhileDoing" -> GWhileDoing (fg x1) Just (i,[]) | i == mkCId "_as_Adv" -> G_as_Adv Just (i,[]) | i == mkCId "_at_Adv" -> G_at_Adv @@ -1554,27 +1564,11 @@ instance Gf GCond where instance Gf GConj where gf GAND = mkApp (mkCId "AND") [] gf GOR = mkApp (mkCId "OR") [] - gf G_and_Conj = mkApp (mkCId "_and_Conj") [] - gf G_before_Conj = mkApp (mkCId "_before_Conj") [] - gf G_both_Conj = mkApp (mkCId "_both_Conj") [] - gf G_but_Conj = mkApp (mkCId "_but_Conj") [] - gf G_if_Conj = mkApp (mkCId "_if_Conj") [] - gf G_or_Conj = mkApp (mkCId "_or_Conj") [] - gf G_that_Conj = mkApp (mkCId "_that_Conj") [] - gf G_when_Conj = mkApp (mkCId "_when_Conj") [] fg t = case unApp t of Just (i,[]) | i == mkCId "AND" -> GAND Just (i,[]) | i == mkCId "OR" -> GOR - Just (i,[]) | i == mkCId "_and_Conj" -> G_and_Conj - Just (i,[]) | i == mkCId "_before_Conj" -> G_before_Conj - Just (i,[]) | i == mkCId "_both_Conj" -> G_both_Conj - Just (i,[]) | i == mkCId "_but_Conj" -> G_but_Conj - Just (i,[]) | i == mkCId "_if_Conj" -> G_if_Conj - Just (i,[]) | i == mkCId "_or_Conj" -> G_or_Conj - Just (i,[]) | i == mkCId "_that_Conj" -> G_that_Conj - Just (i,[]) | i == mkCId "_when_Conj" -> G_when_Conj _ -> error ("no Conj " ++ show t) @@ -2394,6 +2388,34 @@ instance Gf GSub1000000000000 where _ -> error ("no Sub1000000000000 " ++ show t) instance Gf GSubj where + gf G_and_Subj = mkApp (mkCId "_and_Subj") [] + gf G_as_Subj = mkApp (mkCId "_as_Subj") [] + gf G_before_Subj = mkApp (mkCId "_before_Subj") [] + gf G_both_Subj = mkApp (mkCId "_both_Subj") [] + gf G_but_Subj = mkApp (mkCId "_but_Subj") [] + gf G_if_Subj = mkApp (mkCId "_if_Subj") [] + gf G_or_Subj = mkApp (mkCId "_or_Subj") [] + gf G_that_Subj = mkApp (mkCId "_that_Subj") [] + gf G_when_Subj = mkApp (mkCId "_when_Subj") [] + gf G_while_Subj = mkApp (mkCId "_while_Subj") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "_and_Subj" -> G_and_Subj + Just (i,[]) | i == mkCId "_as_Subj" -> G_as_Subj + Just (i,[]) | i == mkCId "_before_Subj" -> G_before_Subj + Just (i,[]) | i == mkCId "_both_Subj" -> G_both_Subj + Just (i,[]) | i == mkCId "_but_Subj" -> G_but_Subj + Just (i,[]) | i == mkCId "_if_Subj" -> G_if_Subj + Just (i,[]) | i == mkCId "_or_Subj" -> G_or_Subj + Just (i,[]) | i == mkCId "_that_Subj" -> G_that_Subj + Just (i,[]) | i == mkCId "_when_Subj" -> G_when_Subj + Just (i,[]) | i == mkCId "_while_Subj" -> G_while_Subj + + + _ -> error ("no Subj " ++ show t) + +instance Gf GSubject where gf (GAN x1) = mkApp (mkCId "AN") [gf x1] gf (GEVERY x1) = mkApp (mkCId "EVERY") [gf x1] gf (GPARTY x1) = mkApp (mkCId "PARTY") [gf x1] @@ -2413,7 +2435,7 @@ instance Gf GSubj where Just (i,[x1]) | i == mkCId "recoverUnparsedSubj" -> GrecoverUnparsedSubj (fg x1) - _ -> error ("no Subj " ++ show t) + _ -> error ("no Subject " ++ show t) instance Gf GTComparison where gf GAFTER = mkApp (mkCId "AFTER") [] @@ -2766,6 +2788,7 @@ instance Compos Tree where GByVP x1 -> r GByVP `a` f x1 GConjAdv x1 x2 -> r GConjAdv `a` f x1 `a` f x2 GPrepNP x1 x2 -> r GPrepNP `a` f x1 `a` f x2 + GSubjS x1 x2 -> r GSubjS `a` f x1 `a` f x2 GWhileDoing x1 -> r GWhileDoing `a` f x1 GrecoverUnparsedAdv x1 -> r GrecoverUnparsedAdv `a` f x1 GAdjCN x1 x2 -> r GAdjCN `a` f x1 `a` f x2 diff --git a/lib/haskell/natural4/src/LS/NLP/NLG.hs b/lib/haskell/natural4/src/LS/NLP/NLG.hs index ef4c1401b..cf776cb13 100644 --- a/lib/haskell/natural4/src/LS/NLP/NLG.hs +++ b/lib/haskell/natural4/src/LS/NLP/NLG.hs @@ -387,10 +387,10 @@ ruleQnTrees env alias rule = do ---------------------------------------------------------------------- -textViaQaHorns :: NLGEnv -> Alias -> Maybe GSubj -> [([RuleName], BoolStructT)] +textViaQaHorns :: NLGEnv -> Alias -> Maybe GSubject -> [([RuleName], BoolStructT)] textViaQaHorns env alias subj = [ (rn, linBStext env $ mkGFtext env alias (referSubj <$> subj) bsr) | (rn, bsr) <- qaHornsR (interpreted env)] -mkGFtext :: NLGEnv -> Alias -> Maybe GSubj -> BoolStructR -> BoolStructGText +mkGFtext :: NLGEnv -> Alias -> Maybe GSubject -> BoolStructR -> BoolStructGText mkGFtext env alias subj bsr = case (whoParses, condParses) of ([], []) -> mkConstraintText env GqPREPOST GqCONSTR bsr ([], _:_) -> mkCondText env GqPREPOST GqCOND bsr @@ -497,7 +497,7 @@ parseAction env bsp = fg tree txt = bsp2text bsp tree :| _ = parseAny "Action" env txt -parseSubj :: NLGEnv -> BoolStructP -> GSubj +parseSubj :: NLGEnv -> BoolStructP -> GSubject parseSubj env bsp = fg tree where txt = bsp2text bsp From dca6185f69f8a855bb64dd2dbb8dd65be439152a Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 4 Aug 2023 16:08:46 +0800 Subject: [PATCH 22/49] =?UTF-8?q?parses=20Meng's=20encoding=20of=20=C2=A71?= =?UTF-8?q?0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/haskell/natural4/grammars/CustomSyntax.gf | 8 +- .../natural4/grammars/CustomSyntaxChi.gf | 8 +- .../natural4/grammars/CustomSyntaxEng.gf | 8 +- .../natural4/grammars/CustomSyntaxMay.gf | 8 +- lib/haskell/natural4/grammars/InsLex.gf | 118 +++++- lib/haskell/natural4/grammars/InsLexEng.gf | 120 +++++- lib/haskell/natural4/grammars/NL4.pgf | Bin 223264 -> 274012 bytes lib/haskell/natural4/grammars/NL4Base.gf | 23 +- lib/haskell/natural4/grammars/NL4BaseChi.gf | 2 +- lib/haskell/natural4/grammars/NL4BaseEng.gf | 15 +- .../natural4/grammars/NL4BaseFunctor.gf | 23 +- lib/haskell/natural4/grammars/NL4BaseMay.gf | 2 +- .../natural4/grammars/StandardLexicon.gf | 1 + .../natural4/grammars/StandardLexiconEng.gf | 1 + lib/haskell/natural4/grammars/updateHS.sh | 2 +- lib/haskell/natural4/src/LS/NLP/NL4.hs | 365 ++++++------------ .../natural4/src/LS/NLP/NL4Transformations.hs | 37 +- lib/haskell/natural4/src/LS/NLP/NLG.hs | 88 ++++- lib/haskell/natural4/test/LS/NLGSpec.hs | 14 +- 19 files changed, 499 insertions(+), 344 deletions(-) diff --git a/lib/haskell/natural4/grammars/CustomSyntax.gf b/lib/haskell/natural4/grammars/CustomSyntax.gf index feac8d4d6..a8869dd33 100644 --- a/lib/haskell/natural4/grammars/CustomSyntax.gf +++ b/lib/haskell/natural4/grammars/CustomSyntax.gf @@ -1,7 +1,7 @@ abstract CustomSyntax = Numeral , Grammar [ - N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP , V, VV, V2, VS, VP , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompNP, CompAP, CompAdv -- is a public agency @@ -13,11 +13,13 @@ abstract CustomSyntax = , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS , S, QS, Conj, Subj, SubjS + , RS, RP, IdRP, RelCN ] , Structural [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep , VV, must_VV , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN + , Subj, because_Subj ] , Extend [ VPS, MkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS @@ -25,8 +27,8 @@ abstract CustomSyntax = , VP, Tense, Ant, Temp, Pol, Conj -- for VPS -- , GenRP -- nice to have in the future? , ByVP, N, CompoundN - , S, PredVPS - , NP, GerundNP + , S, PredVPS, RelVPS + , NP, GerundNP, Num, GenModNP ] ** { ----------------------------------------------------------------------------- diff --git a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf index 3e8b2f7e5..63c611f5a 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf @@ -1,7 +1,7 @@ concrete CustomSyntaxChi of CustomSyntax = NumeralChi , GrammarChi [ - N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP , V, VV, V2, VS, VP, AdvVP , A, A2, AP, PositA , Comp, Adv, VP, UseComp, CompAP, CompAdv -- is a public agency @@ -12,18 +12,20 @@ concrete CustomSyntaxChi of CustomSyntax = , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS , S, QS, Conj, Subj, SubjS + , RS, RP, IdRP, RelCN ] , StructuralChi [ VV, must_VV , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN + , Subj, because_Subj ] , ExtendChi [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS , ByVP, N, CompoundN - , S, PredVPS - , NP, GerundNP -- by performing NDB qualification + , S, PredVPS, RelVPS + , NP, GerundNP, Num, GenModNP -- by performing NDB qualification ] ** open SyntaxChi diff --git a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf index a354776cf..afe3d8384 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf @@ -1,7 +1,7 @@ concrete CustomSyntaxEng of CustomSyntax = NumeralEng , GrammarEng [ - N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP , V, VV, V2, VS, VP , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompAP, CompNP, CompAdv -- is a public agency @@ -13,19 +13,21 @@ concrete CustomSyntaxEng of CustomSyntax = , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS , S, QS, Conj, Subj, SubjS + , RS, RP, IdRP, RelCN ] , StructuralEng [ Prep, to_Prep, for_Prep, from_Prep, on_Prep, before_Prep, after_Prep, possess_Prep , VV, must_VV , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN + , Subj, because_Subj ] , ExtendEng [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS , ByVP, N, CompoundN - , S, PredVPS - , NP, GerundNP -- by performing NDB qualification + , S, PredVPS, RelVPS + , NP, GerundNP, Num, GenModNP -- by performing NDB qualification ] ** open SyntaxEng diff --git a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf index c456c3bd5..50fb2d6ae 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf @@ -1,7 +1,7 @@ concrete CustomSyntaxMay of CustomSyntax = NumeralMay , GrammarMay [ - N, N2, CN, PN, NP, UseN, UsePN, Det, DetCN, MassNP + N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP , V, VV, V2, VS, VP , A, A2, AP, AdjCN, PositA, ComplA2 -- , ProgrVP -- becoming aware @@ -14,19 +14,21 @@ concrete CustomSyntaxMay of CustomSyntax = , ListNP, BaseNP, ConsNP, ConjNP , ListS, BaseS, ConsS, ConjS , S, QS, Conj, Subj, SubjS + , RS, RP, IdRP, RelCN ] , StructuralMay [ Prep, for_Prep, from_Prep, on_Prep, after_Prep, possess_Prep , VV, must_VV , AdN, CAdv, less_CAdv, more_CAdv, at_least_AdN, at_most_AdN + , Subj, because_Subj ] , ExtendMay [ VPS, MkVPS, mkVPS, ListVPS, BaseVPS, ConsVPS, ConjVPS, baseVPS , VPI, MkVPI, mkVPI --, [VPI], BaseVPI, ConsVPI, ConjVPI , VP, Tense, Ant, Temp, Pol, Conj -- for VPS , ByVP, N, CompoundN - , S, PredVPS - , NP, GerundNP -- by performing NDB qualification + , S, PredVPS, RelVPS + , NP, GerundNP, Num, GenModNP -- by performing NDB qualification ] ** open SyntaxMay diff --git a/lib/haskell/natural4/grammars/InsLex.gf b/lib/haskell/natural4/grammars/InsLex.gf index 51783b0e7..296da7125 100644 --- a/lib/haskell/natural4/grammars/InsLex.gf +++ b/lib/haskell/natural4/grammars/InsLex.gf @@ -123,6 +123,7 @@ abstract InsLex = NL4Base ** { _commercial_A : A ; _dc_N : N ; _injury_N : N ; + _self_injury_N : N ; _active_A : A ; _money_N : N ; _bicycle_N : N ; @@ -150,6 +151,7 @@ abstract InsLex = NL4Base ** { _occur_at_V2 : V2 ; _have_V2 : V2 ; _kind_N : N ; + _CN_of_any_kind_CN : CN -> CN ; _benefit_N : N ; _task_N : N ; _Disease_PN : PN ; @@ -174,6 +176,7 @@ abstract InsLex = NL4Base ** { _benADDs_PN : PN ; _take_in_V2 : V2 ; _weapon_N : N ; + _dangerous_weapon_N : N ; _payable_A : A ; _exception_N : N ; _N_PN : PN ; @@ -187,7 +190,7 @@ abstract InsLex = NL4Base ** { _establish_V : V ; _box_in_V2 : V2 ; _1012_PN : PN ; - _hernia_V : V ; + _hernia_N : N ; _for_Prep : Prep ; _adjust_for_V2 : V2 ; _risk_N : N ; @@ -250,7 +253,7 @@ abstract InsLex = NL4Base ** { _Health_PN : PN ; _shortening_N : N ; _lose_V2 : V2 ; - _riot_V : V ; + _riot_N : N ; _nature_N : N ; _outcome_N : N ; _way_N : N ; @@ -270,7 +273,6 @@ abstract InsLex = NL4Base ** { _333A_PN : PN ; _eye_N : N ; _home_N : N ; - _before_Prep : Prep ; _asssure_V : V ; _virus_N : N ; _drug_N : N ; @@ -282,7 +284,7 @@ abstract InsLex = NL4Base ** { _stepuppercentage_N : N ; _include_V2 : V2 ; _Event_PN : PN ; - _start_V : V ; + _start_N : N ; _policy_N : N ; _1013_PN : PN ; _Medicine_PN : PN ; @@ -325,7 +327,7 @@ abstract InsLex = NL4Base ** { _biological_A : A ; _recognise_V : V ; _HAS_PN : PN ; - _diving_A : A ; + _scuba_diving_N : N ; _before_Subj : Subj ; _adjusted_A : A ; _MIN_PN : PN ; @@ -439,6 +441,7 @@ abstract InsLex = NL4Base ** { _H9N2_PN : PN ; _AIDS_PN : PN ; _involve_V2 : V2 ; + _involving_Prep : Prep ; _person_N : N ; _double_A : A ; _physician_N : N ; @@ -495,7 +498,7 @@ abstract InsLex = NL4Base ** { _plan4_PN : PN ; _vessel_N : N ; _racing_N : N ; - _fit_A : A ; + _fit_N : N ; _located_in_A2 : A2 ; _percentage_N : N ; _service_N : N ; @@ -550,7 +553,7 @@ abstract InsLex = NL4Base ** { _Assured_PN : PN ; _ADD_PN : PN ; _f_N : N ; - _travel_by_V2 : V2 ; + _travel_by_N2 : N2 ; _qualifies_for_add_PN : PN ; _member_N : N ; _happen_within_V2 : V2 ; @@ -558,4 +561,105 @@ abstract InsLex = NL4Base ** { _circumstancedescription_N : N ; _dType_PN : PN ; _schema_PN : PN ; +-- some PNs as Ns + _1012_N : N ; + _1014_N : N ; + _333A_N : N ; + _ADD_N : N ; + _AIDS_N : N ; + _Accident_N : N ; + _Accidental_N : N ; + _Accidents_N : N ; + _Address_N : N ; + _Adjustment_N : N ; + _Assured_N : N ; + _BSA_N : N ; + _Benefit_N : N ; + _Cap_N : N ; + _Claim_N : N ; + _CoV_N : N ; + _Conditions_N : N ; + _Date_N : N ; + _Death_N : N ; + _Details_N : N ; + _Disease_N : N ; + _Dismemberment_N : N ; + _Event_N : N ; + _Expense_N : N ; + _Flu_N : N ; + _H5N1_N : N ; + _H7N9_N : N ; + _H7N_N : N ; + _H9N2_N : N ; + _HAS_N : N ; + _Head_N : N ; + _Health_N : N ; + _Influenza_N : N ; + _Injury_N : N ; + _Insurer_N : N ; + _LA_N : N ; + _LE_N : N ; + _Leg_N : N ; + _Legionnaires_N : N ; + _Life_N : N ; + _Limit_N : N ; + _MAP_N : N ; + _MIN_N : N ; + _MR_N : N ; + _M_N : N ; + _Medicine_N : N ; + _Melioidosis_N : N ; + _Ministry_N : N ; + _Mumps_N : N ; + _N_N : N ; + _Nipah_N : N ; + _Ontology_N : N ; + _PS_N : N ; + _Plan14_N : N ; + _PlanAF_N : N ; + _PolicyHolder_N : N ; + _Policy_N : N ; + _RETURN_N : N ; + _Reductions_N : N ; + _Removal_N : N ; + _Republic_N : N ; + _SA_N : N ; + _SG_N : N ; + _Schedule_N : N ; + _Section_N : N ; + _Service_N : N ; + _Singapore_N : N ; + _Step_N : N ; + _Subscribed_N : N ; + _TABLE_N : N ; + _Teeth_N : N ; + _Triple_N : N ; + _Type_N : N ; + _Types_N : N ; + _UPON_N : N ; + _Wife_N : N ; + _Yellow_N : N ; + _addSA_N : N ; + _benADD_N : N ; + _benADDs_N : N ; + _benRA_N : N ; + _benTCM_N : N ; + _circ_N : N ; + _dTime_N : N ; + _dType_N : N ; + _diving_N : N ; + _motocross_N : N ; + _plan3_N : N ; + _plan4_N : N ; + _planAF_N : N ; + _planB_N : N ; + _planC_N : N ; + _planE_N : N ; + _planF_N : N ; + _policyHolder_N : N ; + _qualifies_for_add_N : N ; + _schema_N : N ; + _sum_list_N : N ; + _x_N : N ; + } \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/InsLexEng.gf b/lib/haskell/natural4/grammars/InsLexEng.gf index dacbfaa47..f0881d85f 100644 --- a/lib/haskell/natural4/grammars/InsLexEng.gf +++ b/lib/haskell/natural4/grammars/InsLexEng.gf @@ -1,5 +1,5 @@ concrete InsLexEng of InsLex = NL4BaseEng ** - open ParadigmsEng, Prelude in { + open ParadigmsEng, Prelude, GrammarEng in { oper mkSubj : Str -> Subj = \s -> lin Subj (ss s) ; lin _practitioner_N = mkN "practitioner" ; lin _insanity_N = mkN "insanity" ; @@ -67,6 +67,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _removal_N = mkN "removal" ; lin _sport_N = mkN "sport" ; lin _weapon_N = mkN "weapon" ; + lin _dangerous_weapon_N = mkN "nuclear, biological or chemical weapon" ; lin _middle_A = mkA "middle" ; lin _MAP_PN = mkPN "MAP" ; lin _UPON_PN = mkPN "UPON" ; @@ -170,8 +171,10 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _hand_N = mkN "hand" ; lin _adjust_for_V2 = mkV2 (us_britishV "adjust") (mkPrep "for") ; lin _involve_V2 = mkV2 (us_britishV "involve") ; + lin _involving_Prep = mkPrep "involving" ; lin _place_N = mkN "place" ; lin _injury_N = mkN "injury" ; + lin _self_injury_N = mkN "self-injury" ; lin _treatment_N = mkN "treatment" ; lin _BSA_PN = mkPN "BSA" ; lin _hrr_N = mkN "hrr" ; @@ -187,7 +190,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _result_N = mkN "result" ; lin _less_A = mkA "less" ; lin _percentage_N = mkN "percentage" ; - lin _diving_A = mkA "diving" ; + lin _scuba_diving_N = mkN "scuba diving" ; lin _Types_PN = mkPN "Types" ; lin _revolution_N = mkN "revolution" ; lin _physician_N = mkN "physician" ; @@ -195,7 +198,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _third_A = mkA "third" ; lin _first_A = mkA "first" ; lin _circ_PN = mkPN "circ" ; - lin _travel_by_V2 = mkV2 (us_britishV "travel") (mkPrep "by") ; + lin _travel_by_N2 = mkN2 (mkN "travel") (mkPrep "by") ; lin _burn_N = mkN "burn" ; lin _shortening_N = mkN "shortening" ; lin _wrestle_in_V2 = mkV2 (us_britishV "wrestle") (mkPrep "in") ; @@ -285,7 +288,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _hence_Adv = mkAdv "hence" ; lin _occur_V = us_britishV "occur" ; lin _Ontology_PN = mkPN "Ontology" ; - lin _start_V = us_britishV "start" ; + lin _start_N = mkN "start" ; lin _Mumps_PN = mkPN "Mumps" ; lin _string_N = mkN "string" ; lin _plan4_PN = mkPN "plan4" ; @@ -300,7 +303,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _high_A = mkA "high" ; lin _Event_PN = mkPN "Event" ; lin _occur_at_V2 = mkV2 (us_britishV "occur") (mkPrep "at") ; - lin _fit_A = mkA "fit" ; + lin _fit_N = mkN "fit" ; lin _least_Adv = mkAdv "least" ; lin _policysubscription_N = mkN "policysubscription" ; lin _union_N = mkN "union" ; @@ -318,7 +321,8 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _Accidental_PN = mkPN "Accidental" ; lin _Life_PN = mkPN "Life" ; lin _assure_in_V2 = mkV2 (us_britishV "assure") (mkPrep "in") ; - lin _kind_N = mkN "kind" ; + lin _kind_N = mkN "kind" ; + lin _CN_of_any_kind_CN illness = AdvCN illness (ParadigmsEng.mkAdv "of any kind") ; lin _double_A = mkA "double" ; lin _claimant_N = mkN "claimant" ; lin _suicide_N = mkN "suicide" ; @@ -362,7 +366,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _supervise_V = us_britishV "supervise" ; lin _out_Prep = mkPrep "out" ; lin _start_VS = mkVS (us_britishV "start") ; - lin _riot_V = us_britishV "riot" ; + lin _riot_N = mkN "riot" ; lin _transport_N = mkN "transport" ; lin _H7N7_N = mkN "H7N7" ; lin _both_Subj = mkSubj "both" ; @@ -443,7 +447,6 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _foot_N = mkN "foot" ; lin _incurable_A = mkA "incurable" ; lin _employee_N = mkN "employee" ; - lin _before_Prep = mkPrep "before" ; lin _fare_N = mkN "fare" ; lin _military_A = mkA "military" ; lin _exception_V = us_britishV "exception" ; @@ -489,7 +492,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _service_N = mkN "service" ; lin _mean_as_V2 = mkV2 (us_britishV "mean") (mkPrep "as") ; lin _association_N = mkN "association" ; - lin _hernia_V = us_britishV "hernia" ; + lin _hernia_N = mkN "hernia" ; lin _month_N = mkN "month" ; lin _competition_N = mkN "competition" ; lin _Influenza_PN = mkPN "Influenza" ; @@ -560,4 +563,103 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _assure_of_V2 = mkV2 (us_britishV "assure") (mkPrep "of") ; lin _met_common_requirement_for_add_V = us_britishV "met_common_requirement_for_add" ; lin _vcjd_N = mkN "vcjd" ; +-- some PNs as Ns + lin _1012_N = mkN "10.1.2" ; + lin _1014_N = mkN "10.1.4" ; + lin _333A_N = mkN "333A" ; + lin _ADD_N = mkN "ADD" ; + lin _AIDS_N = mkN "AIDS" ; + lin _Accident_N = mkN "Accident" ; + lin _Accidental_N = mkN "Accidental" ; + lin _Accidents_N = mkN "Accidents" ; + lin _Address_N = mkN "Address" ; + lin _Adjustment_N = mkN "Adjustment" ; + lin _Assured_N = mkN "Assured" ; + lin _BSA_N = mkN "BSA" ; + lin _Benefit_N = mkN "Benefit" ; + lin _Cap_N = mkN "Cap" ; + lin _Claim_N = mkN "Claim" ; + lin _CoV_N = mkN "CoV" ; + lin _Conditions_N = mkN "Conditions" ; + lin _Date_N = mkN "Date" ; + lin _Death_N = mkN "Death" ; + lin _Details_N = mkN "Details" ; + lin _Disease_N = mkN "Disease" ; + lin _Dismemberment_N = mkN "Dismemberment" ; + lin _Event_N = mkN "Event" ; + lin _Expense_N = mkN "Expense" ; + lin _Flu_N = mkN "Flu" ; + lin _H7N9_N = mkN "H7N9" ; + lin _H7N_N = mkN "H7N" ; + lin _H9N2_N = mkN "H9N2" ; + lin _HAS_N = mkN "HAS" ; + lin _Head_N = mkN "Head" ; + lin _Health_N = mkN "Health" ; + lin _Influenza_N = mkN "Influenza" ; + lin _Injury_N = mkN "Injury" ; + lin _Insurer_N = mkN "Insurer" ; + lin _LA_N = mkN "LA" ; + lin _LE_N = mkN "LE" ; + lin _Leg_N = mkN "Leg" ; + lin _Legionnaires_N = mkN "Legionnaires" ; + lin _Life_N = mkN "Life" ; + lin _Limit_N = mkN "Limit" ; + lin _MAP_N = mkN "MAP" ; + lin _MIN_N = mkN "MIN" ; + lin _MR_N = mkN "MR" ; + lin _M_N = mkN "M" ; + lin _Medicine_N = mkN "Medicine" ; + lin _Melioidosis_N = mkN "Melioidosis" ; + lin _Ministry_N = mkN "Ministry" ; + lin _Mumps_N = mkN "Mumps" ; + lin _N_N = mkN "N" ; + lin _Nipah_N = mkN "Nipah" ; + lin _Ontology_N = mkN "Ontology" ; + lin _PS_N = mkN "PS" ; + lin _Plan14_N = mkN "Plan14" ; + lin _PlanAF_N = mkN "PlanAF" ; + lin _PolicyHolder_N = mkN "PolicyHolder" ; + lin _Policy_N = mkN "Policy" ; + lin _RETURN_N = mkN "RETURN" ; + lin _Reductions_N = mkN "Reductions" ; + lin _Removal_N = mkN "Removal" ; + lin _Republic_N = mkN "Republic" ; + lin _SA_N = mkN "SA" ; + lin _SG_N = mkN "SG" ; + lin _Schedule_N = mkN "Schedule" ; + lin _Section_N = mkN "Section" ; + lin _Service_N = mkN "Service" ; + lin _Singapore_N = mkN "Singapore" ; + lin _Step_N = mkN "Step" ; + lin _Subscribed_N = mkN "Subscribed" ; + lin _TABLE_N = mkN "TABLE" ; + lin _Teeth_N = mkN "Teeth" ; + lin _Triple_N = mkN "Triple" ; + lin _Type_N = mkN "Type" ; + lin _Types_N = mkN "Types" ; + lin _UPON_N = mkN "UPON" ; + lin _Wife_N = mkN "Wife" ; + lin _Yellow_N = mkN "Yellow" ; + lin _addSA_N = mkN "addSA" ; + lin _benADD_N = mkN "benADD" ; + lin _benADDs_N = mkN "benADDs" ; + lin _benRA_N = mkN "benRA" ; + lin _benTCM_N = mkN "benTCM" ; + lin _circ_N = mkN "circ" ; + lin _dTime_N = mkN "dTime" ; + lin _dType_N = mkN "dType" ; + lin _diving_N = mkN "diving" ; + lin _motocross_N = mkN "motocross" ; + lin _plan3_N = mkN "plan3" ; + lin _plan4_N = mkN "plan4" ; + lin _planAF_N = mkN "planAF" ; + lin _planB_N = mkN "planB" ; + lin _planC_N = mkN "planC" ; + lin _planE_N = mkN "planE" ; + lin _planF_N = mkN "planF" ; + lin _policyHolder_N = mkN "policyHolder" ; + lin _qualifies_for_add_N = mkN "qualifies_for_add" ; + lin _schema_N = mkN "schema" ; + lin _sum_list_N = mkN "sum_list" ; + lin _x_N = mkN "x" ; } \ No newline at end of file diff --git a/lib/haskell/natural4/grammars/NL4.pgf b/lib/haskell/natural4/grammars/NL4.pgf index 25fd215ff6e59488ced4f204329bb7117f5789c8..48a269f69b24b6f728abebd28eaf19b9d265c2b1 100644 GIT binary patch literal 274012 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

*Z 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

fn2LZJjIFM$nnvr67ei1kwA^BL{j5%EU0aj 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 AApigX literal 223264 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 z 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 Deontic -> Action -> Text ; + Regulative : NP -> Deontic -> Action -> Text ; advUPON : Upon -> Text ; -- actually include the word Upon -- for web forms qWHO, - sWHO : Subject -> Who -> Text ; + sWHO : NP -> Who -> Text ; qUPON, -- TODO rethink types when adding more langs -- TODO2 do we allow upon to take full sentence or just VP*? - sUPON : Subject -> Upon -> Text ; + sUPON : NP -> Upon -> Text ; qCOND, sCOND : Cond -> Text ; -- general Regulative stuff - EVERY, - PARTY, - AN, THE : CN -> Subject ; -- EVERY Person + EVERY : CN -> NP ; -- EVERY Person + -- PARTY, + -- AN, THE WHO : Temp -> Pol -> VP -> Who ; -- WHO walks ACTION : VP -> Action ; MUST, MAY, SHANT : Deontic ; AND, OR : Conj ; - SubjWho : Subject -> Who -> Subject ; + SubjWho : NP -> Who -> NP ; ConjWho : Conj -> [Who] -> Who ; ConjPreWho : PrePost -> Conj -> [Who] -> Who ; -- TODO need to find examples in the wild ConjPrePostWho : (_,_ : PrePost) -> Conj -> [Who] -> Who ; - You : Subject ; + You : NP ; UPON : VP -> Upon ; -- upon becoming + UPONnp : NP -> VP -> Upon ; -- upon Accident happening -- not used for parsing WHEN : NP -> Temp -> Pol -> VP -> Cond ; ConjCond : Conj -> [Cond] -> Cond ; @@ -131,10 +131,11 @@ abstract NL4Base = CustomSyntax ** { ----------------------------------------------------------------------------- -- Very specific things, yet uncategorised - V2_PrePost : V2 -> PrePost ; -- consumes + V2_PrePost : Temp -> Pol -> V2 -> PrePost ; -- consumes NP_PrePost : NP -> PrePost ; -- beverage AP_PrePost : AP -> PrePost ; -- any unauthorised Adv_PrePost : Adv -> PrePost ; -- of personal data + SSlash_PrePost : NP -> Temp -> Pol -> V2 -> PrePost ; -- accident resulted from S_PrePost : NP -> VPS -> PrePost ; -- the vehicle is on its way APWho : AP -> Who ; -- alcoholic AdvWho : Adv -> Who ; -- in whole @@ -148,7 +149,7 @@ abstract NL4Base = CustomSyntax ** { recoverUnparsedWho : String -> Who ; recoverUnparsedCond : String -> Cond ; recoverUnparsedUpon : String -> Upon ; - recoverUnparsedSubj : String -> Subject ; + recoverUnparsedNP : String -> NP ; recoverUnparsedAction : String -> Action ; recoverUnparsedTimeUnit : String -> TimeUnit ; diff --git a/lib/haskell/natural4/grammars/NL4BaseChi.gf b/lib/haskell/natural4/grammars/NL4BaseChi.gf index 0fb1a8c94..fb83da77f 100644 --- a/lib/haskell/natural4/grammars/NL4BaseChi.gf +++ b/lib/haskell/natural4/grammars/NL4BaseChi.gf @@ -127,7 +127,7 @@ lin recoverUnparsedUpon string = mkVP (invarV string.s) ; - recoverUnparsedSubj string = symb string ; + recoverUnparsedNP string = symb string ; recoverUnparsedAction string = MkVPI (mkVP (invarV string.s)) ; diff --git a/lib/haskell/natural4/grammars/NL4BaseEng.gf b/lib/haskell/natural4/grammars/NL4BaseEng.gf index 4d8fd6ea7..c893fcb90 100644 --- a/lib/haskell/natural4/grammars/NL4BaseEng.gf +++ b/lib/haskell/natural4/grammars/NL4BaseEng.gf @@ -57,22 +57,25 @@ concrete NL4BaseEng of NL4Base = s = "·" ++ age.s ++ gt.s ++ fifty.s ; -- if constraint isn't parsed, use the original string qs = "Is" ++ age.s ++ gt.s ++ fifty.s ++ bindQM } ; - lin recoverUnparsedConstraint string = recoverUnparsedPrePost string ; + lin recoverUnparsedConstraint string = { + s = "·" ++ string.s ; + qs = string.s ++ bindQM + } ; - lin recoverUnparsedWho string = MkVPS presSimul POS (mkVP (invarV string.s)) ; + lin recoverUnparsedWho string = MkVPS presSimul POS (mkVP (invarUnparsedV string)) ; lin recoverUnparsedCond string = { s = lin S string ; qs = lin QS {s = \\_ => string.s} } ; - lin recoverUnparsedUpon string = mkVP (invarV string.s) ; - - lin recoverUnparsedSubj string = symb string ; + lin recoverUnparsedUpon string = mkVP (invarUnparsedV string) ; - lin recoverUnparsedAction string = MkVPI (mkVP (invarV string.s)) ; + lin recoverUnparsedAction string = MkVPI (mkVP (invarUnparsedV string)) ; lin recoverUnparsedTimeUnit string = mkCN "·" ++ string.s} : N> ; + oper invarUnparsedV : SS -> V = \ss -> invarV ("·" ++ ss.s) ; + } diff --git a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf index 3cf4362db..1a0bac0e5 100644 --- a/lib/haskell/natural4/grammars/NL4BaseFunctor.gf +++ b/lib/haskell/natural4/grammars/NL4BaseFunctor.gf @@ -18,7 +18,6 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open Action = Extend.VPI ; Who = Extend.VPS ; [Who] = Extend.ListVPS ; - Subject = Syntax.NP ; Deontic = Syntax.VV ; Upon = Syntax.VP ; @@ -76,7 +75,7 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open -- : (_,_ : PrePost) -> Conj -> [Who] -> Who ; ConjPrePostWho = CustomSyntax.ConjPrePostVPS ; -- fun/lin in CustomSyntax - -- : Subj -> Who -> Subj ; + -- : NP -> Who -> NP ; SubjWho subj who = mkNP subj (Extend.RelVPS CustomSyntax.whoRP who) ; -- who_RP is oper in CustomSyntax You = you_NP ; @@ -202,9 +201,9 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open ConsTComparison = CustomSyntax.ConsPrep ; ConjTComparison = CustomSyntax.ConjPrep ; -- Chi has changed lincat and defs of Prep, so all must be from CustomSyntax - BEFORE = CustomSyntax.withinPrep -- internal oper defined in CustomSyntax{Eng,Chi,May} - | CustomSyntax.before_Prep ; -- comes from RGL, re-exported by CustomSyntax{Eng,Chi,May}. + BEFORE = CustomSyntax.before_Prep -- comes from RGL, re-exported by CustomSyntax{Eng,Chi,May}. -- In addition, its lincat and lin has been changed in CustomSyntaxChi. + | CustomSyntax.withinPrep ; -- internal oper defined in CustomSyntax{Eng,Chi,May} AFTER = CustomSyntax.after_Prep ; BY = CustomSyntax.by8timePrep ; ON = CustomSyntax.on_Prep ; @@ -246,10 +245,10 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open APWho alcoholic = Extend.MkVPS presSimul POS (mkVP alcoholic) ; AdvWho in_part = Extend.MkVPS presSimul POS (mkVP in_part) ; - -- : V2 -> PrePost ; -- consumes - V2_PrePost consume = - let consumes : SS = mkUtt (mkS (mkCl emptyNP (mkVP consume emptyNP))) ; - consume : SS = mkUtt (mkS (mkCl emptyPlNP (mkVP consume emptyNP))) ; + -- : Temp -> Pol -> V2 -> PrePost ; -- consumes + V2_PrePost t p consume = + let consumes : SS = mkUtt (mkS t p (mkCl emptyNP (mkVP consume emptyNP))) ; + consume : SS = mkUtt (mkS t p (mkCl emptyPlNP (mkVP consume emptyNP))) ; in {s = consumes.s ; qs = consume.s} ; -- : NP -> PrePost ; -- beverage @@ -273,6 +272,14 @@ incomplete concrete NL4BaseFunctor of NL4Base = CustomSyntax ** open qs = (mkUtt (SQuestVPS np vps)).s } ; + -- : NP -> Temp -> Pol -> V2 -> PrePost ; -- accident resulted from + SSlash_PrePost accident t p result_from = + let result_from_S : SS = mkUtt (mkS t p (mkCl accident (mkVP result_from emptyNP))) ; + result_from_QS : SS = mkUtt (mkQS t p (mkQCl (mkCl accident (mkVP result_from emptyNP)))) ; + in {s = result_from_S.s ; qs = result_from_QS.s} ; + + recoverUnparsedNP string = symb (cc2 (ss "·") string) ; + recoverUnparsedAdv string = lin Adv (cc2 {s="·"} string) ; -- override for Chi } diff --git a/lib/haskell/natural4/grammars/NL4BaseMay.gf b/lib/haskell/natural4/grammars/NL4BaseMay.gf index 437060065..e39f05701 100644 --- a/lib/haskell/natural4/grammars/NL4BaseMay.gf +++ b/lib/haskell/natural4/grammars/NL4BaseMay.gf @@ -50,7 +50,7 @@ lin recoverUnparsedUpon string = mkVP (invarV string.s) ; - recoverUnparsedSubj string = symb string ; + recoverUnparsedNP string = symb string ; recoverUnparsedAction string = MkVPI (mkVP (invarV string.s)) ; diff --git a/lib/haskell/natural4/grammars/StandardLexicon.gf b/lib/haskell/natural4/grammars/StandardLexicon.gf index 6c20063bf..03dd6f641 100644 --- a/lib/haskell/natural4/grammars/StandardLexicon.gf +++ b/lib/haskell/natural4/grammars/StandardLexicon.gf @@ -8,6 +8,7 @@ abstract StandardLexicon = NL4Base ** { fun within_Prep : Prep ; only_AdA : AdA ; -- within -> only within + due_to_A2 : A2 ; -- Open classes, like nouns, verbs etc. fun diff --git a/lib/haskell/natural4/grammars/StandardLexiconEng.gf b/lib/haskell/natural4/grammars/StandardLexiconEng.gf index e11dc65ef..e1efcef04 100644 --- a/lib/haskell/natural4/grammars/StandardLexiconEng.gf +++ b/lib/haskell/natural4/grammars/StandardLexiconEng.gf @@ -14,6 +14,7 @@ concrete StandardLexiconEng of StandardLexicon = NL4BaseEng ** lin within_Prep = mkPrep "within" ; only_AdA = mkAdA "only" ; + due_to_A2 = mkA2 (mkA "due") to_Prep ; -- Open classes, like nouns, verbs etc. lin diff --git a/lib/haskell/natural4/grammars/updateHS.sh b/lib/haskell/natural4/grammars/updateHS.sh index 45b11bb19..11ec7bd3d 100755 --- a/lib/haskell/natural4/grammars/updateHS.sh +++ b/lib/haskell/natural4/grammars/updateHS.sh @@ -2,7 +2,7 @@ set -euo pipefail -gf -make -f haskell --haskell=gadt --haskell=lexical --lexical=N,CN,AP,VP,V2,VS,VV,Dig,Day,Month,YearComponent NL4Eng.gf NL4May.gf NL4Chi.gf +gf -make -f haskell --haskell=gadt --haskell=lexical --lexical=V,N,CN,AP,VP,V2,VS,VV,Dig,Day,Month,YearComponent NL4Eng.gf NL4May.gf NL4Chi.gf cat NL4.hs | sed 's/module NL4 where/module LS.NLP.NL4 where/' | \ sed 's/instance Show .*//' | \ diff --git a/lib/haskell/natural4/src/LS/NLP/NL4.hs b/lib/haskell/natural4/src/LS/NLP/NL4.hs index 7018bec54..13fbe496e 100644 --- a/lib/haskell/natural4/src/LS/NLP/NL4.hs +++ b/lib/haskell/natural4/src/LS/NLP/NL4.hs @@ -112,6 +112,8 @@ type GN2 = Tree GN2_ data GN2_ type GNP = Tree GNP_ data GNP_ +type GNum = Tree GNum_ +data GNum_ type GNumeral = Tree GNumeral_ data GNumeral_ type GPN = Tree GPN_ @@ -124,6 +126,10 @@ type GPrep = Tree GPrep_ data GPrep_ type GQS = Tree GQS_ data GQS_ +type GRP = Tree GRP_ +data GRP_ +type GRS = Tree GRS_ +data GRS_ type GS = Tree GS_ data GS_ type GSub10 = Tree GSub10_ @@ -140,8 +146,6 @@ type GSub1000000000000 = Tree GSub1000000000000_ data GSub1000000000000_ type GSubj = Tree GSubj_ data GSubj_ -type GSubject = Tree GSubject_ -data GSubject_ type GTComparison = Tree GTComparison_ data GTComparison_ type GTemp = Tree GTemp_ @@ -202,12 +206,10 @@ data Tree :: * -> * where G_dangerous_A :: Tree GA_ G_dead_A :: Tree GA_ G_disabled_A :: Tree GA_ - G_diving_A :: Tree GA_ G_double_A :: Tree GA_ G_due_A :: Tree GA_ G_equal_A :: Tree GA_ G_first_A :: Tree GA_ - G_fit_A :: Tree GA_ G_fractured_A :: Tree GA_ G_geographical_A :: Tree GA_ G_great_A :: Tree GA_ @@ -265,6 +267,7 @@ data Tree :: * -> * where G_viral_A :: Tree GA_ G_waterborne_A :: Tree GA_ G_located_in_A2 :: Tree GA2_ + Gdue_to_A2 :: Tree GA2_ GComplA2 :: GA2 -> GNP -> Tree GAP_ GConjAP :: GConj -> GListAP -> Tree GAP_ GInt_or_older :: GInt -> Tree GAP_ @@ -305,7 +308,10 @@ data Tree :: * -> * where Gmore_CAdv :: Tree GCAdv_ GAdjCN :: GAP -> GCN -> Tree GCN_ GCNwhereS :: GCN -> GNP -> GVPS -> Tree GCN_ + GComplN2 :: GN2 -> GNP -> Tree GCN_ + GRelCN :: GCN -> GRS -> Tree GCN_ GUseN :: GN -> Tree GCN_ + G_CN_of_any_kind_CN :: GCN -> Tree GCN_ LexCN :: String -> Tree GCN_ GAdNum :: GAdN -> GCard -> Tree GCard_ GNumDigits :: GDigits -> Tree GCard_ @@ -367,14 +373,19 @@ data Tree :: * -> * where GCompoundN :: GN -> GN -> Tree GN_ LexN :: String -> Tree GN_ G_premise_where_N2 :: Tree GN2_ + G_travel_by_N2 :: Tree GN2_ GConjNP :: GConj -> GListNP -> Tree GNP_ GContents :: Tree GNP_ GDetCN :: GDet -> GCN -> Tree GNP_ + GEVERY :: GCN -> Tree GNP_ + GGenModNP :: GNum -> GNP -> GCN -> Tree GNP_ GGerundNP :: GVP -> Tree GNP_ GLoss_or_Damage :: Tree GNP_ GMassNP :: GCN -> Tree GNP_ GNDB_Qualification :: Tree GNP_ + GSubjWho :: GNP -> GWho -> Tree GNP_ GUsePN :: GPN -> Tree GNP_ + GYou :: Tree GNP_ Ganimal :: Tree GNP_ Gany_other_exclusion :: Tree GNP_ Gbirds :: Tree GNP_ @@ -385,6 +396,7 @@ data Tree :: * -> * where Ginsects :: Tree GNP_ Gplumbing_heating_or_AC :: Tree GNP_ Gpremium :: Tree GNP_ + GrecoverUnparsedNP :: GString -> Tree GNP_ Gresult_from :: GNP -> Tree GNP_ Grodents :: Tree GNP_ Gsigned :: Tree GNP_ @@ -393,6 +405,8 @@ data Tree :: * -> * where Gswimming_pool :: Tree GNP_ Gvermin :: Tree GNP_ Gwater :: Tree GNP_ + GNumPl :: Tree GNum_ + GNumSg :: Tree GNum_ Gnum :: GSub1000000 -> Tree GNumeral_ G_1012_PN :: Tree GPN_ G_1013_PN :: Tree GPN_ @@ -504,15 +518,15 @@ data Tree :: * -> * where GNP_PrePost :: GNP -> Tree GPrePost_ GNP_caused_NP_to_VP_Prep_PrePost :: GNP -> GNP -> GVP -> GPrep -> Tree GPrePost_ GNP_caused_by_PrePost :: GNP -> Tree GPrePost_ + GSSlash_PrePost :: GNP -> GTemp -> GPol -> GV2 -> Tree GPrePost_ GS_PrePost :: GNP -> GVPS -> Tree GPrePost_ - GV2_PrePost :: GV2 -> Tree GPrePost_ + GV2_PrePost :: GTemp -> GPol -> GV2 -> Tree GPrePost_ GrecoverUnparsedPrePost :: GString -> Tree GPrePost_ GConjPrep :: GConj -> GListPrep -> Tree GPrep_ G_across_Prep :: Tree GPrep_ G_after_Prep :: Tree GPrep_ G_as_Prep :: Tree GPrep_ G_at_Prep :: Tree GPrep_ - G_before_Prep :: Tree GPrep_ G_between_Prep :: Tree GPrep_ G_by_Prep :: Tree GPrep_ G_during_Prep :: Tree GPrep_ @@ -520,6 +534,7 @@ data Tree :: * -> * where G_from_Prep :: Tree GPrep_ G_in_Prep :: Tree GPrep_ G_into_Prep :: Tree GPrep_ + G_involving_Prep :: Tree GPrep_ G_of_Prep :: Tree GPrep_ G_on_Prep :: Tree GPrep_ G_out_Prep :: Tree GPrep_ @@ -543,6 +558,8 @@ data Tree :: * -> * where Gwithin_Prep :: Tree GPrep_ GConjPrePostQS :: GString -> GString -> GConj -> GListQS -> Tree GQS_ GConjQS :: GConj -> GListQS -> Tree GQS_ + GIdRP :: Tree GRP_ + GRelVPS :: GRP -> GVPS -> Tree GRS_ GConjPrePostS :: GString -> GString -> GConj -> GListS -> Tree GS_ GConjS :: GConj -> GListS -> Tree GS_ GPredVPS :: GNP -> GVPS -> Tree GS_ @@ -584,13 +601,7 @@ data Tree :: * -> * where G_that_Subj :: Tree GSubj_ G_when_Subj :: Tree GSubj_ G_while_Subj :: Tree GSubj_ - GAN :: GCN -> Tree GSubject_ - GEVERY :: GCN -> Tree GSubject_ - GPARTY :: GCN -> Tree GSubject_ - GSubjWho :: GSubject -> GWho -> Tree GSubject_ - GTHE :: GCN -> Tree GSubject_ - GYou :: Tree GSubject_ - GrecoverUnparsedSubj :: GString -> Tree GSubject_ + Gbecause_Subj :: Tree GSubj_ GAFTER :: Tree GTComparison_ GBEFORE :: Tree GTComparison_ GBY :: Tree GTComparison_ @@ -602,65 +613,24 @@ data Tree :: * -> * where GpresSimul :: Tree GTemp_ GTemporalConstraint :: GTComparison -> GDigits -> GTimeUnit -> Tree GTemporal_ GTemporalConstraintNoDigits :: GTComparison -> GTimeUnit -> Tree GTemporal_ - GRegulative :: GSubject -> GDeontic -> GAction -> Tree GText_ + GRegulative :: GNP -> GDeontic -> GAction -> Tree GText_ GadvUPON :: GUpon -> Tree GText_ GqCOND :: GCond -> Tree GText_ GqCONSTR :: GConstraint -> Tree GText_ GqPREPOST :: GPrePost -> Tree GText_ - GqUPON :: GSubject -> GUpon -> Tree GText_ - GqWHO :: GSubject -> GWho -> Tree GText_ + GqUPON :: GNP -> GUpon -> Tree GText_ + GqWHO :: GNP -> GWho -> Tree GText_ GsCOND :: GCond -> Tree GText_ - GsUPON :: GSubject -> GUpon -> Tree GText_ - GsWHO :: GSubject -> GWho -> Tree GText_ + GsUPON :: GNP -> GUpon -> Tree GText_ + GsWHO :: GNP -> GWho -> Tree GText_ GDay_Unit :: Tree GTimeUnit_ GMonth_Unit :: Tree GTimeUnit_ GYear_Unit :: Tree GTimeUnit_ GrecoverUnparsedTimeUnit :: GString -> Tree GTimeUnit_ GUPON :: GVP -> Tree GUpon_ + GUPONnp :: GNP -> GVP -> Tree GUpon_ GrecoverUnparsedUpon :: GString -> Tree GUpon_ - G_H7N7_V :: Tree GV_ - G_adjust_V :: Tree GV_ - G_apply_V :: Tree GV_ - G_asssure_V :: Tree GV_ - G_assure_V :: Tree GV_ - G_benefit_V :: Tree GV_ - G_canoe_V :: Tree GV_ - G_cave_V :: Tree GV_ - G_claim_V :: Tree GV_ - G_cover_V :: Tree GV_ - G_establish_V :: Tree GV_ - G_exception_V :: Tree GV_ - G_give_V :: Tree GV_ - G_glide_V :: Tree GV_ - G_govern_V :: Tree GV_ - G_hand_V :: Tree GV_ - G_hernia_V :: Tree GV_ - G_hunt_V :: Tree GV_ - G_include_V :: Tree GV_ - G_license_V :: Tree GV_ - G_mean_V :: Tree GV_ - G_met_common_requirement_for_add_V :: Tree GV_ - G_mountaineer_V :: Tree GV_ - G_occur_V :: Tree GV_ - G_organise_V :: Tree GV_ - G_parachute_V :: Tree GV_ - G_pay_V :: Tree GV_ - G_policyholder_V :: Tree GV_ - G_pothole_V :: Tree GV_ - G_race_V :: Tree GV_ - G_recognise_V :: Tree GV_ - G_register_V :: Tree GV_ - G_riot_V :: Tree GV_ - G_sail_V :: Tree GV_ - G_skydive_V :: Tree GV_ - G_start_V :: Tree GV_ - G_stepupsumassure_V :: Tree GV_ - G_subscribe_V :: Tree GV_ - G_suffer_V :: Tree GV_ - G_sumassure_V :: Tree GV_ - G_supervise_V :: Tree GV_ - G_train_V :: Tree GV_ - G_windsurf_V :: Tree GV_ + LexV :: String -> Tree GV_ LexV2 :: String -> Tree GV2_ GAdvVP :: GVP -> GAdv -> Tree GVP_ GComplV2 :: GV2 -> GNP -> Tree GVP_ @@ -711,12 +681,10 @@ instance Eq (Tree a) where (G_dangerous_A,G_dangerous_A) -> and [ ] (G_dead_A,G_dead_A) -> and [ ] (G_disabled_A,G_disabled_A) -> and [ ] - (G_diving_A,G_diving_A) -> and [ ] (G_double_A,G_double_A) -> and [ ] (G_due_A,G_due_A) -> and [ ] (G_equal_A,G_equal_A) -> and [ ] (G_first_A,G_first_A) -> and [ ] - (G_fit_A,G_fit_A) -> and [ ] (G_fractured_A,G_fractured_A) -> and [ ] (G_geographical_A,G_geographical_A) -> and [ ] (G_great_A,G_great_A) -> and [ ] @@ -774,6 +742,7 @@ instance Eq (Tree a) where (G_viral_A,G_viral_A) -> and [ ] (G_waterborne_A,G_waterborne_A) -> and [ ] (G_located_in_A2,G_located_in_A2) -> and [ ] + (Gdue_to_A2,Gdue_to_A2) -> and [ ] (GComplA2 x1 x2,GComplA2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjAP x1 x2,GConjAP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GInt_or_older x1,GInt_or_older y1) -> and [ x1 == y1 ] @@ -814,7 +783,10 @@ instance Eq (Tree a) where (Gmore_CAdv,Gmore_CAdv) -> and [ ] (GAdjCN x1 x2,GAdjCN y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GCNwhereS x1 x2 x3,GCNwhereS y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] + (GComplN2 x1 x2,GComplN2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GRelCN x1 x2,GRelCN y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GUseN x1,GUseN y1) -> and [ x1 == y1 ] + (G_CN_of_any_kind_CN x1,G_CN_of_any_kind_CN y1) -> and [ x1 == y1 ] (LexCN x,LexCN y) -> x == y (GAdNum x1 x2,GAdNum y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GNumDigits x1,GNumDigits y1) -> and [ x1 == y1 ] @@ -876,14 +848,19 @@ instance Eq (Tree a) where (GCompoundN x1 x2,GCompoundN y1 y2) -> and [ x1 == y1 , x2 == y2 ] (LexN x,LexN y) -> x == y (G_premise_where_N2,G_premise_where_N2) -> and [ ] + (G_travel_by_N2,G_travel_by_N2) -> and [ ] (GConjNP x1 x2,GConjNP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GContents,GContents) -> and [ ] (GDetCN x1 x2,GDetCN y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GEVERY x1,GEVERY y1) -> and [ x1 == y1 ] + (GGenModNP x1 x2 x3,GGenModNP y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GGerundNP x1,GGerundNP y1) -> and [ x1 == y1 ] (GLoss_or_Damage,GLoss_or_Damage) -> and [ ] (GMassNP x1,GMassNP y1) -> and [ x1 == y1 ] (GNDB_Qualification,GNDB_Qualification) -> and [ ] + (GSubjWho x1 x2,GSubjWho y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GUsePN x1,GUsePN y1) -> and [ x1 == y1 ] + (GYou,GYou) -> and [ ] (Ganimal,Ganimal) -> and [ ] (Gany_other_exclusion,Gany_other_exclusion) -> and [ ] (Gbirds,Gbirds) -> and [ ] @@ -894,6 +871,7 @@ instance Eq (Tree a) where (Ginsects,Ginsects) -> and [ ] (Gplumbing_heating_or_AC,Gplumbing_heating_or_AC) -> and [ ] (Gpremium,Gpremium) -> and [ ] + (GrecoverUnparsedNP x1,GrecoverUnparsedNP y1) -> and [ x1 == y1 ] (Gresult_from x1,Gresult_from y1) -> and [ x1 == y1 ] (Grodents,Grodents) -> and [ ] (Gsigned,Gsigned) -> and [ ] @@ -902,6 +880,8 @@ instance Eq (Tree a) where (Gswimming_pool,Gswimming_pool) -> and [ ] (Gvermin,Gvermin) -> and [ ] (Gwater,Gwater) -> and [ ] + (GNumPl,GNumPl) -> and [ ] + (GNumSg,GNumSg) -> and [ ] (Gnum x1,Gnum y1) -> and [ x1 == y1 ] (G_1012_PN,G_1012_PN) -> and [ ] (G_1013_PN,G_1013_PN) -> and [ ] @@ -1013,15 +993,15 @@ instance Eq (Tree a) where (GNP_PrePost x1,GNP_PrePost y1) -> and [ x1 == y1 ] (GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4,GNP_caused_NP_to_VP_Prep_PrePost y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GNP_caused_by_PrePost x1,GNP_caused_by_PrePost y1) -> and [ x1 == y1 ] + (GSSlash_PrePost x1 x2 x3 x4,GSSlash_PrePost y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GS_PrePost x1 x2,GS_PrePost y1 y2) -> and [ x1 == y1 , x2 == y2 ] - (GV2_PrePost x1,GV2_PrePost y1) -> and [ x1 == y1 ] + (GV2_PrePost x1 x2 x3,GV2_PrePost y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GrecoverUnparsedPrePost x1,GrecoverUnparsedPrePost y1) -> and [ x1 == y1 ] (GConjPrep x1 x2,GConjPrep y1 y2) -> and [ x1 == y1 , x2 == y2 ] (G_across_Prep,G_across_Prep) -> and [ ] (G_after_Prep,G_after_Prep) -> and [ ] (G_as_Prep,G_as_Prep) -> and [ ] (G_at_Prep,G_at_Prep) -> and [ ] - (G_before_Prep,G_before_Prep) -> and [ ] (G_between_Prep,G_between_Prep) -> and [ ] (G_by_Prep,G_by_Prep) -> and [ ] (G_during_Prep,G_during_Prep) -> and [ ] @@ -1029,6 +1009,7 @@ instance Eq (Tree a) where (G_from_Prep,G_from_Prep) -> and [ ] (G_in_Prep,G_in_Prep) -> and [ ] (G_into_Prep,G_into_Prep) -> and [ ] + (G_involving_Prep,G_involving_Prep) -> and [ ] (G_of_Prep,G_of_Prep) -> and [ ] (G_on_Prep,G_on_Prep) -> and [ ] (G_out_Prep,G_out_Prep) -> and [ ] @@ -1052,6 +1033,8 @@ instance Eq (Tree a) where (Gwithin_Prep,Gwithin_Prep) -> and [ ] (GConjPrePostQS x1 x2 x3 x4,GConjPrePostQS y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GConjQS x1 x2,GConjQS y1 y2) -> and [ x1 == y1 , x2 == y2 ] + (GIdRP,GIdRP) -> and [ ] + (GRelVPS x1 x2,GRelVPS y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjPrePostS x1 x2 x3 x4,GConjPrePostS y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GConjS x1 x2,GConjS y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GPredVPS x1 x2,GPredVPS y1 y2) -> and [ x1 == y1 , x2 == y2 ] @@ -1093,13 +1076,7 @@ instance Eq (Tree a) where (G_that_Subj,G_that_Subj) -> and [ ] (G_when_Subj,G_when_Subj) -> and [ ] (G_while_Subj,G_while_Subj) -> and [ ] - (GAN x1,GAN y1) -> and [ x1 == y1 ] - (GEVERY x1,GEVERY y1) -> and [ x1 == y1 ] - (GPARTY x1,GPARTY y1) -> and [ x1 == y1 ] - (GSubjWho x1 x2,GSubjWho y1 y2) -> and [ x1 == y1 , x2 == y2 ] - (GTHE x1,GTHE y1) -> and [ x1 == y1 ] - (GYou,GYou) -> and [ ] - (GrecoverUnparsedSubj x1,GrecoverUnparsedSubj y1) -> and [ x1 == y1 ] + (Gbecause_Subj,Gbecause_Subj) -> and [ ] (GAFTER,GAFTER) -> and [ ] (GBEFORE,GBEFORE) -> and [ ] (GBY,GBY) -> and [ ] @@ -1126,50 +1103,9 @@ instance Eq (Tree a) where (GYear_Unit,GYear_Unit) -> and [ ] (GrecoverUnparsedTimeUnit x1,GrecoverUnparsedTimeUnit y1) -> and [ x1 == y1 ] (GUPON x1,GUPON y1) -> and [ x1 == y1 ] + (GUPONnp x1 x2,GUPONnp y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GrecoverUnparsedUpon x1,GrecoverUnparsedUpon y1) -> and [ x1 == y1 ] - (G_H7N7_V,G_H7N7_V) -> and [ ] - (G_adjust_V,G_adjust_V) -> and [ ] - (G_apply_V,G_apply_V) -> and [ ] - (G_asssure_V,G_asssure_V) -> and [ ] - (G_assure_V,G_assure_V) -> and [ ] - (G_benefit_V,G_benefit_V) -> and [ ] - (G_canoe_V,G_canoe_V) -> and [ ] - (G_cave_V,G_cave_V) -> and [ ] - (G_claim_V,G_claim_V) -> and [ ] - (G_cover_V,G_cover_V) -> and [ ] - (G_establish_V,G_establish_V) -> and [ ] - (G_exception_V,G_exception_V) -> and [ ] - (G_give_V,G_give_V) -> and [ ] - (G_glide_V,G_glide_V) -> and [ ] - (G_govern_V,G_govern_V) -> and [ ] - (G_hand_V,G_hand_V) -> and [ ] - (G_hernia_V,G_hernia_V) -> and [ ] - (G_hunt_V,G_hunt_V) -> and [ ] - (G_include_V,G_include_V) -> and [ ] - (G_license_V,G_license_V) -> and [ ] - (G_mean_V,G_mean_V) -> and [ ] - (G_met_common_requirement_for_add_V,G_met_common_requirement_for_add_V) -> and [ ] - (G_mountaineer_V,G_mountaineer_V) -> and [ ] - (G_occur_V,G_occur_V) -> and [ ] - (G_organise_V,G_organise_V) -> and [ ] - (G_parachute_V,G_parachute_V) -> and [ ] - (G_pay_V,G_pay_V) -> and [ ] - (G_policyholder_V,G_policyholder_V) -> and [ ] - (G_pothole_V,G_pothole_V) -> and [ ] - (G_race_V,G_race_V) -> and [ ] - (G_recognise_V,G_recognise_V) -> and [ ] - (G_register_V,G_register_V) -> and [ ] - (G_riot_V,G_riot_V) -> and [ ] - (G_sail_V,G_sail_V) -> and [ ] - (G_skydive_V,G_skydive_V) -> and [ ] - (G_start_V,G_start_V) -> and [ ] - (G_stepupsumassure_V,G_stepupsumassure_V) -> and [ ] - (G_subscribe_V,G_subscribe_V) -> and [ ] - (G_suffer_V,G_suffer_V) -> and [ ] - (G_sumassure_V,G_sumassure_V) -> and [ ] - (G_supervise_V,G_supervise_V) -> and [ ] - (G_train_V,G_train_V) -> and [ ] - (G_windsurf_V,G_windsurf_V) -> and [ ] + (LexV x,LexV y) -> x == y (LexV2 x,LexV2 y) -> x == y (GAdvVP x1 x2,GAdvVP y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GComplV2 x1 x2,GComplV2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] @@ -1220,12 +1156,10 @@ instance Gf GA where gf G_dangerous_A = mkApp (mkCId "_dangerous_A") [] gf G_dead_A = mkApp (mkCId "_dead_A") [] gf G_disabled_A = mkApp (mkCId "_disabled_A") [] - gf G_diving_A = mkApp (mkCId "_diving_A") [] gf G_double_A = mkApp (mkCId "_double_A") [] gf G_due_A = mkApp (mkCId "_due_A") [] gf G_equal_A = mkApp (mkCId "_equal_A") [] gf G_first_A = mkApp (mkCId "_first_A") [] - gf G_fit_A = mkApp (mkCId "_fit_A") [] gf G_fractured_A = mkApp (mkCId "_fractured_A") [] gf G_geographical_A = mkApp (mkCId "_geographical_A") [] gf G_great_A = mkApp (mkCId "_great_A") [] @@ -1301,12 +1235,10 @@ instance Gf GA where Just (i,[]) | i == mkCId "_dangerous_A" -> G_dangerous_A Just (i,[]) | i == mkCId "_dead_A" -> G_dead_A Just (i,[]) | i == mkCId "_disabled_A" -> G_disabled_A - Just (i,[]) | i == mkCId "_diving_A" -> G_diving_A Just (i,[]) | i == mkCId "_double_A" -> G_double_A Just (i,[]) | i == mkCId "_due_A" -> G_due_A Just (i,[]) | i == mkCId "_equal_A" -> G_equal_A Just (i,[]) | i == mkCId "_first_A" -> G_first_A - Just (i,[]) | i == mkCId "_fit_A" -> G_fit_A Just (i,[]) | i == mkCId "_fractured_A" -> G_fractured_A Just (i,[]) | i == mkCId "_geographical_A" -> G_geographical_A Just (i,[]) | i == mkCId "_great_A" -> G_great_A @@ -1369,10 +1301,12 @@ instance Gf GA where instance Gf GA2 where gf G_located_in_A2 = mkApp (mkCId "_located_in_A2") [] + gf Gdue_to_A2 = mkApp (mkCId "due_to_A2") [] fg t = case unApp t of Just (i,[]) | i == mkCId "_located_in_A2" -> G_located_in_A2 + Just (i,[]) | i == mkCId "due_to_A2" -> Gdue_to_A2 _ -> error ("no A2 " ++ show t) @@ -1503,14 +1437,20 @@ instance Gf GCAdv where instance Gf GCN where gf (GAdjCN x1 x2) = mkApp (mkCId "AdjCN") [gf x1, gf x2] gf (GCNwhereS x1 x2 x3) = mkApp (mkCId "CNwhereS") [gf x1, gf x2, gf x3] + gf (GComplN2 x1 x2) = mkApp (mkCId "ComplN2") [gf x1, gf x2] + gf (GRelCN x1 x2) = mkApp (mkCId "RelCN") [gf x1, gf x2] gf (GUseN x1) = mkApp (mkCId "UseN") [gf x1] + gf (G_CN_of_any_kind_CN x1) = mkApp (mkCId "_CN_of_any_kind_CN") [gf x1] gf (LexCN x) = mkApp (mkCId x) [] fg t = case unApp t of Just (i,[x1,x2]) | i == mkCId "AdjCN" -> GAdjCN (fg x1) (fg x2) Just (i,[x1,x2,x3]) | i == mkCId "CNwhereS" -> GCNwhereS (fg x1) (fg x2) (fg x3) + Just (i,[x1,x2]) | i == mkCId "ComplN2" -> GComplN2 (fg x1) (fg x2) + Just (i,[x1,x2]) | i == mkCId "RelCN" -> GRelCN (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "UseN" -> GUseN (fg x1) + Just (i,[x1]) | i == mkCId "_CN_of_any_kind_CN" -> G_CN_of_any_kind_CN (fg x1) Just (i,[]) -> LexCN (showCId i) _ -> error ("no CN " ++ show t) @@ -1853,10 +1793,12 @@ instance Gf GN where instance Gf GN2 where gf G_premise_where_N2 = mkApp (mkCId "_premise_where_N2") [] + gf G_travel_by_N2 = mkApp (mkCId "_travel_by_N2") [] fg t = case unApp t of Just (i,[]) | i == mkCId "_premise_where_N2" -> G_premise_where_N2 + Just (i,[]) | i == mkCId "_travel_by_N2" -> G_travel_by_N2 _ -> error ("no N2 " ++ show t) @@ -1865,11 +1807,15 @@ instance Gf GNP where gf (GConjNP x1 x2) = mkApp (mkCId "ConjNP") [gf x1, gf x2] gf GContents = mkApp (mkCId "Contents") [] gf (GDetCN x1 x2) = mkApp (mkCId "DetCN") [gf x1, gf x2] + gf (GEVERY x1) = mkApp (mkCId "EVERY") [gf x1] + gf (GGenModNP x1 x2 x3) = mkApp (mkCId "GenModNP") [gf x1, gf x2, gf x3] gf (GGerundNP x1) = mkApp (mkCId "GerundNP") [gf x1] gf GLoss_or_Damage = mkApp (mkCId "Loss_or_Damage") [] gf (GMassNP x1) = mkApp (mkCId "MassNP") [gf x1] gf GNDB_Qualification = mkApp (mkCId "NDB_Qualification") [] + gf (GSubjWho x1 x2) = mkApp (mkCId "SubjWho") [gf x1, gf x2] gf (GUsePN x1) = mkApp (mkCId "UsePN") [gf x1] + gf GYou = mkApp (mkCId "You") [] gf Ganimal = mkApp (mkCId "animal") [] gf Gany_other_exclusion = mkApp (mkCId "any_other_exclusion") [] gf Gbirds = mkApp (mkCId "birds") [] @@ -1880,6 +1826,7 @@ instance Gf GNP where gf Ginsects = mkApp (mkCId "insects") [] gf Gplumbing_heating_or_AC = mkApp (mkCId "plumbing_heating_or_AC") [] gf Gpremium = mkApp (mkCId "premium") [] + gf (GrecoverUnparsedNP x1) = mkApp (mkCId "recoverUnparsedNP") [gf x1] gf (Gresult_from x1) = mkApp (mkCId "result_from") [gf x1] gf Grodents = mkApp (mkCId "rodents") [] gf Gsigned = mkApp (mkCId "signed") [] @@ -1894,11 +1841,15 @@ instance Gf GNP where Just (i,[x1,x2]) | i == mkCId "ConjNP" -> GConjNP (fg x1) (fg x2) Just (i,[]) | i == mkCId "Contents" -> GContents Just (i,[x1,x2]) | i == mkCId "DetCN" -> GDetCN (fg x1) (fg x2) + Just (i,[x1]) | i == mkCId "EVERY" -> GEVERY (fg x1) + Just (i,[x1,x2,x3]) | i == mkCId "GenModNP" -> GGenModNP (fg x1) (fg x2) (fg x3) Just (i,[x1]) | i == mkCId "GerundNP" -> GGerundNP (fg x1) Just (i,[]) | i == mkCId "Loss_or_Damage" -> GLoss_or_Damage Just (i,[x1]) | i == mkCId "MassNP" -> GMassNP (fg x1) Just (i,[]) | i == mkCId "NDB_Qualification" -> GNDB_Qualification + Just (i,[x1,x2]) | i == mkCId "SubjWho" -> GSubjWho (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "UsePN" -> GUsePN (fg x1) + Just (i,[]) | i == mkCId "You" -> GYou Just (i,[]) | i == mkCId "animal" -> Ganimal Just (i,[]) | i == mkCId "any_other_exclusion" -> Gany_other_exclusion Just (i,[]) | i == mkCId "birds" -> Gbirds @@ -1909,6 +1860,7 @@ instance Gf GNP where Just (i,[]) | i == mkCId "insects" -> Ginsects Just (i,[]) | i == mkCId "plumbing_heating_or_AC" -> Gplumbing_heating_or_AC Just (i,[]) | i == mkCId "premium" -> Gpremium + Just (i,[x1]) | i == mkCId "recoverUnparsedNP" -> GrecoverUnparsedNP (fg x1) Just (i,[x1]) | i == mkCId "result_from" -> Gresult_from (fg x1) Just (i,[]) | i == mkCId "rodents" -> Grodents Just (i,[]) | i == mkCId "signed" -> Gsigned @@ -1921,6 +1873,18 @@ instance Gf GNP where _ -> error ("no NP " ++ show t) +instance Gf GNum where + gf GNumPl = mkApp (mkCId "NumPl") [] + gf GNumSg = mkApp (mkCId "NumSg") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "NumPl" -> GNumPl + Just (i,[]) | i == mkCId "NumSg" -> GNumSg + + + _ -> error ("no Num " ++ show t) + instance Gf GNumeral where gf (Gnum x1) = mkApp (mkCId "num") [gf x1] @@ -2163,8 +2127,9 @@ instance Gf GPrePost where gf (GNP_PrePost x1) = mkApp (mkCId "NP_PrePost") [gf x1] gf (GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4) = mkApp (mkCId "NP_caused_NP_to_VP_Prep_PrePost") [gf x1, gf x2, gf x3, gf x4] gf (GNP_caused_by_PrePost x1) = mkApp (mkCId "NP_caused_by_PrePost") [gf x1] + gf (GSSlash_PrePost x1 x2 x3 x4) = mkApp (mkCId "SSlash_PrePost") [gf x1, gf x2, gf x3, gf x4] gf (GS_PrePost x1 x2) = mkApp (mkCId "S_PrePost") [gf x1, gf x2] - gf (GV2_PrePost x1) = mkApp (mkCId "V2_PrePost") [gf x1] + gf (GV2_PrePost x1 x2 x3) = mkApp (mkCId "V2_PrePost") [gf x1, gf x2, gf x3] gf (GrecoverUnparsedPrePost x1) = mkApp (mkCId "recoverUnparsedPrePost") [gf x1] fg t = @@ -2174,8 +2139,9 @@ instance Gf GPrePost where Just (i,[x1]) | i == mkCId "NP_PrePost" -> GNP_PrePost (fg x1) Just (i,[x1,x2,x3,x4]) | i == mkCId "NP_caused_NP_to_VP_Prep_PrePost" -> GNP_caused_NP_to_VP_Prep_PrePost (fg x1) (fg x2) (fg x3) (fg x4) Just (i,[x1]) | i == mkCId "NP_caused_by_PrePost" -> GNP_caused_by_PrePost (fg x1) + Just (i,[x1,x2,x3,x4]) | i == mkCId "SSlash_PrePost" -> GSSlash_PrePost (fg x1) (fg x2) (fg x3) (fg x4) Just (i,[x1,x2]) | i == mkCId "S_PrePost" -> GS_PrePost (fg x1) (fg x2) - Just (i,[x1]) | i == mkCId "V2_PrePost" -> GV2_PrePost (fg x1) + Just (i,[x1,x2,x3]) | i == mkCId "V2_PrePost" -> GV2_PrePost (fg x1) (fg x2) (fg x3) Just (i,[x1]) | i == mkCId "recoverUnparsedPrePost" -> GrecoverUnparsedPrePost (fg x1) @@ -2187,7 +2153,6 @@ instance Gf GPrep where gf G_after_Prep = mkApp (mkCId "_after_Prep") [] gf G_as_Prep = mkApp (mkCId "_as_Prep") [] gf G_at_Prep = mkApp (mkCId "_at_Prep") [] - gf G_before_Prep = mkApp (mkCId "_before_Prep") [] gf G_between_Prep = mkApp (mkCId "_between_Prep") [] gf G_by_Prep = mkApp (mkCId "_by_Prep") [] gf G_during_Prep = mkApp (mkCId "_during_Prep") [] @@ -2195,6 +2160,7 @@ instance Gf GPrep where gf G_from_Prep = mkApp (mkCId "_from_Prep") [] gf G_in_Prep = mkApp (mkCId "_in_Prep") [] gf G_into_Prep = mkApp (mkCId "_into_Prep") [] + gf G_involving_Prep = mkApp (mkCId "_involving_Prep") [] gf G_of_Prep = mkApp (mkCId "_of_Prep") [] gf G_on_Prep = mkApp (mkCId "_on_Prep") [] gf G_out_Prep = mkApp (mkCId "_out_Prep") [] @@ -2224,7 +2190,6 @@ instance Gf GPrep where Just (i,[]) | i == mkCId "_after_Prep" -> G_after_Prep Just (i,[]) | i == mkCId "_as_Prep" -> G_as_Prep Just (i,[]) | i == mkCId "_at_Prep" -> G_at_Prep - Just (i,[]) | i == mkCId "_before_Prep" -> G_before_Prep Just (i,[]) | i == mkCId "_between_Prep" -> G_between_Prep Just (i,[]) | i == mkCId "_by_Prep" -> G_by_Prep Just (i,[]) | i == mkCId "_during_Prep" -> G_during_Prep @@ -2232,6 +2197,7 @@ instance Gf GPrep where Just (i,[]) | i == mkCId "_from_Prep" -> G_from_Prep Just (i,[]) | i == mkCId "_in_Prep" -> G_in_Prep Just (i,[]) | i == mkCId "_into_Prep" -> G_into_Prep + Just (i,[]) | i == mkCId "_involving_Prep" -> G_involving_Prep Just (i,[]) | i == mkCId "_of_Prep" -> G_of_Prep Just (i,[]) | i == mkCId "_on_Prep" -> G_on_Prep Just (i,[]) | i == mkCId "_out_Prep" -> G_out_Prep @@ -2269,6 +2235,26 @@ instance Gf GQS where _ -> error ("no QS " ++ show t) +instance Gf GRP where + gf GIdRP = mkApp (mkCId "IdRP") [] + + fg t = + case unApp t of + Just (i,[]) | i == mkCId "IdRP" -> GIdRP + + + _ -> error ("no RP " ++ show t) + +instance Gf GRS where + gf (GRelVPS x1 x2) = mkApp (mkCId "RelVPS") [gf x1, gf x2] + + fg t = + case unApp t of + Just (i,[x1,x2]) | i == mkCId "RelVPS" -> GRelVPS (fg x1) (fg x2) + + + _ -> error ("no RS " ++ show t) + instance Gf GS where gf (GConjPrePostS x1 x2 x3 x4) = mkApp (mkCId "ConjPrePostS") [gf x1, gf x2, gf x3, gf x4] gf (GConjS x1 x2) = mkApp (mkCId "ConjS") [gf x1, gf x2] @@ -2398,6 +2384,7 @@ instance Gf GSubj where gf G_that_Subj = mkApp (mkCId "_that_Subj") [] gf G_when_Subj = mkApp (mkCId "_when_Subj") [] gf G_while_Subj = mkApp (mkCId "_while_Subj") [] + gf Gbecause_Subj = mkApp (mkCId "because_Subj") [] fg t = case unApp t of @@ -2411,32 +2398,11 @@ instance Gf GSubj where Just (i,[]) | i == mkCId "_that_Subj" -> G_that_Subj Just (i,[]) | i == mkCId "_when_Subj" -> G_when_Subj Just (i,[]) | i == mkCId "_while_Subj" -> G_while_Subj + Just (i,[]) | i == mkCId "because_Subj" -> Gbecause_Subj _ -> error ("no Subj " ++ show t) -instance Gf GSubject where - gf (GAN x1) = mkApp (mkCId "AN") [gf x1] - gf (GEVERY x1) = mkApp (mkCId "EVERY") [gf x1] - gf (GPARTY x1) = mkApp (mkCId "PARTY") [gf x1] - gf (GSubjWho x1 x2) = mkApp (mkCId "SubjWho") [gf x1, gf x2] - gf (GTHE x1) = mkApp (mkCId "THE") [gf x1] - gf GYou = mkApp (mkCId "You") [] - gf (GrecoverUnparsedSubj x1) = mkApp (mkCId "recoverUnparsedSubj") [gf x1] - - fg t = - case unApp t of - Just (i,[x1]) | i == mkCId "AN" -> GAN (fg x1) - Just (i,[x1]) | i == mkCId "EVERY" -> GEVERY (fg x1) - Just (i,[x1]) | i == mkCId "PARTY" -> GPARTY (fg x1) - Just (i,[x1,x2]) | i == mkCId "SubjWho" -> GSubjWho (fg x1) (fg x2) - Just (i,[x1]) | i == mkCId "THE" -> GTHE (fg x1) - Just (i,[]) | i == mkCId "You" -> GYou - Just (i,[x1]) | i == mkCId "recoverUnparsedSubj" -> GrecoverUnparsedSubj (fg x1) - - - _ -> error ("no Subject " ++ show t) - instance Gf GTComparison where gf GAFTER = mkApp (mkCId "AFTER") [] gf GBEFORE = mkApp (mkCId "BEFORE") [] @@ -2529,108 +2495,25 @@ instance Gf GTimeUnit where instance Gf GUpon where gf (GUPON x1) = mkApp (mkCId "UPON") [gf x1] + gf (GUPONnp x1 x2) = mkApp (mkCId "UPONnp") [gf x1, gf x2] gf (GrecoverUnparsedUpon x1) = mkApp (mkCId "recoverUnparsedUpon") [gf x1] fg t = case unApp t of Just (i,[x1]) | i == mkCId "UPON" -> GUPON (fg x1) + Just (i,[x1,x2]) | i == mkCId "UPONnp" -> GUPONnp (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "recoverUnparsedUpon" -> GrecoverUnparsedUpon (fg x1) _ -> error ("no Upon " ++ show t) instance Gf GV where - gf G_H7N7_V = mkApp (mkCId "_H7N7_V") [] - gf G_adjust_V = mkApp (mkCId "_adjust_V") [] - gf G_apply_V = mkApp (mkCId "_apply_V") [] - gf G_asssure_V = mkApp (mkCId "_asssure_V") [] - gf G_assure_V = mkApp (mkCId "_assure_V") [] - gf G_benefit_V = mkApp (mkCId "_benefit_V") [] - gf G_canoe_V = mkApp (mkCId "_canoe_V") [] - gf G_cave_V = mkApp (mkCId "_cave_V") [] - gf G_claim_V = mkApp (mkCId "_claim_V") [] - gf G_cover_V = mkApp (mkCId "_cover_V") [] - gf G_establish_V = mkApp (mkCId "_establish_V") [] - gf G_exception_V = mkApp (mkCId "_exception_V") [] - gf G_give_V = mkApp (mkCId "_give_V") [] - gf G_glide_V = mkApp (mkCId "_glide_V") [] - gf G_govern_V = mkApp (mkCId "_govern_V") [] - gf G_hand_V = mkApp (mkCId "_hand_V") [] - gf G_hernia_V = mkApp (mkCId "_hernia_V") [] - gf G_hunt_V = mkApp (mkCId "_hunt_V") [] - gf G_include_V = mkApp (mkCId "_include_V") [] - gf G_license_V = mkApp (mkCId "_license_V") [] - gf G_mean_V = mkApp (mkCId "_mean_V") [] - gf G_met_common_requirement_for_add_V = mkApp (mkCId "_met_common_requirement_for_add_V") [] - gf G_mountaineer_V = mkApp (mkCId "_mountaineer_V") [] - gf G_occur_V = mkApp (mkCId "_occur_V") [] - gf G_organise_V = mkApp (mkCId "_organise_V") [] - gf G_parachute_V = mkApp (mkCId "_parachute_V") [] - gf G_pay_V = mkApp (mkCId "_pay_V") [] - gf G_policyholder_V = mkApp (mkCId "_policyholder_V") [] - gf G_pothole_V = mkApp (mkCId "_pothole_V") [] - gf G_race_V = mkApp (mkCId "_race_V") [] - gf G_recognise_V = mkApp (mkCId "_recognise_V") [] - gf G_register_V = mkApp (mkCId "_register_V") [] - gf G_riot_V = mkApp (mkCId "_riot_V") [] - gf G_sail_V = mkApp (mkCId "_sail_V") [] - gf G_skydive_V = mkApp (mkCId "_skydive_V") [] - gf G_start_V = mkApp (mkCId "_start_V") [] - gf G_stepupsumassure_V = mkApp (mkCId "_stepupsumassure_V") [] - gf G_subscribe_V = mkApp (mkCId "_subscribe_V") [] - gf G_suffer_V = mkApp (mkCId "_suffer_V") [] - gf G_sumassure_V = mkApp (mkCId "_sumassure_V") [] - gf G_supervise_V = mkApp (mkCId "_supervise_V") [] - gf G_train_V = mkApp (mkCId "_train_V") [] - gf G_windsurf_V = mkApp (mkCId "_windsurf_V") [] + gf (LexV x) = mkApp (mkCId x) [] fg t = case unApp t of - Just (i,[]) | i == mkCId "_H7N7_V" -> G_H7N7_V - Just (i,[]) | i == mkCId "_adjust_V" -> G_adjust_V - Just (i,[]) | i == mkCId "_apply_V" -> G_apply_V - Just (i,[]) | i == mkCId "_asssure_V" -> G_asssure_V - Just (i,[]) | i == mkCId "_assure_V" -> G_assure_V - Just (i,[]) | i == mkCId "_benefit_V" -> G_benefit_V - Just (i,[]) | i == mkCId "_canoe_V" -> G_canoe_V - Just (i,[]) | i == mkCId "_cave_V" -> G_cave_V - Just (i,[]) | i == mkCId "_claim_V" -> G_claim_V - Just (i,[]) | i == mkCId "_cover_V" -> G_cover_V - Just (i,[]) | i == mkCId "_establish_V" -> G_establish_V - Just (i,[]) | i == mkCId "_exception_V" -> G_exception_V - Just (i,[]) | i == mkCId "_give_V" -> G_give_V - Just (i,[]) | i == mkCId "_glide_V" -> G_glide_V - Just (i,[]) | i == mkCId "_govern_V" -> G_govern_V - Just (i,[]) | i == mkCId "_hand_V" -> G_hand_V - Just (i,[]) | i == mkCId "_hernia_V" -> G_hernia_V - Just (i,[]) | i == mkCId "_hunt_V" -> G_hunt_V - Just (i,[]) | i == mkCId "_include_V" -> G_include_V - Just (i,[]) | i == mkCId "_license_V" -> G_license_V - Just (i,[]) | i == mkCId "_mean_V" -> G_mean_V - Just (i,[]) | i == mkCId "_met_common_requirement_for_add_V" -> G_met_common_requirement_for_add_V - Just (i,[]) | i == mkCId "_mountaineer_V" -> G_mountaineer_V - Just (i,[]) | i == mkCId "_occur_V" -> G_occur_V - Just (i,[]) | i == mkCId "_organise_V" -> G_organise_V - Just (i,[]) | i == mkCId "_parachute_V" -> G_parachute_V - Just (i,[]) | i == mkCId "_pay_V" -> G_pay_V - Just (i,[]) | i == mkCId "_policyholder_V" -> G_policyholder_V - Just (i,[]) | i == mkCId "_pothole_V" -> G_pothole_V - Just (i,[]) | i == mkCId "_race_V" -> G_race_V - Just (i,[]) | i == mkCId "_recognise_V" -> G_recognise_V - Just (i,[]) | i == mkCId "_register_V" -> G_register_V - Just (i,[]) | i == mkCId "_riot_V" -> G_riot_V - Just (i,[]) | i == mkCId "_sail_V" -> G_sail_V - Just (i,[]) | i == mkCId "_skydive_V" -> G_skydive_V - Just (i,[]) | i == mkCId "_start_V" -> G_start_V - Just (i,[]) | i == mkCId "_stepupsumassure_V" -> G_stepupsumassure_V - Just (i,[]) | i == mkCId "_subscribe_V" -> G_subscribe_V - Just (i,[]) | i == mkCId "_suffer_V" -> G_suffer_V - Just (i,[]) | i == mkCId "_sumassure_V" -> G_sumassure_V - Just (i,[]) | i == mkCId "_supervise_V" -> G_supervise_V - Just (i,[]) | i == mkCId "_train_V" -> G_train_V - Just (i,[]) | i == mkCId "_windsurf_V" -> G_windsurf_V - + Just (i,[]) -> LexV (showCId i) _ -> error ("no V " ++ show t) instance Gf GV2 where @@ -2793,7 +2676,10 @@ instance Compos Tree where GrecoverUnparsedAdv x1 -> r GrecoverUnparsedAdv `a` f x1 GAdjCN x1 x2 -> r GAdjCN `a` f x1 `a` f x2 GCNwhereS x1 x2 x3 -> r GCNwhereS `a` f x1 `a` f x2 `a` f x3 + GComplN2 x1 x2 -> r GComplN2 `a` f x1 `a` f x2 + GRelCN x1 x2 -> r GRelCN `a` f x1 `a` f x2 GUseN x1 -> r GUseN `a` f x1 + G_CN_of_any_kind_CN x1 -> r G_CN_of_any_kind_CN `a` f x1 GAdNum x1 x2 -> r GAdNum `a` f x1 `a` f x2 GNumDigits x1 -> r GNumDigits `a` f x1 GCompAP x1 -> r GCompAP `a` f x1 @@ -2822,9 +2708,13 @@ instance Compos Tree where GCompoundN x1 x2 -> r GCompoundN `a` f x1 `a` f x2 GConjNP x1 x2 -> r GConjNP `a` f x1 `a` f x2 GDetCN x1 x2 -> r GDetCN `a` f x1 `a` f x2 + GEVERY x1 -> r GEVERY `a` f x1 + GGenModNP x1 x2 x3 -> r GGenModNP `a` f x1 `a` f x2 `a` f x3 GGerundNP x1 -> r GGerundNP `a` f x1 GMassNP x1 -> r GMassNP `a` f x1 + GSubjWho x1 x2 -> r GSubjWho `a` f x1 `a` f x2 GUsePN x1 -> r GUsePN `a` f x1 + GrecoverUnparsedNP x1 -> r GrecoverUnparsedNP `a` f x1 Gresult_from x1 -> r Gresult_from `a` f x1 Gnum x1 -> r Gnum `a` f x1 GAP_PrePost x1 -> r GAP_PrePost `a` f x1 @@ -2832,12 +2722,14 @@ instance Compos Tree where GNP_PrePost x1 -> r GNP_PrePost `a` f x1 GNP_caused_NP_to_VP_Prep_PrePost x1 x2 x3 x4 -> r GNP_caused_NP_to_VP_Prep_PrePost `a` f x1 `a` f x2 `a` f x3 `a` f x4 GNP_caused_by_PrePost x1 -> r GNP_caused_by_PrePost `a` f x1 + GSSlash_PrePost x1 x2 x3 x4 -> r GSSlash_PrePost `a` f x1 `a` f x2 `a` f x3 `a` f x4 GS_PrePost x1 x2 -> r GS_PrePost `a` f x1 `a` f x2 - GV2_PrePost x1 -> r GV2_PrePost `a` f x1 + GV2_PrePost x1 x2 x3 -> r GV2_PrePost `a` f x1 `a` f x2 `a` f x3 GrecoverUnparsedPrePost x1 -> r GrecoverUnparsedPrePost `a` f x1 GConjPrep x1 x2 -> r GConjPrep `a` f x1 `a` f x2 GConjPrePostQS x1 x2 x3 x4 -> r GConjPrePostQS `a` f x1 `a` f x2 `a` f x3 `a` f x4 GConjQS x1 x2 -> r GConjQS `a` f x1 `a` f x2 + GRelVPS x1 x2 -> r GRelVPS `a` f x1 `a` f x2 GConjPrePostS x1 x2 x3 x4 -> r GConjPrePostS `a` f x1 `a` f x2 `a` f x3 `a` f x4 GConjS x1 x2 -> r GConjS `a` f x1 `a` f x2 GPredVPS x1 x2 -> r GPredVPS `a` f x1 `a` f x2 @@ -2862,12 +2754,6 @@ instance Compos Tree where Gpot5 x1 -> r Gpot5 `a` f x1 Gpot5float x1 -> r Gpot5float `a` f x1 Gpot5plus x1 x2 -> r Gpot5plus `a` f x1 `a` f x2 - GAN x1 -> r GAN `a` f x1 - GEVERY x1 -> r GEVERY `a` f x1 - GPARTY x1 -> r GPARTY `a` f x1 - GSubjWho x1 x2 -> r GSubjWho `a` f x1 `a` f x2 - GTHE x1 -> r GTHE `a` f x1 - GrecoverUnparsedSubj x1 -> r GrecoverUnparsedSubj `a` f x1 GConjTComparison x1 x2 -> r GConjTComparison `a` f x1 `a` f x2 GTemporalConstraint x1 x2 x3 -> r GTemporalConstraint `a` f x1 `a` f x2 `a` f x3 GTemporalConstraintNoDigits x1 x2 -> r GTemporalConstraintNoDigits `a` f x1 `a` f x2 @@ -2883,6 +2769,7 @@ instance Compos Tree where GsWHO x1 x2 -> r GsWHO `a` f x1 `a` f x2 GrecoverUnparsedTimeUnit x1 -> r GrecoverUnparsedTimeUnit `a` f x1 GUPON x1 -> r GUPON `a` f x1 + GUPONnp x1 x2 -> r GUPONnp `a` f x1 `a` f x2 GrecoverUnparsedUpon x1 -> r GrecoverUnparsedUpon `a` f x1 GAdvVP x1 x2 -> r GAdvVP `a` f x1 `a` f x2 GComplV2 x1 x2 -> r GComplV2 `a` f x1 `a` f x2 diff --git a/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs b/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs index 651559e34..9cd114a5b 100644 --- a/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs +++ b/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs @@ -28,17 +28,17 @@ pushPrePostIntoMain bsgt = case bsgt of hackStrVP :: GString -> GVP -> GVP hackStrVP in_part vp = GAdvVP vp (GrecoverUnparsedAdv in_part) - transformWho :: GV2 -> GNP -> GText -> GText - transformWho consume beverage (GqWHO person (GAPWho alcoholic)) = - GqWHO (referSubj person) (GWHO GpresSimul GPOS (GComplV2 consume (introduceNP (insertAP alcoholic beverage)))) - transformWho consume beverage (GqWHO person (GAdvWho in_part)) = - GqWHO (referSubj person) (GWHO GpresSimul GPOS (GAdvVP (GComplV2 consume (referNP beverage)) in_part)) + transformWho :: GTemp -> GPol -> GV2 -> GNP -> GText -> GText + transformWho t p consume beverage (GqWHO person (GAPWho alcoholic)) = + GqWHO (referNP person) (GWHO t p (GComplV2 consume (introduceNP (insertAP alcoholic beverage)))) + transformWho t p consume beverage (GqWHO person (GAdvWho in_part)) = + GqWHO (referNP person) (GWHO t p (GAdvVP (GComplV2 consume (referNP beverage)) in_part)) tryTransformWhole :: BoolStructGText -> BoolStructGText tryTransformWhole bs = case bs of All pp ( Any - ( Just ( PrePost (GqPREPOST ( GV2_PrePost consume ) ) + ( Just ( PrePost (GqPREPOST ( GV2_PrePost t p consume ) ) (GqPREPOST ( GNP_PrePost beverage)))) alcoholic_nonalcoholic : Any @@ -48,15 +48,15 @@ pushPrePostIntoMain bsgt = case bsgt of All pp ( Any Nothing ( - (transformWho consume beverage `mapBS`) <$> alcoholic_nonalcoholic) + (transformWho t p consume beverage `mapBS`) <$> alcoholic_nonalcoholic) : Any Nothing ( - (transformWho consume beverage `mapBS`) <$> inpart_inwhole) + (transformWho t p consume beverage `mapBS`) <$> inpart_inwhole) : restOfInnerRules ) Any pp ( All - ( Just ( PrePost (GqPREPOST ( GV2_PrePost consume ) ) + ( Just ( PrePost (GqPREPOST ( GV2_PrePost t p consume ) ) (GqPREPOST ( GNP_PrePost beverage)))) alcoholic_nonalcoholic : All @@ -66,10 +66,10 @@ pushPrePostIntoMain bsgt = case bsgt of Any pp ( All Nothing ( - (transformWho consume beverage `mapBS`) <$> alcoholic_nonalcoholic) + (transformWho t p consume beverage `mapBS`) <$> alcoholic_nonalcoholic) : All Nothing ( - (transformWho consume beverage `mapBS`) <$> inpart_inwhole) + (transformWho t p consume beverage `mapBS`) <$> inpart_inwhole) : restOfInnerRules ) _ -> bs @@ -149,27 +149,16 @@ mapBS f bs = case bs of AA.Not x -> AA.Not $ mapBS f x ----------------------------------------------------------------------------- -- Generic useful transformations - --- for Subj -introduceSubj :: forall a . Tree a -> Tree a -introduceSubj (GEVERY x) = GAN x -introduceSubj (GPARTY x) = GAN x -introduceSubj x = composOp introduceSubj x - -referSubj :: forall a . Tree a -> Tree a -referSubj (GEVERY x) = GTHE x -referSubj (GPARTY x) = GTHE x -referSubj (GAN x) = GTHE x -referSubj x = composOp referSubj x - -- for NP introduceNP :: forall a . Tree a -> Tree a +introduceNP (GEVERY x) = GDetCN GaSg x introduceNP (GMassNP x) = GDetCN GaSg x introduceNP (GDetCN _ x) = GDetCN GaSg x introduceNP x = composOp introduceNP x referNP :: forall a . Tree a -> Tree a +referNP (GEVERY x) = GDetCN GtheSg x referNP (GMassNP x) = GDetCN GtheSg x referNP (GDetCN GaSg x) = GDetCN GtheSg x --referNP (GDetCN GaPl x) = GDetCN GthePl x diff --git a/lib/haskell/natural4/src/LS/NLP/NLG.hs b/lib/haskell/natural4/src/LS/NLP/NLG.hs index cf776cb13..e3f5f1524 100644 --- a/lib/haskell/natural4/src/LS/NLP/NLG.hs +++ b/lib/haskell/natural4/src/LS/NLP/NLG.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, GADTs #-} {-# OPTIONS_GHC -Wno-name-shadowing #-} module LS.NLP.NLG where @@ -32,13 +32,13 @@ import LS.NLP.NL4Transformations bsConstraint2gfConstraint, bsWho2gfWho, flipPolarity, - introduceSubj, + introduceNP, isChinese, isMalay, mapBSLabel, pastTense, pushPrePostIntoMain, - referSubj, + referNP, ) import LS.Rule (Interpreted (..), Rule (..), ruleLabelName, ruleName, ruleConstructor) import LS.Types @@ -104,6 +104,7 @@ import PGF ) import Paths_natural4 (getDataFileName) import System.Environment (lookupEnv) +import Prettyprinter.Interpolate (__di) data NLGEnv = NLGEnv { gfGrammar :: PGF @@ -159,7 +160,7 @@ myNLGEnv l4i lang = do Left engL -> return $ mutter "** myNLGEnv" >> mutters engErr >> xpError engL Right engR -> do let myParse typ txt = parse gr engR typ (Text.unpack txt) - myLin = rmBIND . Text.pack . linearize gr lang + myLin = uncapKeywords . rmBIND . Text.pack . linearize gr lang return $ do mutter "** myNLGEnv" xpReturn $ NLGEnv gr lang myParse myLin verbose l4i @@ -167,6 +168,15 @@ myNLGEnv l4i lang = do rmBIND :: Text.Text -> Text.Text rmBIND = Text.replace " &+ " "" +uncapKeywords :: Text.Text -> Text.Text +uncapKeywords = Text.unwords . map (lowerWhole ["BEFORE","AFTER","IS"]) . Text.words + where + lowerWhole keywords word = + if word `elem` keywords + then Text.toLower word + else word + + gfPath :: String -> String gfPath x = "grammars/" ++ x @@ -214,7 +224,7 @@ nlg = nlg' TopLevel nlg' :: RecursionLevel -> NLGEnv -> Rule -> IO Text.Text nlg' thl env rule = case rule of Regulative {subj,upon,temporal,cond,who,deontic,action,lest,hence} -> do - let subjExpr = introduceSubj $ parseSubj env subj + let subjExpr = introduceNP $ parseSubj env subj deonticExpr = parseDeontic deontic actionExpr = parseAction env action whoSubjExpr = case who of @@ -322,6 +332,7 @@ ruleQuestions env alias rule = do text DefNameAlias {} -> pure [] -- no questions needed to produce from DefNameAlias DefTypically {} -> pure [] -- no questions needed to produce from DefTypically + RuleGroup {} -> pure [] _ -> pure [AA.Leaf $ Text.pack ("ruleQuestions: doesn't work yet for " <> ruleConstructor rule)] -- [TODO] for our Logging exercise, see how to convert the _ case above to an xpError @@ -359,10 +370,10 @@ ruleQnTrees env alias rule = do case rule of Regulative {subj,who,cond,upon} -> do let subjExpr = parseSubj env subj - aliasExpr = if subjExpr==orgExpr then youExpr else referSubj subjExpr + aliasExpr = if subjExpr==orgExpr then youExpr else referNP subjExpr qWhoTrees = mkWhoText env GqPREPOST (GqWHO aliasExpr) <$> who qCondTrees = mkCondText env GqPREPOST GqCOND <$> cond - qUponTrees = mkUponText env (GqUPON aliasExpr) <$> upon + qUponTrees = mkUponText env aliasExpr GqUPON <$> upon mutterdhsf 4 "Regulative/subjExpr" show subjExpr mutterdhsf 4 "Regulative/aliasExpr" show aliasExpr mutterdhsf 4 "Regulative/qWhoTrees" show qWhoTrees @@ -387,10 +398,10 @@ ruleQnTrees env alias rule = do ---------------------------------------------------------------------- -textViaQaHorns :: NLGEnv -> Alias -> Maybe GSubject -> [([RuleName], BoolStructT)] -textViaQaHorns env alias subj = [ (rn, linBStext env $ mkGFtext env alias (referSubj <$> subj) bsr) | (rn, bsr) <- qaHornsR (interpreted env)] +textViaQaHorns :: NLGEnv -> Alias -> Maybe GNP -> [([RuleName], BoolStructT)] +textViaQaHorns env alias subj = [ (rn, linBStext env $ mkGFtext env alias (referNP <$> subj) bsr) | (rn, bsr) <- qaHornsR (interpreted env)] -mkGFtext :: NLGEnv -> Alias -> Maybe GSubject -> BoolStructR -> BoolStructGText +mkGFtext :: NLGEnv -> Alias -> Maybe GNP -> BoolStructR -> BoolStructGText mkGFtext env alias subj bsr = case (whoParses, condParses) of ([], []) -> mkConstraintText env GqPREPOST GqCONSTR bsr ([], _:_) -> mkCondText env GqPREPOST GqCOND bsr @@ -427,11 +438,13 @@ mkCondText env f g bsr = mapBSLabel f g $ aggregateBoolStruct (gfLang env) $ par mkConstraintText :: NLGEnv -> (GPrePost -> GText) -> (GConstraint -> GText) -> BoolStructR -> BoolStructGText mkConstraintText env f g bsr = mapBSLabel f g $ aggregateBoolStruct (gfLang env) $ parseConstraintBS env bsr -mkUponText :: NLGEnv -> (GUpon -> GText) -> ParamText -> BoolStructGText -mkUponText env f pt = AA.Leaf (f $ parseUpon env pt) - --- mkUponText :: NLGEnv -> (GUpon -> GText) -> ParamText -> BoolStructT --- mkUponText env f = AA.Leaf . gfLin env . gf . f . parseUpon env +mkUponText :: NLGEnv -> GNP -> (GNP -> GUpon -> GText) -> ParamText -> BoolStructGText +mkUponText env alias f pt = AA.Leaf (f subj upon) + where + upon0 = parseUpon env pt + (subj,upon) = case upon0 of + GUPONnp np vp -> (np, GUPON vp) + _ -> (alias, upon0) nlgQuestion :: NLGEnv -> Rule -> XPileLog [Text.Text] nlgQuestion env rl = do @@ -497,11 +510,11 @@ parseAction env bsp = fg tree txt = bsp2text bsp tree :| _ = parseAny "Action" env txt -parseSubj :: NLGEnv -> BoolStructP -> GSubject +parseSubj :: NLGEnv -> BoolStructP -> GNP parseSubj env bsp = fg tree where txt = bsp2text bsp - tree :| _ = parseAny "Subj" env txt + tree :| _ = parseAny "NP" env txt parseWho :: NLGEnv -> RelationalPredicate -> GWho parseWho env rp = fg tree @@ -515,15 +528,32 @@ parseCond env (RPConstraint c (RPTC t) d) = GRPConstraint cond tc date cond = parseCond env (RPMT c) tc = parseTComparison t date = parseDate d +parseCond env (RPConstraint a RPis b) = case (nps,vps) of + (np:_, (GMkVPS t p vp):_) -> GWHEN np t p vp + _ -> parseCond env (RPMT [MTT $ Text.unwords [aTxt, "is", bTxt]]) + where + aTxt = Text.strip $ mt2text a + bTxt = Text.strip $ mt2text b + nps :: [GNP] + nps = fg <$> parseAnyNoRecover "NP" env aTxt + vps :: [GVPS] + vps = fg <$> parseAnyNoRecover "VPS" env (Text.unwords ["is", bTxt]) + parseCond env rp = fg tree where txt = rp2text rp tree :| _ = parseAny "Cond" env txt parseUpon :: NLGEnv -> ParamText -> GUpon -parseUpon env pt = fg tree +parseUpon env pt = case upons of + upon:_ -> upon + [] -> case nps of + np:_ -> GUPONnp np (LexVP "occur") + [] -> fg tree where txt = pt2text pt + upons = fg <$> parseAnyNoRecover "Upon" env txt + nps = fg <$> parseAnyNoRecover "NP" env txt tree :| _ = parseAny "Upon" env txt parseTemporal :: NLGEnv -> TemporalConstraint Text.Text -> GTemporal @@ -556,7 +586,7 @@ parseConstraint env (RPBoolStructR a RPis (AA.Not b)) = case (nps,vps) of (np:_, vp:_) -> GRPleafS (fg np) (flipPolarity $ fg vp) _ -> GrecoverRPis (tString aTxt) (tString $ Text.unwords ["not", bTxt]) where - aTxt = mt2text a + aTxt = Text.strip $ mt2text a bTxt = bsr2text b nps = parseAnyNoRecover "NP" env aTxt vps = parseAnyNoRecover "VPS" env $ Text.unwords ["is", bTxt] @@ -565,11 +595,27 @@ parseConstraint env (RPConstraint a RPis b) = case (nps,vps) of (np:_, vp:_) -> GRPleafS (fg np) (fg vp) _ -> GrecoverRPis (tString aTxt) (tString bTxt) where - aTxt = mt2text a - bTxt = mt2text b + aTxt = Text.strip $ mt2text a + bTxt = Text.strip $ mt2text b nps = parseAnyNoRecover "NP" env aTxt vps = parseAnyNoRecover "VPS" env $ Text.unwords ["is", bTxt] +parseConstraint env (RPConstraint a (RPTC t) b) = case (sents,advs) of + (s:_, adv:_) -> case s of + GPredVPS np (GMkVPS t p vp) -> GRPleafS np (GMkVPS t p (GAdvVP vp adv)) + _ -> trace ("parseConstraint: unable to parse " <> showExpr [] (gf s)) fallback + x -> trace ("parseConstraint: unable to parse " <> show x <> Text.unpack tTxt) fallback + where + aTxt = Text.strip $ mt2text a + tTxt = gfLin env $ gf $ parseTComparison t + bTxt = Text.strip $ mt2text b + sents :: [GS] + sents = fg <$> parseAnyNoRecover "S" env aTxt + advs :: [GAdv] + advs = fg <$> parseAnyNoRecover "Adv" env (Text.unwords [tTxt, bTxt]) + fallback = GrecoverUnparsedConstraint (tString $ Text.unwords [aTxt, tTxt, bTxt]) + + parseConstraint env (RPConstraint a RPgt b) = case (nps,vps) of (np:_, vp:_) -> GRPleafS (fg np) (fg vp) _ -> GrecoverRPmath (tString ">") (tString aTxt) (tString bTxt) diff --git a/lib/haskell/natural4/test/LS/NLGSpec.hs b/lib/haskell/natural4/test/LS/NLGSpec.hs index c3614dff0..0da6b41d2 100644 --- a/lib/haskell/natural4/test/LS/NLGSpec.hs +++ b/lib/haskell/natural4/test/LS/NLGSpec.hs @@ -138,13 +138,19 @@ spec = do -- in MustSing5, the gold just happens to be the same as returned by ruleQuestions, so why not - let mustsing5ViaQaHorns = textViaQaHorns envMustSing5 Nothing (Just $ parseSubj env $ subj $ head mustsing5Rules) - let (mustsing5ViaRuleQuestions,_) = xpLog $ ruleQuestions envMustSing5 Nothing (head $ expandRulesForNLG envMustSing5 mustsing5Rules) - testViaQaHorns "mustsing5" (map snd mustsing5ViaQaHorns) (mustsing5ViaRuleQuestions <> [Leaf "Does the following hold: Person Qualifies"]) + let mustsing5ViaQaHorns = + textViaQaHorns envMustSing5 + Nothing + (Just $ parseSubj env $ subj $ head mustsing5Rules) + let (mustsing5ViaRuleQuestions,_) = xpLog $ + ruleQuestions envMustSing5 + Nothing + (head $ expandRulesForNLG envMustSing5 mustsing5Rules) + testViaQaHorns "mustsing5" (map snd mustsing5ViaQaHorns) (mustsing5ViaRuleQuestions <> [Leaf "Person Qualifies?"]) let mustsing6ViaQaHorns = textViaQaHorns envMustSing6 Nothing (Just $ parseSubj env $ subj $ head mustsing6Rules) let (mustsing6ViaRuleQuestions,_) = xpLog $ ruleQuestions envMustSing6 Nothing (head $ expandRulesForNLG envMustSing6 mustsing6Rules) - testViaQaHorns "mustsing6" (map snd mustsing6ViaQaHorns) ([Leaf "Does the following hold: Person Qualifies"] <> mustsing6ViaRuleQuestions) + testViaQaHorns "mustsing6" (map snd mustsing6ViaQaHorns) ([Leaf "Person Qualifies?"] <> mustsing6ViaRuleQuestions) -- for Rodents, apparently ruleQuestions is genuinely buggy so compare it against a manually copied gold let rodentsViaQaHorns = textViaQaHorns env Nothing (Just $ parseSubj env $ subj $ head rodentsRules) From 51c124689a66e01ebb2e873b3c283771c9d0139f Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Mon, 7 Aug 2023 13:28:53 +0800 Subject: [PATCH 23/49] new words + make more cats lexical in generated hs --- lib/haskell/natural4/grammars/CustomSyntax.gf | 2 +- .../natural4/grammars/CustomSyntaxChi.gf | 2 +- .../natural4/grammars/CustomSyntaxEng.gf | 2 +- .../natural4/grammars/CustomSyntaxMay.gf | 2 +- lib/haskell/natural4/grammars/InsLex.gf | 93 +- lib/haskell/natural4/grammars/InsLexEng.gf | 90 +- lib/haskell/natural4/grammars/NL4.pgf | Bin 274012 -> 283263 bytes lib/haskell/natural4/grammars/updateHS.sh | 2 +- lib/haskell/natural4/src/LS/NLP/NL4.hs | 958 +----------------- .../natural4/src/LS/NLP/NL4Transformations.hs | 18 +- 10 files changed, 243 insertions(+), 926 deletions(-) diff --git a/lib/haskell/natural4/grammars/CustomSyntax.gf b/lib/haskell/natural4/grammars/CustomSyntax.gf index a8869dd33..fc3928d5e 100644 --- a/lib/haskell/natural4/grammars/CustomSyntax.gf +++ b/lib/haskell/natural4/grammars/CustomSyntax.gf @@ -2,7 +2,7 @@ abstract CustomSyntax = Numeral , Grammar [ N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP - , V, VV, V2, VS, VP + , V, VV, V2, VS, VP, UseV , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompNP, CompAP, CompAdv -- is a public agency , Prep, PrepNP, AdvVP diff --git a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf index 63c611f5a..c6ae01f99 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxChi.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxChi.gf @@ -2,7 +2,7 @@ concrete CustomSyntaxChi of CustomSyntax = NumeralChi , GrammarChi [ N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP - , V, VV, V2, VS, VP, AdvVP + , V, VV, V2, VS, VP, UseV, AdvVP , A, A2, AP, PositA , Comp, Adv, VP, UseComp, CompAP, CompAdv -- is a public agency , AdA, AdAdv, Card, CAdv, AdN, AdNum, AdnCAdv diff --git a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf index afe3d8384..82d970d27 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxEng.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxEng.gf @@ -2,7 +2,7 @@ concrete CustomSyntaxEng of CustomSyntax = NumeralEng , GrammarEng [ N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP - , V, VV, V2, VS, VP + , V, VV, V2, VS, VP, UseV , A, A2, AP, AdjCN, PositA, ComplA2 , Comp, Adv, VP, UseComp, CompAP, CompNP, CompAdv -- is a public agency , Prep, PrepNP, AdvVP diff --git a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf index 50fb2d6ae..6798b3e58 100644 --- a/lib/haskell/natural4/grammars/CustomSyntaxMay.gf +++ b/lib/haskell/natural4/grammars/CustomSyntaxMay.gf @@ -2,7 +2,7 @@ concrete CustomSyntaxMay of CustomSyntax = NumeralMay , GrammarMay [ N, N2, CN, PN, NP, UseN, ComplN2, UsePN, Num, NumSg, NumPl, Det, DetCN, MassNP - , V, VV, V2, VS, VP + , V, VV, V2, VS, VP, UseV , A, A2, AP, AdjCN, PositA, ComplA2 -- , ProgrVP -- becoming aware , Comp, Adv, VP, UseComp, CompAP, CompNP, CompAdv -- is a public agency diff --git a/lib/haskell/natural4/grammars/InsLex.gf b/lib/haskell/natural4/grammars/InsLex.gf index 296da7125..8ea4a2908 100644 --- a/lib/haskell/natural4/grammars/InsLex.gf +++ b/lib/haskell/natural4/grammars/InsLex.gf @@ -1,5 +1,92 @@ abstract InsLex = NL4Base ** { fun + _ignore_consider_V2 : V2 ; + _Number_PN : PN ; + _note_V2 : V2 ; + _thing_N : N ; + _convert_to_V2 : V2 ; + _A_PN : PN ; + _detail_N : N ; + _earn_V2 : V2 ; + _appearance_N : N ; + _concrete_A : A ; + _Pru_PN : PN ; + _administrative_A : A ; + _natural4_N : N ; + _claim_from_V2 : V2 ; + _damage_N : N ; + _base_on_V2 : V2 ; + _overall_A : A ; + _encoding_N : N ; + _OverallPolicySum_PN : PN ; + _database_N : N ; + _Amount_N : N ; + _reinstatement_N : N ; + _A_N : N ; + _life_assured_N : N ; + _like_Prep : Prep ; + _PruAssure_PN : PN ; + _convert_V2 : V2 ; + _long_Adv : Adv ; + _remark_N : N ; + _involve_VS : VS ; + _represent_V2 : V2 ; + _Damage_N : N ; + _relate_to_V2 : V2 ; + _Pru_N : N ; + _cause_V : V ; + _subsection_N : N ; + _text_N : N ; + _cell_N : N ; + _Damage_PN : PN ; + _PruAssure_N : N ; + _end_V : V ; + _end_accord_V2 : V2 ; + _argument_N : N ; + _use_VV : VV ; + _describe_in_V2 : V2 ; + _about_Prep : Prep ; + _arise_V2 : V2 ; + _qualify_for_V2 : V2 ; + _directly_Adv : Adv ; + _OverallPolicySum_N : N ; + _Number_N : N ; + _update_N : N ; + _indirectly_Adv : Adv ; + _ph_PN : PN ; + _natural_A : A ; + _separate_A : A ; + _subsequent_A : A ; + _structure_N : N ; + _accord_to_V2 : V2 ; + _atomicity_N : N ; + _Amount_PN : PN ; + _income_N : N ; + _reward_N : N ; + _more_Adv : Adv ; + _datatype_N : N ; + _Hsi_N : N ; + _consider_V2 : V2 ; + _reach_V2 : V2 ; + _insurer_N : N ; + _whether_Subj : Subj ; + _handle_V2 : V2 ; + _renew_V2 : V2 ; + _ph_N : N ; + _no_Adv : Adv ; + _live_A : A ; + _capacity_N : N ; + _cover_N : N ; + _start_V2 : V2 ; + _so_Adv : Adv ; + _define_based_on_V2 : V2 ; + _exclude_from_V2 : V2 ; + _similar_A : A ; + _here_Adv : Adv ; + _demarcate_V2 : V2 ; + _underlie_V : V ; + _complex_A : A ; + _clause_N : N ; _leg_N : N ; _line_N : N ; _SA_PN : PN ; @@ -160,7 +247,6 @@ abstract InsLex = NL4Base ** { _rule_N : N ; _pregnancy_N : N ; _cost_N : N ; - _countqualifye_V2 : V2 ; _sumassure_V : V ; _alcohol_N : N ; _n_N : N ; @@ -315,7 +401,6 @@ abstract InsLex = NL4Base ** { _Insurer_PN : PN ; _adjustment_N : N ; _give_V2 : V2 ; - _qualifie_N : N ; _logical_A : A ; _triple_A : A ; _timeyear_N : N ; @@ -375,6 +460,7 @@ abstract InsLex = NL4Base ** { _circ_PN : PN ; _Benefit_PN : PN ; _particular_A : A ; + _participate_in_V2 : V2 ; _planAF_PN : PN ; _at_Prep : Prep ; _accepted_A : A ; @@ -384,7 +470,7 @@ abstract InsLex = NL4Base ** { _duty_N : N ; _finger_N : N ; _deduce_VS : VS ; - _occur_V : V ; +-- _occur_V : V ; _accidental_A : A ; _medical_A : A ; _cover_V : V ; @@ -531,7 +617,6 @@ abstract InsLex = NL4Base ** { _on_Prep : Prep ; _as_Subj : Subj ; _holder_N : N ; - _assured_N : N ; _alive_A : A ; _juvenile_A : A ; _intentional_A : A ; diff --git a/lib/haskell/natural4/grammars/InsLexEng.gf b/lib/haskell/natural4/grammars/InsLexEng.gf index f0881d85f..e7b28510e 100644 --- a/lib/haskell/natural4/grammars/InsLexEng.gf +++ b/lib/haskell/natural4/grammars/InsLexEng.gf @@ -1,6 +1,91 @@ concrete InsLexEng of InsLex = NL4BaseEng ** open ParadigmsEng, Prelude, GrammarEng in { oper mkSubj : Str -> Subj = \s -> lin Subj (ss s) ; + lin _ignore_consider_V2 = mkV2 (mkV "ignore") (mkPrep "consider") ; + lin _Number_PN = mkPN "Number" ; + lin _note_V2 = mkV2 (mkV "note") ; + lin _thing_N = mkN "thing" ; + lin _convert_to_V2 = mkV2 (mkV "convert") (mkPrep "to") ; + lin _A_PN = mkPN "A" ; + lin _detail_N = mkN "detail" ; + lin _earn_V2 = mkV2 (mkV "earn") ; + lin _appearance_N = mkN "appearance" ; + lin _concrete_A = mkA "concrete" ; + lin _Pru_PN = mkPN "Pru" ; + lin _administrative_A = mkA "administrative" ; + lin _natural4_N = mkN "natural4" ; + lin _claim_from_V2 = mkV2 (mkV "claim") (mkPrep "from") ; + lin _damage_N = mkN "damage" ; + lin _base_on_V2 = mkV2 (mkV "base") (mkPrep "on") ; + lin _overall_A = mkA "overall" ; + lin _encoding_N = mkN "encoding" ; + lin _OverallPolicySum_PN = mkPN "OverallPolicySum" ; + lin _database_N = mkN "database" ; + lin _Amount_N = mkN "Amount" ; + lin _reinstatement_N = mkN "reinstatement" ; + lin _A_N = mkN "A" ; + lin _like_Prep = mkPrep "like" ; + lin _PruAssure_PN = mkPN "PruAssure" ; + lin _convert_V2 = mkV2 (mkV "convert") ; + lin _long_Adv = mkAdv "long" ; + lin _remark_N = mkN "remark" ; + lin _involve_VS = mkVS (mkV "involve") ; + lin _represent_V2 = mkV2 (mkV "represent") ; + lin _Damage_N = mkN "Damage" ; + lin _relate_to_V2 = mkV2 (mkV "relate") (mkPrep "to") ; + lin _Pru_N = mkN "Pru" ; + lin _cause_V = mkV "cause" ; + lin _subsection_N = mkN "subsection" ; + lin _text_N = mkN "text" ; + lin _cell_N = mkN "cell" ; + lin _Damage_PN = mkPN "Damage" ; + lin _PruAssure_N = mkN "PruAssure" ; + lin _end_V = mkV "end" ; + lin _end_accord_V2 = mkV2 (mkV "end") (mkPrep "accord") ; + lin _argument_N = mkN "argument" ; + lin _use_VV = mkVV (mkV "use") ; + lin _describe_in_V2 = mkV2 (mkV "describe") (mkPrep "in") ; + lin _about_Prep = mkPrep "about" ; + lin _arise_V2 = mkV2 (mkV "arise") ; + lin _qualify_for_V2 = mkV2 (mkV "qualify") (mkPrep "for") ; + lin _directly_Adv = mkAdv "directly" ; + lin _OverallPolicySum_N = mkN "OverallPolicySum" ; + lin _Number_N = mkN "Number" ; + lin _update_N = mkN "update" ; + lin _indirectly_Adv = mkAdv "indirectly" ; + lin _ph_PN = mkPN "ph" ; + lin _natural_A = mkA "natural" ; + lin _separate_A = mkA "separate" ; + lin _subsequent_A = mkA "subsequent" ; + lin _structure_N = mkN "structure" ; + lin _accord_to_V2 = mkV2 (mkV "accord") (mkPrep "to") ; + lin _atomicity_N = mkN "atomicity" ; + lin _Amount_PN = mkPN "Amount" ; + lin _income_N = mkN "income" ; + lin _reward_N = mkN "reward" ; + lin _more_Adv = mkAdv "more" ; + lin _datatype_N = mkN "datatype" ; + lin _consider_V2 = mkV2 (mkV "consider") ; + lin _reach_V2 = mkV2 (mkV "reach") ; + lin _insurer_N = mkN "insurer" ; + lin _whether_Subj = mkSubj "whether" ; + lin _handle_V2 = mkV2 (mkV "handle") ; + lin _renew_V2 = mkV2 (mkV "renew") ; + lin _ph_N = mkN "ph" ; + lin _no_Adv = mkAdv "no" ; + lin _live_A = mkA "//,,,live" ; + lin _capacity_N = mkN "capacity" ; + lin _cover_N = mkN "cover" ; + lin _start_V2 = mkV2 (mkV "start") ; + lin _so_Adv = mkAdv "so" ; + lin _define_based_on_V2 = mkV2 (mkV "define") (mkPrep "based on") ; + lin _exclude_from_V2 = mkV2 (mkV "exclude") (mkPrep "from") ; + lin _similar_A = mkA "similar" ; + lin _here_Adv = mkAdv "here" ; + lin _demarcate_V2 = mkV2 (mkV "demarcate") ; + lin _underlie_V = mkV "underlie" ; + lin _complex_A = mkA "complex" ; + lin _clause_N = mkN "clause" ; lin _practitioner_N = mkN "practitioner" ; lin _insanity_N = mkN "insanity" ; lin _plan_N = mkN "plan" ; @@ -34,7 +119,6 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _b_N = mkN "b" ; lin _LE_PN = mkPN "LE" ; lin _Type_PN = mkPN "Type" ; - lin _qualifie_N = mkN "qualifie" ; lin _medical_A = mkA "medical" ; lin _suffer_V = us_britishV "suffer" ; lin _benefit_V = us_britishV "benefit" ; @@ -260,7 +344,6 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _H5N1_PN = mkPN "H5N1" ; lin _surgical_A = mkA "surgical" ; lin _nature_N = mkN "nature" ; - lin _countqualifye_V2 = mkV2 (us_britishV "count(qualifye") ; lin _transform_into_V2 = mkV2 (us_britishV "transform") (mkPrep "into") ; lin _only_Adv = mkAdv "only" ; lin _benefit_V2 = mkV2 (us_britishV "benefit") ; @@ -387,6 +470,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _patella_N = mkN "patella" ; lin _schedule_N = mkN "schedule" ; lin _particular_A = mkA "particular" ; + lin _participate_in_V2 = mkV2 (mkV "participate") in_Prep ; lin _passenger_N = mkN "passenger" ; lin _where_Subj = mkSubj "where" ; lin _total_A = mkA "total" ; @@ -541,7 +625,7 @@ concrete InsLexEng of InsLex = NL4BaseEng ** lin _death_N = mkN "death" ; lin _time_N = mkN "time" ; lin _professional_A = mkA "professional" ; - lin _assured_N = mkN "assured" ; + lin _life_assured_N = mkN "life assured" ; lin _form_N = mkN "form" ; lin _dc_N = mkN "dc" ; lin _sum_list_PN = mkPN "sum_list" ; diff --git a/lib/haskell/natural4/grammars/NL4.pgf b/lib/haskell/natural4/grammars/NL4.pgf index 48a269f69b24b6f728abebd28eaf19b9d265c2b1..208e8e108453f28dee33503a51413cfb92cefcc5 100644 GIT binary patch delta 85303 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 delta 75623 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 * where - G_accepted_A :: Tree GA_ - G_accidental_A :: Tree GA_ - G_active_A :: Tree GA_ - G_add_A :: Tree GA_ - G_adjusted_A :: Tree GA_ - G_alive_A :: Tree GA_ - G_basic_A :: Tree GA_ - G_biological_A :: Tree GA_ - G_chemical_A :: Tree GA_ - G_claimable_A :: Tree GA_ - G_commercial_A :: Tree GA_ - G_competitive_A :: Tree GA_ - G_current_A :: Tree GA_ - G_dangerous_A :: Tree GA_ - G_dead_A :: Tree GA_ - G_disabled_A :: Tree GA_ - G_double_A :: Tree GA_ - G_due_A :: Tree GA_ - G_equal_A :: Tree GA_ - G_first_A :: Tree GA_ - G_fractured_A :: Tree GA_ - G_geographical_A :: Tree GA_ - G_great_A :: Tree GA_ - G_hfmd_A :: Tree GA_ - G_high_A :: Tree GA_ - G_human_A :: Tree GA_ - G_incurable_A :: Tree GA_ - G_infectious_A :: Tree GA_ - G_initial_A :: Tree GA_ - G_intentional_A :: Tree GA_ - G_japanese_A :: Tree GA_ - G_juvenile_A :: Tree GA_ - G_less_A :: Tree GA_ - G_little_A :: Tree GA_ - G_logical_A :: Tree GA_ - G_low_A :: Tree GA_ - G_martial_A :: Tree GA_ - G_maximum_A :: Tree GA_ - G_medical_A :: Tree GA_ - G_mental_A :: Tree GA_ - G_middle_A :: Tree GA_ - G_military_A :: Tree GA_ - G_more_A :: Tree GA_ - G_multiple_A :: Tree GA_ - G_national_A :: Tree GA_ - G_normal_A :: Tree GA_ - G_nuclear_A :: Tree GA_ - G_other_A :: Tree GA_ - G_particular_A :: Tree GA_ - G_past_A :: Tree GA_ - G_payable_A :: Tree GA_ - G_permanent_A :: Tree GA_ - G_physical_A :: Tree GA_ - G_possible_A :: Tree GA_ - G_previous_A :: Tree GA_ - G_private_A :: Tree GA_ - G_professional_A :: Tree GA_ - G_public_A :: Tree GA_ - G_reckless_A :: Tree GA_ - G_registered_A :: Tree GA_ - G_relevant_A :: Tree GA_ - G_subject_A :: Tree GA_ - G_successful_A :: Tree GA_ - G_surgical_A :: Tree GA_ - G_third_A :: Tree GA_ - G_total_A :: Tree GA_ - G_traditional_A :: Tree GA_ - G_triple_A :: Tree GA_ - G_unlawful_A :: Tree GA_ - G_unnecessary_A :: Tree GA_ - G_unsound_A :: Tree GA_ - G_unsuccessful_A :: Tree GA_ - G_upscaled_A :: Tree GA_ - G_valid_A :: Tree GA_ - G_viral_A :: Tree GA_ - G_waterborne_A :: Tree GA_ + LexA :: String -> Tree GA_ G_located_in_A2 :: Tree GA2_ Gdue_to_A2 :: Tree GA2_ GComplA2 :: GA2 -> GNP -> Tree GAP_ @@ -289,14 +214,21 @@ data Tree :: * -> * where GWhileDoing :: GVP -> Tree GAdv_ G_as_Adv :: Tree GAdv_ G_at_Adv :: Tree GAdv_ + G_directly_Adv :: Tree GAdv_ G_first_Adv :: Tree GAdv_ G_fully_Adv :: Tree GAdv_ G_hence_Adv :: Tree GAdv_ + G_here_Adv :: Tree GAdv_ + G_indirectly_Adv :: Tree GAdv_ G_least_Adv :: Tree GAdv_ + G_long_Adv :: Tree GAdv_ + G_more_Adv :: Tree GAdv_ + G_no_Adv :: Tree GAdv_ G_on_its_way_Adv :: Tree GAdv_ G_only_Adv :: Tree GAdv_ G_permanently_Adv :: Tree GAdv_ G_pland_Adv :: Tree GAdv_ + G_so_Adv :: Tree GAdv_ G_soon_Adv :: Tree GAdv_ G_then_Adv :: Tree GAdv_ G_totally_Adv :: Tree GAdv_ @@ -324,8 +256,7 @@ data Tree :: * -> * where GRPConstraint :: GCond -> GTComparison -> GDate -> Tree GCond_ GWHEN :: GNP -> GTemp -> GPol -> GVP -> Tree GCond_ GrecoverUnparsedCond :: GString -> Tree GCond_ - GAND :: Tree GConj_ - GOR :: Tree GConj_ + LexConj :: String -> Tree GConj_ GConjConstraint :: GConj -> GListConstraint -> Tree GConstraint_ GConjPreConstraint :: GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ GConjPrePostConstraint :: GPrePost -> GPrePost -> GConj -> GListConstraint -> Tree GConstraint_ @@ -408,109 +339,7 @@ data Tree :: * -> * where GNumPl :: Tree GNum_ GNumSg :: Tree GNum_ Gnum :: GSub1000000 -> Tree GNumeral_ - G_1012_PN :: Tree GPN_ - G_1013_PN :: Tree GPN_ - G_1014_PN :: Tree GPN_ - G_333A_PN :: Tree GPN_ - G_ADD_PN :: Tree GPN_ - G_AIDS_PN :: Tree GPN_ - G_Accident_PN :: Tree GPN_ - G_Accidental_PN :: Tree GPN_ - G_Accidents_PN :: Tree GPN_ - G_Address_PN :: Tree GPN_ - G_Adjustment_PN :: Tree GPN_ - G_Assured_PN :: Tree GPN_ - G_BSA_PN :: Tree GPN_ - G_Benefit_PN :: Tree GPN_ - G_Cap_PN :: Tree GPN_ - G_Claim_PN :: Tree GPN_ - G_CoV_PN :: Tree GPN_ - G_Conditions_PN :: Tree GPN_ - G_Date_PN :: Tree GPN_ - G_Death_PN :: Tree GPN_ - G_Details_PN :: Tree GPN_ - G_Disease_PN :: Tree GPN_ - G_Dismemberment_PN :: Tree GPN_ - G_Event_PN :: Tree GPN_ - G_Expense_PN :: Tree GPN_ - G_Flu_PN :: Tree GPN_ - G_H5N1_PN :: Tree GPN_ - G_H7N9_PN :: Tree GPN_ - G_H7N_PN :: Tree GPN_ - G_H9N2_PN :: Tree GPN_ - G_HAS_PN :: Tree GPN_ - G_Head_PN :: Tree GPN_ - G_Health_PN :: Tree GPN_ - G_Influenza_PN :: Tree GPN_ - G_Injury_PN :: Tree GPN_ - G_Insurer_PN :: Tree GPN_ - G_LA_PN :: Tree GPN_ - G_LE_PN :: Tree GPN_ - G_Leg_PN :: Tree GPN_ - G_Legionnaires_PN :: Tree GPN_ - G_Life_PN :: Tree GPN_ - G_Limit_PN :: Tree GPN_ - G_MAP_PN :: Tree GPN_ - G_MIN_PN :: Tree GPN_ - G_MR_PN :: Tree GPN_ - G_M_PN :: Tree GPN_ - G_Medicine_PN :: Tree GPN_ - G_Melioidosis_PN :: Tree GPN_ - G_Ministry_PN :: Tree GPN_ - G_Mumps_PN :: Tree GPN_ - G_N_PN :: Tree GPN_ - G_Nipah_PN :: Tree GPN_ - G_Ontology_PN :: Tree GPN_ - G_PS_PN :: Tree GPN_ - G_Plan14_PN :: Tree GPN_ - G_PlanAF_PN :: Tree GPN_ - G_PolicyHolder_PN :: Tree GPN_ - G_Policy_PN :: Tree GPN_ - G_RETURN_PN :: Tree GPN_ - G_Reductions_PN :: Tree GPN_ - G_Removal_PN :: Tree GPN_ - G_Republic_PN :: Tree GPN_ - G_SA_PN :: Tree GPN_ - G_SG_PN :: Tree GPN_ - G_Schedule_PN :: Tree GPN_ - G_Section_PN :: Tree GPN_ - G_Service_PN :: Tree GPN_ - G_Singapore_PN :: Tree GPN_ - G_Step_PN :: Tree GPN_ - G_Subscribed_PN :: Tree GPN_ - G_TABLE_PN :: Tree GPN_ - G_Teeth_PN :: Tree GPN_ - G_Triple_PN :: Tree GPN_ - G_Type_PN :: Tree GPN_ - G_Types_PN :: Tree GPN_ - G_UPON_PN :: Tree GPN_ - G_Wife_PN :: Tree GPN_ - G_Yellow_PN :: Tree GPN_ - G_addSA_PN :: Tree GPN_ - G_benADD_PN :: Tree GPN_ - G_benADDs_PN :: Tree GPN_ - G_benRA_PN :: Tree GPN_ - G_benTCM_PN :: Tree GPN_ - G_circ_PN :: Tree GPN_ - G_dTime_PN :: Tree GPN_ - G_dType_PN :: Tree GPN_ - G_diving_PN :: Tree GPN_ - G_holder_PN :: Tree GPN_ - G_motocross_PN :: Tree GPN_ - G_p_PN :: Tree GPN_ - G_plan3_PN :: Tree GPN_ - G_plan4_PN :: Tree GPN_ - G_planAF_PN :: Tree GPN_ - G_planB_PN :: Tree GPN_ - G_planC_PN :: Tree GPN_ - G_planE_PN :: Tree GPN_ - G_planF_PN :: Tree GPN_ - G_policyHolder_PN :: Tree GPN_ - G_qualifies_for_add_PN :: Tree GPN_ - G_schema_PN :: Tree GPN_ - G_sum_list_PN :: Tree GPN_ - G_x_PN :: Tree GPN_ - G_y_PN :: Tree GPN_ + LexPN :: String -> Tree GPN_ GNEG :: Tree GPol_ GPOS :: Tree GPol_ GAP_PrePost :: GAP -> Tree GPrePost_ @@ -523,39 +352,7 @@ data Tree :: * -> * where GV2_PrePost :: GTemp -> GPol -> GV2 -> Tree GPrePost_ GrecoverUnparsedPrePost :: GString -> Tree GPrePost_ GConjPrep :: GConj -> GListPrep -> Tree GPrep_ - G_across_Prep :: Tree GPrep_ - G_after_Prep :: Tree GPrep_ - G_as_Prep :: Tree GPrep_ - G_at_Prep :: Tree GPrep_ - G_between_Prep :: Tree GPrep_ - G_by_Prep :: Tree GPrep_ - G_during_Prep :: Tree GPrep_ - G_for_Prep :: Tree GPrep_ - G_from_Prep :: Tree GPrep_ - G_in_Prep :: Tree GPrep_ - G_into_Prep :: Tree GPrep_ - G_involving_Prep :: Tree GPrep_ - G_of_Prep :: Tree GPrep_ - G_on_Prep :: Tree GPrep_ - G_out_Prep :: Tree GPrep_ - G_over_Prep :: Tree GPrep_ - G_per_Prep :: Tree GPrep_ - G_than_Prep :: Tree GPrep_ - G_through_Prep :: Tree GPrep_ - G_to_Prep :: Tree GPrep_ - G_under_Prep :: Tree GPrep_ - G_up_Prep :: Tree GPrep_ - G_with_Prep :: Tree GPrep_ - G_within_Prep :: Tree GPrep_ - Gabout_Prep :: Tree GPrep_ - Gafter_Prep :: Tree GPrep_ - Gbefore_Prep :: Tree GPrep_ - Gfor_Prep :: Tree GPrep_ - Gfrom_Prep :: Tree GPrep_ - Gon_Prep :: Tree GPrep_ - Gpossess_Prep :: Tree GPrep_ - Gto_Prep :: Tree GPrep_ - Gwithin_Prep :: Tree GPrep_ + LexPrep :: String -> Tree GPrep_ GConjPrePostQS :: GString -> GString -> GConj -> GListQS -> Tree GQS_ GConjQS :: GConj -> GListQS -> Tree GQS_ GIdRP :: Tree GRP_ @@ -591,17 +388,7 @@ data Tree :: * -> * where Gpot51 :: Tree GSub1000000000000_ Gpot5float :: GFloat -> Tree GSub1000000000000_ Gpot5plus :: GSub1000 -> GSub1000000000 -> Tree GSub1000000000000_ - G_and_Subj :: Tree GSubj_ - G_as_Subj :: Tree GSubj_ - G_before_Subj :: Tree GSubj_ - G_both_Subj :: Tree GSubj_ - G_but_Subj :: Tree GSubj_ - G_if_Subj :: Tree GSubj_ - G_or_Subj :: Tree GSubj_ - G_that_Subj :: Tree GSubj_ - G_when_Subj :: Tree GSubj_ - G_while_Subj :: Tree GSubj_ - Gbecause_Subj :: Tree GSubj_ + LexSubj :: String -> Tree GSubj_ GAFTER :: Tree GTComparison_ GBEFORE :: Tree GTComparison_ GBY :: Tree GTComparison_ @@ -639,6 +426,7 @@ data Tree :: * -> * where GComplVSif :: GVS -> GS -> Tree GVP_ GComplVSthat :: GVS -> GS -> Tree GVP_ GUseComp :: GComp -> Tree GVP_ + GUseV :: GV -> Tree GVP_ LexVP :: String -> Tree GVP_ GMkVPI :: GVP -> Tree GVPI_ GComparison_Card_Years :: GCard -> Tree GVPS_ @@ -665,82 +453,7 @@ data Tree :: * -> * where instance Eq (Tree a) where i == j = case (i,j) of - (G_accepted_A,G_accepted_A) -> and [ ] - (G_accidental_A,G_accidental_A) -> and [ ] - (G_active_A,G_active_A) -> and [ ] - (G_add_A,G_add_A) -> and [ ] - (G_adjusted_A,G_adjusted_A) -> and [ ] - (G_alive_A,G_alive_A) -> and [ ] - (G_basic_A,G_basic_A) -> and [ ] - (G_biological_A,G_biological_A) -> and [ ] - (G_chemical_A,G_chemical_A) -> and [ ] - (G_claimable_A,G_claimable_A) -> and [ ] - (G_commercial_A,G_commercial_A) -> and [ ] - (G_competitive_A,G_competitive_A) -> and [ ] - (G_current_A,G_current_A) -> and [ ] - (G_dangerous_A,G_dangerous_A) -> and [ ] - (G_dead_A,G_dead_A) -> and [ ] - (G_disabled_A,G_disabled_A) -> and [ ] - (G_double_A,G_double_A) -> and [ ] - (G_due_A,G_due_A) -> and [ ] - (G_equal_A,G_equal_A) -> and [ ] - (G_first_A,G_first_A) -> and [ ] - (G_fractured_A,G_fractured_A) -> and [ ] - (G_geographical_A,G_geographical_A) -> and [ ] - (G_great_A,G_great_A) -> and [ ] - (G_hfmd_A,G_hfmd_A) -> and [ ] - (G_high_A,G_high_A) -> and [ ] - (G_human_A,G_human_A) -> and [ ] - (G_incurable_A,G_incurable_A) -> and [ ] - (G_infectious_A,G_infectious_A) -> and [ ] - (G_initial_A,G_initial_A) -> and [ ] - (G_intentional_A,G_intentional_A) -> and [ ] - (G_japanese_A,G_japanese_A) -> and [ ] - (G_juvenile_A,G_juvenile_A) -> and [ ] - (G_less_A,G_less_A) -> and [ ] - (G_little_A,G_little_A) -> and [ ] - (G_logical_A,G_logical_A) -> and [ ] - (G_low_A,G_low_A) -> and [ ] - (G_martial_A,G_martial_A) -> and [ ] - (G_maximum_A,G_maximum_A) -> and [ ] - (G_medical_A,G_medical_A) -> and [ ] - (G_mental_A,G_mental_A) -> and [ ] - (G_middle_A,G_middle_A) -> and [ ] - (G_military_A,G_military_A) -> and [ ] - (G_more_A,G_more_A) -> and [ ] - (G_multiple_A,G_multiple_A) -> and [ ] - (G_national_A,G_national_A) -> and [ ] - (G_normal_A,G_normal_A) -> and [ ] - (G_nuclear_A,G_nuclear_A) -> and [ ] - (G_other_A,G_other_A) -> and [ ] - (G_particular_A,G_particular_A) -> and [ ] - (G_past_A,G_past_A) -> and [ ] - (G_payable_A,G_payable_A) -> and [ ] - (G_permanent_A,G_permanent_A) -> and [ ] - (G_physical_A,G_physical_A) -> and [ ] - (G_possible_A,G_possible_A) -> and [ ] - (G_previous_A,G_previous_A) -> and [ ] - (G_private_A,G_private_A) -> and [ ] - (G_professional_A,G_professional_A) -> and [ ] - (G_public_A,G_public_A) -> and [ ] - (G_reckless_A,G_reckless_A) -> and [ ] - (G_registered_A,G_registered_A) -> and [ ] - (G_relevant_A,G_relevant_A) -> and [ ] - (G_subject_A,G_subject_A) -> and [ ] - (G_successful_A,G_successful_A) -> and [ ] - (G_surgical_A,G_surgical_A) -> and [ ] - (G_third_A,G_third_A) -> and [ ] - (G_total_A,G_total_A) -> and [ ] - (G_traditional_A,G_traditional_A) -> and [ ] - (G_triple_A,G_triple_A) -> and [ ] - (G_unlawful_A,G_unlawful_A) -> and [ ] - (G_unnecessary_A,G_unnecessary_A) -> and [ ] - (G_unsound_A,G_unsound_A) -> and [ ] - (G_unsuccessful_A,G_unsuccessful_A) -> and [ ] - (G_upscaled_A,G_upscaled_A) -> and [ ] - (G_valid_A,G_valid_A) -> and [ ] - (G_viral_A,G_viral_A) -> and [ ] - (G_waterborne_A,G_waterborne_A) -> and [ ] + (LexA x,LexA y) -> x == y (G_located_in_A2,G_located_in_A2) -> and [ ] (Gdue_to_A2,Gdue_to_A2) -> and [ ] (GComplA2 x1 x2,GComplA2 y1 y2) -> and [ x1 == y1 , x2 == y2 ] @@ -764,14 +477,21 @@ instance Eq (Tree a) where (GWhileDoing x1,GWhileDoing y1) -> and [ x1 == y1 ] (G_as_Adv,G_as_Adv) -> and [ ] (G_at_Adv,G_at_Adv) -> and [ ] + (G_directly_Adv,G_directly_Adv) -> and [ ] (G_first_Adv,G_first_Adv) -> and [ ] (G_fully_Adv,G_fully_Adv) -> and [ ] (G_hence_Adv,G_hence_Adv) -> and [ ] + (G_here_Adv,G_here_Adv) -> and [ ] + (G_indirectly_Adv,G_indirectly_Adv) -> and [ ] (G_least_Adv,G_least_Adv) -> and [ ] + (G_long_Adv,G_long_Adv) -> and [ ] + (G_more_Adv,G_more_Adv) -> and [ ] + (G_no_Adv,G_no_Adv) -> and [ ] (G_on_its_way_Adv,G_on_its_way_Adv) -> and [ ] (G_only_Adv,G_only_Adv) -> and [ ] (G_permanently_Adv,G_permanently_Adv) -> and [ ] (G_pland_Adv,G_pland_Adv) -> and [ ] + (G_so_Adv,G_so_Adv) -> and [ ] (G_soon_Adv,G_soon_Adv) -> and [ ] (G_then_Adv,G_then_Adv) -> and [ ] (G_totally_Adv,G_totally_Adv) -> and [ ] @@ -799,8 +519,7 @@ instance Eq (Tree a) where (GRPConstraint x1 x2 x3,GRPConstraint y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GWHEN x1 x2 x3 x4,GWHEN y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GrecoverUnparsedCond x1,GrecoverUnparsedCond y1) -> and [ x1 == y1 ] - (GAND,GAND) -> and [ ] - (GOR,GOR) -> and [ ] + (LexConj x,LexConj y) -> x == y (GConjConstraint x1 x2,GConjConstraint y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GConjPreConstraint x1 x2 x3,GConjPreConstraint y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GConjPrePostConstraint x1 x2 x3 x4,GConjPrePostConstraint y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] @@ -883,109 +602,7 @@ instance Eq (Tree a) where (GNumPl,GNumPl) -> and [ ] (GNumSg,GNumSg) -> and [ ] (Gnum x1,Gnum y1) -> and [ x1 == y1 ] - (G_1012_PN,G_1012_PN) -> and [ ] - (G_1013_PN,G_1013_PN) -> and [ ] - (G_1014_PN,G_1014_PN) -> and [ ] - (G_333A_PN,G_333A_PN) -> and [ ] - (G_ADD_PN,G_ADD_PN) -> and [ ] - (G_AIDS_PN,G_AIDS_PN) -> and [ ] - (G_Accident_PN,G_Accident_PN) -> and [ ] - (G_Accidental_PN,G_Accidental_PN) -> and [ ] - (G_Accidents_PN,G_Accidents_PN) -> and [ ] - (G_Address_PN,G_Address_PN) -> and [ ] - (G_Adjustment_PN,G_Adjustment_PN) -> and [ ] - (G_Assured_PN,G_Assured_PN) -> and [ ] - (G_BSA_PN,G_BSA_PN) -> and [ ] - (G_Benefit_PN,G_Benefit_PN) -> and [ ] - (G_Cap_PN,G_Cap_PN) -> and [ ] - (G_Claim_PN,G_Claim_PN) -> and [ ] - (G_CoV_PN,G_CoV_PN) -> and [ ] - (G_Conditions_PN,G_Conditions_PN) -> and [ ] - (G_Date_PN,G_Date_PN) -> and [ ] - (G_Death_PN,G_Death_PN) -> and [ ] - (G_Details_PN,G_Details_PN) -> and [ ] - (G_Disease_PN,G_Disease_PN) -> and [ ] - (G_Dismemberment_PN,G_Dismemberment_PN) -> and [ ] - (G_Event_PN,G_Event_PN) -> and [ ] - (G_Expense_PN,G_Expense_PN) -> and [ ] - (G_Flu_PN,G_Flu_PN) -> and [ ] - (G_H5N1_PN,G_H5N1_PN) -> and [ ] - (G_H7N9_PN,G_H7N9_PN) -> and [ ] - (G_H7N_PN,G_H7N_PN) -> and [ ] - (G_H9N2_PN,G_H9N2_PN) -> and [ ] - (G_HAS_PN,G_HAS_PN) -> and [ ] - (G_Head_PN,G_Head_PN) -> and [ ] - (G_Health_PN,G_Health_PN) -> and [ ] - (G_Influenza_PN,G_Influenza_PN) -> and [ ] - (G_Injury_PN,G_Injury_PN) -> and [ ] - (G_Insurer_PN,G_Insurer_PN) -> and [ ] - (G_LA_PN,G_LA_PN) -> and [ ] - (G_LE_PN,G_LE_PN) -> and [ ] - (G_Leg_PN,G_Leg_PN) -> and [ ] - (G_Legionnaires_PN,G_Legionnaires_PN) -> and [ ] - (G_Life_PN,G_Life_PN) -> and [ ] - (G_Limit_PN,G_Limit_PN) -> and [ ] - (G_MAP_PN,G_MAP_PN) -> and [ ] - (G_MIN_PN,G_MIN_PN) -> and [ ] - (G_MR_PN,G_MR_PN) -> and [ ] - (G_M_PN,G_M_PN) -> and [ ] - (G_Medicine_PN,G_Medicine_PN) -> and [ ] - (G_Melioidosis_PN,G_Melioidosis_PN) -> and [ ] - (G_Ministry_PN,G_Ministry_PN) -> and [ ] - (G_Mumps_PN,G_Mumps_PN) -> and [ ] - (G_N_PN,G_N_PN) -> and [ ] - (G_Nipah_PN,G_Nipah_PN) -> and [ ] - (G_Ontology_PN,G_Ontology_PN) -> and [ ] - (G_PS_PN,G_PS_PN) -> and [ ] - (G_Plan14_PN,G_Plan14_PN) -> and [ ] - (G_PlanAF_PN,G_PlanAF_PN) -> and [ ] - (G_PolicyHolder_PN,G_PolicyHolder_PN) -> and [ ] - (G_Policy_PN,G_Policy_PN) -> and [ ] - (G_RETURN_PN,G_RETURN_PN) -> and [ ] - (G_Reductions_PN,G_Reductions_PN) -> and [ ] - (G_Removal_PN,G_Removal_PN) -> and [ ] - (G_Republic_PN,G_Republic_PN) -> and [ ] - (G_SA_PN,G_SA_PN) -> and [ ] - (G_SG_PN,G_SG_PN) -> and [ ] - (G_Schedule_PN,G_Schedule_PN) -> and [ ] - (G_Section_PN,G_Section_PN) -> and [ ] - (G_Service_PN,G_Service_PN) -> and [ ] - (G_Singapore_PN,G_Singapore_PN) -> and [ ] - (G_Step_PN,G_Step_PN) -> and [ ] - (G_Subscribed_PN,G_Subscribed_PN) -> and [ ] - (G_TABLE_PN,G_TABLE_PN) -> and [ ] - (G_Teeth_PN,G_Teeth_PN) -> and [ ] - (G_Triple_PN,G_Triple_PN) -> and [ ] - (G_Type_PN,G_Type_PN) -> and [ ] - (G_Types_PN,G_Types_PN) -> and [ ] - (G_UPON_PN,G_UPON_PN) -> and [ ] - (G_Wife_PN,G_Wife_PN) -> and [ ] - (G_Yellow_PN,G_Yellow_PN) -> and [ ] - (G_addSA_PN,G_addSA_PN) -> and [ ] - (G_benADD_PN,G_benADD_PN) -> and [ ] - (G_benADDs_PN,G_benADDs_PN) -> and [ ] - (G_benRA_PN,G_benRA_PN) -> and [ ] - (G_benTCM_PN,G_benTCM_PN) -> and [ ] - (G_circ_PN,G_circ_PN) -> and [ ] - (G_dTime_PN,G_dTime_PN) -> and [ ] - (G_dType_PN,G_dType_PN) -> and [ ] - (G_diving_PN,G_diving_PN) -> and [ ] - (G_holder_PN,G_holder_PN) -> and [ ] - (G_motocross_PN,G_motocross_PN) -> and [ ] - (G_p_PN,G_p_PN) -> and [ ] - (G_plan3_PN,G_plan3_PN) -> and [ ] - (G_plan4_PN,G_plan4_PN) -> and [ ] - (G_planAF_PN,G_planAF_PN) -> and [ ] - (G_planB_PN,G_planB_PN) -> and [ ] - (G_planC_PN,G_planC_PN) -> and [ ] - (G_planE_PN,G_planE_PN) -> and [ ] - (G_planF_PN,G_planF_PN) -> and [ ] - (G_policyHolder_PN,G_policyHolder_PN) -> and [ ] - (G_qualifies_for_add_PN,G_qualifies_for_add_PN) -> and [ ] - (G_schema_PN,G_schema_PN) -> and [ ] - (G_sum_list_PN,G_sum_list_PN) -> and [ ] - (G_x_PN,G_x_PN) -> and [ ] - (G_y_PN,G_y_PN) -> and [ ] + (LexPN x,LexPN y) -> x == y (GNEG,GNEG) -> and [ ] (GPOS,GPOS) -> and [ ] (GAP_PrePost x1,GAP_PrePost y1) -> and [ x1 == y1 ] @@ -998,39 +615,7 @@ instance Eq (Tree a) where (GV2_PrePost x1 x2 x3,GV2_PrePost y1 y2 y3) -> and [ x1 == y1 , x2 == y2 , x3 == y3 ] (GrecoverUnparsedPrePost x1,GrecoverUnparsedPrePost y1) -> and [ x1 == y1 ] (GConjPrep x1 x2,GConjPrep y1 y2) -> and [ x1 == y1 , x2 == y2 ] - (G_across_Prep,G_across_Prep) -> and [ ] - (G_after_Prep,G_after_Prep) -> and [ ] - (G_as_Prep,G_as_Prep) -> and [ ] - (G_at_Prep,G_at_Prep) -> and [ ] - (G_between_Prep,G_between_Prep) -> and [ ] - (G_by_Prep,G_by_Prep) -> and [ ] - (G_during_Prep,G_during_Prep) -> and [ ] - (G_for_Prep,G_for_Prep) -> and [ ] - (G_from_Prep,G_from_Prep) -> and [ ] - (G_in_Prep,G_in_Prep) -> and [ ] - (G_into_Prep,G_into_Prep) -> and [ ] - (G_involving_Prep,G_involving_Prep) -> and [ ] - (G_of_Prep,G_of_Prep) -> and [ ] - (G_on_Prep,G_on_Prep) -> and [ ] - (G_out_Prep,G_out_Prep) -> and [ ] - (G_over_Prep,G_over_Prep) -> and [ ] - (G_per_Prep,G_per_Prep) -> and [ ] - (G_than_Prep,G_than_Prep) -> and [ ] - (G_through_Prep,G_through_Prep) -> and [ ] - (G_to_Prep,G_to_Prep) -> and [ ] - (G_under_Prep,G_under_Prep) -> and [ ] - (G_up_Prep,G_up_Prep) -> and [ ] - (G_with_Prep,G_with_Prep) -> and [ ] - (G_within_Prep,G_within_Prep) -> and [ ] - (Gabout_Prep,Gabout_Prep) -> and [ ] - (Gafter_Prep,Gafter_Prep) -> and [ ] - (Gbefore_Prep,Gbefore_Prep) -> and [ ] - (Gfor_Prep,Gfor_Prep) -> and [ ] - (Gfrom_Prep,Gfrom_Prep) -> and [ ] - (Gon_Prep,Gon_Prep) -> and [ ] - (Gpossess_Prep,Gpossess_Prep) -> and [ ] - (Gto_Prep,Gto_Prep) -> and [ ] - (Gwithin_Prep,Gwithin_Prep) -> and [ ] + (LexPrep x,LexPrep y) -> x == y (GConjPrePostQS x1 x2 x3 x4,GConjPrePostQS y1 y2 y3 y4) -> and [ x1 == y1 , x2 == y2 , x3 == y3 , x4 == y4 ] (GConjQS x1 x2,GConjQS y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GIdRP,GIdRP) -> and [ ] @@ -1066,17 +651,7 @@ instance Eq (Tree a) where (Gpot51,Gpot51) -> and [ ] (Gpot5float x1,Gpot5float y1) -> and [ x1 == y1 ] (Gpot5plus x1 x2,Gpot5plus y1 y2) -> and [ x1 == y1 , x2 == y2 ] - (G_and_Subj,G_and_Subj) -> and [ ] - (G_as_Subj,G_as_Subj) -> and [ ] - (G_before_Subj,G_before_Subj) -> and [ ] - (G_both_Subj,G_both_Subj) -> and [ ] - (G_but_Subj,G_but_Subj) -> and [ ] - (G_if_Subj,G_if_Subj) -> and [ ] - (G_or_Subj,G_or_Subj) -> and [ ] - (G_that_Subj,G_that_Subj) -> and [ ] - (G_when_Subj,G_when_Subj) -> and [ ] - (G_while_Subj,G_while_Subj) -> and [ ] - (Gbecause_Subj,Gbecause_Subj) -> and [ ] + (LexSubj x,LexSubj y) -> x == y (GAFTER,GAFTER) -> and [ ] (GBEFORE,GBEFORE) -> and [ ] (GBY,GBY) -> and [ ] @@ -1114,6 +689,7 @@ instance Eq (Tree a) where (GComplVSif x1 x2,GComplVSif y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GComplVSthat x1 x2,GComplVSthat y1 y2) -> and [ x1 == y1 , x2 == y2 ] (GUseComp x1,GUseComp y1) -> and [ x1 == y1 ] + (GUseV x1,GUseV y1) -> and [ x1 == y1 ] (LexVP x,LexVP y) -> x == y (GMkVPI x1,GMkVPI y1) -> and [ x1 == y1 ] (GComparison_Card_Years x1,GComparison_Card_Years y1) -> and [ x1 == y1 ] @@ -1140,163 +716,12 @@ instance Eq (Tree a) where _ -> False instance Gf GA where - gf G_accepted_A = mkApp (mkCId "_accepted_A") [] - gf G_accidental_A = mkApp (mkCId "_accidental_A") [] - gf G_active_A = mkApp (mkCId "_active_A") [] - gf G_add_A = mkApp (mkCId "_add_A") [] - gf G_adjusted_A = mkApp (mkCId "_adjusted_A") [] - gf G_alive_A = mkApp (mkCId "_alive_A") [] - gf G_basic_A = mkApp (mkCId "_basic_A") [] - gf G_biological_A = mkApp (mkCId "_biological_A") [] - gf G_chemical_A = mkApp (mkCId "_chemical_A") [] - gf G_claimable_A = mkApp (mkCId "_claimable_A") [] - gf G_commercial_A = mkApp (mkCId "_commercial_A") [] - gf G_competitive_A = mkApp (mkCId "_competitive_A") [] - gf G_current_A = mkApp (mkCId "_current_A") [] - gf G_dangerous_A = mkApp (mkCId "_dangerous_A") [] - gf G_dead_A = mkApp (mkCId "_dead_A") [] - gf G_disabled_A = mkApp (mkCId "_disabled_A") [] - gf G_double_A = mkApp (mkCId "_double_A") [] - gf G_due_A = mkApp (mkCId "_due_A") [] - gf G_equal_A = mkApp (mkCId "_equal_A") [] - gf G_first_A = mkApp (mkCId "_first_A") [] - gf G_fractured_A = mkApp (mkCId "_fractured_A") [] - gf G_geographical_A = mkApp (mkCId "_geographical_A") [] - gf G_great_A = mkApp (mkCId "_great_A") [] - gf G_hfmd_A = mkApp (mkCId "_hfmd_A") [] - gf G_high_A = mkApp (mkCId "_high_A") [] - gf G_human_A = mkApp (mkCId "_human_A") [] - gf G_incurable_A = mkApp (mkCId "_incurable_A") [] - gf G_infectious_A = mkApp (mkCId "_infectious_A") [] - gf G_initial_A = mkApp (mkCId "_initial_A") [] - gf G_intentional_A = mkApp (mkCId "_intentional_A") [] - gf G_japanese_A = mkApp (mkCId "_japanese_A") [] - gf G_juvenile_A = mkApp (mkCId "_juvenile_A") [] - gf G_less_A = mkApp (mkCId "_less_A") [] - gf G_little_A = mkApp (mkCId "_little_A") [] - gf G_logical_A = mkApp (mkCId "_logical_A") [] - gf G_low_A = mkApp (mkCId "_low_A") [] - gf G_martial_A = mkApp (mkCId "_martial_A") [] - gf G_maximum_A = mkApp (mkCId "_maximum_A") [] - gf G_medical_A = mkApp (mkCId "_medical_A") [] - gf G_mental_A = mkApp (mkCId "_mental_A") [] - gf G_middle_A = mkApp (mkCId "_middle_A") [] - gf G_military_A = mkApp (mkCId "_military_A") [] - gf G_more_A = mkApp (mkCId "_more_A") [] - gf G_multiple_A = mkApp (mkCId "_multiple_A") [] - gf G_national_A = mkApp (mkCId "_national_A") [] - gf G_normal_A = mkApp (mkCId "_normal_A") [] - gf G_nuclear_A = mkApp (mkCId "_nuclear_A") [] - gf G_other_A = mkApp (mkCId "_other_A") [] - gf G_particular_A = mkApp (mkCId "_particular_A") [] - gf G_past_A = mkApp (mkCId "_past_A") [] - gf G_payable_A = mkApp (mkCId "_payable_A") [] - gf G_permanent_A = mkApp (mkCId "_permanent_A") [] - gf G_physical_A = mkApp (mkCId "_physical_A") [] - gf G_possible_A = mkApp (mkCId "_possible_A") [] - gf G_previous_A = mkApp (mkCId "_previous_A") [] - gf G_private_A = mkApp (mkCId "_private_A") [] - gf G_professional_A = mkApp (mkCId "_professional_A") [] - gf G_public_A = mkApp (mkCId "_public_A") [] - gf G_reckless_A = mkApp (mkCId "_reckless_A") [] - gf G_registered_A = mkApp (mkCId "_registered_A") [] - gf G_relevant_A = mkApp (mkCId "_relevant_A") [] - gf G_subject_A = mkApp (mkCId "_subject_A") [] - gf G_successful_A = mkApp (mkCId "_successful_A") [] - gf G_surgical_A = mkApp (mkCId "_surgical_A") [] - gf G_third_A = mkApp (mkCId "_third_A") [] - gf G_total_A = mkApp (mkCId "_total_A") [] - gf G_traditional_A = mkApp (mkCId "_traditional_A") [] - gf G_triple_A = mkApp (mkCId "_triple_A") [] - gf G_unlawful_A = mkApp (mkCId "_unlawful_A") [] - gf G_unnecessary_A = mkApp (mkCId "_unnecessary_A") [] - gf G_unsound_A = mkApp (mkCId "_unsound_A") [] - gf G_unsuccessful_A = mkApp (mkCId "_unsuccessful_A") [] - gf G_upscaled_A = mkApp (mkCId "_upscaled_A") [] - gf G_valid_A = mkApp (mkCId "_valid_A") [] - gf G_viral_A = mkApp (mkCId "_viral_A") [] - gf G_waterborne_A = mkApp (mkCId "_waterborne_A") [] + gf (LexA x) = mkApp (mkCId x) [] fg t = case unApp t of - Just (i,[]) | i == mkCId "_accepted_A" -> G_accepted_A - Just (i,[]) | i == mkCId "_accidental_A" -> G_accidental_A - Just (i,[]) | i == mkCId "_active_A" -> G_active_A - Just (i,[]) | i == mkCId "_add_A" -> G_add_A - Just (i,[]) | i == mkCId "_adjusted_A" -> G_adjusted_A - Just (i,[]) | i == mkCId "_alive_A" -> G_alive_A - Just (i,[]) | i == mkCId "_basic_A" -> G_basic_A - Just (i,[]) | i == mkCId "_biological_A" -> G_biological_A - Just (i,[]) | i == mkCId "_chemical_A" -> G_chemical_A - Just (i,[]) | i == mkCId "_claimable_A" -> G_claimable_A - Just (i,[]) | i == mkCId "_commercial_A" -> G_commercial_A - Just (i,[]) | i == mkCId "_competitive_A" -> G_competitive_A - Just (i,[]) | i == mkCId "_current_A" -> G_current_A - Just (i,[]) | i == mkCId "_dangerous_A" -> G_dangerous_A - Just (i,[]) | i == mkCId "_dead_A" -> G_dead_A - Just (i,[]) | i == mkCId "_disabled_A" -> G_disabled_A - Just (i,[]) | i == mkCId "_double_A" -> G_double_A - Just (i,[]) | i == mkCId "_due_A" -> G_due_A - Just (i,[]) | i == mkCId "_equal_A" -> G_equal_A - Just (i,[]) | i == mkCId "_first_A" -> G_first_A - Just (i,[]) | i == mkCId "_fractured_A" -> G_fractured_A - Just (i,[]) | i == mkCId "_geographical_A" -> G_geographical_A - Just (i,[]) | i == mkCId "_great_A" -> G_great_A - Just (i,[]) | i == mkCId "_hfmd_A" -> G_hfmd_A - Just (i,[]) | i == mkCId "_high_A" -> G_high_A - Just (i,[]) | i == mkCId "_human_A" -> G_human_A - Just (i,[]) | i == mkCId "_incurable_A" -> G_incurable_A - Just (i,[]) | i == mkCId "_infectious_A" -> G_infectious_A - Just (i,[]) | i == mkCId "_initial_A" -> G_initial_A - Just (i,[]) | i == mkCId "_intentional_A" -> G_intentional_A - Just (i,[]) | i == mkCId "_japanese_A" -> G_japanese_A - Just (i,[]) | i == mkCId "_juvenile_A" -> G_juvenile_A - Just (i,[]) | i == mkCId "_less_A" -> G_less_A - Just (i,[]) | i == mkCId "_little_A" -> G_little_A - Just (i,[]) | i == mkCId "_logical_A" -> G_logical_A - Just (i,[]) | i == mkCId "_low_A" -> G_low_A - Just (i,[]) | i == mkCId "_martial_A" -> G_martial_A - Just (i,[]) | i == mkCId "_maximum_A" -> G_maximum_A - Just (i,[]) | i == mkCId "_medical_A" -> G_medical_A - Just (i,[]) | i == mkCId "_mental_A" -> G_mental_A - Just (i,[]) | i == mkCId "_middle_A" -> G_middle_A - Just (i,[]) | i == mkCId "_military_A" -> G_military_A - Just (i,[]) | i == mkCId "_more_A" -> G_more_A - Just (i,[]) | i == mkCId "_multiple_A" -> G_multiple_A - Just (i,[]) | i == mkCId "_national_A" -> G_national_A - Just (i,[]) | i == mkCId "_normal_A" -> G_normal_A - Just (i,[]) | i == mkCId "_nuclear_A" -> G_nuclear_A - Just (i,[]) | i == mkCId "_other_A" -> G_other_A - Just (i,[]) | i == mkCId "_particular_A" -> G_particular_A - Just (i,[]) | i == mkCId "_past_A" -> G_past_A - Just (i,[]) | i == mkCId "_payable_A" -> G_payable_A - Just (i,[]) | i == mkCId "_permanent_A" -> G_permanent_A - Just (i,[]) | i == mkCId "_physical_A" -> G_physical_A - Just (i,[]) | i == mkCId "_possible_A" -> G_possible_A - Just (i,[]) | i == mkCId "_previous_A" -> G_previous_A - Just (i,[]) | i == mkCId "_private_A" -> G_private_A - Just (i,[]) | i == mkCId "_professional_A" -> G_professional_A - Just (i,[]) | i == mkCId "_public_A" -> G_public_A - Just (i,[]) | i == mkCId "_reckless_A" -> G_reckless_A - Just (i,[]) | i == mkCId "_registered_A" -> G_registered_A - Just (i,[]) | i == mkCId "_relevant_A" -> G_relevant_A - Just (i,[]) | i == mkCId "_subject_A" -> G_subject_A - Just (i,[]) | i == mkCId "_successful_A" -> G_successful_A - Just (i,[]) | i == mkCId "_surgical_A" -> G_surgical_A - Just (i,[]) | i == mkCId "_third_A" -> G_third_A - Just (i,[]) | i == mkCId "_total_A" -> G_total_A - Just (i,[]) | i == mkCId "_traditional_A" -> G_traditional_A - Just (i,[]) | i == mkCId "_triple_A" -> G_triple_A - Just (i,[]) | i == mkCId "_unlawful_A" -> G_unlawful_A - Just (i,[]) | i == mkCId "_unnecessary_A" -> G_unnecessary_A - Just (i,[]) | i == mkCId "_unsound_A" -> G_unsound_A - Just (i,[]) | i == mkCId "_unsuccessful_A" -> G_unsuccessful_A - Just (i,[]) | i == mkCId "_upscaled_A" -> G_upscaled_A - Just (i,[]) | i == mkCId "_valid_A" -> G_valid_A - Just (i,[]) | i == mkCId "_viral_A" -> G_viral_A - Just (i,[]) | i == mkCId "_waterborne_A" -> G_waterborne_A - + Just (i,[]) -> LexA (showCId i) _ -> error ("no A " ++ show t) instance Gf GA2 where @@ -1377,14 +802,21 @@ instance Gf GAdv where gf (GWhileDoing x1) = mkApp (mkCId "WhileDoing") [gf x1] gf G_as_Adv = mkApp (mkCId "_as_Adv") [] gf G_at_Adv = mkApp (mkCId "_at_Adv") [] + gf G_directly_Adv = mkApp (mkCId "_directly_Adv") [] gf G_first_Adv = mkApp (mkCId "_first_Adv") [] gf G_fully_Adv = mkApp (mkCId "_fully_Adv") [] gf G_hence_Adv = mkApp (mkCId "_hence_Adv") [] + gf G_here_Adv = mkApp (mkCId "_here_Adv") [] + gf G_indirectly_Adv = mkApp (mkCId "_indirectly_Adv") [] gf G_least_Adv = mkApp (mkCId "_least_Adv") [] + gf G_long_Adv = mkApp (mkCId "_long_Adv") [] + gf G_more_Adv = mkApp (mkCId "_more_Adv") [] + gf G_no_Adv = mkApp (mkCId "_no_Adv") [] gf G_on_its_way_Adv = mkApp (mkCId "_on_its_way_Adv") [] gf G_only_Adv = mkApp (mkCId "_only_Adv") [] gf G_permanently_Adv = mkApp (mkCId "_permanently_Adv") [] gf G_pland_Adv = mkApp (mkCId "_pland_Adv") [] + gf G_so_Adv = mkApp (mkCId "_so_Adv") [] gf G_soon_Adv = mkApp (mkCId "_soon_Adv") [] gf G_then_Adv = mkApp (mkCId "_then_Adv") [] gf G_totally_Adv = mkApp (mkCId "_totally_Adv") [] @@ -1403,14 +835,21 @@ instance Gf GAdv where Just (i,[x1]) | i == mkCId "WhileDoing" -> GWhileDoing (fg x1) Just (i,[]) | i == mkCId "_as_Adv" -> G_as_Adv Just (i,[]) | i == mkCId "_at_Adv" -> G_at_Adv + Just (i,[]) | i == mkCId "_directly_Adv" -> G_directly_Adv Just (i,[]) | i == mkCId "_first_Adv" -> G_first_Adv Just (i,[]) | i == mkCId "_fully_Adv" -> G_fully_Adv Just (i,[]) | i == mkCId "_hence_Adv" -> G_hence_Adv + Just (i,[]) | i == mkCId "_here_Adv" -> G_here_Adv + Just (i,[]) | i == mkCId "_indirectly_Adv" -> G_indirectly_Adv Just (i,[]) | i == mkCId "_least_Adv" -> G_least_Adv + Just (i,[]) | i == mkCId "_long_Adv" -> G_long_Adv + Just (i,[]) | i == mkCId "_more_Adv" -> G_more_Adv + Just (i,[]) | i == mkCId "_no_Adv" -> G_no_Adv Just (i,[]) | i == mkCId "_on_its_way_Adv" -> G_on_its_way_Adv Just (i,[]) | i == mkCId "_only_Adv" -> G_only_Adv Just (i,[]) | i == mkCId "_permanently_Adv" -> G_permanently_Adv Just (i,[]) | i == mkCId "_pland_Adv" -> G_pland_Adv + Just (i,[]) | i == mkCId "_so_Adv" -> G_so_Adv Just (i,[]) | i == mkCId "_soon_Adv" -> G_soon_Adv Just (i,[]) | i == mkCId "_then_Adv" -> G_then_Adv Just (i,[]) | i == mkCId "_totally_Adv" -> G_totally_Adv @@ -1502,15 +941,12 @@ instance Gf GCond where _ -> error ("no Cond " ++ show t) instance Gf GConj where - gf GAND = mkApp (mkCId "AND") [] - gf GOR = mkApp (mkCId "OR") [] + gf (LexConj x) = mkApp (mkCId x) [] fg t = case unApp t of - Just (i,[]) | i == mkCId "AND" -> GAND - Just (i,[]) | i == mkCId "OR" -> GOR - + Just (i,[]) -> LexConj (showCId i) _ -> error ("no Conj " ++ show t) instance Gf GConstraint where @@ -1896,217 +1332,12 @@ instance Gf GNumeral where _ -> error ("no Numeral " ++ show t) instance Gf GPN where - gf G_1012_PN = mkApp (mkCId "_1012_PN") [] - gf G_1013_PN = mkApp (mkCId "_1013_PN") [] - gf G_1014_PN = mkApp (mkCId "_1014_PN") [] - gf G_333A_PN = mkApp (mkCId "_333A_PN") [] - gf G_ADD_PN = mkApp (mkCId "_ADD_PN") [] - gf G_AIDS_PN = mkApp (mkCId "_AIDS_PN") [] - gf G_Accident_PN = mkApp (mkCId "_Accident_PN") [] - gf G_Accidental_PN = mkApp (mkCId "_Accidental_PN") [] - gf G_Accidents_PN = mkApp (mkCId "_Accidents_PN") [] - gf G_Address_PN = mkApp (mkCId "_Address_PN") [] - gf G_Adjustment_PN = mkApp (mkCId "_Adjustment_PN") [] - gf G_Assured_PN = mkApp (mkCId "_Assured_PN") [] - gf G_BSA_PN = mkApp (mkCId "_BSA_PN") [] - gf G_Benefit_PN = mkApp (mkCId "_Benefit_PN") [] - gf G_Cap_PN = mkApp (mkCId "_Cap_PN") [] - gf G_Claim_PN = mkApp (mkCId "_Claim_PN") [] - gf G_CoV_PN = mkApp (mkCId "_CoV_PN") [] - gf G_Conditions_PN = mkApp (mkCId "_Conditions_PN") [] - gf G_Date_PN = mkApp (mkCId "_Date_PN") [] - gf G_Death_PN = mkApp (mkCId "_Death_PN") [] - gf G_Details_PN = mkApp (mkCId "_Details_PN") [] - gf G_Disease_PN = mkApp (mkCId "_Disease_PN") [] - gf G_Dismemberment_PN = mkApp (mkCId "_Dismemberment_PN") [] - gf G_Event_PN = mkApp (mkCId "_Event_PN") [] - gf G_Expense_PN = mkApp (mkCId "_Expense_PN") [] - gf G_Flu_PN = mkApp (mkCId "_Flu_PN") [] - gf G_H5N1_PN = mkApp (mkCId "_H5N1_PN") [] - gf G_H7N9_PN = mkApp (mkCId "_H7N9_PN") [] - gf G_H7N_PN = mkApp (mkCId "_H7N_PN") [] - gf G_H9N2_PN = mkApp (mkCId "_H9N2_PN") [] - gf G_HAS_PN = mkApp (mkCId "_HAS_PN") [] - gf G_Head_PN = mkApp (mkCId "_Head_PN") [] - gf G_Health_PN = mkApp (mkCId "_Health_PN") [] - gf G_Influenza_PN = mkApp (mkCId "_Influenza_PN") [] - gf G_Injury_PN = mkApp (mkCId "_Injury_PN") [] - gf G_Insurer_PN = mkApp (mkCId "_Insurer_PN") [] - gf G_LA_PN = mkApp (mkCId "_LA_PN") [] - gf G_LE_PN = mkApp (mkCId "_LE_PN") [] - gf G_Leg_PN = mkApp (mkCId "_Leg_PN") [] - gf G_Legionnaires_PN = mkApp (mkCId "_Legionnaires_PN") [] - gf G_Life_PN = mkApp (mkCId "_Life_PN") [] - gf G_Limit_PN = mkApp (mkCId "_Limit_PN") [] - gf G_MAP_PN = mkApp (mkCId "_MAP_PN") [] - gf G_MIN_PN = mkApp (mkCId "_MIN_PN") [] - gf G_MR_PN = mkApp (mkCId "_MR_PN") [] - gf G_M_PN = mkApp (mkCId "_M_PN") [] - gf G_Medicine_PN = mkApp (mkCId "_Medicine_PN") [] - gf G_Melioidosis_PN = mkApp (mkCId "_Melioidosis_PN") [] - gf G_Ministry_PN = mkApp (mkCId "_Ministry_PN") [] - gf G_Mumps_PN = mkApp (mkCId "_Mumps_PN") [] - gf G_N_PN = mkApp (mkCId "_N_PN") [] - gf G_Nipah_PN = mkApp (mkCId "_Nipah_PN") [] - gf G_Ontology_PN = mkApp (mkCId "_Ontology_PN") [] - gf G_PS_PN = mkApp (mkCId "_PS_PN") [] - gf G_Plan14_PN = mkApp (mkCId "_Plan14_PN") [] - gf G_PlanAF_PN = mkApp (mkCId "_PlanAF_PN") [] - gf G_PolicyHolder_PN = mkApp (mkCId "_PolicyHolder_PN") [] - gf G_Policy_PN = mkApp (mkCId "_Policy_PN") [] - gf G_RETURN_PN = mkApp (mkCId "_RETURN_PN") [] - gf G_Reductions_PN = mkApp (mkCId "_Reductions_PN") [] - gf G_Removal_PN = mkApp (mkCId "_Removal_PN") [] - gf G_Republic_PN = mkApp (mkCId "_Republic_PN") [] - gf G_SA_PN = mkApp (mkCId "_SA_PN") [] - gf G_SG_PN = mkApp (mkCId "_SG_PN") [] - gf G_Schedule_PN = mkApp (mkCId "_Schedule_PN") [] - gf G_Section_PN = mkApp (mkCId "_Section_PN") [] - gf G_Service_PN = mkApp (mkCId "_Service_PN") [] - gf G_Singapore_PN = mkApp (mkCId "_Singapore_PN") [] - gf G_Step_PN = mkApp (mkCId "_Step_PN") [] - gf G_Subscribed_PN = mkApp (mkCId "_Subscribed_PN") [] - gf G_TABLE_PN = mkApp (mkCId "_TABLE_PN") [] - gf G_Teeth_PN = mkApp (mkCId "_Teeth_PN") [] - gf G_Triple_PN = mkApp (mkCId "_Triple_PN") [] - gf G_Type_PN = mkApp (mkCId "_Type_PN") [] - gf G_Types_PN = mkApp (mkCId "_Types_PN") [] - gf G_UPON_PN = mkApp (mkCId "_UPON_PN") [] - gf G_Wife_PN = mkApp (mkCId "_Wife_PN") [] - gf G_Yellow_PN = mkApp (mkCId "_Yellow_PN") [] - gf G_addSA_PN = mkApp (mkCId "_addSA_PN") [] - gf G_benADD_PN = mkApp (mkCId "_benADD_PN") [] - gf G_benADDs_PN = mkApp (mkCId "_benADDs_PN") [] - gf G_benRA_PN = mkApp (mkCId "_benRA_PN") [] - gf G_benTCM_PN = mkApp (mkCId "_benTCM_PN") [] - gf G_circ_PN = mkApp (mkCId "_circ_PN") [] - gf G_dTime_PN = mkApp (mkCId "_dTime_PN") [] - gf G_dType_PN = mkApp (mkCId "_dType_PN") [] - gf G_diving_PN = mkApp (mkCId "_diving_PN") [] - gf G_holder_PN = mkApp (mkCId "_holder_PN") [] - gf G_motocross_PN = mkApp (mkCId "_motocross_PN") [] - gf G_p_PN = mkApp (mkCId "_p_PN") [] - gf G_plan3_PN = mkApp (mkCId "_plan3_PN") [] - gf G_plan4_PN = mkApp (mkCId "_plan4_PN") [] - gf G_planAF_PN = mkApp (mkCId "_planAF_PN") [] - gf G_planB_PN = mkApp (mkCId "_planB_PN") [] - gf G_planC_PN = mkApp (mkCId "_planC_PN") [] - gf G_planE_PN = mkApp (mkCId "_planE_PN") [] - gf G_planF_PN = mkApp (mkCId "_planF_PN") [] - gf G_policyHolder_PN = mkApp (mkCId "_policyHolder_PN") [] - gf G_qualifies_for_add_PN = mkApp (mkCId "_qualifies_for_add_PN") [] - gf G_schema_PN = mkApp (mkCId "_schema_PN") [] - gf G_sum_list_PN = mkApp (mkCId "_sum_list_PN") [] - gf G_x_PN = mkApp (mkCId "_x_PN") [] - gf G_y_PN = mkApp (mkCId "_y_PN") [] + gf (LexPN x) = mkApp (mkCId x) [] fg t = case unApp t of - Just (i,[]) | i == mkCId "_1012_PN" -> G_1012_PN - Just (i,[]) | i == mkCId "_1013_PN" -> G_1013_PN - Just (i,[]) | i == mkCId "_1014_PN" -> G_1014_PN - Just (i,[]) | i == mkCId "_333A_PN" -> G_333A_PN - Just (i,[]) | i == mkCId "_ADD_PN" -> G_ADD_PN - Just (i,[]) | i == mkCId "_AIDS_PN" -> G_AIDS_PN - Just (i,[]) | i == mkCId "_Accident_PN" -> G_Accident_PN - Just (i,[]) | i == mkCId "_Accidental_PN" -> G_Accidental_PN - Just (i,[]) | i == mkCId "_Accidents_PN" -> G_Accidents_PN - Just (i,[]) | i == mkCId "_Address_PN" -> G_Address_PN - Just (i,[]) | i == mkCId "_Adjustment_PN" -> G_Adjustment_PN - Just (i,[]) | i == mkCId "_Assured_PN" -> G_Assured_PN - Just (i,[]) | i == mkCId "_BSA_PN" -> G_BSA_PN - Just (i,[]) | i == mkCId "_Benefit_PN" -> G_Benefit_PN - Just (i,[]) | i == mkCId "_Cap_PN" -> G_Cap_PN - Just (i,[]) | i == mkCId "_Claim_PN" -> G_Claim_PN - Just (i,[]) | i == mkCId "_CoV_PN" -> G_CoV_PN - Just (i,[]) | i == mkCId "_Conditions_PN" -> G_Conditions_PN - Just (i,[]) | i == mkCId "_Date_PN" -> G_Date_PN - Just (i,[]) | i == mkCId "_Death_PN" -> G_Death_PN - Just (i,[]) | i == mkCId "_Details_PN" -> G_Details_PN - Just (i,[]) | i == mkCId "_Disease_PN" -> G_Disease_PN - Just (i,[]) | i == mkCId "_Dismemberment_PN" -> G_Dismemberment_PN - Just (i,[]) | i == mkCId "_Event_PN" -> G_Event_PN - Just (i,[]) | i == mkCId "_Expense_PN" -> G_Expense_PN - Just (i,[]) | i == mkCId "_Flu_PN" -> G_Flu_PN - Just (i,[]) | i == mkCId "_H5N1_PN" -> G_H5N1_PN - Just (i,[]) | i == mkCId "_H7N9_PN" -> G_H7N9_PN - Just (i,[]) | i == mkCId "_H7N_PN" -> G_H7N_PN - Just (i,[]) | i == mkCId "_H9N2_PN" -> G_H9N2_PN - Just (i,[]) | i == mkCId "_HAS_PN" -> G_HAS_PN - Just (i,[]) | i == mkCId "_Head_PN" -> G_Head_PN - Just (i,[]) | i == mkCId "_Health_PN" -> G_Health_PN - Just (i,[]) | i == mkCId "_Influenza_PN" -> G_Influenza_PN - Just (i,[]) | i == mkCId "_Injury_PN" -> G_Injury_PN - Just (i,[]) | i == mkCId "_Insurer_PN" -> G_Insurer_PN - Just (i,[]) | i == mkCId "_LA_PN" -> G_LA_PN - Just (i,[]) | i == mkCId "_LE_PN" -> G_LE_PN - Just (i,[]) | i == mkCId "_Leg_PN" -> G_Leg_PN - Just (i,[]) | i == mkCId "_Legionnaires_PN" -> G_Legionnaires_PN - Just (i,[]) | i == mkCId "_Life_PN" -> G_Life_PN - Just (i,[]) | i == mkCId "_Limit_PN" -> G_Limit_PN - Just (i,[]) | i == mkCId "_MAP_PN" -> G_MAP_PN - Just (i,[]) | i == mkCId "_MIN_PN" -> G_MIN_PN - Just (i,[]) | i == mkCId "_MR_PN" -> G_MR_PN - Just (i,[]) | i == mkCId "_M_PN" -> G_M_PN - Just (i,[]) | i == mkCId "_Medicine_PN" -> G_Medicine_PN - Just (i,[]) | i == mkCId "_Melioidosis_PN" -> G_Melioidosis_PN - Just (i,[]) | i == mkCId "_Ministry_PN" -> G_Ministry_PN - Just (i,[]) | i == mkCId "_Mumps_PN" -> G_Mumps_PN - Just (i,[]) | i == mkCId "_N_PN" -> G_N_PN - Just (i,[]) | i == mkCId "_Nipah_PN" -> G_Nipah_PN - Just (i,[]) | i == mkCId "_Ontology_PN" -> G_Ontology_PN - Just (i,[]) | i == mkCId "_PS_PN" -> G_PS_PN - Just (i,[]) | i == mkCId "_Plan14_PN" -> G_Plan14_PN - Just (i,[]) | i == mkCId "_PlanAF_PN" -> G_PlanAF_PN - Just (i,[]) | i == mkCId "_PolicyHolder_PN" -> G_PolicyHolder_PN - Just (i,[]) | i == mkCId "_Policy_PN" -> G_Policy_PN - Just (i,[]) | i == mkCId "_RETURN_PN" -> G_RETURN_PN - Just (i,[]) | i == mkCId "_Reductions_PN" -> G_Reductions_PN - Just (i,[]) | i == mkCId "_Removal_PN" -> G_Removal_PN - Just (i,[]) | i == mkCId "_Republic_PN" -> G_Republic_PN - Just (i,[]) | i == mkCId "_SA_PN" -> G_SA_PN - Just (i,[]) | i == mkCId "_SG_PN" -> G_SG_PN - Just (i,[]) | i == mkCId "_Schedule_PN" -> G_Schedule_PN - Just (i,[]) | i == mkCId "_Section_PN" -> G_Section_PN - Just (i,[]) | i == mkCId "_Service_PN" -> G_Service_PN - Just (i,[]) | i == mkCId "_Singapore_PN" -> G_Singapore_PN - Just (i,[]) | i == mkCId "_Step_PN" -> G_Step_PN - Just (i,[]) | i == mkCId "_Subscribed_PN" -> G_Subscribed_PN - Just (i,[]) | i == mkCId "_TABLE_PN" -> G_TABLE_PN - Just (i,[]) | i == mkCId "_Teeth_PN" -> G_Teeth_PN - Just (i,[]) | i == mkCId "_Triple_PN" -> G_Triple_PN - Just (i,[]) | i == mkCId "_Type_PN" -> G_Type_PN - Just (i,[]) | i == mkCId "_Types_PN" -> G_Types_PN - Just (i,[]) | i == mkCId "_UPON_PN" -> G_UPON_PN - Just (i,[]) | i == mkCId "_Wife_PN" -> G_Wife_PN - Just (i,[]) | i == mkCId "_Yellow_PN" -> G_Yellow_PN - Just (i,[]) | i == mkCId "_addSA_PN" -> G_addSA_PN - Just (i,[]) | i == mkCId "_benADD_PN" -> G_benADD_PN - Just (i,[]) | i == mkCId "_benADDs_PN" -> G_benADDs_PN - Just (i,[]) | i == mkCId "_benRA_PN" -> G_benRA_PN - Just (i,[]) | i == mkCId "_benTCM_PN" -> G_benTCM_PN - Just (i,[]) | i == mkCId "_circ_PN" -> G_circ_PN - Just (i,[]) | i == mkCId "_dTime_PN" -> G_dTime_PN - Just (i,[]) | i == mkCId "_dType_PN" -> G_dType_PN - Just (i,[]) | i == mkCId "_diving_PN" -> G_diving_PN - Just (i,[]) | i == mkCId "_holder_PN" -> G_holder_PN - Just (i,[]) | i == mkCId "_motocross_PN" -> G_motocross_PN - Just (i,[]) | i == mkCId "_p_PN" -> G_p_PN - Just (i,[]) | i == mkCId "_plan3_PN" -> G_plan3_PN - Just (i,[]) | i == mkCId "_plan4_PN" -> G_plan4_PN - Just (i,[]) | i == mkCId "_planAF_PN" -> G_planAF_PN - Just (i,[]) | i == mkCId "_planB_PN" -> G_planB_PN - Just (i,[]) | i == mkCId "_planC_PN" -> G_planC_PN - Just (i,[]) | i == mkCId "_planE_PN" -> G_planE_PN - Just (i,[]) | i == mkCId "_planF_PN" -> G_planF_PN - Just (i,[]) | i == mkCId "_policyHolder_PN" -> G_policyHolder_PN - Just (i,[]) | i == mkCId "_qualifies_for_add_PN" -> G_qualifies_for_add_PN - Just (i,[]) | i == mkCId "_schema_PN" -> G_schema_PN - Just (i,[]) | i == mkCId "_sum_list_PN" -> G_sum_list_PN - Just (i,[]) | i == mkCId "_x_PN" -> G_x_PN - Just (i,[]) | i == mkCId "_y_PN" -> G_y_PN - + Just (i,[]) -> LexPN (showCId i) _ -> error ("no PN " ++ show t) instance Gf GPol where @@ -2149,78 +1380,13 @@ instance Gf GPrePost where instance Gf GPrep where gf (GConjPrep x1 x2) = mkApp (mkCId "ConjPrep") [gf x1, gf x2] - gf G_across_Prep = mkApp (mkCId "_across_Prep") [] - gf G_after_Prep = mkApp (mkCId "_after_Prep") [] - gf G_as_Prep = mkApp (mkCId "_as_Prep") [] - gf G_at_Prep = mkApp (mkCId "_at_Prep") [] - gf G_between_Prep = mkApp (mkCId "_between_Prep") [] - gf G_by_Prep = mkApp (mkCId "_by_Prep") [] - gf G_during_Prep = mkApp (mkCId "_during_Prep") [] - gf G_for_Prep = mkApp (mkCId "_for_Prep") [] - gf G_from_Prep = mkApp (mkCId "_from_Prep") [] - gf G_in_Prep = mkApp (mkCId "_in_Prep") [] - gf G_into_Prep = mkApp (mkCId "_into_Prep") [] - gf G_involving_Prep = mkApp (mkCId "_involving_Prep") [] - gf G_of_Prep = mkApp (mkCId "_of_Prep") [] - gf G_on_Prep = mkApp (mkCId "_on_Prep") [] - gf G_out_Prep = mkApp (mkCId "_out_Prep") [] - gf G_over_Prep = mkApp (mkCId "_over_Prep") [] - gf G_per_Prep = mkApp (mkCId "_per_Prep") [] - gf G_than_Prep = mkApp (mkCId "_than_Prep") [] - gf G_through_Prep = mkApp (mkCId "_through_Prep") [] - gf G_to_Prep = mkApp (mkCId "_to_Prep") [] - gf G_under_Prep = mkApp (mkCId "_under_Prep") [] - gf G_up_Prep = mkApp (mkCId "_up_Prep") [] - gf G_with_Prep = mkApp (mkCId "_with_Prep") [] - gf G_within_Prep = mkApp (mkCId "_within_Prep") [] - gf Gabout_Prep = mkApp (mkCId "about_Prep") [] - gf Gafter_Prep = mkApp (mkCId "after_Prep") [] - gf Gbefore_Prep = mkApp (mkCId "before_Prep") [] - gf Gfor_Prep = mkApp (mkCId "for_Prep") [] - gf Gfrom_Prep = mkApp (mkCId "from_Prep") [] - gf Gon_Prep = mkApp (mkCId "on_Prep") [] - gf Gpossess_Prep = mkApp (mkCId "possess_Prep") [] - gf Gto_Prep = mkApp (mkCId "to_Prep") [] - gf Gwithin_Prep = mkApp (mkCId "within_Prep") [] + gf (LexPrep x) = mkApp (mkCId x) [] fg t = case unApp t of Just (i,[x1,x2]) | i == mkCId "ConjPrep" -> GConjPrep (fg x1) (fg x2) - Just (i,[]) | i == mkCId "_across_Prep" -> G_across_Prep - Just (i,[]) | i == mkCId "_after_Prep" -> G_after_Prep - Just (i,[]) | i == mkCId "_as_Prep" -> G_as_Prep - Just (i,[]) | i == mkCId "_at_Prep" -> G_at_Prep - Just (i,[]) | i == mkCId "_between_Prep" -> G_between_Prep - Just (i,[]) | i == mkCId "_by_Prep" -> G_by_Prep - Just (i,[]) | i == mkCId "_during_Prep" -> G_during_Prep - Just (i,[]) | i == mkCId "_for_Prep" -> G_for_Prep - Just (i,[]) | i == mkCId "_from_Prep" -> G_from_Prep - Just (i,[]) | i == mkCId "_in_Prep" -> G_in_Prep - Just (i,[]) | i == mkCId "_into_Prep" -> G_into_Prep - Just (i,[]) | i == mkCId "_involving_Prep" -> G_involving_Prep - Just (i,[]) | i == mkCId "_of_Prep" -> G_of_Prep - Just (i,[]) | i == mkCId "_on_Prep" -> G_on_Prep - Just (i,[]) | i == mkCId "_out_Prep" -> G_out_Prep - Just (i,[]) | i == mkCId "_over_Prep" -> G_over_Prep - Just (i,[]) | i == mkCId "_per_Prep" -> G_per_Prep - Just (i,[]) | i == mkCId "_than_Prep" -> G_than_Prep - Just (i,[]) | i == mkCId "_through_Prep" -> G_through_Prep - Just (i,[]) | i == mkCId "_to_Prep" -> G_to_Prep - Just (i,[]) | i == mkCId "_under_Prep" -> G_under_Prep - Just (i,[]) | i == mkCId "_up_Prep" -> G_up_Prep - Just (i,[]) | i == mkCId "_with_Prep" -> G_with_Prep - Just (i,[]) | i == mkCId "_within_Prep" -> G_within_Prep - Just (i,[]) | i == mkCId "about_Prep" -> Gabout_Prep - Just (i,[]) | i == mkCId "after_Prep" -> Gafter_Prep - Just (i,[]) | i == mkCId "before_Prep" -> Gbefore_Prep - Just (i,[]) | i == mkCId "for_Prep" -> Gfor_Prep - Just (i,[]) | i == mkCId "from_Prep" -> Gfrom_Prep - Just (i,[]) | i == mkCId "on_Prep" -> Gon_Prep - Just (i,[]) | i == mkCId "possess_Prep" -> Gpossess_Prep - Just (i,[]) | i == mkCId "to_Prep" -> Gto_Prep - Just (i,[]) | i == mkCId "within_Prep" -> Gwithin_Prep - + Just (i,[]) -> LexPrep (showCId i) _ -> error ("no Prep " ++ show t) instance Gf GQS where @@ -2374,33 +1540,12 @@ instance Gf GSub1000000000000 where _ -> error ("no Sub1000000000000 " ++ show t) instance Gf GSubj where - gf G_and_Subj = mkApp (mkCId "_and_Subj") [] - gf G_as_Subj = mkApp (mkCId "_as_Subj") [] - gf G_before_Subj = mkApp (mkCId "_before_Subj") [] - gf G_both_Subj = mkApp (mkCId "_both_Subj") [] - gf G_but_Subj = mkApp (mkCId "_but_Subj") [] - gf G_if_Subj = mkApp (mkCId "_if_Subj") [] - gf G_or_Subj = mkApp (mkCId "_or_Subj") [] - gf G_that_Subj = mkApp (mkCId "_that_Subj") [] - gf G_when_Subj = mkApp (mkCId "_when_Subj") [] - gf G_while_Subj = mkApp (mkCId "_while_Subj") [] - gf Gbecause_Subj = mkApp (mkCId "because_Subj") [] + gf (LexSubj x) = mkApp (mkCId x) [] fg t = case unApp t of - Just (i,[]) | i == mkCId "_and_Subj" -> G_and_Subj - Just (i,[]) | i == mkCId "_as_Subj" -> G_as_Subj - Just (i,[]) | i == mkCId "_before_Subj" -> G_before_Subj - Just (i,[]) | i == mkCId "_both_Subj" -> G_both_Subj - Just (i,[]) | i == mkCId "_but_Subj" -> G_but_Subj - Just (i,[]) | i == mkCId "_if_Subj" -> G_if_Subj - Just (i,[]) | i == mkCId "_or_Subj" -> G_or_Subj - Just (i,[]) | i == mkCId "_that_Subj" -> G_that_Subj - Just (i,[]) | i == mkCId "_when_Subj" -> G_when_Subj - Just (i,[]) | i == mkCId "_while_Subj" -> G_while_Subj - Just (i,[]) | i == mkCId "because_Subj" -> Gbecause_Subj - + Just (i,[]) -> LexSubj (showCId i) _ -> error ("no Subj " ++ show t) instance Gf GTComparison where @@ -2533,6 +1678,7 @@ instance Gf GVP where gf (GComplVSif x1 x2) = mkApp (mkCId "ComplVSif") [gf x1, gf x2] gf (GComplVSthat x1 x2) = mkApp (mkCId "ComplVSthat") [gf x1, gf x2] gf (GUseComp x1) = mkApp (mkCId "UseComp") [gf x1] + gf (GUseV x1) = mkApp (mkCId "UseV") [gf x1] gf (LexVP x) = mkApp (mkCId x) [] fg t = @@ -2544,6 +1690,7 @@ instance Gf GVP where Just (i,[x1,x2]) | i == mkCId "ComplVSif" -> GComplVSif (fg x1) (fg x2) Just (i,[x1,x2]) | i == mkCId "ComplVSthat" -> GComplVSthat (fg x1) (fg x2) Just (i,[x1]) | i == mkCId "UseComp" -> GUseComp (fg x1) + Just (i,[x1]) | i == mkCId "UseV" -> GUseV (fg x1) Just (i,[]) -> LexVP (showCId i) _ -> error ("no VP " ++ show t) @@ -2778,6 +1925,7 @@ instance Compos Tree where GComplVSif x1 x2 -> r GComplVSif `a` f x1 `a` f x2 GComplVSthat x1 x2 -> r GComplVSthat `a` f x1 `a` f x2 GUseComp x1 -> r GUseComp `a` f x1 + GUseV x1 -> r GUseV `a` f x1 GMkVPI x1 -> r GMkVPI `a` f x1 GComparison_Card_Years x1 -> r GComparison_Card_Years `a` f x1 GConjPrePostVPS x1 x2 x3 x4 -> r GConjPrePostVPS `a` f x1 `a` f x2 `a` f x3 `a` f x4 diff --git a/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs b/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs index 9cd114a5b..5ccb20031 100644 --- a/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs +++ b/lib/haskell/natural4/src/LS/NLP/NL4Transformations.hs @@ -96,7 +96,7 @@ bsNeg2textNeg bs = case bs of -- textNeg2bsNeg :: BoolStructWho -> BoolStructWho ----------------------------------------------------------------------------- --- This is rather hard to read, but the alternative is to duplicate bs2gf for every single GF category +-- This is rather hard to read, but the alternative is to duplicate bs2gf for every single GF cate(LexConj "OR")y type ConjFun list single = GConj -> Tree list -> Tree single type ConjPreFun list single = GPrePost -> GConj -> Tree list -> Tree single @@ -106,12 +106,12 @@ type ListFun single list = [Tree single] -> Tree list bs2gf :: (Gf (Tree s)) => ConjFun l s -> ConjPreFun l s -> ConjPrePostFun l s -> ListFun s l -> BoolStructGF s -> Tree s bs2gf conj conjPre conjPrePost mkList bs = case bs' of AA.Leaf x -> x - AA.Any Nothing xs -> mergeConj $ conj GOR $ mkList $ f <$> xs - AA.All Nothing xs -> mergeConj $ conj GAND $ mkList $ f <$> xs - AA.Any (Just (AA.Pre pre)) xs -> conjPre pre GOR $ mkList $ f <$> xs - AA.All (Just (AA.Pre pre)) xs -> conjPre pre GAND $ mkList $ f <$> xs - AA.Any (Just (AA.PrePost pre post)) xs -> conjPrePost pre post GOR $ mkList $ f <$> xs - AA.All (Just (AA.PrePost pre post)) xs -> conjPrePost pre post GAND $ mkList $ f <$> xs + AA.Any Nothing xs -> mergeConj $ conj (LexConj "OR") $ mkList $ f <$> xs + AA.All Nothing xs -> mergeConj $ conj (LexConj "AND") $ mkList $ f <$> xs + AA.Any (Just (AA.Pre pre)) xs -> conjPre pre (LexConj "OR") $ mkList $ f <$> xs + AA.All (Just (AA.Pre pre)) xs -> conjPre pre (LexConj "AND") $ mkList $ f <$> xs + AA.Any (Just (AA.PrePost pre post)) xs -> conjPrePost pre post (LexConj "OR") $ mkList $ f <$> xs + AA.All (Just (AA.PrePost pre post)) xs -> conjPrePost pre post (LexConj "AND") $ mkList $ f <$> xs AA.Not unexpectedBS -> trace unexpectedNegationMsg $ bs2gf conj conjPre conjPrePost mkList unexpectedBS -- AA.Not _ -> error unexpectedNegationMsg where @@ -227,6 +227,6 @@ aggregateBoolStruct l bs = then bs else (case bs of - AA.Any _ xs -> maybe bs AA.Leaf $ squeezeTrees GOR $ concatMap toList xs - AA.All _ xs -> maybe bs AA.Leaf $ squeezeTrees GAND $ concatMap toList xs + AA.Any _ xs -> maybe bs AA.Leaf $ squeezeTrees (LexConj "OR") $ concatMap toList xs + AA.All _ xs -> maybe bs AA.Leaf $ squeezeTrees (LexConj "AND") $ concatMap toList xs _ -> bs) From 56772c7966798d5677aa425db641ef75a287f931 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Mon, 7 Aug 2023 13:30:04 +0800 Subject: [PATCH 24/49] fix non-exhaustive pattern in rpRelToBComparOp --- lib/haskell/natural4/src/LS/XPile/CoreL4.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/haskell/natural4/src/LS/XPile/CoreL4.hs b/lib/haskell/natural4/src/LS/XPile/CoreL4.hs index 8173a85ea..7b38a5675 100644 --- a/lib/haskell/natural4/src/LS/XPile/CoreL4.hs +++ b/lib/haskell/natural4/src/LS/XPile/CoreL4.hs @@ -420,7 +420,7 @@ rpRelToBComparOp RPelem = refute "rpRelToBComparOp: erroring on RPelem" rpRelToBComparOp RPnotElem = refute "rpRelToBComparOp: erroring on RPnotElem" rpRelToBComparOp RPnot = refute "rpRelToBComparOp: erroring on RPnot" rpRelToBComparOp RPTC {} = refute "rpRelToBComparOp: erroring on RPTC" - +rpRelToBComparOp x = refute ("rpRelToBComparOp: erroring on " <> pretty (show x)) -- END helper functions boolStructRToExpr :: [String] -> BoolStructR -> ExprM ann () From 272d50ec34b9e7982921348241b33d73fd73bd4c Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 19:55:34 +0800 Subject: [PATCH 25/49] init one example Co-authored-by: johsi-k --- .../parentchild/notes/parentchild.pl | 12 ++++++++++++ .../parentchild/parentchild-with-period.csv | 4 ++++ .../parentchild/parentchild-without-period.csv | 4 ++++ .../WithoutOurLELibs/parentchild/parentchild.le | 9 +++++++++ 4 files changed, 29 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl new file mode 100644 index 000000000..7f25bc90e --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl @@ -0,0 +1,12 @@ +:-module('parent_eg_no_libs-prolog', []). +source_lang(en). +local_dict([is_the_parent_of, A, B], [x-x, y-y], [A, is, the, parent, of, B]). +local_dict([is_the_child_of, A, B], [y-y, x-x], [A, is, the, child, of, B]). +local_meta_dict([],[],[]). +prolog_le(verified). +is_the_parent_of(A, B) :- + is_the_child_of(B, A). +example(null, []). +example(alice, [scenario([(is_the_child_of('Alice6', 'Bob'):-true)], true)]). +query(null, true). +query(q_ap, is_the_parent_of(_, 'Alice6')). diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv new file mode 100644 index 000000000..9347322c8 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv @@ -0,0 +1,4 @@ +GIVEN,x,,IS A,Person +,y,,IS A,Person +DECIDE,x,is the parent of,y, +IF,y,is the child of,x., \ No newline at end of file diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv new file mode 100644 index 000000000..fe4721208 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv @@ -0,0 +1,4 @@ +GIVEN,x,,IS A,Person +,y,,IS A,Person +DECIDE,x,is the parent of,y, +IF,y,is the child of,x, \ No newline at end of file diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le new file mode 100644 index 000000000..82ed22fcc --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le @@ -0,0 +1,9 @@ +the target language is: prolog. + +the templates are: + *a x* is the parent of *a y*, + *a y* is the child of *a x*. + +the knowledge base encoding includes: + a x is the parent of a y + if y is the child of x. From 44c92c080d615b20ae8a57fc5e3320e8868841f7 Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 21:04:13 +0800 Subject: [PATCH 26/49] simple-parentchild: unindent and add simple prefix --- .../{parentchild => simple-parentchild}/notes/parentchild.pl | 0 .../parentchild-with-period.csv | 0 .../parentchild-without-period.csv | 0 .../{parentchild => simple-parentchild}/parentchild.le | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/{parentchild => simple-parentchild}/notes/parentchild.pl (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/{parentchild => simple-parentchild}/parentchild-with-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/{parentchild => simple-parentchild}/parentchild-without-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/{parentchild => simple-parentchild}/parentchild.le (85%) diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/notes/parentchild.pl rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-with-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild-without-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild.le similarity index 85% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild.le index 82ed22fcc..04d2d1190 100644 --- a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/parentchild/parentchild.le +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild.le @@ -6,4 +6,4 @@ the templates are: the knowledge base encoding includes: a x is the parent of a y - if y is the child of x. + if y is the child of x. From 3f5deb64b4bc6f0882ccfed4a4bcad835050b52f Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 21:59:55 +0800 Subject: [PATCH 27/49] rejig structure of LE testcases Co-authored-by: johsi-k --- .../WithoutOurLELibs/simple-parentchild/notes/parentchild.pl | 0 .../simple-parentchild/parentchild-with-period.csv | 0 .../simple-parentchild/parentchild-without-period.csv | 0 .../WithoutOurLELibs/simple-parentchild/parentchild.le | 0 .../WithoutOurLELibs/simple-parentchild/rules.txt | 2 ++ .../WithoutOurLELibs/simple-parentchild/templates.txt | 2 ++ 6 files changed, 4 insertions(+) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{EndToEnd => }/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{EndToEnd => }/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{EndToEnd => }/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{EndToEnd => }/WithoutOurLELibs/simple-parentchild/parentchild.le (100%) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/EndToEnd/WithoutOurLELibs/simple-parentchild/parentchild.le rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt new file mode 100644 index 000000000..3413979b2 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt @@ -0,0 +1,2 @@ +a x is the parent of a y +if y is the child of x. \ No newline at end of file diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt new file mode 100644 index 000000000..cf099796a --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt @@ -0,0 +1,2 @@ +*a x* is the parent of *a y* +*a y* is the child of *a x* \ No newline at end of file From 9c42f72215f9e772b8e9018575daed0fa331d47d Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 22:13:55 +0800 Subject: [PATCH 28/49] parentchild.le: fix trailing space --- .../WithoutOurLELibs/simple-parentchild/parentchild.le | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le index 04d2d1190..2fa660393 100644 --- a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le @@ -6,4 +6,4 @@ the templates are: the knowledge base encoding includes: a x is the parent of a y - if y is the child of x. + if y is the child of x. \ No newline at end of file From 4dfb6711f702ebca70ec45b0c5ee918fb580bf51 Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 22:28:30 +0800 Subject: [PATCH 29/49] indentation_databreach: add prelim draft of LE version Co-authored-by: johsi-k --- .../indentation_databreach_with_queries.le | 31 +++++++++++++++++++ .../indentation-propn-databreach/rules.txt | 5 +++ .../templates.txt | 5 +++ 3 files changed, 41 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le new file mode 100644 index 000000000..c2bcfa840 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le @@ -0,0 +1,31 @@ +the target language is: prolog. + +the templates are: + *a data breach* with *a organization* results in harm to *a individual*, + *a data breach* with *a organization* exposed data from *an individual*, + *a data breach* with *a organization* relates to the name of *a individual*, + *a data breach* with *a organization* relates to an account *a individual* had with *a organization*, + *a data breach* with *a organization* relates to data required for access to the account of *a individual*. + +the knowledge base includes: + a data breach with a organization results in harm to a individual + if data breach with organization exposed data from individual + and data breach with organization relates to the name of individual + or data breach with organization relates to an account individual had with organization + and data breach with organization relates to data required for access to the account of individual. + +scenario alicesimple is: + the incident last night with acmecorp exposed data from alice. + the incident last night with acmecorp relates to the name of alice. + + +scenario aliceharder is: + the incident last night with acmecorp exposed data from alice. + the incident last night with acmecorp relates to an account alice had with acmecorp. + the incident last night with acmecorp relates to data required for access to the account of alice. + +query q is: + 0 < 1. + +query qa is: + which breach with which org results in harm to alice. \ No newline at end of file diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt new file mode 100644 index 000000000..51ddb89af --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt @@ -0,0 +1,5 @@ +a data breach with a organization results in harm to a individual +if data breach with organization exposed data from individual +and data breach with organization relates to the name of individual + or data breach with organization relates to an account individual had with organization + and data breach with organization relates to data required for access to the account of individual. \ No newline at end of file diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt new file mode 100644 index 000000000..a00dcfa8c --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt @@ -0,0 +1,5 @@ +*a data breach* with *a organization* results in harm to *a individual* +*a data breach* with *a organization* exposed data from *an individual* +*a data breach* with *a organization* relates to the name of *a individual* +*a data breach* with *a organization* relates to an account *a individual* had with *a organization* +*a data breach* with *a organization* relates to data required for access to the account of *a individual* \ No newline at end of file From 32cb2408677ce03764ea15d995e2afee3cfb8fd7 Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 22:47:58 +0800 Subject: [PATCH 30/49] indentation-databreach: forgot it should be kebab case --- ...ach_with_queries.le => indentation-databreach-with-queries.le} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/{indentation_databreach_with_queries.le => indentation-databreach-with-queries.le} (100%) diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation-databreach-with-queries.le similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation_databreach_with_queries.le rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation-databreach-with-queries.le From 7043cb73b3ecb8e6ec07813d09172f6c6b60b81f Mon Sep 17 00:00:00 2001 From: ymh Date: Thu, 10 Aug 2023 22:50:04 +0800 Subject: [PATCH 31/49] indentation-databreach: add putative Natural L4 input Co-authored-by: johsi-k --- .../indentation-databreach.csv | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv new file mode 100644 index 000000000..3b241264b --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv @@ -0,0 +1,8 @@ +GIVEN,data breach,,IS A,Data Breach,,,, +,organization,,IS A,Organization,,,, +,individual,,IS A,Person,,,, +DECIDE,data breach,with,organization,results in harm to,individual,,, +IF,data breach,with,organization,exposed data from,individual,,, +AND,data breach,with,organization,related to the name of,individual,,, +,OR,data breach,with,organization,relates to an account,individual,had with,organization +,,AND,data breach,with,organization,relates to data required for access to the account of,individual, \ No newline at end of file From 9ba46c2d08da6befc02456a550f7108e24104797 Mon Sep 17 00:00:00 2001 From: ymh Date: Fri, 11 Aug 2023 01:22:16 +0800 Subject: [PATCH 32/49] rejig test dir structure again -- just use the `nonlib*` pattern to denote rules/templates that don't include the lib-specific rules/templates Co-authored-by: johsi-k --- .../indentation-propn-databreach/indentation-databreach.csv | 0 .../rules.txt => indentation-propn-databreach/nonlib-rules.txt} | 0 .../nonlib-templates.txt} | 0 .../notes/indentation-databreach-with-queries.le | 0 .../rules.txt => simple-parentchild/nonlib-rules.txt} | 0 .../templates.txt => simple-parentchild/nonlib-templates.txt} | 0 .../simple-parentchild/notes/parentchild.pl | 0 .../simple-parentchild/parentchild-with-period.csv | 0 .../simple-parentchild/parentchild-without-period.csv | 0 .../{WithoutOurLELibs => }/simple-parentchild/parentchild.le | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/indentation-propn-databreach/indentation-databreach.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs/indentation-propn-databreach/rules.txt => indentation-propn-databreach/nonlib-rules.txt} (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs/indentation-propn-databreach/templates.txt => indentation-propn-databreach/nonlib-templates.txt} (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/indentation-propn-databreach/notes/indentation-databreach-with-queries.le (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs/simple-parentchild/rules.txt => simple-parentchild/nonlib-rules.txt} (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs/simple-parentchild/templates.txt => simple-parentchild/nonlib-templates.txt} (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/simple-parentchild/notes/parentchild.pl (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/simple-parentchild/parentchild-with-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/simple-parentchild/parentchild-without-period.csv (100%) rename lib/haskell/natural4/test/Testcases/LogicalEnglish/{WithoutOurLELibs => }/simple-parentchild/parentchild.le (100%) diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/indentation-databreach.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/indentation-databreach.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/indentation-databreach.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/nonlib-rules.txt similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/rules.txt rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/nonlib-rules.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/nonlib-templates.txt similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/templates.txt rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/nonlib-templates.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation-databreach-with-queries.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/notes/indentation-databreach-with-queries.le similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/indentation-propn-databreach/notes/indentation-databreach-with-queries.le rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/indentation-propn-databreach/notes/indentation-databreach-with-queries.le diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/nonlib-rules.txt similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/rules.txt rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/nonlib-rules.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/nonlib-templates.txt similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/templates.txt rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/nonlib-templates.txt diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/notes/parentchild.pl similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/notes/parentchild.pl rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/notes/parentchild.pl diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild-with-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-with-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild-with-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild-without-period.csv similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild-without-period.csv rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild-without-period.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild.le similarity index 100% rename from lib/haskell/natural4/test/Testcases/LogicalEnglish/WithoutOurLELibs/simple-parentchild/parentchild.le rename to lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-parentchild/parentchild.le From 3d93bad489a13e22a899cedfebc0eff445e284b5 Mon Sep 17 00:00:00 2001 From: Martin-Strecker Date: Wed, 9 Aug 2023 21:59:06 +0800 Subject: [PATCH 33/49] Started compiler to sCasp --- lib/haskell/natural4/app/Main.hs | 4 +- lib/haskell/natural4/src/LS/XPile/Prolog.hs | 85 +++++++++++++++++++-- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index 39e3ade22..59bdc66a8 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -58,7 +58,7 @@ import LS.XPile.Maude qualified as Maude import LS.XPile.NaturalLanguage (toNatLang) import LS.XPile.Org (toOrg) import LS.XPile.Petri (toPetri) -import LS.XPile.Prolog (sfl4ToProlog) +import LS.XPile.Prolog (rulesToProlog) import LS.XPile.Purescript (translate2PS) import LS.XPile.SVG qualified as AAS import LS.XPile.Typescript (asTypescript) @@ -173,7 +173,7 @@ main = do -- end of the section that deals with NLG - let (toprologFN, asProlog) = (workuuid <> "/" <> "prolog", show (sfl4ToProlog rules)) + let (toprologFN, asProlog) = (workuuid <> "/" <> "prolog", rulesToProlog rules) (topetriFN, (asPetri, asPetriErr)) = (workuuid <> "/" <> "petri", xpLog $ toPetri rules) (toaasvgFN, asaasvg) = (workuuid <> "/" <> "aasvg", AAS.asAAsvg defaultAAVConfig l4i rules) (tocorel4FN, (asCoreL4, asCoreL4Err)) = (workuuid <> "/" <> "corel4", xpLog (sfl4ToCorel4 rules)) diff --git a/lib/haskell/natural4/src/LS/XPile/Prolog.hs b/lib/haskell/natural4/src/LS/XPile/Prolog.hs index 958b46da9..d18ca748f 100644 --- a/lib/haskell/natural4/src/LS/XPile/Prolog.hs +++ b/lib/haskell/natural4/src/LS/XPile/Prolog.hs @@ -10,10 +10,12 @@ For more information see also `RelationalPredicates`. module LS.XPile.Prolog where -import AnyAll (BoolStruct (All, Any, Leaf, Not)) +import AnyAll (BoolStruct (All, Any, Leaf, Not), Dot (xPos)) import Data.List.NonEmpty as NE (NonEmpty (..), toList) import Data.Map qualified as Map import Data.Text qualified as Text +import Prettyprinter +import Prettyprinter.Render.Text (putDoc) import LS.Rule as SFL4 ( Rule (Hornlike, TypeDecl, clauses, enums, has, name, super), ) @@ -26,7 +28,7 @@ import LS.Types as SFL4 MTExpr (..), ParamText, ParamType (TList0, TList1, TOne, TOptional), - RPRel, + RPRel (RPeq), RelationalPredicate (..), TypeSig (..), mt2text, @@ -35,7 +37,72 @@ import LS.Types as SFL4 rel2txt, untypePT, ) -import Language.Prolog (Clause (Clause), Term (Struct), var) +import Language.Prolog (Clause (Clause), Term (Struct, Var, Wildcard, Cut), Atom, var) +import Data.Functor.Classes (showsBinary1) + +-- Document generation for Logic Programs +-- Currently supported: Prolog and SCasp + +data TranslationMode = Prolog | SCasp +class ShowLP x where + showLP :: TranslationMode -> x -> Doc ann + +instance ShowLP Clause where + -- showLP t c = pretty (show c) + showLP t (Clause lhs []) = + showLP t lhs <> pretty ("." :: Text.Text) + showLP t (Clause lhs rhs) = + showLP t lhs <> + pretty (":-" :: Text.Text) <> + nest 4 + ((vsep (punctuate comma (map (showLP t) rhs)) <> + pretty ("." :: Text.Text))) + showLP t c = pretty (show c) + +instance ShowLP Term where + {- + showLP SCasp trm@(Struct atom terms) = + parens (pretty ("Struct" :: Text.Text) <> pretty (show trm)) + showLP SCasp trm@(Var vn) = + parens (pretty ("Var" :: Text.Text) <> pretty (show trm)) + showLP SCasp trm@Wildcard = + parens (pretty ("WC" :: Text.Text) <> pretty (show trm)) + showLP SCasp trm@(Cut vn) = + parens (pretty ("Cut" :: Text.Text) <> pretty (show trm)) + -} + showLP SCasp trm@(Struct atom terms) = + if showLPIsSpecial atom + then showLPspecialSCasp atom terms + else pretty (show trm) + showLP t trm = pretty (show trm) + +showLPIsSpecial :: Atom -> Bool +showLPIsSpecial "IS" = True +showLPIsSpecial "<" = True +showLPIsSpecial "=<" = True +showLPIsSpecial "<=" = True +showLPIsSpecial ">" = True +showLPIsSpecial ">=" = True +showLPIsSpecial "=" = True +showLPIsSpecial "==" = True +showLPIsSpecial _ = False + + +showLPspecialSCasp :: Atom -> [Term] -> Doc ann +showLPspecialSCasp "IS" = showBinaryInfixSCasp "#=" +showLPspecialSCasp "<" = showBinaryInfixSCasp "#<" +showLPspecialSCasp "=<" = showBinaryInfixSCasp "#=<" +showLPspecialSCasp "<=" = showBinaryInfixSCasp "#=<" +showLPspecialSCasp ">" = showBinaryInfixSCasp "#>" +showLPspecialSCasp ">=" = showBinaryInfixSCasp "#>=" +showLPspecialSCasp "=" = showBinaryInfixSCasp "=" -- non arithmetic equality +showLPspecialSCasp "==" = showBinaryInfixSCasp "#=" + +showBinaryInfixSCasp :: Text.Text -> [Term] -> Doc ann +showBinaryInfixSCasp sym (trm1:trm2:trms) = + pretty (show trm1) <> + pretty (sym :: Text.Text) <> + pretty (show trm2) prologExamples :: [Clause] prologExamples = @@ -44,6 +111,9 @@ prologExamples = type Analysis = Map.Map Text.Text Text.Text +rulesToProlog :: [SFL4.Rule] -> String +rulesToProlog rs = show (vsep (map (showLP SCasp) (sfl4ToProlog rs))) + sfl4ToProlog :: [SFL4.Rule] -> [Clause] sfl4ToProlog rs = let @@ -99,7 +169,7 @@ showtype (SimpleType TList1 tt) = "nonEmptyList(" <> tt <> ")" showtype (InlineEnum pt tt) = showtype (SimpleType pt (inEnums (fmap mtexpr2text <$> untypePT tt))) inEnums :: NonEmpty (NonEmpty Text.Text) -> Text.Text -inEnums pt = "enums(" <> Text.unwords [ h | (h :| _) <- NE.toList pt ] <> ")" +inEnums pt = "enums(" <> Text.unwords [ h | (h :| _) <- NE.toList pt ] <> ")" -- we gonna need the same writer magic to append top-level output. -- in future, run clpEnums -- for now, just blurt it out @@ -167,8 +237,13 @@ rp2goal (RPBoolStructR lhs_ _rel bsr) = Struct (Text.unpack $ mt2text lhs_) <$> rp2goal (RPConstraint mt1 rel mt2) = pure $ Struct (rel2f rel) $ (varmt <$> mt1) ++ (varmt <$> mt2) rp2goal (RPnary rprel rps) = pure $ Struct (rel2f rprel) (concatMap rp2goal rps) +-- The equality token RPeq has three external appearances: =, ==, === +-- whose difference is not clear. +-- Here, they are mapped to =, so that the symbol can be used as +-- Prolog's "unifiable". TODO: a bad hack. rel2f :: RPRel -> String -rel2f = Text.unpack . rel2txt +rel2f RPeq = "=" +rel2f r = Text.unpack (rel2txt r) analyze :: [SFL4.Rule] -> Analysis analyze _rs = Map.fromList [("enumPrimaryKey", "1")] -- sorry, gonna have to read and show this all the time, slightly lame From bbb922dac4066bdfff99f668ec43756bceff91a7 Mon Sep 17 00:00:00 2001 From: Martin-Strecker Date: Wed, 9 Aug 2023 23:01:00 +0800 Subject: [PATCH 34/49] Generation of a separate scasp directory during transpilation. Some documentation. --- lib/haskell/natural4/app/Main.hs | 5 +- lib/haskell/natural4/src/LS/Lib.hs | 2 + lib/haskell/natural4/src/LS/Types.hs | 2 + lib/haskell/natural4/src/LS/XPile/Prolog.hs | 52 ++++++++++++++------- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index 59bdc66a8..2ea635c77 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -58,7 +58,7 @@ import LS.XPile.Maude qualified as Maude import LS.XPile.NaturalLanguage (toNatLang) import LS.XPile.Org (toOrg) import LS.XPile.Petri (toPetri) -import LS.XPile.Prolog (rulesToProlog) +import LS.XPile.Prolog (rulesToProlog, rulesToSCasp) import LS.XPile.Purescript (translate2PS) import LS.XPile.SVG qualified as AAS import LS.XPile.Typescript (asTypescript) @@ -174,6 +174,7 @@ main = do -- end of the section that deals with NLG let (toprologFN, asProlog) = (workuuid <> "/" <> "prolog", rulesToProlog rules) + (toscaspFN, asSCasp) = (workuuid <> "/" <> "scasp", rulesToSCasp rules) (topetriFN, (asPetri, asPetriErr)) = (workuuid <> "/" <> "petri", xpLog $ toPetri rules) (toaasvgFN, asaasvg) = (workuuid <> "/" <> "aasvg", AAS.asAAsvg defaultAAVConfig l4i rules) (tocorel4FN, (asCoreL4, asCoreL4Err)) = (workuuid <> "/" <> "corel4", xpLog (sfl4ToCorel4 rules)) @@ -291,6 +292,7 @@ main = do (concatMap snd toWriteVue) when (SFL4.toprolog opts) $ mywritefile True toprologFN iso8601 "pl" asProlog + when (SFL4.toscasp opts) $ mywritefile True toscaspFN iso8601 "pl" asSCasp when (SFL4.topetri opts) $ mywritefile2 True topetriFN iso8601 "dot" (commentIfError "//" asPetri) asPetriErr when (SFL4.tots opts) $ mywritefile2 True totsFN iso8601 "ts" (show asTSpretty) asTSerr when (SFL4.tonl opts) $ mywritefile True toNL_FN iso8601 "txt" asNatLang @@ -339,6 +341,7 @@ main = do pPrint $ groundrules rc rules when (SFL4.toProlog rc) $ pPrint asProlog + when (SFL4.toSCasp rc) $ pPrint asSCasp when (SFL4.only opts == "" && SFL4.workdir opts == "") $ pPrint rules when (SFL4.only opts == "native") $ pPrint rules diff --git a/lib/haskell/natural4/src/LS/Lib.hs b/lib/haskell/natural4/src/LS/Lib.hs index b975acfff..c5b5422f1 100644 --- a/lib/haskell/natural4/src/LS/Lib.hs +++ b/lib/haskell/natural4/src/LS/Lib.hs @@ -87,6 +87,7 @@ data Opts w = Opts { demo :: w ::: Bool "False" , workdir :: w ::: String "" "workdir to save all the output files to" , uuiddir :: w ::: String "no-uuid" "uuid prefix to follow the workdir" , toprolog :: w ::: Bool "True" "prolog-like syntax representing the predicate logic" + , toscasp :: w ::: Bool "True" "sCasp-like syntax representing the predicate logic" , tonative :: w ::: Bool "True" "native Haskell data structure of the AST" , topetri :: w ::: Bool "True" "a petri-net Dot file of the state graph" , toaasvg :: w ::: Bool "True" "an anyall SVG of the decision trees" @@ -157,6 +158,7 @@ getConfig o = do , toBabyL4 = only o == "babyl4" || only o == "corel4" , toASP = only o == "asp" , toProlog = only o == "prolog" + , toSCasp = only o == "scasp" , toUppaal = only o == "uppaal" , toGrounds = only o == "grounds" , toChecklist = only o == "checklist" diff --git a/lib/haskell/natural4/src/LS/Types.hs b/lib/haskell/natural4/src/LS/Types.hs index ede294442..a3c553f1f 100644 --- a/lib/haskell/natural4/src/LS/Types.hs +++ b/lib/haskell/natural4/src/LS/Types.hs @@ -607,6 +607,7 @@ data RunConfig = RC { debug :: Bool , toBabyL4 :: Bool , toASP :: Bool , toProlog :: Bool + , toSCasp :: Bool , toUppaal :: Bool , toHTML :: Bool , saveAKA :: Bool @@ -632,6 +633,7 @@ defaultRC = RC , toBabyL4 = False , toASP = False , toProlog = False + , toSCasp = False , toUppaal = False , saveAKA = False , wantNotRules = False diff --git a/lib/haskell/natural4/src/LS/XPile/Prolog.hs b/lib/haskell/natural4/src/LS/XPile/Prolog.hs index d18ca748f..d62889b01 100644 --- a/lib/haskell/natural4/src/LS/XPile/Prolog.hs +++ b/lib/haskell/natural4/src/LS/XPile/Prolog.hs @@ -8,6 +8,27 @@ to Prolog. For more information see also `RelationalPredicates`. -} +{-| +TODO: Move the following into a README once the transpiler toolchain +is operational. + +The transpiler comes in two versions: for Prolog and for sCasp. +For a generation of valid sCasp to work, some very strong assumptions +about Spreadsheet / csv files have been made, and if these +are not respected, the compiler produces garbage without mercy and warnings: +* Each argument of a predicate has to be written in a separate CSV cell, + and so has the predicate itself +* However, arguments can be composite, e.g. function and arguments. +* Also comparison operators have to be written in a separate cell. +For available comparison operators, see function showLPspecialSCasp +* Assignment of a numerical value to a variable has to be written with IS: + var IS val which is rendered as var #= val in sCasp +* Equating two terms (triggerin unification in sCasp / Prolog) has to be written = . + Attention, in a spreadsheet, the symbol = has to be preceeded by a simple quote to be accepted. + term1 = term2 is rendered as term1 = term2 in sCasp + The tokens == and === are synonymes of = and are also rendered as term1 = term2 in sCasp +-} + module LS.XPile.Prolog where import AnyAll (BoolStruct (All, Any, Leaf, Not), Dot (xPos)) @@ -39,6 +60,8 @@ import LS.Types as SFL4 ) import Language.Prolog (Clause (Clause), Term (Struct, Var, Wildcard, Cut), Atom, var) import Data.Functor.Classes (showsBinary1) +import qualified Data.Bits as sCasp + -- Document generation for Logic Programs -- Currently supported: Prolog and SCasp @@ -55,24 +78,14 @@ instance ShowLP Clause where showLP t lhs <> pretty (":-" :: Text.Text) <> nest 4 - ((vsep (punctuate comma (map (showLP t) rhs)) <> - pretty ("." :: Text.Text))) + (vsep (punctuate comma (map (showLP t) rhs)) <> + pretty ("." :: Text.Text)) showLP t c = pretty (show c) instance ShowLP Term where - {- - showLP SCasp trm@(Struct atom terms) = - parens (pretty ("Struct" :: Text.Text) <> pretty (show trm)) - showLP SCasp trm@(Var vn) = - parens (pretty ("Var" :: Text.Text) <> pretty (show trm)) - showLP SCasp trm@Wildcard = - parens (pretty ("WC" :: Text.Text) <> pretty (show trm)) - showLP SCasp trm@(Cut vn) = - parens (pretty ("Cut" :: Text.Text) <> pretty (show trm)) - -} showLP SCasp trm@(Struct atom terms) = if showLPIsSpecial atom - then showLPspecialSCasp atom terms + then showLPspecialSCasp atom terms else pretty (show trm) showLP t trm = pretty (show trm) @@ -112,15 +125,22 @@ prologExamples = type Analysis = Map.Map Text.Text Text.Text rulesToProlog :: [SFL4.Rule] -> String -rulesToProlog rs = show (vsep (map (showLP SCasp) (sfl4ToProlog rs))) +rulesToProlog rs = show (vsep (map (showLP Prolog) (sfl4ToLogProg rs))) + +rulesToSCasp :: [SFL4.Rule] -> String +rulesToSCasp rs = show (vsep (map (showLP SCasp) (sfl4ToLogProg rs))) -sfl4ToProlog :: [SFL4.Rule] -> [Clause] -sfl4ToProlog rs = +-- Translation of rules to generic logic programming clauses +sfl4ToLogProg :: [SFL4.Rule] -> [Clause] +sfl4ToLogProg rs = let analysis = analyze rs :: Analysis in concatMap (rule2clause analysis) rs +-- TODO: not clear what the "Analysis" is good for. +-- The corresponding parameter seems to be ignored in all called functions. +-- Also see the comment in the "analyze" function further below. rule2clause :: Analysis -> SFL4.Rule -> [Clause] rule2clause st cr@Hornlike {} = hornlike2clauses st (mt2text $ name cr) (clauses cr) rule2clause st td@TypeDecl { enums = Just ens } = clpEnums st (mt2text $ name td) ens From 8a2c56c880ea3a592996ef375bc36a20fa765722 Mon Sep 17 00:00:00 2001 From: Martin-Strecker Date: Fri, 11 Aug 2023 14:53:57 +0800 Subject: [PATCH 35/49] removed an unmotivated import (introduced by vscode?) --- lib/haskell/natural4/src/LS/XPile/Prolog.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/haskell/natural4/src/LS/XPile/Prolog.hs b/lib/haskell/natural4/src/LS/XPile/Prolog.hs index d62889b01..7e89d7b0d 100644 --- a/lib/haskell/natural4/src/LS/XPile/Prolog.hs +++ b/lib/haskell/natural4/src/LS/XPile/Prolog.hs @@ -60,7 +60,6 @@ import LS.Types as SFL4 ) import Language.Prolog (Clause (Clause), Term (Struct, Var, Wildcard, Cut), Atom, var) import Data.Functor.Classes (showsBinary1) -import qualified Data.Bits as sCasp -- Document generation for Logic Programs From 00a9778f59c2a69fc0516e20384d100a1ebb7a23 Mon Sep 17 00:00:00 2001 From: johsi-k Date: Sun, 13 Aug 2023 16:54:26 +0800 Subject: [PATCH 36/49] add test case for product --- .../LogicalEnglish/product-twiceof/nonlib-rules.txt | 3 +++ .../product-twiceof/nonlib-templates.txt | 1 + .../LogicalEnglish/product-twiceof/notes/product.pl | 11 +++++++++++ .../LogicalEnglish/product-twiceof/product.csv | 7 +++++++ .../LogicalEnglish/product-twiceof/product.le | 12 ++++++++++++ 5 files changed, 34 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-rules.txt create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-templates.txt create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/notes/product.pl create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.csv create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.le diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-rules.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-rules.txt new file mode 100644 index 000000000..a49f860b7 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-rules.txt @@ -0,0 +1,3 @@ +a x is twice of a y +if y is between 0 & 100 +and x is the product of [y, 2]. diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-templates.txt b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-templates.txt new file mode 100644 index 000000000..7e2a06db5 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/nonlib-templates.txt @@ -0,0 +1 @@ +*a x* is twice of *a y* diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/notes/product.pl b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/notes/product.pl new file mode 100644 index 000000000..9eee1f35f --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/notes/product.pl @@ -0,0 +1,11 @@ +:-module('product-prolog', []). +source_lang(en). +local_dict([is_twice_of, A, B], [x-x, y-y], [A, is, twice, of, B]). +local_meta_dict([],[],[]). +prolog_le(verified). +is_twice_of(A, B) :- + between(0, 100, B), + product_list([B, 2], A). +example(null, []). +query(null, true). +query(q, is_twice_of(_, _)). diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.csv new file mode 100644 index 000000000..125b588d3 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.csv @@ -0,0 +1,7 @@ +GIVEN,x,IS A,Number, +,y,IS A,Number, +DECIDE,x,is twice of,y, +IF,y,>=,0, +AND,y,<=,100, +AND,x,IS,PRODUCT,y +,,,,2 diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.le new file mode 100644 index 000000000..e96d8a880 --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/product-twiceof/product.le @@ -0,0 +1,12 @@ +the target language is: prolog. + +the templates are: + *a x* is twice of *a y*. + +the knowledge base encoding includes: + a x is twice of a y + if y is between 0 & 100 + and x is the product of [y, 2]. + +query q is: + which number is twice of which other number. From d281258086d60918937e497babad3d3892ac074e Mon Sep 17 00:00:00 2001 From: johsi-k Date: Sun, 13 Aug 2023 18:07:14 +0800 Subject: [PATCH 37/49] add test case for rpnary AND --- .../test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv new file mode 100644 index 000000000..39f506f9d --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv @@ -0,0 +1,3 @@ +DECIDE,BoolOne rpnary syntax,IS,&&,fact 1 +,,,,fact 2 +,,,,fact 3 From eb42b05b329a81ce67271d92737da4c97c0949a3 Mon Sep 17 00:00:00 2001 From: ymh Date: Sun, 13 Aug 2023 18:47:56 +0800 Subject: [PATCH 38/49] feat: simple utils / convenience functions to facilitate development at the REPL --- lib/haskell/natural4/package.yaml | 4 + lib/haskell/natural4/src/LS/UtilsREPLDev.hs | 91 +++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 lib/haskell/natural4/src/LS/UtilsREPLDev.hs diff --git a/lib/haskell/natural4/package.yaml b/lib/haskell/natural4/package.yaml index 7c4495967..c3bdd8f1d 100644 --- a/lib/haskell/natural4/package.yaml +++ b/lib/haskell/natural4/package.yaml @@ -89,6 +89,10 @@ executables: - '"-with-rtsopts=-N -H500M -qg"' dependencies: - natural4 + - filepath + - filemanip +# the file stuff is for the interactive repl utils +# it's a bit misleading to list them as dependnecies of the executable, but there doesn't seem to be any real alternative if we're using stack, at least according to discord tests: natural4-test: diff --git a/lib/haskell/natural4/src/LS/UtilsREPLDev.hs b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs new file mode 100644 index 000000000..5be410cab --- /dev/null +++ b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs @@ -0,0 +1,91 @@ +{-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE LambdaCase #-} + +{-| +Simple utils / convenience functions for prototyping / dev-ing at the REPL. +-} + + +module LS.UtilsREPLDev + ( filesInDirWithExtn, + findFileByNameInDir, + csvsInDir, + l4csv2rules, + leTestcasesDir, + leTestCSVs + ) +where + +import Flow ((|>)) +import Data.Maybe (fromMaybe, listToMaybe) + +import System.FilePath (()) +import System.FilePath.Find + ( always, + fileName, + find, + (==?), + extension + ) + +import LS qualified +import LS.Lib (NoLabel (..), Opts (..)) +import LS.Utils ((|$>)) + + +-- Getting file paths + +type FileExtn = String +type BaseFileName = String +type StartDir = String + +filesInDirWithExtn :: FileExtn -> StartDir -> IO [FilePath] +filesInDirWithExtn fextn = find always (extension ==? fextn) + +csvsInDir :: StartDir -> IO [FilePath] +csvsInDir = filesInDirWithExtn ".csv" + +{-| +==== __Examples__ +>>> findFileByNameInDir leTestcasesDir "indentation-databreach.csv" +Just "test/Testcases/LogicalEnglish/indentation-propn-databreach/indentation-databreach.csv" +-} +findFileByNameInDir :: StartDir -> BaseFileName -> IO (Maybe FilePath) +findFileByNameInDir startdir basefnm = + startdir + |> find always (fileName ==? basefnm) + |$> listToMaybe + + +-- Getting rules from L4 CSVs +--- TODO: Would be convenient to also have a function that allows you to match just on a part of the base filename + +{-| +Util function for getting rules from a L4 CSV filepath +Meant to be for interactive use at the REPL by a dev, and not for production apps +==== __Examples__ +>>> l4csv2rules "test/Testcases/LogicalEnglish/" "indentation-databreach.csv" +-} +l4csv2rules :: StartDir -> BaseFileName -> IO [LS.Rule] +l4csv2rules startdir csvFpath = + findFileByNameInDir startdir csvFpath >>= + \case + Nothing -> error "Can't find file" + -- remember, this is meant to be for internal use by a developer in the REPL + Just file -> LS.dumpRules + Opts + { file = NoLabel [file], + dbug = False, + dstream = False + } + + +------- TODO: LE-specific things; to be moved into a better place when I have more time +-- | Convenient, tho not the best practice to put this in this module +leTestcasesDir :: FilePath +leTestcasesDir = "test" "Testcases" "LogicalEnglish" + +-- | Returns a list of csvs in the LE subdir of test/Testcases +leTestCSVs :: IO [FilePath] +leTestCSVs = csvsInDir leTestcasesDir \ No newline at end of file From 4dea73ef1ea2d0a7dac5141d721e6e7f8f474349 Mon Sep 17 00:00:00 2001 From: ymh Date: Sun, 13 Aug 2023 18:50:39 +0800 Subject: [PATCH 39/49] utils for deving at repl: include comment to credit source --- lib/haskell/natural4/src/LS/UtilsREPLDev.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/haskell/natural4/src/LS/UtilsREPLDev.hs b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs index 5be410cab..a80ee30ea 100644 --- a/lib/haskell/natural4/src/LS/UtilsREPLDev.hs +++ b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs @@ -64,6 +64,7 @@ findFileByNameInDir startdir basefnm = {-| Util function for getting rules from a L4 CSV filepath Meant to be for interactive use at the REPL by a dev, and not for production apps +Adapted from Joe's code for testing LP Programs ==== __Examples__ >>> l4csv2rules "test/Testcases/LogicalEnglish/" "indentation-databreach.csv" -} From 42f6b6ac25fd27264dba1b316820fa3b00bd8e78 Mon Sep 17 00:00:00 2001 From: ymh Date: Sun, 13 Aug 2023 19:04:49 +0800 Subject: [PATCH 40/49] fix package.yaml --- lib/haskell/natural4/package.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/haskell/natural4/package.yaml b/lib/haskell/natural4/package.yaml index c3bdd8f1d..4d4bf1adb 100644 --- a/lib/haskell/natural4/package.yaml +++ b/lib/haskell/natural4/package.yaml @@ -78,6 +78,11 @@ ghc-options: -Wdefault -Wno-missed-extra-shared-lib -fconstraint-solver-iteratio library: source-dirs: src + dependencies: + - filepath + - filemanip +# the file stuff is for the interactive repl utils +# it's a bit misleading to list them as dependencies of the lib, but there doesn't seem to be any real alternative if we're using stack, at least according to discord executables: natural4-exe: @@ -89,10 +94,6 @@ executables: - '"-with-rtsopts=-N -H500M -qg"' dependencies: - natural4 - - filepath - - filemanip -# the file stuff is for the interactive repl utils -# it's a bit misleading to list them as dependnecies of the executable, but there doesn't seem to be any real alternative if we're using stack, at least according to discord tests: natural4-test: From 7cd196ee2ca0a253c529a56c52b91974a30d0813 Mon Sep 17 00:00:00 2001 From: ymh Date: Sun, 13 Aug 2023 19:05:03 +0800 Subject: [PATCH 41/49] add one more convenience function for pretty printing the rules --- lib/haskell/natural4/src/LS/UtilsREPLDev.hs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/haskell/natural4/src/LS/UtilsREPLDev.hs b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs index a80ee30ea..0f3d7815b 100644 --- a/lib/haskell/natural4/src/LS/UtilsREPLDev.hs +++ b/lib/haskell/natural4/src/LS/UtilsREPLDev.hs @@ -28,6 +28,7 @@ import System.FilePath.Find (==?), extension ) +import Text.Pretty.Simple ( pShowNoColor, pPrint ) import LS qualified import LS.Lib (NoLabel (..), Opts (..)) @@ -62,8 +63,8 @@ findFileByNameInDir startdir basefnm = --- TODO: Would be convenient to also have a function that allows you to match just on a part of the base filename {-| -Util function for getting rules from a L4 CSV filepath -Meant to be for interactive use at the REPL by a dev, and not for production apps +Util function for getting raw rules from a L4 CSV filepath +Not meant for production apps! Adapted from Joe's code for testing LP Programs ==== __Examples__ >>> l4csv2rules "test/Testcases/LogicalEnglish/" "indentation-databreach.csv" @@ -81,6 +82,14 @@ l4csv2rules startdir csvFpath = dstream = False } +{-| +Util function for __pretty printing (in color)__ raw rules from a L4 CSV filepath +==== __Examples__ +>>> pRules "test/Testcases/LogicalEnglish/" "indentation-databreach.csv" +-} +pRules :: StartDir -> BaseFileName -> IO () +pRules startdir csvFpath = l4csv2rules startdir csvFpath >>= pPrint + ------- TODO: LE-specific things; to be moved into a better place when I have more time -- | Convenient, tho not the best practice to put this in this module From 1184ac66b56b2fb2a772dcdcdd21c29271322576 Mon Sep 17 00:00:00 2001 From: johsi-k Date: Sun, 13 Aug 2023 22:43:04 +0800 Subject: [PATCH 42/49] modify not test case to include GIVEN --- .../test/Testcases/LogicalEnglish/and-not/and-not.csv | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/and-not/and-not.csv diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/and-not/and-not.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/and-not/and-not.csv new file mode 100644 index 000000000..275a1c75b --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/and-not/and-not.csv @@ -0,0 +1,5 @@ +GIVEN,x,IS A,Animal +,aquatic animal,IS A,Aquatic animal +DECIDE,x,is an,aquatic animal +IF,,x,lives in water +AND,NOT,x,lives on land From 669c6b700277b6262747e0757d5bee7c5efb4797 Mon Sep 17 00:00:00 2001 From: johsi-k Date: Sun, 13 Aug 2023 23:57:11 +0800 Subject: [PATCH 43/49] modify rpnary-and to include GIVEN --- .../Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv b/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv index 39f506f9d..b58ca5fde 100644 --- a/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/rpnary-and/rpnary-and.csv @@ -1,3 +1,4 @@ -DECIDE,BoolOne rpnary syntax,IS,&&,fact 1 -,,,,fact 2 -,,,,fact 3 +GIVEN,x,IS A,Fluorescent Lamp, +DECIDE,x,IS,&&,low-pressure +,,,,mercury-vapor +,,,,gas-discharge From 4d81aff20e66ccce2c13e94385b28b98d571f2cc Mon Sep 17 00:00:00 2001 From: ymh Date: Sun, 13 Aug 2023 22:46:22 +0800 Subject: [PATCH 44/49] add simple sum le example; will add corresponding L4 when have more time --- .../simple-sum/notes/simple-sum.le | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-sum/notes/simple-sum.le diff --git a/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-sum/notes/simple-sum.le b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-sum/notes/simple-sum.le new file mode 100644 index 000000000..59f1c976c --- /dev/null +++ b/lib/haskell/natural4/test/Testcases/LogicalEnglish/simple-sum/notes/simple-sum.le @@ -0,0 +1,31 @@ +the target language is: prolog. + +the templates are: + *a number* is the sum of *a list*, + the additional savings is *a number*, + the total savings is *a z*, + the initial savings is *a x*, + the additional savings is *a y*. + + +the knowledge base includes: + + % Arithmetic predicates required for sum example + a number is the sum of a list + if number is the sum of each X such that + X is in list. + + the total savings is a z + if the initial savings is a x + and the additional savings is a y + and z is the sum of [x, y]. + +scenario simple is: + the initial savings is 1000. + the additional savings is 337. + +%query q is: +% 0 < 1. + +query totalsavings is: + the total savings is which value. \ No newline at end of file From bb36a4a3dea2572f56ce730a4511a93afd228df8 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Thu, 17 Aug 2023 01:56:03 +0800 Subject: [PATCH 45/49] lol, forgot to add the actual dataflow module --- lib/haskell/natural4/src/LS/DataFlow.hs | 137 ++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 lib/haskell/natural4/src/LS/DataFlow.hs diff --git a/lib/haskell/natural4/src/LS/DataFlow.hs b/lib/haskell/natural4/src/LS/DataFlow.hs new file mode 100644 index 000000000..a38968d9f --- /dev/null +++ b/lib/haskell/natural4/src/LS/DataFlow.hs @@ -0,0 +1,137 @@ +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +{-| transpiler to show dataflow for both arithmetic and boolean logic -} + +module LS.DataFlow where + +import LS.XPile.Logging +import LS +import LS.Interpreter +import LS.Rule +import Data.Text qualified as Text +import Flow ((.>), (|>)) + +import qualified Data.Map as Map -- if you want to upgrade this to Hashmap, go ahead + +-- fgl +import Data.Graph.Inductive.Graph +import Data.Graph.Inductive.PatriciaTree (Gr) + +-- graphviz +import Data.GraphViz + ( shape, + graphToDot, + Shape(Circle), + GraphID(Str), + NodeCluster(N, C), + GlobalAttributes(NodeAttrs, GraphAttrs), + GraphvizParams(..), + PrintDot (unqtDot), + DotGraph, + toLabel, + ) +import Data.Text.Lazy qualified as LT +import Data.GraphViz.Printing (renderDot) +import Data.GraphViz.Attributes.Complete + +-- * Conceptually, a FlowNode is either a rule or a leaf/ground term referenced by a rule. +-- +-- Suppose the top-level rule is: +-- +-- @DECIDE happy IF warm AND sunny@ +-- +-- The top-level node corresponds to "happy". And there are two dependencies: @warm@ and @sunny@. +-- +-- Let's say @warm@ is a ground term: we have no further information +-- about @warm@. We need a human to provide a valuation of that fact. +-- In our graph it is a leaf node. +-- +-- Let's say @sunny@ is itself a rule: @sunny IF daytime AND NOT cloudy@. +-- +-- And it bottoms out there: both @daytime@ and @cloudy@ are ground terms. +-- +-- So our dataflow graph has: +-- +-- @ +-- warm -> happy +-- sunny -> happy +-- daytime -> sunny +-- cloudy -> sunny +-- @ +-- +-- Note that we are throwing away the logic -- we have lost the "NOT" on the "cloudy". +-- +-- The same idea applies to arithmetic rules: we might have @DECIDE happiness IS baselineHappiness + situationalHappiness@, where the terms are numeric-typed; the same shape of graph obtains. +-- +-- Our task is to return that graph. +-- +-- We get most of it out of the Interpreter, with the original Rules preserved, so we work with that. + +-- | This is the top-level entry point for this file; we produce a dotfile and rely on other elements of the L4 runtime to produce SVG from the Dot. +dataFlowAsDot :: Interpreted -> XPileLog String +dataFlowAsDot l4i = do + -- https://hackage.haskell.org/package/fgl-5.8.1.1/docs/Data-Graph-Inductive-Graph.html#v:mkGraph + let dfg :: RuleGraph + dfg = ruleGraph l4i + + let dot :: DotGraph Node + dot = graphToDot flowParams dfg + + -- if you look at Petri.hs you will see its graph construction delves deep into the logical relationship between rules. + -- That code was written before we had the Intepreter available to analyze rules for us. + -- So, we grab one tree of rules at a time from the RuleGraph provided by the interpreter, and dump those; + -- then we dump the ground term leaves in those rules. + + let rG = ruleGraph l4i + mutterd 2 "dataFlowasDot: retrieving ruleGraph" + mutterdhsf 3 "dataFlowasDot: first, let's dump the rulegraph" pShowNoColorS rG + + mutterd 3 "dataFlowasDot: heeere's ruleGraphErr" + mutters (ruleGraphErr l4i) + + let toreturn = ( dfg + |> graphToDot flowParams + |> unqtDot + |> renderDot + |> LT.toStrict + |> Text.unpack + ) + + mutterdhsf 3 "and now we should get some dot goodness" pShowNoColorS toreturn + return toreturn + + + where + ruleNodes = Map.fromList ( zip [1..] [ [MTT "pretend rule R1" ] -- 1 + , [MTT "pretend rule R2" ] -- 2 + ] ) + leafNodes = Map.fromList ( zip [1..] [ [MTT "pretend leaf L1" ] -- 1 + , [MTT "pretend leaf L2" ] -- 2 + , [MTT "pretend leaf L3" ] -- 3 + , [MTT "pretend leaf L4" ] -- 4 + ] ) + ruleEdges = [ (1, 1, ()), + (1, 2, ()), + (2, 3, ()), + (2, 4, ()) ] + + -- see Petri.hs for a more complex example of styling the graphviz output + flowParams :: GraphvizParams Int Rule () Int Rule + flowParams = Params + { isDirected = True + , globalAttributes = [GraphAttrs [Compound True]] + , clusterBy = C 1 . N -- in future we may want to partition all leaf nodes into a separate cluster to better identify them + , isDotCluster = const False + , clusterID = const (Str "clusterId") + , fmtCluster = const [NodeAttrs [ shape Circle ] ] + , fmtNode = fmtRuleNode + , fmtEdge = const [] + } + +fmtRuleNode :: (Node, Rule) -> [Attribute] +fmtRuleNode (_n, r) = pure $ toLabel $ mt2text $ name r + + + From fdc12e42b682e2dbbefba2deea653affad3f236c Mon Sep 17 00:00:00 2001 From: Martin-Strecker Date: Wed, 9 Aug 2023 23:01:00 +0800 Subject: [PATCH 46/49] Generation of a separate scasp directory during transpilation. Some documentation. --- lib/haskell/natural4/app/Main.hs | 2 ++ lib/haskell/natural4/src/LS/XPile/Prolog.hs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/haskell/natural4/app/Main.hs b/lib/haskell/natural4/app/Main.hs index 2ea635c77..07fbea11c 100644 --- a/lib/haskell/natural4/app/Main.hs +++ b/lib/haskell/natural4/app/Main.hs @@ -343,6 +343,8 @@ main = do when (SFL4.toProlog rc) $ pPrint asProlog when (SFL4.toSCasp rc) $ pPrint asSCasp + when (SFL4.toTS rc) $ print $ asTypescript rules + when (SFL4.only opts == "" && SFL4.workdir opts == "") $ pPrint rules when (SFL4.only opts == "native") $ pPrint rules when (SFL4.only opts == "classes") $ pPrint (SFL4.classtable l4i) diff --git a/lib/haskell/natural4/src/LS/XPile/Prolog.hs b/lib/haskell/natural4/src/LS/XPile/Prolog.hs index 7e89d7b0d..97fc2aec4 100644 --- a/lib/haskell/natural4/src/LS/XPile/Prolog.hs +++ b/lib/haskell/natural4/src/LS/XPile/Prolog.hs @@ -60,6 +60,8 @@ import LS.Types as SFL4 ) import Language.Prolog (Clause (Clause), Term (Struct, Var, Wildcard, Cut), Atom, var) import Data.Functor.Classes (showsBinary1) +import qualified Data.Bits as sCasp + -- Document generation for Logic Programs From b33f7a66a1b950d1aa85a7b317961f7343f12158 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Thu, 17 Aug 2023 17:15:20 +0800 Subject: [PATCH 47/49] clarify MIN MAX for RPnary vs < > RPlt RPgt --- lib/haskell/natural4/src/LS/BasicTypes.hs | 8 +++++--- lib/haskell/natural4/src/LS/Interpreter.hs | 12 ++++++++++++ lib/haskell/natural4/src/LS/RelationalPredicates.hs | 2 ++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/haskell/natural4/src/LS/BasicTypes.hs b/lib/haskell/natural4/src/LS/BasicTypes.hs index a07b8554c..b9c86a150 100644 --- a/lib/haskell/natural4/src/LS/BasicTypes.hs +++ b/lib/haskell/natural4/src/LS/BasicTypes.hs @@ -80,7 +80,7 @@ data MyToken = Every | Party | TokAll | Empty | EOL | RuleMarker Int Text.Text | Expect | ScenarioTok - | TokLT | TokLTE | TokGT | TokGTE | TokIn | TokNotIn | TokEQ | TokAnd | TokOr | TokSum | TokProduct + | TokLT | TokLTE | TokGT | TokGTE | TokIn | TokNotIn | TokEQ | TokAnd | TokOr | TokSum | TokProduct | TokMin | TokMax | Notwithstanding | Despite | SubjectTo | Otherwise | SOF | EOF @@ -243,11 +243,11 @@ toToken "§§§§§§" = pure $ RuleMarker 6 "§" toToken "SCENARIO" = pure ScenarioTok toToken "EXPECT" = pure Expect toToken "<" = pure TokLT -toToken "MIN" = pure TokLT; toToken "MIN OF" = pure TokLT +toToken "MIN" = pure TokMin; toToken "MIN OF" = pure TokMin toToken "=<" = pure TokLTE toToken "<=" = pure TokLTE toToken ">" = pure TokGT -toToken "MAX" = pure TokGT; toToken "MAX OF" = pure TokGT +toToken "MAX" = pure TokMax; toToken "MAX OF" = pure TokMax toToken ">=" = pure TokGTE toToken "=" = pure TokEQ toToken "&&" = pure TokAnd @@ -416,6 +416,8 @@ renderToken (RuleMarker n txt) = concat $ replicate n (Text.unpack txt) renderToken Semicolon = ";;" renderToken SubjectTo = "SUBJECT TO" +renderToken TokMin = "MIN" +renderToken TokMax = "MAX" renderToken TokSum = "SUM" renderToken TokProduct = "PRODUCT" renderToken FMap = "MAP" diff --git a/lib/haskell/natural4/src/LS/Interpreter.hs b/lib/haskell/natural4/src/LS/Interpreter.hs index 26419592c..6f9d8a907 100644 --- a/lib/haskell/natural4/src/LS/Interpreter.hs +++ b/lib/haskell/natural4/src/LS/Interpreter.hs @@ -326,6 +326,18 @@ getAttrTypesIn ct classname = ] +-- | structure the rules as a graph. +-- in the simple case, the graph is one or more trees, each rooted at a "top-level" rule which is not "used" by any another rule. + +-- if we walk the roots, we will sooner or later encounter all the decision elements relevant to each root. +-- in a less simple case, the graph is cyclic! everything depends on everything else! but we can recognize that as an error condition. +-- +-- note that a regulative rule R1 HENCE R2 is recorded as a single rule, even if we think of the R2 as a separate rule +-- perhaps we should have a notion of anonymous rules, that are internally labelled and structured, so R2 is equal to R1 in the graph. + +type RuleGraphEdgeLabel = () +type RuleGraph = Gr Rule RuleGraphEdgeLabel + -- | used by `ruleDecisionGraph`; a map from a rule to a unique integer identifier for that rule, used in the `RuleGraph` type RuleIDMap = Map.HashMap Rule Int diff --git a/lib/haskell/natural4/src/LS/RelationalPredicates.hs b/lib/haskell/natural4/src/LS/RelationalPredicates.hs index 86674b4a3..1ee4bb320 100644 --- a/lib/haskell/natural4/src/LS/RelationalPredicates.hs +++ b/lib/haskell/natural4/src/LS/RelationalPredicates.hs @@ -238,6 +238,8 @@ tok2rel = choice , RPor <$ pToken TokOr , RPsum <$ pToken TokSum , RPproduct <$ pToken TokProduct + , RPmin <$ pToken TokMin + , RPmax <$ pToken TokMax , RPlt <$ pToken TokLT -- serves double duty as MinOflist when in RPnary position , RPlte <$ pToken TokLTE , RPgt <$ pToken TokGT -- serves double duty as MaxOflist when in RPnary position From 65890a6df18e85f791e50da98e8100d2d921fb4e Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Mon, 21 Aug 2023 17:08:51 +0800 Subject: [PATCH 48/49] finish clarifying MIN MAX vs < > next, add tests --- lib/haskell/natural4/src/LS/Types.hs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/haskell/natural4/src/LS/Types.hs b/lib/haskell/natural4/src/LS/Types.hs index a3c553f1f..995ee0eeb 100644 --- a/lib/haskell/natural4/src/LS/Types.hs +++ b/lib/haskell/natural4/src/LS/Types.hs @@ -51,6 +51,7 @@ type BoolStructR = AA.OptionallyLabeledBoolStruct RelationalPredicate -- | the relations in a RelationalPredicate data RPRel = RPis | RPhas | RPeq | RPlt | RPlte | RPgt | RPgte | RPelem | RPnotElem | RPnot | RPand | RPor | RPsum | RPproduct | RPsubjectTo + | RPmin | RPmax | RPmap | RPTC TComparison -- ^ temporal constraint as part of a relational predicate; note there is a separate `TemporalConstraint` type. deriving (Eq, Ord, Show, Generic, ToJSON) @@ -276,6 +277,7 @@ mkRpmt a = RPMT (MTT <$> a) mkRpmtLeaf :: [Text.Text] -> BoolStructR mkRpmtLeaf a = mkLeaf (mkRpmt a) +-- | [TODO] figure out why there are two very similar functions, this and `rel2op` rel2txt :: RPRel -> Text.Text rel2txt RPis = "IS" rel2txt RPhas = "HAS" -- "relHas" @@ -290,6 +292,8 @@ rel2txt RPnot = "NOT" -- "relNot" rel2txt RPand = "&&" -- "relAnd" rel2txt RPor = "||" -- "relOr" rel2txt RPmap = "MAP" +rel2txt RPmin = "MIN" +rel2txt RPmax = "MAX" rel2txt RPsum = "SUM" rel2txt RPproduct = "PRODUCT" rel2txt (RPTC TBefore) = "BEFORE" @@ -298,6 +302,7 @@ rel2txt (RPTC TBy ) = "BY" rel2txt (RPTC TOn) = "ON" rel2txt (RPTC TVague) = "ABOUT" +-- | [TODO] figure out why there are two very similar functions, this and `rel2txt` rel2op :: RPRel -> Text.Text rel2op RPis = "IS" rel2op RPhas = ".?" @@ -311,14 +316,7 @@ rel2op RPnotElem = "NOT IN" rel2op RPnot = "NOT" rel2op RPand = "&&" rel2op RPor = "||" -rel2op RPmap = "MAP" -rel2op RPsum = "SUM" -rel2op RPproduct = "PRODUCT" -rel2op (RPTC TBefore) = "BEFORE" -rel2op (RPTC TAfter ) = "AFTER" -rel2op (RPTC TBy ) = "BY" -rel2op (RPTC TOn) = "ON" -rel2op (RPTC TVague) = "ABOUT" +rel2op x = rel2txt x rp2mt :: RelationalPredicate -> MultiTerm rp2mt (RPParamText pt) = pt2multiterm pt From a16ddb01a022bd1bfb79f23bd9ec6cb78faa8e65 Mon Sep 17 00:00:00 2001 From: Meng Weng Wong Date: Mon, 21 Aug 2023 17:29:00 +0800 Subject: [PATCH 49/49] strip leading and trailing whitespace from tokens --- lib/haskell/natural4/src/LS/Lib.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/haskell/natural4/src/LS/Lib.hs b/lib/haskell/natural4/src/LS/Lib.hs index c5b5422f1..002d6585f 100644 --- a/lib/haskell/natural4/src/LS/Lib.hs +++ b/lib/haskell/natural4/src/LS/Lib.hs @@ -402,7 +402,7 @@ stanzaAsStream rs = -- tokenLength = fromIntegral $ Text.length rawToken + 1 & \r -> Debug.trace (show r) r -- tokenLength = fromIntegral $ Text.length rawToken + 1 & Debug.trace <$> show <*> id -- same as above line, but with reader applicative -- tokenLength = fromIntegral $ Text.length rawToken + 1 -- without debugging - , tokenVal <- toToken rawToken + , tokenVal <- toToken (Text.strip rawToken) -- strip leading and trailing whitespace from tokens. If you want a bare "IS" your best bet is to say "is". , tokenVal `notElem` [ Empty, TokTrue, TokFalse ] -- ignore TRUE and FALSE values ... so long as our policy is to ignore checkboxes, that is. ] where