summaryrefslogtreecommitdiff
path: root/grammars/aggregation
diff options
context:
space:
mode:
authoraarne <unknown>2003-10-09 15:23:32 +0000
committeraarne <unknown>2003-10-09 15:23:32 +0000
commit2ee936c7e23bd690b05b8362179911a2d176f150 (patch)
tree00e54d208f21b4f0278aab96ae551ecd6cae4abc /grammars/aggregation
parentddd103ccd7422c35b5af0bcb5bad5edd49b080bb (diff)
Added treatment of transfer modules. Aggregation is an example.
Diffstat (limited to 'grammars/aggregation')
-rw-r--r--grammars/aggregation/Abstract.gf57
-rw-r--r--grammars/aggregation/Aggregation.gf5
-rw-r--r--grammars/aggregation/English.gf18
-rw-r--r--grammars/aggregation/transfer.gf75
4 files changed, 155 insertions, 0 deletions
diff --git a/grammars/aggregation/Abstract.gf b/grammars/aggregation/Abstract.gf
new file mode 100644
index 000000000..719bfe150
--- /dev/null
+++ b/grammars/aggregation/Abstract.gf
@@ -0,0 +1,57 @@
+-- testing transfer: aggregation by def definitions. AR 12/4/2003 -- 9/10
+
+-- p "Mary runs or John runs and John walks" | l -transfer=Aggregation
+-- Mary runs or John runs and walks
+-- Mary or John runs and John walks
+
+-- The two results are due to ambiguity in parsing. Thus it is not spurious!
+
+abstract Abstract = {
+
+cat
+ S ; NP ; VP ; Conj ;
+
+fun
+ Pred : NP -> VP -> S ;
+ ConjS : Conj -> S -> S -> S ;
+ ConjVP : Conj -> VP -> VP -> VP ;
+ ConjNP : Conj -> NP -> NP -> NP ;
+
+ John, Mary, Bill : NP ;
+ Walk, Run, Swim : VP ;
+ And, Or : Conj ;
+
+fun aggreg : S -> S ;
+def
+ aggreg (ConjS c (Pred Q F) B) = aggrAux c Q F B ;
+ aggreg (ConjS c A B) = ConjS c (aggreg A) (aggreg B) ;
+ aggreg A = A ;
+
+-- this auxiliary makes pattern matching on NP to test equality
+
+fun aggrAux : Conj -> NP -> VP -> S -> S ;
+def
+ -- aggregate verbs with shared subject
+ aggrAux c John F (Pred John G) = Pred John (ConjVP c F G) ;
+ aggrAux c Mary F (Pred Mary G) = Pred Mary (ConjVP c F G) ;
+ aggrAux c Bill F (Pred Bill G) = Pred Bill (ConjVP c F G) ;
+
+ -- aggregate subjects with shared verbs
+ aggrAux c Q Run (Pred R Run) = Pred (ConjNP c Q R) Run ;
+ aggrAux c Q Walk (Pred R Walk) = Pred (ConjNP c Q R) Walk ;
+ aggrAux c Q Swim (Pred R Swim) = Pred (ConjNP c Q R) Swim ;
+
+ -- this case takes care of munching
+ aggrAux c Q F (ConjS e A B) = aggrAux c Q F (aggreg (ConjS e A B)) ;
+
+ aggrAux c Q F B = ConjS c (Pred Q F) (aggreg B) ;
+
+-- unfortunately we cannot test string equality for Name : String -> NP ;
+-- It would also be tedious to test the equality of complex
+-- NPs and VPs, but not impossible.
+
+-- have to add these, otherwise constants are not constructor patterns!
+
+data NP = John | Mary | Bill ;
+data VP = Run | Walk | Swim ;
+}
diff --git a/grammars/aggregation/Aggregation.gf b/grammars/aggregation/Aggregation.gf
new file mode 100644
index 000000000..116629422
--- /dev/null
+++ b/grammars/aggregation/Aggregation.gf
@@ -0,0 +1,5 @@
+transfer Aggregation : Abstract -> Abstract = {
+
+ transfer S : S -> S = aggreg ;
+
+}
diff --git a/grammars/aggregation/English.gf b/grammars/aggregation/English.gf
new file mode 100644
index 000000000..21da16b23
--- /dev/null
+++ b/grammars/aggregation/English.gf
@@ -0,0 +1,18 @@
+concrete English of Abstract = {
+
+pattern
+ Pred np vp = np ++ vp ;
+ ConjS c A B = A ++ c ++ B ;
+ ConjVP c A B = A ++ c ++ B ;
+ ConjNP c A B = A ++ c ++ B ;
+
+ John = "John" ;
+ Mary = "Mary" ;
+ Bill = "Bill" ;
+ Walk = "walks" ;
+ Run = "runs" ;
+ Swim = "swims" ;
+
+ And = "and" ;
+ Or = "or" ;
+}
diff --git a/grammars/aggregation/transfer.gf b/grammars/aggregation/transfer.gf
new file mode 100644
index 000000000..0f4e12097
--- /dev/null
+++ b/grammars/aggregation/transfer.gf
@@ -0,0 +1,75 @@
+-- testing transfer: aggregation by def definitions. AR 12/4/2003
+
+-- p "Mary runs or John runs and John walks" | wt -c aggreg | l
+-- Mary runs or John runs and walks
+-- Mary or John runs and John walks
+-- The two results are due to ambiguity in parsing. Thus it is not spurious!
+
+flags transfer=aggreg ;
+
+cat
+ S ; NP ; VP ; Conj ;
+
+fun
+ Pred : NP -> VP -> S ;
+ ConjS : Conj -> S -> S -> S ;
+ ConjVP : Conj -> VP -> VP -> VP ;
+ ConjNP : Conj -> NP -> NP -> NP ;
+
+ John, Mary, Bill : NP ;
+ Walk, Run, Swim : VP ;
+ And, Or : Conj ;
+
+pattern
+ Pred np vp = np ++ vp ;
+ ConjS c A B = A ++ c ++ B ;
+ ConjVP c A B = A ++ c ++ B ;
+ ConjNP c A B = A ++ c ++ B ;
+
+ John = "John" ;
+ Mary = "Mary" ;
+ Bill = "Bill" ;
+ Walk = "walks" ;
+ Run = "runs" ;
+ Swim = "swims" ;
+
+
+ And = "and" ;
+ Or = "or" ;
+
+-- aggregation transformation
+
+fun aggreg : S -> S ;
+def
+ aggreg (ConjS c (Pred Q F) B) = aggrAux c Q F B ;
+ aggreg (ConjS c A B) = ConjS c (aggreg A) (aggreg B) ;
+ aggreg A = A ;
+
+-- this auxiliary makes pattern matching on NP to test equality
+
+fun aggrAux : Conj -> NP -> VP -> S -> S ;
+def
+ -- aggregate verbs with shared subject
+ aggrAux c John F (Pred John G) = Pred John (ConjVP c F G) ;
+ aggrAux c Mary F (Pred Mary G) = Pred Mary (ConjVP c F G) ;
+ aggrAux c Bill F (Pred Bill G) = Pred Bill (ConjVP c F G) ;
+
+ -- aggregate subjects with shared verbs
+ aggrAux c Q Run (Pred R Run) = Pred (ConjNP c Q R) Run ;
+ aggrAux c Q Walk (Pred R Walk) = Pred (ConjNP c Q R) Walk ;
+ aggrAux c Q Swim (Pred R Swim) = Pred (ConjNP c Q R) Swim ;
+
+ -- this case takes care of munching
+ aggrAux c Q F (ConjS e A B) = aggrAux c Q F (aggreg (ConjS e A B)) ;
+
+ aggrAux c Q F B = ConjS c (Pred Q F) (aggreg B) ;
+
+-- unfortunately we cannot test string equality for Name : String -> NP ;
+-- It would also be tedious to test the equality of complex
+-- NPs and VPs, but not impossible.
+
+-- have to add these, otherwise constants are not constructor patterns!
+
+data NP = John | Mary | Bill ;
+data VP = Run | Walk | Swim ;
+