forked from GitHub/gf-core
another optimization of Romance VP. Effect on Fre over 50% in compilation and parse speed. Somewhat smaller on Spa,Ita,Cat.
This commit is contained in:
@@ -1,9 +1,17 @@
|
|||||||
--# -path=.:../romance:../abstract:../common:prelude
|
--# -path=.:../romance:../abstract:../common:prelude
|
||||||
instance DiffCat of DiffRomance = open CommonRomance, PhonoCat, BeschCat, Prelude in {
|
instance DiffCat of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRomance, PhonoCat, BeschCat, Prelude in {
|
||||||
|
|
||||||
flags optimize=noexpand ;
|
flags optimize=noexpand ;
|
||||||
coding=utf8 ;
|
coding=utf8 ;
|
||||||
|
|
||||||
|
---- exceptions ----------------
|
||||||
|
oper
|
||||||
|
partAgr : VType -> Bool = \vtyp -> False ;
|
||||||
|
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, False> ;
|
||||||
|
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <verbDefaultPart v, False> ;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
param
|
param
|
||||||
Prepos = P_de | P_a ;
|
Prepos = P_de | P_a ;
|
||||||
VType = VHabere | VRefl ;
|
VType = VHabere | VRefl ;
|
||||||
@@ -66,8 +74,6 @@ oper
|
|||||||
|
|
||||||
auxVerb : VType -> (VF => Str) = \_ -> haver_V.s ;
|
auxVerb : VType -> (VF => Str) = \_ -> haver_V.s ;
|
||||||
|
|
||||||
partAgr : VType -> VPAgr = \vtyp -> vpAgrNone ;
|
|
||||||
|
|
||||||
vpAgrClit : Agr -> VPAgr = \a ->
|
vpAgrClit : Agr -> VPAgr = \a ->
|
||||||
vpAgrNone ;
|
vpAgrNone ;
|
||||||
|
|
||||||
|
|||||||
@@ -61,15 +61,15 @@ instance DiffFre of DiffRomance - [
|
|||||||
_ => copula.s
|
_ => copula.s
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
partAgr : VType -> VPAgr = \vtyp -> case vtyp of {
|
|
||||||
VTyp VHabere _ => vpAgrNone ;
|
|
||||||
_ => VPAgrSubj
|
|
||||||
} ;
|
|
||||||
|
|
||||||
vpAgrClit : Agr -> VPAgr = \a0 ->
|
vpAgrClit : Agr -> VPAgr = \a0 ->
|
||||||
let a = complAgr a0 in
|
let a = complAgr a0 in
|
||||||
VPAgrClit a.g a.n ;
|
VPAgrClit a.g a.n ;
|
||||||
|
|
||||||
|
partAgr : VType -> Bool = \vtyp -> case vtyp of { -- works for all except Spa
|
||||||
|
VTyp VHabere _ => False ;
|
||||||
|
_ => True
|
||||||
|
} ;
|
||||||
|
|
||||||
---- pronArg = pronArgGen Neg ; --- takes more space and time
|
---- pronArg = pronArgGen Neg ; --- takes more space and time
|
||||||
|
|
||||||
pronArg : Number -> Person -> CAgr -> CAgr -> Str * Str * Bool =
|
pronArg : Number -> Person -> CAgr -> CAgr -> Str * Str * Bool =
|
||||||
|
|||||||
@@ -88,15 +88,15 @@ instance DiffIta of DiffRomance - [contractInf] = open CommonRomance, PhonoIta,
|
|||||||
_ => copula.s
|
_ => copula.s
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
partAgr : VType -> VPAgr = \vtyp -> case vtyp of {
|
|
||||||
VHabere => vpAgrNone ;
|
|
||||||
_ => VPAgrSubj
|
|
||||||
} ;
|
|
||||||
|
|
||||||
vpAgrClit : Agr -> VPAgr = \a0 ->
|
vpAgrClit : Agr -> VPAgr = \a0 ->
|
||||||
let a = complAgr a0 in
|
let a = complAgr a0 in
|
||||||
VPAgrClit a.g a.n ;
|
VPAgrClit a.g a.n ;
|
||||||
|
|
||||||
|
partAgr : VType -> Bool = \vtyp -> case vtyp of { -- works for all except Spa
|
||||||
|
VHabere => False ;
|
||||||
|
_ => True
|
||||||
|
} ;
|
||||||
|
|
||||||
pronArg = \n,p,acc,dat ->
|
pronArg = \n,p,acc,dat ->
|
||||||
let
|
let
|
||||||
pacc = case acc of { --- only accusative refl handled
|
pacc = case acc of { --- only accusative refl handled
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ interface DiffRomance = open CommonRomance, Prelude in {
|
|||||||
-- Derivatively, if/when the participle agrees to the subject.
|
-- Derivatively, if/when the participle agrees to the subject.
|
||||||
-- (Fre "elle est partie", Ita "lei è partita", Spa not)
|
-- (Fre "elle est partie", Ita "lei è partita", Spa not)
|
||||||
|
|
||||||
oper partAgr : VType -> VPAgr ;
|
oper partAgr : VType -> Bool ;
|
||||||
|
|
||||||
-- Whether participle agrees to foregoing clitic.
|
-- Whether participle agrees to foregoing clitic.
|
||||||
-- (Fre "je l'ai vue", Spa "yo la he visto")
|
-- (Fre "je l'ai vue", Spa "yo la he visto")
|
||||||
@@ -105,9 +105,16 @@ param
|
|||||||
oper
|
oper
|
||||||
Verb = {s : VF => Str ; vtyp : VType ; p : Str} ;
|
Verb = {s : VF => Str ; vtyp : VType ; p : Str} ;
|
||||||
|
|
||||||
|
VPAgrType : Type = Str * Bool ; ---- originally VPAgr, expensive
|
||||||
|
getVPAgr : Verb -> VPAgrType = \v -> <verbDefaultPart v, partAgr v.vtyp> ; -- str may be used
|
||||||
|
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, True> ; -- str not used but subject instead ---- VPAgrSubj
|
||||||
|
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <v.s ! (VPart a.g a.n), False> ; -- str used from clitic ---- vpAgrClit
|
||||||
|
verbDefaultPart : Verb -> Str = \v -> v.s ! (VPart Masc Sg) ;
|
||||||
|
|
||||||
|
|
||||||
VP : Type = {
|
VP : Type = {
|
||||||
s : Verb ;
|
s : Verb ;
|
||||||
agr : VPAgr ; -- dit/dite dep. on verb, subj, and clitic
|
agr : VPAgrType ; -- dit/dite dep. on verb, subj, and clitic
|
||||||
neg : RPolarity => (Str * Str) ; -- ne-pas
|
neg : RPolarity => (Str * Str) ; -- ne-pas
|
||||||
clit1 : Str ; -- le/se
|
clit1 : Str ; -- le/se
|
||||||
clit2 : Str ; -- lui
|
clit2 : Str ; -- lui
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ oper
|
|||||||
typ = verb.vtyp ;
|
typ = verb.vtyp ;
|
||||||
in {
|
in {
|
||||||
s = verb ;
|
s = verb ;
|
||||||
agr = partAgr typ ;
|
agr = getVPAgr verb ;
|
||||||
neg = negation ;
|
neg = negation ;
|
||||||
clit1 = [] ;
|
clit1 = [] ;
|
||||||
clit2 = [] ;
|
clit2 = [] ;
|
||||||
@@ -98,7 +98,7 @@ oper
|
|||||||
in {
|
in {
|
||||||
s = vp.s ;
|
s = vp.s ;
|
||||||
agr = case <np.hasClit, c.isDir, c.c> of {
|
agr = case <np.hasClit, c.isDir, c.c> of {
|
||||||
<True,True,Acc> => vpAgrClit np.a ;
|
<True,True,Acc> => vpAgrClits vp.s np.a ;
|
||||||
_ => vp.agr -- must be dat
|
_ => vp.agr -- must be dat
|
||||||
} ;
|
} ;
|
||||||
clit1 = vp.clit1 ++ obj.c1 ;
|
clit1 = vp.clit1 ++ obj.c1 ;
|
||||||
@@ -126,40 +126,18 @@ oper
|
|||||||
-- Agreement with preceding relative or interrogative:
|
-- Agreement with preceding relative or interrogative:
|
||||||
-- "les femmes que j'ai aimées"
|
-- "les femmes que j'ai aimées"
|
||||||
|
|
||||||
insertAgr : AAgr -> VP -> VP = \ag,vp -> {
|
insertAgr : AAgr -> VP -> VP = \ag,vp -> vp ** {
|
||||||
s = vp.s ;
|
agr = vpAgrClits vp.s ag ;
|
||||||
agr = vpAgrClit (agrP3 ag.g ag.n) ;
|
|
||||||
clit1 = vp.clit1 ;
|
|
||||||
clit2 = vp.clit2 ;
|
|
||||||
clit3 = vp.clit3 ;
|
|
||||||
isNeg = vp.isNeg ;
|
|
||||||
neg = vp.neg ;
|
|
||||||
comp = vp.comp ;
|
|
||||||
ext = vp.ext ;
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
insertRefl : VP -> VP = \vp -> {
|
insertRefl : VP -> VP = \vp -> vp ** {
|
||||||
s = vp.s ** {vtyp = vRefl vp.s.vtyp} ;
|
s = vp.s ** {vtyp = vRefl vp.s.vtyp} ;
|
||||||
agr = VPAgrSubj ;
|
agr = vpAgrSubj vp.s ;
|
||||||
clit1 = vp.clit1 ;
|
|
||||||
clit2 = vp.clit2 ;
|
|
||||||
clit3 = vp.clit3 ;
|
|
||||||
isNeg = vp.isNeg ;
|
|
||||||
neg = vp.neg ;
|
|
||||||
comp = vp.comp ;
|
|
||||||
ext = vp.ext ;
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
insertAdv : Str -> VP -> VP = \co,vp -> {
|
insertAdv : Str -> VP -> VP = \co,vp -> vp ** {
|
||||||
s = vp.s ;
|
|
||||||
agr = vp.agr ;
|
|
||||||
clit1 = vp.clit1 ;
|
|
||||||
clit2 = vp.clit2 ;
|
|
||||||
clit3 = vp.clit3 ;
|
|
||||||
isNeg = vp.isNeg ; --- adv could be neg
|
isNeg = vp.isNeg ; --- adv could be neg
|
||||||
neg = vp.neg ;
|
|
||||||
comp = \\a => vp.comp ! a ++ co ;
|
comp = \\a => vp.comp ! a ++ co ;
|
||||||
ext = vp.ext ;
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
insertAdV : Str -> VP -> VP = \co,vp -> {
|
insertAdV : Str -> VP -> VP = \co,vp -> {
|
||||||
@@ -242,10 +220,16 @@ oper
|
|||||||
verb = vp.s.s ;
|
verb = vp.s.s ;
|
||||||
vaux = auxVerb vp.s.vtyp ;
|
vaux = auxVerb vp.s.vtyp ;
|
||||||
|
|
||||||
part = case vp.agr of {
|
---- VPAgr : this is where it really matters
|
||||||
VPAgrSubj => verb ! VPart agr.g agr.n ;
|
part = case vp.agr.p2 of {
|
||||||
VPAgrClit g n => verb ! VPart g n
|
False => vp.agr.p1 ;
|
||||||
|
True => verb ! VPart agr.g agr.n
|
||||||
} ;
|
} ;
|
||||||
|
---- part = case vp.agr of {
|
||||||
|
---- VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||||
|
---- VPAgrClit g n => verb ! VPart g n
|
||||||
|
---- } ;
|
||||||
|
|
||||||
|
|
||||||
vps : Str * Str = case <te,a> of {
|
vps : Str * Str = case <te,a> of {
|
||||||
<RPast,Simul> => <verb ! VFin (VImperf m) num per, []> ; --# notpresent
|
<RPast,Simul> => <verb ! VFin (VImperf m) num per, []> ; --# notpresent
|
||||||
|
|||||||
@@ -103,10 +103,15 @@ incomplete concrete SentenceRomance of Sentence =
|
|||||||
|
|
||||||
ext = vp.ext ! b ;
|
ext = vp.ext ! b ;
|
||||||
|
|
||||||
part = case vp.agr of {
|
---- VPAgr : this is where it really matters
|
||||||
VPAgrSubj => verb ! VPart agr.g agr.n ;
|
part = case vp.agr.p2 of {
|
||||||
VPAgrClit g n => verb ! VPart g n
|
False => vp.agr.p1 ;
|
||||||
|
True => verb ! VPart agr.g agr.n
|
||||||
} ;
|
} ;
|
||||||
|
---- part = case vp.agr of {
|
||||||
|
---- VPAgrSubj => verb ! VPart agr.g agr.n ;
|
||||||
|
---- VPAgrClit g n => verb ! VPart g n
|
||||||
|
---- } ;
|
||||||
|
|
||||||
vpss : Str * Str = case <te,a> of {
|
vpss : Str * Str = case <te,a> of {
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ incomplete concrete VerbRomance of Verb =
|
|||||||
|
|
||||||
SlashV2VNP v np vps = let obj = np.s ! v.c2.c in {
|
SlashV2VNP v np vps = let obj = np.s ! v.c2.c in {
|
||||||
s = v ;
|
s = v ;
|
||||||
agr = partAgr v.vtyp ;
|
agr = getVPAgr v ;
|
||||||
clit1 = obj.c1 ;
|
clit1 = obj.c1 ;
|
||||||
clit2 = obj.c2 ;
|
clit2 = obj.c2 ;
|
||||||
clit3 = {s,imp = [] ; hasClit = False} ; ---- shortcut from insertObject, to check AR 20/11/2013
|
clit3 = {s,imp = [] ; hasClit = False} ; ---- shortcut from insertObject, to check AR 20/11/2013
|
||||||
|
|||||||
@@ -432,6 +432,17 @@ v0.2
|
|||||||
876660 french/RelativeFre.gfo
|
876660 french/RelativeFre.gfo
|
||||||
8114329 total
|
8114329 total
|
||||||
|
|
||||||
|
v03 195227 msec (old with VPAgr changed to Str; not yet correct)
|
||||||
|
5084845 french/SentenceFre.gfo
|
||||||
|
131929 french/QuestionFre.gfo
|
||||||
|
333884 french/RelativeFre.gfo
|
||||||
|
5550658 total
|
||||||
|
v04 242696 msec (this correct, Str * Bool)
|
||||||
|
6091544 french/SentenceFre.gfo
|
||||||
|
156000 french/QuestionFre.gfo
|
||||||
|
511900 french/RelativeFre.gfo
|
||||||
|
6759444 total
|
||||||
|
|
||||||
v2
|
v2
|
||||||
23476139 french/SentenceFre.gfo
|
23476139 french/SentenceFre.gfo
|
||||||
1150969 french/QuestionFre.gfo
|
1150969 french/QuestionFre.gfo
|
||||||
@@ -455,6 +466,13 @@ Ita
|
|||||||
606895 italian/RelativeIta.gfo
|
606895 italian/RelativeIta.gfo
|
||||||
3408954 total
|
3408954 total
|
||||||
|
|
||||||
|
Ita v03:
|
||||||
|
253879 msec
|
||||||
|
2169173 italian/SentenceIta.gfo
|
||||||
|
95021 italian/QuestionIta.gfo
|
||||||
|
347063 italian/RelativeIta.gfo
|
||||||
|
2611257 total
|
||||||
|
|
||||||
Spa
|
Spa
|
||||||
112362 msec
|
112362 msec
|
||||||
1541743 spanish/SentenceSpa.gfo
|
1541743 spanish/SentenceSpa.gfo
|
||||||
@@ -462,6 +480,21 @@ Spa
|
|||||||
430675 spanish/RelativeSpa.gfo
|
430675 spanish/RelativeSpa.gfo
|
||||||
2061979 total
|
2061979 total
|
||||||
|
|
||||||
|
Spa v03:
|
||||||
|
91598 msec
|
||||||
|
1086758 spanish/SentenceSpa.gfo
|
||||||
|
66345 spanish/QuestionSpa.gfo
|
||||||
|
250267 spanish/RelativeSpa.gfo
|
||||||
|
1403370 total
|
||||||
|
|
||||||
|
Cat v03
|
||||||
|
83132 msec
|
||||||
|
1078970 catalan/SentenceCat.gfo
|
||||||
|
66225 catalan/QuestionCat.gfo
|
||||||
|
249211 catalan/RelativeCat.gfo
|
||||||
|
1394406 total
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VType = VTyp VAux Bool
|
VType = VTyp VAux Bool
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
--# -path=.:../romance:../abstract:../common:prelude
|
--# -path=.:../romance:../abstract:../common:prelude
|
||||||
|
|
||||||
instance DiffSpa of DiffRomance = open CommonRomance, PhonoSpa, BeschSpa, Prelude in {
|
instance DiffSpa of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRomance, PhonoSpa, BeschSpa, Prelude in {
|
||||||
|
|
||||||
flags optimize=noexpand ;
|
flags optimize=noexpand ;
|
||||||
coding=utf8 ;
|
coding=utf8 ;
|
||||||
|
|
||||||
|
---- exceptions ----------------
|
||||||
|
oper
|
||||||
|
partAgr : VType -> Bool = \vtyp -> False ;
|
||||||
|
vpAgrSubj : Verb -> VPAgrType = \v -> <verbDefaultPart v, False> ;
|
||||||
|
vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> <verbDefaultPart v, False> ;
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
param
|
param
|
||||||
Prepos = P_de | P_a ;
|
Prepos = P_de | P_a ;
|
||||||
VType = VHabere | VRefl ;
|
VType = VHabere | VRefl ;
|
||||||
@@ -72,8 +80,6 @@ instance DiffSpa of DiffRomance = open CommonRomance, PhonoSpa, BeschSpa, Prelud
|
|||||||
|
|
||||||
auxVerb : VType -> (VF => Str) = \_ -> haber_V.s ;
|
auxVerb : VType -> (VF => Str) = \_ -> haber_V.s ;
|
||||||
|
|
||||||
partAgr : VType -> VPAgr = \vtyp -> vpAgrNone ;
|
|
||||||
|
|
||||||
vpAgrClit : Agr -> VPAgr = \a ->
|
vpAgrClit : Agr -> VPAgr = \a ->
|
||||||
vpAgrNone ;
|
vpAgrNone ;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user