% An HPSG Grammar for Polish, as described in 
% "Formalny opis jezyka polskiego: Teoria i implementacja".

% AUTHORS: A. Kupsc, M. Marciniak, A. Mykowiecka, A. Przepiorkowski
% LAST MODIFIED: 25.06.2002
% VERSION: 1.0


% Some restrictions: 
% modifiers - only one modifiers allowed
% hd-filler phrases - only one filler allowed

% Coordination:
%   no numerals in coordination as they have ne_subj unlike other nominals;
%   no comps raising for coordination (no RNR) but the rule allows for subject
%   sharing, and accepts coordination of NPs, VPs as well as full sentences
%   coordination for adjectives: phrases from word-adjs but no modification...
%     for prepositions: only PPs and Ps with *the same* prep can be 
%     coordinated
%     NC use of conjunction isn't computed (remains bool_t) as it slows
%     down processing about 10 times!


max:- lex_rule_depth(1). 
		 % Standard ALE constant limiting lexical rules application

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Signature + type constraints
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% General types

bot sub [sign_t, local_t, nonlocal_t, cat_t, cont_t, index_t, number_t,
	 person_t, aspect_t, tense_t, degree_t, mode_t, gender_t, head_t, case_t,
	 marking_t, bool_t, agr_t, list, synsem_t, none_t,entry_t, 
	 morsyn_t, conj_or_none_t, graph_t, argst_t, mod_t,clausality_t].


entry_t sub []
  intro [lex_phon: graph_list,
	 lex_head: head_t,
	 lex_cont: cont_t,
	 lex_neg_sens: bool_t,
         lex_rel: index_list,
         lex_res:index_list].

sign_t sub [word_t, phrase_t]
     intro [synsem: canon_ss_t,
	    phon: graph_list,
	    root: bool_t].

sign_t cons S
       goal (single_subject(S),      % SINGLE SUBJECT
	     single_mod(S)).% SINGLE MOD	
               
  
word_t sub []
      intro [val: synsem_list,  
             entry: entry_t].	


  phrase_t sub [fill_ph, val_ph] 
         intro [hd_dtr: sign_t, 
                non_hd_dtrs: phrase_list,
                 clausality: clausality_t].  

phrase_t cons P  
         goal (hfp(P),
	       cont_principle(P), 
	       hncp(P)). 

clausality_t sub [non_clause,clause_t].

clause_t sub [core_cl, rel_cl].

rel_cl sub [noun_mod_cl, cl_mod_cl ]. %, free_rel].  - not implemented

noun_mod_cl sub [wh_rel, mark_rel,red_rel].


  synsem_t sub [noncanon_ss_t, non_raised_t]
           intro [loc: local_t,
                  nonloc: nonlocal_t].

     noncanon_ss_t sub [raised_t, pro_gap_t]. 
     non_raised_t sub [pro_gap_t, canon_ss_t].
     pro_gap_t sub [pro_t,gap_t].

raised_t cons S goal (e_slash(S)).
e_slash(nonloc:slash:e_list) if true.

gap_t sub [].
gap_t cons S goal (init_gap(S), eq_loc_slash(S)).

pro_t sub [].
pro_t cons S goal init_pro(S).

init_pro((nonloc:(rel:[],slash:[]))) if true.

init_gap((nonloc:(res:[],rel:[]))) if true.
eq_loc_slash((loc:X,nonloc:slash:[X])) if true.

pro_gap_t cons S goal(g_or_p(S)).

g_or_p((gap_t;pro_t)) if true.
 
nonlocal_t sub []
           intro [slash: local_list, 
                  rel: index_list, res: index_list,
                  nc: bool_t].

max_one([]) if true.
max_one([_|e_list]) if true.               

local_t sub []
        intro [cat: cat_t,
	       cont: cont_t].

cont_t sub [nom_obj_t, psoa_t].

  nom_obj_t sub [npron_t, pron_t]
            intro [index: index_t,
	           restr: psoa_list].
    npron_t sub [].
    pron_t sub [ppro_t, ana_t].
      ppro_t sub [].
      ana_t sub [refl_t, recp_t]
        intro [bind: bool_t].
          refl_t sub [].
          recp_t sub [].

  psoa_t sub [].


index_t sub []
        intro [i_pers: person_t,
               i_gend: gender_t,
               i_number: number_t].

person_t sub [first_t, second_t, third_t].
  first_t sub [].
  second_t sub [].
  third_t sub [].


number_t sub [sg_t, pl_t].

gender_t sub [masc_neut_t, non_masc_hum_t]
         intro [num: num_t].
  masc_neut_t sub [masc_t, m23neut_t].
    masc_t sub [m12_t, m23_t].          
      m12_t sub [m1_t, m2_t].
          m1_t sub [].   % chlopiec
          m2_t sub [].   % pies
      m23_t sub [m2_t, m3_t].
        m3_t sub [].     % stol
    m23neut_t sub [m23_t,neut_t].
  non_masc_hum_t sub [m23neut_t, fem_t].
  fem_t sub [].      
  

num_t sub [accom_t, non_accom_t].
  accom_t sub [main_t, coll_t].

cat_t  sub []
       intro [head: head_t].
              
head_t sub []
       intro [mod: mod_list,
              morsyn: morsyn_t,
              conj: conj_or_none_t, 
              argst: argst_t].

   conj_or_none_t sub [conj_t, none_t].
     conj_t sub [].
     none_t sub [].

   
   argst_t sub []
     intro [subj: synsem_list, 
            args: synsem_list].

   max_a((args:S)) if (at_most3(S)).

   morsyn_t sub [agreeing_t, aspectual_t, gradable_t, adverbial_t,
		 preposition_t, marker_t]  
                 intro [prd: bool_t].  

   agreeing_t sub [cased_t, agr_and_asp_t]  
       intro  [agr: agr_t].

   cased_t sub [nominal_t, adjecti_t,case_asp_t]
       intro [agr: c_agr_t].

   aspectual_t sub [verbal_t, agr_and_asp_t]
                  intro [aspect: aspect_t,
                         neg: bool_t].

       agr_and_asp_t sub [agr_verbal_t,case_asp_t]. 

%% adding of agr_and_asp_t and agr_verbal_t allows using v_noun_t as a subtype 
%% of both cased_t oraz apectual_t

   case_asp_t sub [v_noun_t,adjp_t].

   gradable_t sub [adjective_t, adverb_t]
                 intro [degree: degree_t]. 

   verbal_t sub [agr_verbal_t, impersonal_t].
               %   intro [tense: tense_t,  
               %          mode: mode_t].
   
   agr_verbal_t sub [personal_t, l_participle_t, adjp_t].
     agr_verbal_t cons (agr:(p_agr_t;lagr_t)).

%% l_participle_t is a subtype of both verbal_t and agreeing_t (like personal_t)

   personal_t sub []
           intro [%aux: bool_t,
		  agr: p_agr_t].

      
tense_t sub [past_t, present_t, future_t, none_t].      


impersonal_t sub [infiniti_t, no_to_t, sie_t,advp_t].  %,adjp_t
     
sie_t sub [].
 
l_pariciple_t cons (agr: lagr_t). 

adverbial_t sub [advp_t, adverb_t].
   advp_t sub [prsadvp_t, pstadvp_t].
   prsadvp_t sub [].
   pstadvp_t sub [].

adjecti_t sub [adjective_t, adjp_t].
   adjp_t sub [actadjp_t, pasadjp_t].

%% adjp_t and advp_t should be subtypes of impersonal_t and gradable_t,
%% but they are not due to technical limits

aspect_t sub [perfective_t, impefective_t, none_t].
	
mode_t sub [indicative_t, conditional_t, imperative_t, none_t].

nominal_t sub [noun_t, numeral_t]
          intro [prep_pl: bool_t]. % yes_t - forms occurring after prepositions                          
                                   % only, no_t - forms that cannot occur after  
                                   % prepositions,
                                   % bool_t - both positions posible
 
noun_t sub [v_noun_t, n_noun_t].

preposition_t sub [prep_bez, not_prep_bez].
  prep_bez sub [].
  not_prep_bez sub [
    prep_na_acc,
    prep_na_loc,
    prep_obok,
    prep_pod_acc,
    prep_pod_instr,
    prep_o_acc,
    prep_o_loc,
    prep_od,
    prep_do,
    prep_ku,
    prep_miedzy,
    prep_pomiedzy,
    prep_ponizej,
    prep_poza,
    prep_powyzej,
    prep_ponad,
    prep_przeciw,
    prep_nad_acc,
    prep_nad_instr,
    prep_sposrod,
    prep_wsrod,
    prep_w_acc,
    prep_w_loc,
    prep_wewnatrz,
    prep_z_gen,
    prep_z_instr,
    prep_za,
    prep_zza].
    
   
marker_t sub []
   intro [marking: marking_t].				
    
   marking_t sub [ze_t, by_t, bo_t, co_t].
      ze_t sub [].
      by_t sub [].
      bo_t sub [].    
      co_t sub [].

     

agr_t sub [c_agr_t, p_agr_t, lagr_t]
      intro [gender: gender_t,
             number: number_t].

c_agr_t sub []
         intro [case: case_t]. 
            
p_agr_t sub []
        intro [person: person_t].
        

bool_t sub [yes_t, no_t].
  yes_t sub [].
  no_t  sub [].

case_t sub [str_t, gen_t, lex_t].
  str_t sub [nom_t, acc_t, sgen_t, null_t, voc_t].
  gen_t sub [sgen_t, lgen_t].
  lex_t sub [lgen_t, dat_t, ins_t, loc_t].
    nom_t sub [].
    dat_t sub [].
    acc_t sub [].
    ins_t sub [].
    loc_t sub [].
    sgen_t sub [].
    lgen_t sub [].
    null_t sub [].
    voc_t sub [].

degree_t sub [equal_t, comparative_t, superlative_t].



mod_t sub []
  intro [syn: morsyn_t, 
         sem: cont_t].



list sub [e_list, ne_list, synsem_list, phrase_list, psoa_list, index_list,
          local_list, graph_list, mod_list]. 

  e_list sub [].  
  ne_list sub [ne_synsem_list, ne_phrase_list, ne_psoa_list, ne_index_list,
               ne_local_list, ne_graph_list, ne_mod_list] 
          intro [hd: bot, 
                 tl: list]. 

  synsem_list sub [e_list, ne_synsem_list, noncan_list, canon_list].
    ne_synsem_list sub [ne_noncan_list,
          	        ne_canon_list]
                   intro [hd: synsem_t, 
			  tl: synsem_list].

  canon_list sub [e_list, ne_canon_list].
    ne_canon_list sub []
         intro [hd: canon_ss_t, 
                tl: canon_list].

  noncan_list sub [e_list, ne_noncan_list].
    ne_noncan_list sub []
         intro [hd: noncanon_ss_t, 
                tl: noncan_list].

  phrase_list sub [e_list, ne_phrase_list].
    ne_phrase_list sub []
                 intro [hd: phrase_t, 
			tl: phrase_list].

  psoa_list sub [e_list, ne_psoa_list].
    ne_psoa_list sub []
                 intro [hd: psoa_t, 
			tl: psoa_list].
			
  index_list sub [e_list, ne_index_list].
    ne_index_list sub []
                 intro [hd: index_t, 
			tl: index_list].
			
  local_list sub [e_list, ne_local_list].
    ne_local_list sub []
                 intro [hd: local_t, 
			tl: local_list].
			
  graph_list sub [e_list, ne_graph_list].
    ne_graph_list sub []
                 intro [hd: graph_t, 
			tl: graph_list].


  mod_list sub [e_list, ne_mod_list].
    ne_mod_list sub []
           intro [hd: mod_t, 
                  tl: mod_list].

%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  %
%  % Schema
%  %
%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'<word>' rule % a rule to transform entry_t to word_t and add modifiers
(word_t, W,
  phon: Phon,
  synsem:loc:(cat:head: (morsyn: X,
	                 argst: (subj: S,
			         args: AS),
			 conj:Cn,
			 mod:Y),
              cont: C),  
  entry: HDtr)
===>
cat> (HDtr,
	entry_t,
	lex_phon: Phon,
	lex_head: (morsyn: X,
	           argst: (subj: S,
		           args: A),
		   conj:Cn,
		    mod:Y),
	lex_cont: C),
	
goal> ( empty_entry_mod(A),
        prolog(N=1),          % only one modifier
%	lex_principle(X,C),    % semantics is specified directly in
	                       % entries but this can be changed :) 
	at_most(N,M),
	canon(M),              % only canonical modifiers added
	add_modifiers(X,M),
	append(A,M,AS), append(AS,S,ASS),
	ini_nl(W,ASS)). 

ini_nl((synsem:nonloc:(slash:e_list,rel:R,res:RS),
        entry:lex_rel:R,entry:lex_res:RS),[]) if true.
ini_nl(_, [_|_]) if true.

% semantics doesn't change but should depend on the presence/absence of 
% modifiers

add_modifiers(_,[]) if true.
add_modifiers(X,[(loc:(cat:head:(mod:[syn:X])))]) if true.


lex_principle((nominal_t;adjective_t;preposition_t),nom_obj_t) if true.
lex_principle((verbal_t;adverbial_t;marker_t),psoa_t) if true.

% arguments have to have empty 'mod' 
empty_entry_mod([]) if true.
empty_entry_mod([(loc:cat:head:mod:e_list)|Slist]) if empty_entry_mod(Slist).
  

%%%%%%%%%%%%%%%%
% realisation of all arguments and (optionally) one modifier
%%%%%%%%%%%%%%%
schema1 rule	
   (Mother, val_ph,
    hd_dtr: HDtr, 
    non_hd_dtrs: NHdtr,
    phon: Mphon)

   ===>
    goal> (prolog(N=3), at_most(N,NHdtr1)),
    cats> NHdtr1,
    cat> (HDtr,     phon: Hphon,
          synsem:loc:cat:head:(morsyn:M,
			       conj:none_t),
	  val: X), 
    goal> (word_principles(HDtr),
	   left_right_dtrs(M,NHdtr1,NHdtr2), % to fix the order of Hdtr with 
                                 % respect to NHdtrs depending on 
                                 % its MORSYN ue 
	   synsems_to_signs(X,Slist),
	   same_length(X,NHdtr),   
				% to ensure that there are no empty modifiers 
           permutation(Slist,NHdtr),      % Slist permuted to NHdtr
	   append(NHdtr1,NHdtr2,NHdtr)
         ),  % NH1 + NH2 = NHdtr
    cats> NHdtr2,
    goal> (
	  % principle_a(HDtr),   % veeery slow; switched off once tested
	   non_root_list([HDtr|NHdtr]),
	   root_condition(Mother,HDtr),phon_list(NHdtr,Nphon),  
	   nla1_principle(HDtr),
	   nli_principle(Mother),
         clausality_principle(Mother)  
).

same_length([],[]) if true.
same_length(tl:Xs,tl:Ys) if
  same_length(Xs,Ys).
phon_list([],[]) if true.
phon_list([X|Y], [PX|PY]) if phon(X,PX), phon_list(Y,PY).
phon((phon:X),X) if true.


%%%%%%%%%%%%%%%%%%%%%%%
% hd-filler schema
%%%%%%%%%%%%%%%%%%%%%%%

schema11 rule	
   (Mother, fill_ph,  % one 'filler' only
    hd_dtr: HDtr, 
    non_hd_dtrs: [NHdtr],     phon: Mphon,
    synsem:nonloc: (slash:e_list,rel:e_list, res:e_list))
    
   ===>
    cat> (NHdtr, synsem:loc:S,synsem:nonloc:(slash:[], rel:[_|_],res:[]),
          phon:Nphon),
    cat> (HDtr,     phon: Hphon,
	    phrase_t,
          synsem:loc:cat:head:(morsyn:M,
			       conj:none_t),
	    synsem:nonloc:slash:[S|[]],
          synsem:loc:cat:head:argst:AS),
	goal> (
	  % principle_a(HDtr),   % veeery slow; switched off once tested
	   non_root_list([HDtr|[NHdtr]]),
         root_condition(Mother,HDtr), 
         dependents_not_raised(AS),
         clausality_principle(Mother)).

%%%%%%%%%%%%%%%%%%%%%%
% coordination schema
%%%%%%%%%%%%%%%%%%%%%%
schema21 rule			
   (Mother, val_ph,
    phon: Mphon,
    hd_dtr: HDtr, 
    non_hd_dtrs: NHdtr)

   ===>
    goal> (prolog(N=2), at_most(N,NHdtr1)),
    cats> NHdtr1, 
    cat> (HDtr, 
          phon: Hphon,
          synsem:loc:(L, cat:head:(H,
			       (morsyn:M,
			        argst:A,
			        conj: conj_t))),
	  val: X), 
    goal> (
	   category(M,A),
	   conj_agr(M,L),
	   argst_principle(H,X),
	   synsems_to_signs(X, NHdtr), % only SUBJ + ARGS order possible
	   append(NHdtr1, NHdtr2, NHdtr)), % NH1 + NH2 = NHdtr 
    cats> NHdtr2,
    goal> (
	   non_root_list([HDtr|NHdtr]),
	   root_condition(Mother,HDtr),
   	  nla1_principle(HDtr),
	  nli_principle(Mother),
        clausality_principle(Mother)  
). 


category(M, (subj:S, args:A))
    if morsyn(M,A), conj_(S,A).

morsyn(nominal_t, [loc:cat:head:morsyn:nominal_t, 
		   loc:cat:head:morsyn:nominal_t])
    if true.   

morsyn((verbal_t, neg:N), [loc:cat:head:morsyn:(verbal_t,neg:A),
		           loc:cat:head:morsyn:(verbal_t,neg:B)])
    if neg_verb(A,B,N).    

neg_verb(A,B,A) if equal(A,B).
neg_verb(yes_t,no_t,no_t) if true.
neg_verb(no_t,yes_t,no_t) if true.

morsyn(adjecti_t, [loc:cat:head:morsyn:adjecti_t,
		      loc:cat:head:morsyn:adjecti_t])
    if true. 

morsyn(preposition_t, [loc:cat:head:morsyn:preposition_t,
		       loc:cat:head:morsyn:preposition_t])
    if true. 


conj_(S, ([loc:cat:head:argst:subj:SC,      % different subjs of components
	      loc:cat:head:argst:subj:SC1]))  
   if check(SC,SC1,S).

check(([];[canon_ss_t]),([];[canon_ss_t]),[]) if true.
check((X,[pro_t]),(X,[pro_t]),[]) if true.
check((X,[(raised_t,loc:L,nonloc:N)]),X,[(loc:L,nonloc:N)]) if true. 

conj_subj((A,([];[non_raised_t])),A) if true.
conj_subj([loc:L],[(raised_t,loc:L)])
   if true.			% the subject of conjuncts may be raised...

canon([]) if true.
canon((hd:canon_ss_t,tl:R))
   if canon(R).  


conj_agr((nominal_t,agr:gender:X,agr:number:N), (cont:index:(i_pers:P,
				                i_gend:X,
				                i_number:N), % for most (?) cases
		                    cat:head:(H,argst:A)))
  if person(P,A), c_np_agr(H).

conj_agr((agr_verbal_t,agr:A), % pers-verb conjs with noncanon subj --> pers-verb
	 (cat:head:argst:args:[loc:cat:head:(morsyn:agr:A,
					     argst:subj:[noncanon_ss_t]),
		               loc:cat:head:(morsyn:agr:A,
					     argst:subj:[noncanon_ss_t])])) if
        true.

conj_agr(impersonal_t,  % verbal conjs with realised subjs --> impersonal  
	 (cat:head:argst:args:[loc:cat:head:(morsyn:verbal_t,
					     argst:subj:([];[canon_ss_t])),
			       loc:cat:head:(morsyn:verbal_t,
					     argst:subj:([];[canon_ss_t]))])) if
        true. 

conj_agr((adjecti_t,agr:X),
	 (cat:head:argst:args:[loc:cat:head:morsyn:(adjecti_t,agr:X),
        	               loc:cat:head:morsyn:(adjecti_t,agr:Y)])) if
         equal(X,Y). 

conj_agr((X,preposition_t),
	 (cat:head:argst:args:[loc:cat:head:(morsyn:X,
					     argst:args:canon_list),
			       loc:cat:head:(morsyn:(Y,preposition_t),
					     argst:args:canon_list)]))
         if equal(X,Y).

person(P, (args:[loc:cont:index:i_pers:X,
		 loc:cont:index:i_pers:Y]))
  if min(X,Y,P).

min(first_t,_,first_t) if true.
min((second_t;third_t),first_t,first_t) if true.
min(second_t,(second_t;third_t),second_t) if true.
min((second_t;third_t),second_t,second_t) if true.
min(third_t,third_t,third_t) if true.

c_np_agr((morsyn:agr:(case:A,gender:G,number:pl_t),   % CP must include coordination...
	  argst:args:[loc:cat:head:morsyn:agr:(case:A,gender:X),
		      loc:cat:head:morsyn:agr:(case:A,gender:Y)]))
   if gender(X,Y,G). 

case(X,X,X) if true.

gender(m1_t,_,m1_t) if true.
gender(_,m1_t,m1_t) if true.
gender(non_masc_hum_t,non_masc_hum_t,non_masc_hum_t) if true.



left_right_dtrs((preposition_t; marker_t),[],_)
  if true.               % arguments of prepositions & markers only to the right
left_right_dtrs((nominal_t;gradable_t;verbal_t),_,_)
  if true.               % arguments of other categories can occur anywhere

at_most(_,[]) if true.
at_most(N,[_|R]) if
  prolog(N > 0),
  prolog(N1 = N - 1),
  at_most(N1,R).

word_principles((synsem:(loc:cat:head:Head,
			 nonloc:nc: NC),
		 val:Val,
		 entry:lex_neg_sens:NS)) if
   argst_principle(Head,Val), 
   nc_ue(Head,NS,NC),   
   case_principle(Head),
   agreement_principle(Head).  % added to rule; otherwise too many solutions


%%%%%%%%%%%%%%%%%%%%%%%%%
%
% NEGATIVE CONCORD
%
%%%%%%%%%%%%%%%%%%%%%%%%%

nc_ue((morsyn:(@not_neg),
	  argst:(subj:S,
		 args:AS)), NS,NC) if append(S,AS,X), count_nc(X,NS,NC).
nc_ue((morsyn:neg:no_t,  
       	  argst:(subj:S,
 	         args:AS)), NS, NC) if append(S,AS,X),
                                       count_nc(X,NS,NC), equal(NC,no_t). 
nc_ue((morsyn:((neg:yes_t); prep_bez)), no_t,no_t) if true.

count_nc(_,yes_t,yes_t) if true.
count_nc(X,no_t,Y) if sum_neg(X,Y).

sum_neg([],no_t) if true.
sum_neg((hd:nonloc:nc:yes_t), yes_t) if true.
sum_neg((hd:nonloc:nc:no_t,tl:X), Y) if sum_neg(X,Y).

equal(X,X) if true.

not_neg macro (adjective_t; n_noun_t; numeral_t; adverb_t;  
		    marker_t; not_prep_bez). 



%%%%%%%%%%%%% ARGST PRINCIPLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

argst_principle((argst:(subj:X,
                        args:Y)), Z)
    if append(X,Y,New), take_canons(New,Z).

take_canons([],[]) if true.
take_canons([noncanon_ss_t|R],Z) if take_canons(R,Z).
take_canons([(A,canon_ss_t)|R],[A|Z]) if take_canons(R,Z).


% Root condition: all arguments in argst of root utterances are non_raised_t.
% This is formulated as a condition on head daughters of root clauses
% because a straightforward implementation as a condition on mothers leads
% to infitnite loops.


% nonlocal features are empty

root_condition((root:yes_t),((synsem:loc:cat:head:argst:AS),
synsem:nonloc:(slash:e_list,res:e_list, rel:e_list))) if
  dependents_not_raised(AS). 

root_condition((root:no_t),_) if true.

raised_member((subj:S,args:AS)) if
  append(S,AS,X), member(raised_t,X).

member(X,hd:X) if true.
member(X,tl:R) if member(X,R).

dependents_not_raised((subj:S,args:AS)) if
  non_raised_list(S),
  non_raised_list(AS).

non_raised_list([]) if true.
non_raised_list([non_raised_t|Rest]) if
  non_raised_list(Rest).


non_root_list([]) if true.
non_root_list([(root:no_t)|Rest]) if
  non_root_list(Rest).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  Binding
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

principle_a(synsem:loc:cat:head:argst:(subj:X,args:Y))
   if check_argst(X,Y).

check_argst(([];[loc:cont:psoa_t]),_) if true. 
check_argst([(X,loc:cont:nom_obj_t)],R) if
  list_bind(X,R).

list_bind(_,[]) if true.
list_bind(X,[H|R]) if 
    s_bind(X,H), 
    check_argst([X],R). 

  s_bind((loc:(cat:head:morsyn:nominal_t,
	       cont:(nom_obj_t,
	             index:X))),
	 (loc:(cat:head:(morsyn:nominal_t,
			 argst:args:[]),
	       cont:((npron_t;ppro_t),
		      index:(=\=X))))) if true. 
  s_bind((loc:cont:index:I),(loc:(cat:head:(morsyn:nominal_t,
					    argst:args:[]),
				  cont:((ana_t,bind:yes_t,index:I);
					 ana_t)
				 ))) if true.

  s_bind((loc:cont:nom_obj_t),(loc:(cat:head:morsyn:(agr_verbal_t;
						     adverbial_t;
						     adjecti_t;
						     marker_t),
        		            cont:psoa_t))) if true.

  s_bind((X,loc:cont:nom_obj_t),(loc:cat:head:(morsyn:(infiniti_t),
		                               argst:args:A))) if
           non_raised_list(A),list_bind(X,A).

  s_bind((X,loc:cont:nom_obj_t),(loc:cat:head:(morsyn:infiniti_t,
		          argst:args:A))) if
           raised_list(A). 

% it's OK if a pronoun/anaphora is only one level deeper...
  s_bind((X,loc:cont:nom_obj_t),(loc:cat:head:(morsyn:nominal_t,
		                               argst:args:[(B,canon_ss_t,
				        loc:cat:head:(morsyn:nominal_t,
						      argst:args:[]))]))) if 
           s_bind(X,B).


raised_list([]) if true.
raised_list([raised_t|Rest]) if
  raised_list(Rest).

not_personal macro (cased_t; impersonal_t; marker_t; preposition_t). 

%%%%%% Constraints added to types: %%%%%%%%%

hfp((_ph,synsem:loc:cat:head:X,
     hd_dtr:synsem:loc:cat:head:X)) if true.


hfp((fill_ph,synsem:loc:cat:head:(morsyn:M, argst:A, conj:C),
      hd_dtr:synsem:loc:cat:head:(morsyn:M,argst:A, conj:C)
   )) if true.   

single_subject((synsem:loc:cat:head:argst:subj:([]; tl:[]))) if true.

single_mod((synsem:loc:cat:head:mod:([]; tl:[]))) if true.

single_rel_res((synsem:nonloc:(rel:R,res:RS))) 
	if (append(R,RS,[]); append(R,RS,[_])).

single_rel((synsem:nonloc:rel:([]; tl:[]))) if true.
single_res((synsem:nonloc:res:([]; tl:[]))) if true.
single_slash((synsem:nonloc:slash:([]; tl:[]))) if true. % tymczasowo

cont_principle((synsem:loc:cont: X,
		hd_dtr:synsem:loc:cont: X)) if true.

hncp((synsem:nonloc:nc: X,
      hd_dtr:synsem:nonloc:nc: X)) if true.


shuffle([], [], []) if true. 
shuffle([H|R], L1, [H|L]) if shuffle(R, L1, L).
shuffle(L1, [H|R], [H|L]) if shuffle(L1, R, L).

   append([], X) +++> X.
   append([H|R], L) +++> [H|append(R,L)].

at_most3(([]; tl:[]; tl:tl:[]; tl:tl:tl:[])) if true. 


%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   %
%   % AGREEMENT PRINCIPLE
%   %
%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

agreement_principle((Head, morsyn:personal_t)) if
      vap_verb_fin(Head).

agreement_principle((morsyn:(impersonal_t;
			     nominal_t;
			     adverbial_t;
			     preposition_t;
			     marker_t))) if
      true.

agreement_principle((morsyn:(adjective_t,
			     mod:[syn:agr:(X, c_agr_t)],
                 	     agr:X))) if true. 

  vap_verb_fin((Head,
	      argst:subj:hd:loc:cat:head:morsyn:(nominal_t,
                                                 agr:case:nom_t))) if
     vap_true_agreement(Head).

  vap_verb_fin((Head,
                argst:subj:hd:loc:cat:head:morsyn:(nominal_t,
                                                   agr:case:(@not_nom))))
     if vap_3rdsingneut_agreement(Head).

  vap_verb_fin((Head,
                argst:subj:hd:loc:cat:head:morsyn:(@not_nominal))) if
      vap_3rdsingneut_agreement(Head).

  vap_verb_fin((Head,
                argst:subj:[])) if
      vap_3rdsingneut_agreement(Head).
   
  vap_true_agreement((morsyn:agr:(person:P,number:N,
                                       gender:G),
                      argst:subj:hd:loc:cont:index:(@index(P,N,G)))) if
		true.

   vap_3rdsingneut_agreement((morsyn:agr:(person: third_t,number:sg_t,
                                          gender: neut_t))) if
      true.

not_nom macro (acc_t;gen_t;dat_t;ins_t;loc_t;voc_t;null_t).
not_nominal macro (gradable_t; verbal_t; preposition_t; marker_t).
index(Pers, Numb,Gend) macro 
     index_t,
     i_pers: Pers,
     i_number: Numb,
     i_gend: Gend.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Case Principle
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

case_principle((morsyn:M,
		argst:(subj:S,
		       args:AS))) if
  cp_subj(M,S),
  cp_args(M,AS).

cp_subj(_,[]) if true.
cp_subj(_,[raised_t]) if true.
cp_subj(HM,[(non_raised_t,
	    loc:cat:head:morsyn:SM)]) if
  cp_subj_nr(HM,SM).

cp_subj_nr(_,@not_cased) if true.
cp_subj_nr(_,agr:case:lex_t) if true.
cp_subj_nr(HM,(SM,agr:case:str_t)) if
  cp_subj_true(HM,SM).

cp_subj_true(agr_verbal_t,(numeral_t,agr:case:acc_t)) if true. 
cp_subj_true(agr_verbal_t,(noun_t,agr:case:nom_t)) if true.
cp_subj_true(impersonal_t,agr:case:null_t) if true.
cp_subj_true(nominal_t,agr:case:gen_t) if true. 

% no case is assigned to arguments of markers, adverbs, adjectives or nominals; 
% *real* complements of nominals are in genitive, e.g.: dom janka_gen;
% czytanie ksiazki_gen; but since 
% adjectives are present on ARGS, the case should agree with the nominal head,
% e.g.: piekny_nom jan_nom; pieknego_gen domu_gen;
cp_args((marker_t;adverb_t;adjective_t;nominal_t),_) if true.
cp_args(preposition_t,AS) if assign_list(AS,acc_t).
cp_args((verbal_t,neg:no_t),AS) if assign_list(AS,acc_t).
cp_args((verbal_t,neg:yes_t),AS) if assign_list(AS,gen_t).

assign_list([],_) if true.
assign_list([F|R],Case) if
  assign_argument(F,Case),
  assign_list(R,Case).

assign_argument(raised_t,_) if true.
assign_argument((non_raised_t,loc:cat:head:morsyn:(@not_cased)),_) if true.
assign_argument((non_raised_t,loc:cat:head:morsyn:agr:case:lex_t),_) if true.
assign_argument((non_raised_t,loc:cat:head:morsyn:agr:case:(str_t,Case)),Case) if true.


not_cased macro (verbal_t;adverbial_t;preposition_t;marker_t).

nom_list([]) if true.
nom_list([(H,nominal_t)|R]) if nom_list(R).

adj_list([]) if true.
adj_list([(H,adjective_t)|R]) if adj_list(R).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Non-local Amalgamation Principle 
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

nla1_principle(phrase_t) if true.


nla1_principle((word_t, entry:(lex_rel:LR,lex_res:LRS),
                       synsem:(loc:cat:head:argst:(subj:X, args:Y), 
                       nonloc:(slash:Slash, rel:Rel, res:Res))))
if   append(X,Y,Z), 
     ((empty(Z), empty(Slash), make(Rel, LR), make(Res, LRS));
     (nempty(Z), nempty(LR),  make(Rel, LR),empty(Res), empty(Slash));
     (nempty(Z), nempty(LRS), make(Res, LRS),empty(Rel), empty(Slash));
     (nempty(Z), empty(LR),empty(LRS), find_rel(Z,Rel),find_res(Z,Res), 
      find_slash(Z,Slash))).
 
find_rel([],[]) if true.
find_rel([X|Y], Z) if (nerel(X,Z); (erel(X),find_rel(Y,Z))).

nerel((nonloc:rel:[X]),[X]) if true.
erel(nonloc:rel:e_list) if true.

find_res([],[]) if true.
find_res([X|Y], Z) if (neres(X,Z); (eres(X),find_res(Y,Z))).

neres((nonloc:res:[X]),[X]) if true.
eres(nonloc:res:e_list) if true.

find_slash([],[]) if true.
find_slash([X|Y], Z) if (neslash(X,Z); (eslash(X),find_slash(Y,Z))).

neslash((nonloc:slash:[X]),[X]) if true.
eslash(nonloc:slash:e_list) if true.

make(X,X) if true.

% ponizsza, ogolniejsza regula nie dziala z niewiadomych powodow


nla_principle(phrase_t) if true.
nla_principle((word_t, entry:(lex_rel:LR,lex_res:LRS),
                       synsem:(loc:cat:head:argst:(subj:[], args:Y), 
                               nonloc:(slash:Slash, rel:Rel, res: Res))))
   if   ss_slashes(Y,Slash), 
        ss_rels(Y, R), append(LR,R,Rel),
                            ss_ress(Y,RS), append(LRS,RS,Res).
   first([],[]) if true.
   first([X|_],X) if true.
 
nla_principle((word_t, entry:(lex_rel:LR,lex_res:LRS),
                       synsem:(loc:cat:head:argst:(subj:[X], args:Y), 
                       nonloc:(slash:Slash, rel:Rel, res:Res))))
if   ss_slash(X,Slash), 
     ss_rel(X, R), append(LR,R,Rel),
     ss_res(X, RS), append(LRS,RS,Res).

 
ss_slashes([],[]) if true.
ss_slashes([X|Y], Z) if ss_slash(X, X1), ss_slashes(Y,Y1), append(X1,Y1,Z).

ss_slash(nonloc:slash:X,X) if true.

ss_rels([],[]) if true.
ss_rels([X|Y], Z) if ss_rel(X, X1), ss_rels(Y,Y1), append(X1,Y1,Z).

ss_rel(nonloc:rel:X,X) if true.

ss_ress([],[]) if true.
ss_ress([X|Y], Z) if ss_res(X, X1), ss_ress(Y,Y1), append(X1,Y1,Z).

ss_res(nonloc:res:X,X) if true.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ------------------------------
% Non-local Inheritance Principle 
% -------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

nli_principle(word_t) if true.
nli_principle(fill_ph) if true.

nli_principle((val_ph, 
clausality:(core_cl;non_clause),
 (synsem:nonloc:X, hd_dtr:synsem:nonloc:X))) if true.
 
nli_principle((val_ph, clausality:rel_cl, 
               synsem:nonloc:(rel:e_list, res:e_list, slash: e_list)))
if true.


%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CLAUSALITY %
%%%%%%%%%%%%%%%%%%%%%%%%%%%

clausality_principle((S, val_ph, clausality:core_cl)) if 
  e_rel(S),
  empty_mod(S), 
  verbal_type(S).
             
clausality_principle((S,clausality:non_clause)) 
     if (cased_type(S);preposition_type(S);
          (marker_type(S), nonmarked_co(S));
           gradable_type(S);
           adverbial_type(S)).    
   

clausality_principle((S,clausality:rel_cl,
		        synsem:loc:cat:head:argst: subj:([];[non_raised_t]))) 
	 if ((verbal_type(S);marked_co(S)), non_empty_mod(S), relcl(S)). 
	 
relcl(S) if (mod_nominal_type(S), nounmodcl(S)).

nounmodcl(((clausality:wh_rel,
            non_hd_dtrs:hd:synsem:nonloc:rel:[Y],
            synsem:loc:cat:head:mod:hd:sem:index:Y);
(clausality:mark_rel,
        synsem:loc:cat:head:mod:hd:sem:index:X,
        synsem:loc:cat:head:morsyn:marking:co_t,
        synsem:loc:cat:head:mod:hd:syn:nominal_t,
        hd_dtr:synsem:nonloc:res:[X]))) 
if true.

cl_mod_cl((clausality:cl_mod_cl, synsem:loc:cat:head:mod:hd:syn:verbal_t))
if true.

%                 argst:(subj:(S,([];[non_raised_t])))).%, 
%                        args:(A, non_raised_list(A)))). 
% nie ma zapewnienia, ze argumenty nie sa raised (jak?)

verbal_type(synsem:loc:cat:head:morsyn:verbal_t)  
		if true.
marker_type(synsem:loc:cat:head:morsyn:marker_t) if true. 
preposition_type(synsem:loc:cat:head:morsyn:preposition_t) if true. 
adverbial_type(synsem:loc:cat:head:morsyn:adverbial_t) if true. 
gradable_type(synsem:loc:cat:head:morsyn:gradable_t) if true. 
cased_type(synsem:loc:cat:head:morsyn:cased_t) if true. 
nonmarked_co(synsem:loc:cat:head:morsyn:marking:(ze_t; by_t; bo_t)) if true.
marked_co(synsem:loc:cat:head:morsyn:marking:co_t) if true.
empty_mod(synsem:loc:cat:head:mod:[]) if true. 
non_empty_mod(synsem:loc:cat:head:mod:[X|_]) if true. 
are_relres(synsem:nonloc:(rel:[], res: [])) if true.   
e_rel(synsem:nonloc:rel:[]) if true.   
mod_nominal_type(synsem:loc:cat:head:mod:hd:syn:nominal_t) if true.

%   %%%%%%%%%%%%%%%%%%%%%%%%%%%
%   % Pomocnicze
%   %%%%%%%%%%%%%%%%%%%%%%%%%%%

  synsems_to_signs([],[]) if  true.
  synsems_to_signs([Syns|SynsList],[(sign_t, synsem:Syns)|SignList]) if 
    synsems_to_signs(SynsList,SignList).  


  append([], X, X) if true.
  append([H|R],L,[H|L1]) if append(R,L,L1).


  permutation([], []) if true.
  permutation(L, [H|R]) if
    select(H, L, L1), permutation(L1, R).



  select(Z, [Z|Xs], Xs) if true.
    select(Z, [Y|Ys], [Y|Zs]) if 
    select(Z, Ys, Zs).



  sign_list_phon([], []) if true.
  sign_list_phon([(sign_t, phon:P)|SignList], [P|PhonList]) if 
    sign_list_phon(SignList, PhonList).  

 nempty([_|X]) if true.
 empty([]) if true.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Lex rule for negation: for every (sub)type of verbal individually...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

neg_pers lex_rule
  (entry_t,
   lex_head:(morsyn:(personal_t,
			 agr: Ag,  
                         neg: no_t,
			 %mode: Mo,
			 aspect: As,
			 %aux: Au,
			 %tense: T,	 
			 prd: P),
                mod: M,
                argst: A,
		conj: Co),
  lex_cont: C,
  lex_neg_sens: NS,
  lex_rel: R,
  lex_res:RS)

  **> (entry_t,
       lex_head:(morsyn:(personal_t,
			 agr: Ag,  
                         neg: yes_t,
			 %mod: M,
			 %mode: Mo,
			 aspect: As,
			 %aux: Au,
			 %tense: T,	 
			 prd: P),
                mod: M,
                argst: A,
		conj: Co),
      lex_cont: C,
      lex_neg_sens:NS,
      lex_rel: R,
      lex_res:RS)      


  morphs
    X becomes (nie_,X).


neg_inf lex_rule
  (entry_t,
   lex_head:(morsyn: (infiniti_t,
                         neg: no_t,
			 prd: P,
			 aspect: As),
			 
                mod: M,
                argst: A,
		conj: Co),
   lex_cont: C,
   lex_neg_sens:NS,
   lex_rel: R,
   lex_res:RS)  

  **> (entry_t,
       lex_head:(morsyn: (infiniti_t,
                         neg: yes_t,
			 prd: P,
			 aspect: As),
                mod: M,
                argst: A,
		conj: Co),
       lex_cont: C,
       lex_neg_sens:NS,
       lex_rel: R,
       lex_res:RS)  

  morphs
    X becomes (nie_,X).


   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %
   %        Words
   %
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  
graph_t sub [jan, jana, janem, janowi, domu, kwiaty, marysi, marysia, ksiazke,
	       kwiatow, dziecko,
psa,
	       on, niego, jego, go, 
               ona, niej, jej, 
               siebie, sobie, sie, swoje, swojego,
               ja, moje, mojego, nikt, nikomu, niczego, ktory,ktorego,
               idzie, ide, isc, ida, spi, spia,
               biegnie, mowi, powiedzial,
               kazal, kazalam, 
               obiecal, obiecalam, chce,
               kazal,
ma,
               dal,  
               kupil, przewiozl, kupili,
uzyl,
               kupic, isc, 
               piekne, pieknego, duze, piekny,
               szybko, szybciej, najszybciej, bardzo, pieknie, 
               ze, by, do,od,co,
	       i,
	       piec].

jan ---> @pn_lex(jan, nom_t, m1_t,sg_t,no_t,npron_t).
dziecko ---> @cn_lex(dziecko, (nom_t;acc_t), neut_t,sg_t,no_t,npron_t,[@np_ss(str_t)]).
kwiaty ---> @pn_lex(kwiaty, (nom_t;acc_t),m2_t,pl_t,no_t,npron_t).
kwiato_w ---> @pn_lex(kwiatow, gen_t,m2_t,pl_t,no_t,npron_t).
marysi ---> @pn_lex(marysi, (dat_t;gen_t), fem_t,sg_t,no_t,npron_t).
marysia ---> @pn_lex(marysi, nom_t, fem_t,sg_t,no_t,npron_t).
ksia_z_ke_ ---> @pn_lex(ksiazke, acc_t, fem_t,sg_t,no_t,npron_t).
janem ---> @pn_lex(janem, ins_t, m1_t,sg_t,no_t,npron_t).
nikt ---> @pn_lex(nikt, nom_t, m1_t,sg_t,yes_t,npron_t).
nikomu ---> @pn_lex(nikomu, dat_t, m1_t,sg_t,yes_t,npron_t).
niczego ---> @pn_lex(nikomu, gen_t, neut_t,sg_t,yes_t,npron_t).
sobie --->  @pn_lex(sobie, dat_t,_,_,no_t,ana_t).
siebie --->  @pn_lex(siebie, (gen_t;acc_t),_,_,no_t,ana_t).
jego --->  @pn_lex(jego, (gen_t;acc_t), masc_neut_t,sg_t,no_t,ppro_t).
swoje ---> @pron_lex(swoje,ana_t,acc_t,non_masc_hum_t,pl_t).
kto_ry ---> @pron_rel(ktory,nom_t, masc_t,sg_t).
kto_rego ---> @pron_rel(ktory,(gen_t;acc_t), masc_t,sg_t).
kto_ra_ ---> @pron_rel(ktory,(acc_t), fem_t,sg_t).
psa --->  @pn_lex(psa, (gen_t;acc_t),m2_t,sg_t,no_t,npron_t).



on ---> @pron_pers_lex(on,nom_t,masc_t,sg_t,third_t).
jego ---> @pron_pers_lex(on,gen_t,masc_neut_t,sg_t,third_t).

ma ---> @personal_lex(ma,[@np_ss(str_t)],[@np_ss(str_t)],gender_t,sg_t,third_t,no_t,no_t).
idzie ---> @personal_lex(idzie,[@np_ss(str_t)],[],gender_t,sg_t,third_t,no_t,no_t).
s_pi ---> @personal_lex(spi,[@np_ss(str_t)],[],gender_t,sg_t,third_t,no_t,no_t).
ida_ ---> @personal_lex(ida,[@np_ss(str_t)],[],gender_t,pl_t,third_t,no_t,no_t).
s_pia_ ---> @personal_lex(spia,[@np_ss(str_t)],[],gender_t,pl_t,third_t,no_t,no_t).

uz_yl_ ---> @personal_lex(uzyl,[@np_ss(str_t)],[@np_ss(gen_t)],masc_t,sg_t,third_t,no_t,no_t). 

kupil_ ---> @personal_lex(kupil,[@np_ss(str_t)],[@np_ss(str_t)],masc_t,sg_t,third_t,no_t,no_t). 
kupili ---> @personal_lex(kupili,[@np_ss(str_t)],[@np_ss(str_t)],masc_t,pl_t,third_t,no_t,no_t).
dal_ ---> 
@personal_lex(dal,[@np_ss(str_t)],[@np_ss(str_t),@np_ss(dat_t)],masc_t,sg_t,third_t,no_t,no_t). 

przewio_zl_ ---> 
@personal_lex(przewiozl,[@np_ss(str_t)],
[@np_ss(str_t),@np_ss(dat_t),@np_ss(ins_t)],masc_t,sg_t,third_t,no_t,no_t). 
                       
mo_wi ---> 
@personal_lex(mowi,[@np_ss(str_t)],[@ms(ze_t)],gender_t,sg_t,third_t,no_t,no_t). 
is_c_ ---> @impersonal_lex(isc,infiniti_t,[],no_t,no_t).
kupic_ ---> @impersonal_lex(kupic,infiniti_t,[@np_ss(str_t)],no_t,no_t).
chce ---> 
@personal_lex(chce,[(@np_ss(str_t),loc:cont:index:I)],[@vp_ss(infiniti_t,
              [loc:cont:index:I],_)],gender_t,sg_t,third_t,no_t,no_t);
	  @personal_lex(chce,[(@np_ss(str_t),loc:cont:index:I)],
		    [@vp_ss(infiniti_t,[loc:cont:index:I],[(raised_t,loc:L)]) 
|[(canon_ss_t,loc:L)]],gender_t,sg_t,third_t,no_t,no_t).

kazal_ ---> 
@personal_lex(kazal,[@np_ss(str_t)],[(@np_ss(dat_t),loc:cont:index:I),@vp_ss(infiniti_t,[loc:cont:index:I])],gender_t,sg_t,third_t,no_t,no_t);
	  @personal_lex(kazal,[@np_ss(str_t)],[(@np_ss(dat_t),loc:cont:index:I),
		    @vp_ss(infiniti_t,[loc:cont:index:I],[(raised_t,loc:L)]) 
|[(canon_ss_t,loc:L)]],gender_t,sg_t,third_t,no_t,no_t).

i ---> @conj(i).



conj(Phon) macro
  entry_t, % make it word_t, or define semantics...
  lex_phon:[Phon],
  lex_head:(mod:M, 
		       argst:args:[(canon_ss_t,loc:cat:head:(mod:M,
						argst:args:canon_list)),
		                   (canon_ss_t,loc:cat:head:(mod:M,
						argst:args:canon_list))],
		       conj:conj_t), % 2 conjuncts, no comps raising
  lex_neg_sens:no_t,
  lex_rel: e_list,
  lex_res: e_list.


%%%%%%%%%% markers
            
z_e ---> @mp_lex(ze,[@vp_ss_nr(personal_t)],ze_t),@marker_relres(e_list,e_list).
by ---> @mp_lex(by, [@vp_ss_nr(verbal_t)], by_t), @marker_relres(e_list,e_list).
         

co --->  @mp_lex_nemod(co,[@vp_ss_nr(personal_t)],co_t), 
         @marker_relres(e_list,ne_list),@e_slash.

% wymagania nie raised: 
%   nie chciala zeby ja zobaczyl/ nie chciala jej zobaczyc
% konieczne dla 'co'
% 


marker_relres(Rel, Res) macro
        lex_head:argst:args:hd:nonloc:
	    (rel:Rel, res: Res).
e_slash macro 	lex_head:argst:args:hd:nonloc:
slash:e_list.
	    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  pie_c_ ---> @num(piec,str_t,gender_t).

do ---> @prep_lex(do,prep_do,gen_t). 
szybko ---> @adv_lex(szybko,no_t). 

duz_e ---> @adj_lex(duze,(nom_t;acc_t),non_masc_hum_t,pl_t). 
pie_kne ---> @adj_lex(piekne,(nom_t;acc_t),non_masc_hum_t,pl_t). 
pie_kny ---> @adj_lex(piekny,nom_t,masc_t,sg_t). 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%% entry macros %%%%%%%%%%%%%%%%%%%%%%



pn_lex(Name,Case,Gender, Number,NS,X) macro
  @noun_lex(Case,Gender,Number,X),
  lex_neg_sens: NS,
  lex_phon: [Name].

cn_lex(Name,Case,Gender,Number,NS,X,A) macro
  @noun_lex(Case,Gender,Number,X,A),
  lex_neg_sens: NS,
  lex_phon: [Name].

noun_lex(Case,Gender,Number,X,A) macro
  entry_t,
  lex_head:(morsyn:( n_noun_t,
		    agr:(case:Case,
	                 gender:Gender,
	                 number: Number)), % not for "wysokosc" etc.
	    (mod: []; 
	     
	    (mod: [(syn:noun_t,% brat Jana
	            sem:npron_t)],
  	     morsyn: agr:case:gen_t)),
	    argst:(subj:[],
                   args:A),
	    conj:none_t),
   lex_cont:(X,index:(i_pers: third_t,
		      i_gend: Gender, 
		      i_number: Number)),
   lex_rel: e_list,
   lex_res: e_list.

% noun modifiers in genetive only  



noun_lex(Case,Gender,Number,X) macro
  entry_t,
  lex_head:(morsyn:(n_noun_t,
 		    agr:(case:Case,
			 gender:Gender,
			 number: Number)), % not for "wysokosc" etc.
                    (mod: []; 
		     (mod: [(syn:noun_t,% brat Jana
			     sem:npron_t)],
		      morsyn:agr:case:gen_t)),
             argst:(subj:[],
	            args:[]),
			conj:none_t),
	      lex_cont:(X,index:(i_pers: third_t,
			     i_gend: Gender,
			     i_number: Number)),
  lex_rel: e_list,
  lex_res: e_list.


personal_lex(Phon,Subj,Args,Gender,Number,Person,Neg,NS) macro
  entry_t,
  lex_phon: [Phon],
  lex_head:(morsyn:(personal_t,
		                agr:(gender:Gender,
				     person:Person,
				     number: Number),

				neg:Neg),
			mod:[],
			argst:(subj:Subj,
			       args:Args),
			conj:none_t),
  lex_cont:psoa_t,
  lex_neg_sens: NS,
  lex_rel: e_list,
  lex_res: e_list.



impersonal_lex(Phon,Mtype,Args,Neg,NS) macro
  entry_t,
  lex_phon: [Phon],
  lex_head:(morsyn:((Mtype, impersonal_t),
				neg:Neg),
			mod:[],
			argst:(subj:[(pro_t,@np_ss(str_t))],
			       args:Args),
			conj:none_t),
	      lex_cont:psoa_t,
  lex_neg_sens: NS,
  lex_rel: e_list,
  lex_res: e_list.


prep_lex(Phon,Prep,Case) macro
  entry_t,
  lex_phon: [Phon],
  @phead(Prep,Case),
  lex_rel: e_list,
  lex_res: e_list.


num_lex(Phon,Case,Gender,Number) macro
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:(numeral_t,

				agr:(case:Case,
				     gender:Gender,
				     number:Number)),
			argst:(subj:[(canon_ss_t,@np_ss(str_t),loc:cont:index:I)],
			       args:[]), 
			mod: [],
			conj:none_t),
  lex_cont:(npron_t,index:(I,
                    i_gend: Gender,
                    i_number: Number)),
  lex_neg_sens:no_t,
  lex_rel: e_list,
  lex_res: e_list.


mp_lex(Name,Args,Marking) macro  % markery z mod e_list
   entry_t, 
   lex_head:(morsyn:marking: Marking, 
               	     mod:[],
             argst: (subj:[], args:Args),
	     conj:none_t),
   lex_cont:psoa_t,		% I know it's kind of stupid... :) 
   lex_neg_sens:no_t,
   lex_phon: [Name],
   lex_rel: e_list,
   lex_res: e_list.

mp_lex_nemod(Name,Args,Marking) macro  % marker co moze modyfikowac np
   entry_t, 
   lex_head:(morsyn:marking: Marking, 
             argst: (subj:[], args:Args),
	     conj:none_t),
   lex_cont:psoa_t,		% I know it's kind of stupid... :) 
   lex_neg_sens:no_t,
   lex_phon: [Name],
   lex_rel: e_list,
   lex_res: e_list.


adj_lex(Phon,Case,Gender,Number) macro   % attibutive adjectives
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:(adjective_t,

		    agr:(case:Case,
			 gender:Gender,
			 number: Number)),
	   mod:[syn:n_noun_t], 
	   argst:(subj:[],
		   args:[]),
	    conj:none_t),
  lex_cont:nom_obj_t,
  lex_neg_sens:no_t,
  lex_rel: e_list,
  lex_res: e_list.
 


adv_lex(Phon,NS) macro
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:adverb_t,

	    argst:(subj:[],
		   args:[]),
	     mod:[syn:verbal_t], % too simple: modifies only verbals
	     conj:none_t),
  lex_cont:psoa_t,   
  lex_neg_sens:NS,
  lex_rel: e_list,
  lex_res: e_list.
 

pron_lex(Phon,Cont,Case,Gend, Number) macro
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:(n_noun_t, 
                    agr:(case: Case,
                         gender: Gend,
                         number: Number)),
            mod:[(syn:noun_t,
			  sem:npron_t)],
	    argst:(subj:[],
		   args:[])),
lex_cont:(Cont,nom_obj_t),
  lex_neg_sens:no_t,
  lex_rel: e_list,
  lex_res: e_list.

pron_pers_lex(Phon,Case,Gend, Number,Pers) macro
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:(n_noun_t, 
                    agr:(case: Case,
                         gender: Gend,
                         number: Number)),
            mod:[],
	    argst:(subj:[],
		   args:[])),
  lex_cont:(ppro_t,index:(I,i_pers: Pers,
		      i_gend: Gend,
		      i_number: Number)),
  lex_neg_sens:no_t,
  lex_rel: e_list,
  lex_res: (e_list;[I]).
  

pron_rel(Phon,Case,Gender,Number) macro
  entry_t,
  lex_phon:[Phon],
  lex_head:(morsyn:(n_noun_t,
			agr:(case:Case,
			     gender:Gender,
			     number: Number)), % not for "wysokosc" etc.
			argst:(subj:[],
			       args:[]),
 	    (mod: []; 
	    mod: [(syn:noun_t,% ktorego brat 
	           sem:npron_t)],
              	     morsyn: agr:case:gen_t),
	    conj:none_t),
	      lex_cont:(nom_obj_t,index:( I,
			     i_gend: Gender,
			     i_number: Number)),
  lex_neg_sens:no_t,
  lex_rel: [I],
  lex_res: e_list.


%%%%%%%%%%%%%%%% word macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% local macro

np_loc(Case) macro
 cat:head:morsyn:(nominal_t,agr:case:Case),
 cont:nom_obj_t. 

% synsem macros

np_ss(Case) macro
  loc: @np_loc(Case).

% this is only for case-marking prepositions

phead(Prep,Case) macro
  lex_head:(morsyn:(preposition_t,Prep),
		 mod:[],
		 argst:(subj:[],
			args:[(canon_ss_t,
			       @np_ss(Case),
			       loc:cont:Cont)]),
		 conj:none_t),
  lex_cont:Cont,
  lex_neg_sens:no_t.


pp_ss(Prep,Case) macro
  loc:(cat:head:(morsyn:(preposition_t,Prep),
			 mod:[],
		 argst:(subj:[],
			args:[(canon_ss_t,
			       @np_ss(Case),
			       loc:cont:Cont)]),
		 conj:none_t),
       cont:Cont).

ms(M) macro
  loc:(cat:head:morsyn:(marker_t,
		        marking: M),
       cont:psoa_t).

vp_ss(VMorsyn,S,Args) macro
   canon_ss_t,
   loc:cat:head:(morsyn:VMorsyn,
		 argst:(subj:(S,[pro_t]), 
			args:Args)).


vp_ss(VMorsyn,S) macro
   canon_ss_t,
   loc:cat:head:(morsyn:VMorsyn,
		 argst:subj:(S,[pro_t])). 


vp_ss(VMorsyn) macro
   loc:cat:head:(morsyn:VMorsyn,
                 argst:(subj:(S,([];[non_raised_t])))). 
%%                        args:(A, non_raised_list(A)))). 
%% nie ma zapewnienia, ze argumenty nie sa raised (jak?)

vp_ss_nr(VMorsyn) macro
   loc:cat:head:(morsyn:VMorsyn,
                 argst:(subj:(S,([];[non_raised_t])))).%, 



