% Deklarativní popis češtiny I
% Gramatika 5 -- sémantika
% Teorie

:- discontiguous '*>'/2.
:- discontiguous 'fun'/1.



:- tree_extensions.
:- multifile if/2.
:- discontiguous 'if'/2.

hidden_feat(dtrs). 
>>> phon.
>>> subj.
>>> vform.
>>> case.

empty := (subj:e_list,
          comps:e_list).

saturated := (cat:val:(@empty)).

nn(Gend-gend,Num-num,Pers-pers,Case-case,Nom_obj-nom_obj) :=
   (word,
    cat:(head:(noun,
               case:Case,
               agr:(num:Num,
                    gend:Gend,
                    pers:Pers)),
         val: @empty),
    cont:Nom_obj).

nnval(Case-case,Nom_obj-nom_obj) :=
   (sign,
    cat:(head:(noun,
               case:Case),
         val: @empty),
    cont:Nom_obj).

   
vv(Vform-vform,Gend-gend,Num-num,Pers-pers,Val-val,Rel-rel) :=
   (word,
    cat:(head:(vfin,
               vform:Vform,
               agr:(num:Num,
                    gend:Gend,
                    pers:Pers)),
         val:Val),
    cont:Rel). 

vinf(Val-val,Rel-rel) :=
   (word,
    cat:(head:vinf,
         val:Val),
    cont:Rel). 

vinfval(Val-val,Rel-rel) :=
   (sign,
    cat:(head:vinf,
         val:Val),
    cont:Rel). 


vi(Vform-vform,Gend-gend,Num-num,Pers-pers,Rel-rel) := 
     @vv(Vform,Gend,Num,Pers,
        (subj:[@nnval(nom,Arg1)],comps:[]),
        (Rel,arg1:Arg1)).

vt(Vform-vform,Gend-gend,Num-num,Pers-pers,Case-case,Rel-rel) :=
   @vv(Vform,Gend,Num,Pers,
       (subj:[@nnval(nom,Arg1)],
        comps:[@nnval(Case,Arg2)]),
       (Rel,arg1:Arg1,arg2:Arg2)).

vd(Vform-vform,Gend-gend,Num-num,Pers-pers,Case1-case,Case2-case,Rel-rel123) :=
    @vv(Vform,Gend,Num,Pers,
        (subj:[@nnval(nom,Arg1)],
         comps:[@nnval(Case1,Arg2),
               @nnval(Case2,Arg3)]),
        (Rel,arg1:Arg1,arg2:Arg2,arg3:Arg3)).


pepa  ~~> @nn(ma,sg,third,nom,pepa_).
pepovi  ~~> @nn(ma,sg,third,dat,pepa_).
kozu  ~~> @nn(f,sg,third,acc,koza_).
kozy  ~~> @nn(f,pl,third,nom_acc,koza_).
máňa  ~~> @nn(f,sg,third,nom,mana_).
máně  ~~> @nn(f,sg,third,dat,mana_).
kluci ~~> @nn(ma,pl,third,nom,kluk_). 
děvčata ~~> @nn(n,pl,third,nom_acc,devce_).
děti  ~~> @nn(f,pl,third,nom_acc,dite_).
dětem ~~> @nn(f,pl,third,dat,dite_). 
pusu  ~~> @nn(f,sg,third,acc,pusa_).
knížky  ~~> @nn(f,pl,third,nom_acc,knizka_).

štěně ~~> @nn(n,sg,third,nom_acc,stene_).
kotě ~~> @nn(n,sg,third,nom_acc,kote_).

spí   ~~> @vi(pres,_,_,third,spat_).
spal  ~~> @vi(past,m,sg,third,spat_).
spala ~~> @vi(past,f,sg,third,spat_);
          @vi(past,n,pl,third,spat_).
spali ~~> @vi(past,ma,pl,third,spat_).
spaly ~~> @vi(past,f_mi,pl,third,spat_).
spát ~~>  @vinf((subj:[@nnval(_,Arg1)],
                 comps:[]),
                (spat_,arg1:Arg1)).
 

honí ~~> @vt(pres,_,_,third,acc,honit_).
honit ~~>  @vinf((subj:[@nnval(_,Arg1)],
                  comps:[@nnval(acc,Arg2)]),
                 (honit_,arg1:Arg1,arg2:Arg2)).

prší ~~> @vv(pres,n,sg,third,@empty,prset_).
pršet ~~> @vinf((subj:[],comps:[]),prset_).

pase  ~~> @vt(pres,_,sg,third,acc,past_).
pasou ~~> @vt(pres,_,pl,third,acc,past_).
pásl  ~~> @vt(past,m,sg,third,acc,past_).
pásla ~~> @vt(past,f,sg,third,acc,past_);
          @vt(past,n,pl,third,acc,past_).
pásli ~~> @vt(past,ma,pl,third,acc,past_).
pásly ~~> @vt(past,f_mi,pl,third,acc,past_).

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

chce  ~~> @vt(past,_,sg,third,acc,chtit_).
chce   ~~>  @vv(pres,_,sg,third,
               (subj:[@nnval(nom,Subj)],
                comps:[@vinfval((subj:[(cont:Subj)],
                                 comps:[]),
                                Inf)]),
               (chtit_,arg1:Subj,arg2:Inf)).
chtějí ~~> @vt(past,_,pl,third,acc,chtit_).
chtějí ~~> @vv(pres,_,pl,third,
               (subj:[@nnval(nom,Subj)],
                comps:[@vinfval((subj:[(cont:Subj)],
                                 comps:[]),
                                 Inf)]),
               (chtit_,arg1:Subj,arg2:Inf)).

dá  ~~> @vd(pres,_,sg,third,acc,dat,dat_).
dají  ~~> @vd(pres,_,pl,third,acc,dat,dat_).
dal ~~> @vd(past,m,sg,third,acc,dat,dat_).
dala ~~> @vd(past,f,sg,third,acc,dat,dat_).
dala ~~> @vd(past,n,pl,third,acc,dat,dat_).
dali ~~> @vd(past,ma,pl,third,acc,dat,dat_).
daly ~~> @vd(past,f_mi,pl,third,acc,dat,dat_).

% Principles

% Head Feature Principle

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

% Valency Principle

phrase *> ((cat:val:(subj:[],
                    comps:Comps),
           head_dtr:cat:val:(subj:[NHead],
                             comps:Comps),
           nonh_dtr:NHead);
          (cat:val:(subj:Subj,	    
		    comps:del(NHead,HVal)),
           head_dtr:cat:val:(subj:Subj,
                             comps:HVal),
           nonh_dtr:NHead)).

% Semantics Principle

phrase *> (cont:Cont,
           head_dtr:cont:Cont).

% Agreement Principle

(word,cat:(head:flective,
           val:subj:ne_list)) 
       *> (cat:val:subj:[cat:head:agr:Agr],
           cat:head:agr:Agr).


% Phrase Structure Rules

headfin ##
    (phrase,
     h_init:minus,
     head_dtr:Head,
     nonh_dtr:NonH)
===>
    cat> NonH,
    cat> Head.

% headfin lze použít vždy

headinit ##
    (phrase,
     h_init:plus,
     head_dtr:Head,
     nonh_dtr:NonH)
===>
    cat> (Head,h_init:plus),
    cat> NonH.

% headinit nelze použít na řídící člen vytvořený HeadFin

% h_init:bool způsobuje, že levostranná rozvití stojí ve stromě 
% nad všemi pravostrannými, aby nedocházelo k falešným víceznačnostem,
% stojí-li řídící člen mezi závislými

% 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).

%%%

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

undelayed_del(El,[El|L],L) if true.
undelayed_del(El,[H|T1],[H|T2]) if del(El,T1,T2).



% Test sentences

t(1, "máňa dala dětem kotě", @saturated, 1, 'Gramatika5: sémantika').
t(2, "pepa pase kozy", @saturated, 1, 'Gramatika5: sémantika').
t(3, "prší", @saturated, 1, 'Gramatika5: sémantika').
t(4, "štěně dala máňa pepovi", @saturated, 1, 'Gramatika5: sémantika').
t(5, "štěně dala máňa", @saturated, 0, 'Gramatika5: nenasycená valence').
t(6, "pepa prší", @saturated, 0, 'Gramatika5: chybějící valence').
t(7, "kozy daly knížky dětem", @saturated, 2, 'Gramatika5: víceznačnost acc/nom').
t(8, "děti honí kozy", @saturated, 2, 'Gramatika5: víceznačnost acc/nom').
t(9, "kluci chtějí spát", @saturated, 1, 'Gramatika5: valence inf').
t(10, "štěně chce honit kotě", @saturated, 1, 'Gramatika5: valence inf, bez neprojektivit').
t(11, "chce honit kotě štěně", @saturated, 1, 'Gramatika5: valence inf, bez neprojektivit').
t(12, "štěně kotě chce honit", @saturated, 0, 'Gramatika5: valence inf, bez neprojektivit'). 
t(13, "knížky chtějí pršet", @saturated, 0, 'Gramatika5: nulová valence'). 
t(14, "děvčata spaly", @saturated, 0, 'Gramatika5: neshoda pl n/f'). 
t(15, "děvčata rozumějí dětem", @saturated, 1, 'Gramatika5: val dat'). 
t(16, "pepa rozumí děvčata", @saturated, 0, 'Gramatika5: porušená val dat'). 
t(17, "děti chtějí spát", @saturated, 1, 'Gramatika5: val inf'). 
t(18, "máňa chce kozu", @saturated, 1, 'Gramatika5: val acc').
t(19, "děvčata chtějí děti", @saturated, 2, 'Gramatika5: víceznačnost nom/acc').
t(20, "pásli kluci", @saturated, 0, 'Gramatika5: slovosled head initial').
t(21, "rozumějí dětem děvčata", @saturated, 1, 'Gramatika5: slovosled VOS'). 
t(22, "chtějí děti spát", @saturated, 1, 'Gramatika5: slovosled VSO'). 
t(23, "kozu chce máňa", @saturated, 1, 'Gramatika5: slovosled OVS'). 
t(24, "kozu děti pasou", @saturated, 1, 'Gramatika5: slovosled OSV').
t(25, "děti kozu pasou", @saturated, 1, 'Gramatika5: slovosled SOV').
t(26, "štěně kotě honí", @saturated, 2, 'Gramatika5: slovosled OSV/SOV, víceznačnost nom/acc').
t(27, "honí štěně kotě", @saturated, 2, 'Gramatika5: slovosled OSV/SOV, víceznačnost nom/acc').
t(28, "štěně honí kotě", @saturated, 2, 'Gramatika5: slovosled SOV/VOS, víceznačnost nom/acc').
