/*    Sample HPSG Grammar in DCG       */
/* Copyright (C) 1993 Yuji Matsumoto   */

% ȥåץΡɤ
:- sax_top_node_category(_, sentence/1).

% 繽¤§
sentence(Mother) -->
	n(Comp),
	v(Head),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = [Comp]},
	{Mother@cat@subcat = []},
	{Head@content = Mother@content}.

v(Mother) -->
	v(Head),
	n(Comp),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = [Comp|Mother@cat@subcat]},
	{Head@content = Mother@content}.
v(Mother) -->
	v(Head),
	p(Adjunct),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = Mother@cat@subcat},
	{Adjunct@cat@head@mod = Head},
	{Adjunct@cat@subcat   = []},
	{Adjunct@content = Mother@content}.

n(Mother) -->
	det(Comp),
	n(Head),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = [Comp|Mother@cat@subcat]},
	{Head@content = Mother@content}.
n(Mother) -->
	n(Head),
	p(Adjunct),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = Mother@cat@subcat},
	{Adjunct@cat@head@mod = Head},
	{Adjunct@cat@subcat   = []},
	{Adjunct@content = Mother@content}.

p(Mother) -->
	p(Head),
	n(Comp),
	{Head@cat@head   = Mother@cat@head},
	{Head@cat@subcat = [Comp|Mother@cat@subcat]},
	{Head@content = Mother@content}.

% 
det(Sign) --> [a],
	{Sign@cat@head@pos = det},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
        {IND@person = third},
	{IND@number = sing}.

det(Sign) --> [the],
	{Sign@cat@head@pos = det},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
        {IND@person = third}.

n(Sign) --> [i],
	{Sign@cat@head@pos  = n},
	{Sign@cat@head@case = nom},
	{Sign@cat@subcat    = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = first},
	{IND@number = sing},
	{PSOA@reln   = speaker},
	{PSOA@bearer = IND}.

n(Sign) --> [john],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln   = naming},
        {PSOA@bearer = IND},
	{PSOA@name   = john}.

n(Sign) --> [tokyo],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln   = naming},
        {PSOA@bearer = IND},
	{PSOA@name   = tokyo}.

n(Sign) --> [girl],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = [DET]},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{DET@cat@head@pos = det},
	{DET@cat@subcat   = []},
	{DET@content@index = INDofDET},
	{INDofDET@number = sing},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln = girl},
	{PSOA@inst = IND}.

n(Sign) --> [telescope],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = [DET]},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{DET@cat@head@pos = det},
	{DET@cat@subcat   = []},
	{DET@content@index = INDofDET},
	{INDofDET@number = sing},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln = telescope},
	{PSOA@inst = IND}.

n(Sign) --> [window],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = [DET]},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{DET@cat@head@pos = det},
	{DET@cat@subcat   = []},
	{DET@content@index = INDofDET},
	{INDofDET@number = sing},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln = window},
	{PSOA@inst = IND}.

n(Sign) --> [leaf],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = [DET]},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{DET@cat@head@pos = det},
	{DET@cat@subcat   = []},
	{DET@content@index = INDofDET},
	{INDofDET@number = sing},
	{IND@person = third},
	{IND@number = sing},
	{PSOA@reln = leaf},
	{PSOA@inst = IND}.

n(Sign) --> [girls],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = pl},
	{PSOA@reln = girl},
	{PSOA@inst = IND}.

n(Sign) --> [telescopes],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = pl},
	{PSOA@reln = telescope},
	{PSOA@inst = IND}.

n(Sign) --> [windows],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = pl},
	{PSOA@reln = window},
	{PSOA@inst = IND}.

n(Sign) --> [leaves],
	{Sign@cat@head@pos = n},
	{Sign@cat@subcat   = []},
	{Sign@content@index = IND},
	{Sign@content@restr = [PSOA]},
	{IND@person = third},
	{IND@number = pl},
	{PSOA@reln = leaf},
	{PSOA@inst = IND}.

v(Sign) --> [run],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Subj]},
	{Sign@content@reln   = run},
        {Sign@content@runner = Runner},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Runner},
	{constr(not_sing_third(Runner@index@number,Runner@index@person))}.

v(Sign) --> [see],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln  = see},
        {Sign@content@seer  = Seer},
	{Sign@content@seen  = Seen},
        {Sign@content@tense = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Seer},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Seen},
	{constr(not_sing_third(Seer@index@number,Seer@index@person))}.

v(Sign) --> [leave],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = leave},
        {Sign@content@leaver = Leaver},
	{Sign@content@leavee = Leavee},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Leaver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Leavee},
	{constr(not_sing_third(Leaver@index@number,Leaver@index@person))}.

v(Sign) --> [open],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = open},
        {Sign@content@opener = Opener},
	{Sign@content@openee = Openee},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Opener},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Openee},
	{constr(not_sing_third(Opener@index@number,Opener@index@person))}.

v(Sign) --> [give],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Obj2,Subj]},
	{Sign@content@reln  = give},
        {Sign@content@giver = Giver},
	{Sign@content@given = Given},
	{Sign@content@gift  = Gift},
        {Sign@content@tense = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Giver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Gift},
	{Obj2@cat@head@pos  = n},
	{Obj2@cat@head@case = acc},
	{Obj2@cat@subcat    = []},
	{Obj2@content = Given},
	{constr(not_sing_third(Giver@index@number,Giver@index@person))}.

v(Sign) --> [runs],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Subj]},
	{Sign@content@reln   = run},
        {Sign@content@runner = Runner},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Runner},
	{Runner@index@person = third},
	{Runner@index@number = sing}.

v(Sign) --> [sees],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln  = see},
        {Sign@content@seer  = Seer},
	{Sign@content@seen  = Seen},
        {Sign@content@tense = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Seer},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Seen},
	{Seer@index@person = third},
	{Seer@index@number = sing}.

v(Sign) --> [leaves],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = leave},
        {Sign@content@leaver = Leaver},
	{Sign@content@leavee = Leavee},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Leaver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Leavee},
	{Leaver@index@person = third},
	{Leaver@index@number = sing}.

v(Sign) --> [opens],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = open},
        {Sign@content@opener = Opener},
	{Sign@content@openee = Openee},
        {Sign@content@tense  = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Opener},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Openee},
	{Opener@index@person = third},
	{Opener@index@number = sing}.

v(Sign) --> [gives],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Obj2,Subj]},
	{Sign@content@reln  = give},
        {Sign@content@giver = Giver},
	{Sign@content@given = Given},
	{Sign@content@gift  = Gift},
        {Sign@content@tense = present},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Giver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Gift},
	{Obj2@cat@head@pos  = n},
	{Obj2@cat@head@case = dat},
	{Obj2@cat@subcat    = []},
	{Obj2@content = Given},
	{Giver@index@person = third},
	{Giver@index@number = sing}.

v(Sign) --> [ran],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Subj]},
	{Sign@content@reln   = run},
        {Sign@content@runner = Runner},
        {Sign@content@tense  = past},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Runner}.

v(Sign) --> [saw],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln  = see},
        {Sign@content@seer  = Seer},
	{Sign@content@seen  = Seen},
        {Sign@content@tense = past},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Seer},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Seen}.

v(Sign) --> [left],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = leave},
        {Sign@content@leaver = Leaver},
	{Sign@content@leavee = Leavee},
        {Sign@content@tense  = past},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Leaver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Leavee}.

v(Sign) --> [opened],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Subj]},
	{Sign@content@reln   = open},
        {Sign@content@opener = Opener},
	{Sign@content@openee = Openee},
        {Sign@content@tense  = past},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Opener},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Openee}.

v(Sign) --> [gave],
	{Sign@cat@head@pos   = v},
	{Sign@cat@head@vform = fin},
	{Sign@cat@subcat     = [Obj,Obj2,Subj]},
	{Sign@content@reln  = give},
        {Sign@content@giver = Giver},
	{Sign@content@given = Given},
	{Sign@content@gift  = Gift},
        {Sign@content@tense = past},
	{Subj@cat@head@pos  = n},
	{Subj@cat@head@case = nom},
	{Subj@cat@subcat    = []},
	{Subj@content = Giver},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	{Obj@content = Gift},
	{Obj2@cat@head@pos  = n},
	{Obj2@cat@head@case = dat},
	{Obj2@cat@subcat    = []},
	{Obj2@content = Given}.

p(Sign) --> [with],
	{Sign@cat@head@pos   = p},
	{Sign@cat@head@pform = with},
	{Sign@cat@head@mod   = Mod},
	{Sign@cat@subcat     = [Obj]},
	{Obj@cat@head@pos  = n},
	{Obj@cat@head@case = acc},
	{Obj@cat@subcat    = []},
	(   {Sign@content@index = Haver@index},
	    {Sign@content@restr = [PSOA|Haver@restr]},
	    {Mod@cat@head@pos = n},
	    {Mod@cat@subcat   = []},
	    {Mod@content = Haver},
	    {Obj@content = Havee},
	    {PSOA@reln  = have},
	    {PSOA@haver = Haver},
	    {PSOA@havee = Havee}
	;   {Sign@content = PSOA},
	    {Mod@cat@head@pos = v},
	    {Mod@cat@subcat   = [_Subj]},
	    {Mod@content = PSOA},
	    {Obj@content = Tool},
	    {PSOA@tool = Tool}
	).

% 
not_sing_third(pl, _).
not_sing_third(sing, first).
not_sing_third(sing, second).
