% Deklarativní popis češtiny I
% Gramatika 3
% Teorie

:- tree_extensions.
:- multifile if/2.

% Lexicon

nn(Gend-gend,Num-num,Case-case) :=
   (word,
    cat:(head:(noun,
               case:Case,
               agr:(num:Num,
                    gend:Gend)),
               val:e_list)).   

vv(Vform-vform,Val-list) :=
   (word,
    cat:(head:(verb,
               vform:Vform),
         val:Val)). 

vi(Vform-fin,Gend-gend,Num-num) :=
   @vv(Vform,[@nn(Gend,Num,nom)]).

vt(Vform-fin,Gend-gend,Num-num,Case-case) :=
   @vv(Vform,([@nn(Gend,Num,nom),@nn(_,_,Case)])).

vit(Vform-fin,Gend-gend,Num-num,Case-case) :=
   @vv(Vform,([@nn(Gend,Num,nom)];
              [@nn(Gend,Num,nom),@nn(_,_,Case)])).

pepa  ~~> @nn(ma,sg,nom).
kozu  ~~> @nn(f,sg,acc).
kozy  ~~> @nn(f,pl,(nom;acc)).
máňa  ~~> @nn(f,sg,nom).
kluci ~~> @nn(ma,pl,nom). 
děvčata ~~> @nn(n,pl,(nom;acc)).
děti  ~~> @nn(f,pl,(nom;acc)).
dětem ~~> @nn(f,pl,dat). 

spí   ~~> @vi(pres,_,_).
spal  ~~> @vi(past,m,sg).
spala ~~> @vi(past,f,sg);@vi(past,n,pl).
spali ~~> @vi(past,ma,pl).
spaly ~~> @vi(past,(mi;f),pl).
spát ~~>  @vv(inf,e_list). 

pase  ~~> @vit(past,_,sg,acc).
pasou ~~> @vit(past,_,pl,acc).
pásl  ~~> @vit(past,m,sg,acc).
pásla ~~> @vit(past,f,sg,acc);@vit(past,n,pl,acc).
pásli ~~> @vit(past,ma,pl,acc).
pásly ~~> @vit(past,(mi;f),pl,acc).

rozumí ~~> @vit(pres,_,sg,dat).
rozumějí ~~> @vit(pres,_,pl,dat).

chce   ~~> @vv(pres,[@nn(_,sg,nom),(@vv(inf,e_list);
                                  @nn(_,_,acc))]).
chtějí ~~> @vv(pres,[@nn(_,pl,nom),(@vv(inf,e_list);
                                  @nn(_,_,acc))]).

% Principles

% Head Feature Principle

phrase *> (cat:head:HF,
           head_dtr:cat:head:HF).

% Valency Principle

phrase *> (cat:val:MVal,
           head_dtr:cat:val:append(MVal,[NHead]),
           nonh_dtr:NHead).

% Phrase Structure Rules

s ##
    (phrase,
     cat:val:e_list,
     head_dtr:Head,
     nonh_dtr:Subj)
===>
    cat> Subj,
    cat> Head.

vp ##
    (phrase,
     cat:val:[sign],
     head_dtr:Head,
     nonh_dtr:Obj)
===>
    cat> Head,
    cat> Obj.

% Constraints

% append(+,+,-)
% This append assumes that the first or the third argument
% are known to be non_empty or empty lists. 
%

fun append(+,+,-).
append(X,Y,Z) if 
   when( (X=(e_list;ne_list);
          Z=(e_list;ne_list)) 
       , undelayed_append(X,Y,Z)
       ).

undelayed_append([],L,L) if true.
undelayed_append([H|T1],L,[H|T2]) if append(T1,L,T2).


% Test sentences

t(1, "máňa pase", phrase, 1, 'Gramatika3: shoda sg').
t(2, "pepa pase kozy", phrase, 1, 'Gramatika3: shoda sg').
t(3, "máňa pasou", phrase, 0, 'Gramatika3: neshoda sg/pl').
t(4, "máňa pásla", phrase, 1, 'Gramatika3: shoda sg f').
t(5, "máňa pásl", phrase, 0, 'Gramatika3: neshoda sg f/m').
t(6, "pepa pásl", phrase, 1, 'Gramatika3: shoda sg ma').
t(7, "pepa pásla", phrase, 0, 'Gramatika3: neshoda sg ma/f').
t(8, "kluci pásli", phrase, 1, 'Gramatika3: shoda pl ma').
t(9, "kluci pásly", phrase, 0, 'Gramatika3: neshoda pl ma/mi').
t(10, "kluci pásl", phrase, 0, 'Gramatika3: neshoda pl/sg ma').
t(11, "děti pásly", phrase, 1, 'Gramatika3: shoda pl f').
t(12, "děti pásli", phrase, 0, 'Gramatika3: neshoda pl f/ma'). 
t(13, "děvčata spala", phrase, 1, 'Gramatika3: shoda pl n'). 
t(14, "děvčata spaly", phrase, 0, 'Gramatika3: neshoda pl n/f'). 
t(15, "děvčata rozumějí dětem", phrase, 1, 'Gramatika3: val dat'). 
t(16, "pepa rozumí děvčata", phrase, 0, 'Gramatika3: porušená val dat'). 
t(17, "děti chtějí spát", phrase, 1, 'Gramatika3: val inf'). 
t(18, "máňa chce kozu", phrase, 1, 'Gramatika3: val acc').
t(19, "děvčata chtějí děti", phrase, 1, 'Gramatika3: val acc').
