%%%%%%%%%%%%%%%%%%%%%%%%% rel.p %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%			JPSG parser ver1.3
%%%			    1992.6.6
%%%		       JPSG Parser Sample
%%%            1995.12  commented by John Fry (ETL)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%  Category :
%%%	{core/{pos/Pos, form/Form, asp/View}, 
%%	  ajc/Adjacent, sc/Subcat, ajn/Adjoin, 
%%	  psl/PSlash, slash/Slash, refl/Refl, sem/Sem (,temp/Temp)}
%%% Pos: part of speech   p,n,v,vs(sahen-dousi),adn(rentai-si),adv(fuku-si)
%%% Form: when Pos=n, n,ns(sahen-meisi)
%%%	  when Pos=v, vv,vk,vcw,... (verb form), 
%%%		   adj(adjective), na(adjective-verb)
%%% Temp: Temp feature for proto-lexicon

%% write_dl(L1,L2):-write("["),w_dl(L1,L2),write("]").
%% w_dl(X,X).
%% w_dl([A|L1],L2):-write(A),write(" "),w_dl(L1,L2).

%%%  Left Corner Parser
p2(S):-parse0(A,B,S,[],[idx(s,speaker)]),write(A),nl,pcon,nl.
p(Sentence):-
	parse0(Cat,H,Sentence,[],[idx(s,speaker)]),nl,
	tree(H),nl,
	write("category= "),write(Cat),nl,
	write("constraint= "),project_cstr(Cat),nl.

nil_or_speaker([]).
nil_or_speaker([{sem/speaker}]).

parse0(MCat,MHist,Str,Rest,Idxlist):-
	lookup(Str,SubStr,Cat,Hist,Idxlist,Nidx),!,
	parse1(Cat,Hist,MCat,MHist,SubStr,Rest,Nidx).

parse1(LCat,LHist,GCat,GHist,[Word|SubStr],Rest,Idxlist):-
	lookup_post(LCat,Word,RCat,RHist,RuleName),
	psr_adj(LCat,RCat,MCat),
	parse1(MCat,
		t(t(MCat,RuleName,[]),LHist,RHist),
		GCat,GHist,SubStr,Rest,Idxlist).

parse1(Cat,H,Cat,H,Str,Str,N).

parse1(LCat,LHist,GCat,GHist,Str,Rest,Idxlist):-
	psr(LCat,RCat,MCat,RN),
	parse0(RCat,RHist,Str,SubStr,Idxlist),
	parse1(MCat,t(t(MCat,RN,[]),LHist,RHist),
		GCat,GHist,SubStr,Rest,Idxlist).

%%%  phrase structure rules
%%%     psr(LeftCat,RightCat,MotherCat)

%%% 1. Adjacent Structure:  psr_adj(Left,Head,Mother)
psr_adj({core/Cc,sc/Csc,refl/Cref,slash/Csl,psl/Cpsl,sem/SEM0,ajn/[]},
    {core/Hc,ajc/[{core/Cc,sc/Asc,refl/ReflAC,sem/SEM0}],
      ajn/Adj, sc/Hsc, refl/Href, slash/Hsl, sem/SEM},
    {core/Hc,ajc/[],ajn/Adj,sc/Msc,refl/Mref,slash/Msl,psl/Cpsl,
	sem/SEM});
	adjacent_sc_p(Csc,Asc,Hsc,Msc),
	slash_p(Csl,Hsl,Msl),
	refl_cond(Cref,Href,Mref,Hsc).

%%% slash feature principle: 
%%%	slash_p(LeftS,RightS,MotherS)
%%%	LeftS=C.slash, RightS=H.slash, MotherS=M.slash
slash_p([],[],[]).
slash_p([S],[],[S]).
slash_p([],[S],[S]).
slash_p([S],[RS],[RS]):-sem_unify(S,RS).
sem_unify({sem/X},{sem/X}).

%%  adjacent-subcat principle for adjacent structure
%% adjacent_sc_p(CSC,ASC,HSC,MSC).
%%	CSC=C.sc, ASC=H.ajc.sc, HSC=H.sc, MSC=M.sc
%% adjacent_sc_p(CSC,[],HSC,MSC):-merge(CSC,HSC,MSC).
adjacent_sc_p([],[],SC,SC).
adjacent_sc_p([SC|R],[],[],[SC|R]).
adjacent_sc_p(CSC,[AS],HSC,SC):-one_of(CSC,AS,Rest),append(HSC,Rest,SC).
adjacent_sc_p([A1,A2|R],[A1,A2],SC,MSC):-append(SC,R,MSC).  /* for ukemi */

%%%	2. relative clause structure : psr(R,H,M)
psr({core/{form/rel},sc/Rsc,slash/Rsl,psl/Rps,sem/Rs,ajc/[],ajn/[]},
    {core/Hc,ajc/Ha,slash/Hsl,sem/Hs},
    {core/Hc,sc/[],slash/Msl,psl/[],sem/[Hs,Rs]},[relative_s]);
	{pos/n}=Hc,sc_sl(Rsc,Rsl,Rps,Ha,Hsl,Msl,Hs).

sc_sl([],[{sem/Hsm}],Rps,[],Hsl,Msl,Hsm):-slash_p(Rps,Hsl,Msl).
sc_sl([],Rsl,Rps,[{core/{form/rel}}],Hsl,Msl,Hsm):-sl_psl_p(Rsl,Hsl,Msl,Rps).
sc_sl([{sem/Hsm}],[Rsl],Rps,[],Hsl,Msl,Hsm):-sl_psl_p([Rsl],Hsl,Msl,Rps).

%% sl_psl_p(Csl,Hsl,Msl,Psl)
sl_psl_p([],[],[P],[P]).
sl_psl_p(Csl,Hsl,Msl,[]):-slash_p(Csl,Hsl,Msl).
sl_psl_p(Csl,Hsl,Msl,[{sem/X}]):-slash_p(Csl,Hsl,[{sem/X}]).

%%%	3. Subcategorization Structure : psr(C,H,M)
psr(Comp,
    {core/Hc, ajn/Hn, ajc/Hac, sc/HC, refl/Hr, slash/Hsl, sem/Hs},
    {core/Hc, ajn/Hn, ajc/Hac, sc/Rest, refl/Mr, slash/Msl,psl/Cps,sem/Hs},
	[subcat_p] );
	{core/Cc, ajc/[], refl/Cr,slash/Csl,psl/Cps, ajn/[]}=Comp,
	one_of(HC,Comp,Rest),
	slash_p(Csl,Hsl,Msl),
	refl_cond(Cr,Hr,Mr,Rest),
	sc_cond(Cc,Hc).

sc_cond({pos/p},{pos/v}).
sc_cond({pos/adn},{pos/n}).

refl_cond([],[],[],Rt).
refl_cond([],[Cat],[Cat],Rt).
refl_cond([Cat],[],[Cat],Rt).
refl_cond([Cat],[],[],SC) :- memb3(Cat,SC).

%%%	4. Adjunction Structure: psr(An,H,M)
psr({core/_,ajn/[Head], slash/Asl,refl/ReflA,psl/Apsl,sem/As},
    Head,
    {core/C,ajn/A,ajc/[],sc/Hsc,slash/Msl,refl/ReflM,psl/Apsl,sem/As},
	[adjunct_p] );
	{core/C,ajn/A,ajc/[],sc/Hsc,slash/Hsl,refl/ReflH,sem/Hs}=Head,
	refl_cond(ReflA,ReflH,ReflM,Hsc),
	slash_p(Asl,Hsl,Msl).

%%%%%	lexical rule (for general dictionary)
%%% lex_rule(OrigCat,NewCat)
lex_rule(C,Cat):-
	same_feature(C,Cat),
	sc_to_sl(C,Cat),default(Cat,{},{ajc/[],ajn/[],refl/[]}).

%% core,sem
same_feature({core/C,sem/S},{core/C,sem/S}).

%% adjacent default(defaul value is [], if it is not specified)
%% ajc_default({ajc/[]},{ajc/[]}):-!.
%% ajc_default({ajc/X},{ajc/X}).

%% adjoin default(defaul value is [], if it is not specified)
%% ajn_default({ajn/[]},{ajn/[]}):-!.
%% ajn_default({ajn/X},{ajn/X}).

%% refl default(defaul value is [], if it is not specified)
%% refl_default({refl/[]},{refl/[]}):-!.
%% refl_default({refl/X},{refl/X}).

%% sc,slash (subcat to slash movement, sc,slash,psl default) 
sc_to_sl({sc/[]},{sc/[],slash/[],psl/[]}):-!.
sc_to_sl({sc/S},{sc/Nsc,slash/Nsl,psl/[]});sc_sl_move(S,Nsc,Nsl).
sc_sl_move(Sc,Sc,[]).
sc_sl_move(Sc,Nsc,[{sem/Sl}]):-one_of(Sc,{sem/Sl},Nsc).

%% temp,asp (temp to aspect conversion, asp default)
%% temp_to_asp({temp/[]},{core/{asp/[]}}):-!.
%% temp_to_asp({temp/t(S,F,R,DSF,DRF)},{core/{view/asp(AB,AE,AD,AT)}});
%%	temp_cstr(S,F,R,DSF,DRF,AB,AE,AD,AT).
temp_cstr(S,F,T0,DSF,T1,S,F,DSF,basic).
temp_cstr(T0,F,R,T1,f,F,R,f,result).
temp_cstr(T0,F,T1,T2,T3,F,i,i,exp).
temp_cstr(T0,T1,R,T2,f,R,i,i,exp).

%%%%%	general dictionary
%%%%%  lookup(Str,RestStr,Cat,Hist,OldIdx,NewIdx)
%%%%%  lookup([nil|X],X,_,_):-fail,!.
%%lookup([idx([Sent|Cont],I)|X],X,Cat,Hist):-
%%	parse0(Cat,Hist,[Sent|Cont],[]).
lookup([idx(Word,I)|X],X,Cat,t(Cat,[Word,I],[]),OldIdx,OldIdx)
	:-member(idx(I,Sem),OldIdx),!,
%%	write("lookup "),write(idx(I,Sem)),write(" in "),write(OldIdx),nl,
	dict1(Word,C),lex_rule(C,Cat);{sem/Sem}=Cat.
lookup([idx(Word,I)|X],X,Cat,t(Cat,[Word,I],[]),OldIdx,[idx(I,Sem)|OldIdx])
	:-!,
	dict1(Word,C),lex_rule(C,Cat);{sem/Sem}=C.
lookup([[Sent|Cont]|X],X,Cat,Hist,Idx,Idx):-
	parse0(Cat,Hist,[Sent|Cont],[],Idx).
lookup([Word|X],X,Cat,t(Cat,[Word],[]),Idx,Idx)
	:-dict1(Word,C),lex_rule(C,Cat).

%%%%%	pp, suffix, auxiliary verb dictionary
%%%%%	lookup_post(PreCat, Word, PostCat, PostHist,RuleName)
lookup_post({core/{pos/v,form/Form}},Word, Cat,t(Cat,[Word],[]),[suff_p])
	:-search_suffix(Form,Word,Cat);
	{slash/[],psl/[],refl/[]}=Cat.
lookup_post(_,Word,Cat,t(Cat,[Word],[]),[adjacent_p])
	:-dict_pos(Word,Cat);
	{slash/[],psl/[],refl/[]}=Cat.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%	jconst.p 
%%%%%%%%%  constraints
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%	general constraint	   %%%
%%%  constraint  (finite predicate)

%%% one_of(List, One, Rest)    |List|<=3  
one_of([X|Y],X,Y).
one_of([X,Y|Z],Y,[X|Z]).
one_of([X,Y,Z],Z,[X,Y]).

%%% member(X,List)	|List|<=3
memb3(X,[X|Y]).
memb3(X,[Y,X|Z]).
memb3(X,[Y,Z,X]).

%%% finite permutation 
perm2([A,B],[A,B]).
perm2([A,B],[B,A]).
perm3([A,B,C],[A|X]):-perm2([B,C],X).
perm3([A,B,C],[B|X]):-perm2([A,C],X).
perm3([A,B,C],[C|X]):-perm2([A,B],X).

%%%%%%%  constraint (recursive predicate)
merge([],[],[]).
merge([],[A|X],[A|X]).
merge([A|X],[],[A|X]).
merge([A|X],[B|Y],[A|Z]):-merge(X,[B|Y],Z).
merge([B|X],[A|Y],[A|Z]):-merge([B|X],Y,Z).

append([],X,X).
append([A|X],Y,[A|Z]):-append(X,Y,Z).

member(X,[X|Y]).
member(X,[Y|Z]):-member(X,Z).

%%%%%%%%%%%%% sahen constraint %%%%%%%%%%%%%%%%%%%
su_handler(Adjacent,v_su,[],SC,Sem) :-
      suru(Adjacent,SC,Sem).
su_handler([{core/{pos/v,form/vcs},ajc/[],ajn/[],sc/[],sem/Sem}],
		Form,[],[],Sem).

suru([{core/{pos/n,form/ns},sc/Subc,sem/[Pred|SRest]}],
	SC,[Pred|SRest]):- suru_correspond(SRest,Subc,SC).
suru([],[{core/{pos/p,form/wo},
		sc/[{core/{pos/adn,form/ga},refl/RF,sem/Sbj}|Sc],
	refl/RF,sem/[Pred,Sbj,Obj|SRest]}|SC],
	[Pred,Sbj,Obj|SRest] ):-
       suru_correspond([Sbj|SRest],
	[{core/{pos/adn,form/ga},refl/RF,sem/Sbj}|Sc],SC).
suru([],
	[{core/{pos/p,form/ga},refl/RF,sem/Sbj},
	{core/{pos/p,form/wo}, 
		sc/[{core/{pos/adn,form/ga},refl/RF,sem/Sbj}|SC],
		sem/[Pred,Sbj,Obj|SRest]}|SC],
     BR,RF,[Pred,Sbj,Obj|SRest]) :- suru_correspond(SRest,Sc,SC).

suru_correspond([],[],[]).
suru_correspond([Sbj], [{core/{form/F},sem/Sbj}], 
	[{core/{pos/p,form/F},sem/Sbj}]).
suru_correspond([Sbj,Obj], 
	[{core/{form/FO},sem/Obj},{core/{form/FS},sem/Sbj}], 
	[{core/{pos/p,form/FS},sem/Sbj},{core/{pos/p,form/FO},sem/Obj}]).
suru_correspond([Sbj,Obj,Iob],
	[{core/{form/FO},sem/Obj},
	{core/{form/FI},sem/Iob},{core/{form/FS},sem/Sbj}],
	[{core/{pos/p,form/FS},sem/Sbj},
	{core/{pos/p,form/FI},sem/Iob},
	{core/{pos/p,form/FO},sem/Obj}]).

adn_2([{core/{pos/adn,form/First},sem/Obj},
	{core/{pos/adn,form/Second},sem/Sbj}],
	First,Second,Obj,Sbj).
adn_2([{core/{pos/adn,form/First},sem/Obj},
	{core/{pos/adn,form/Second},sem/Sbj}],
	Second,First,Obj,Sbj).

adn_wo_ga(SC,Obj,Sbj):-adn_2(SC,wo,ga,Obj,Sbj).

adn_1([{core/{pos/adn,form/First},sem/Sem}],Form,Sem).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%		post.p	
%%%	PP, aux , etc.   (have ADJACENT feature)
%%%	dict_pos( 1word, Cat)		: pp, aux, etc.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%	Post Positions
dict_pos(nado,
       	{core/{pos/n,form/Form},ajn/[],sc/[],
	ajc/[{core/{pos/n,form/Form},sc/[],sem/SEM}],sem/etc(SEM)} ).

%%%%%   Postpositional particles (joshi)	%%%%%%%%%%%%%%%%%%%%
%%%  --wo,ga,ni,de,to,no,ha,ba
general_pp(Form,
	{core/{pos/p,form/Form},ajn/[],sc/[],
	ajc/[{core/{pos/n},sc/[],sem/SEM}],sem/SEM} ).
dict_pos(wo, Cat):-general_pp(wo, Cat).
dict_pos(ga, Cat):-general_pp(ga, Cat).
dict_pos(ni, Cat):-general_pp(ni, Cat).

dict_pos(de,
	{core/{pos/adn,form/de},sc/[],
	ajc/[{core/{pos/n},sc/[],sem/SEM1}],
	ajn/[{core/{pos/v},sem/SEM2}],sem/de(SEM1,SEM2)} ).

dict_pos(to,
	{core/{pos/Pos,form/to},sc/[],
	ajc/[{core/{pos/Cat1,form/Form},sc/[],sem/SEM1}],
	ajn/[{core/{pos/Cat2},sem/SEM2}], sem/SEM} );
	to_compl(Pos,Cat1,Form,SEM1,Cat2,SEM2,SEM).

to_compl(adj,n,_,S1,v,S2,[with(S1)|S2]).
to_compl(adn,n,_,S1,n,S2,[S1,and|S2]).
to_compl(adj,v,Inf,S1,v,S2, [with,S1,S2] ):-sentence_end(Inf).
sentence_end(inf).
sentence_end(a_inf).
to_compl(adj,v,imp,S1,nil,S2,S1).

dict_pos(no,
       {core/{pos/adn,form/Form},sc/[],
	ajc/[{core/{pos/CP,form/CF},sc/[],sem/CS}],ajn/Adjoin,sem/SEM} );
	no_handler(CP,CF,Form,Adjoin,CS,SEM).

no_handler(p,Form,Form,[],Sem,Sem):-
    with_case(Form).
no_handler(n,n,no,
	[{core/{pos/n,form/n},ajc/[],ajn/[],sc/[],sem/inst(Obj,Type)}],
           Atr,inst(Obj,[rel,Atr,Type])).
%%no_handler(n,n,Form,[],Sem,Sem):-
%%    without_case(Form).

dict_pos(ha,
       {core/{pos/p,form/Form},ajn/[],sc/[],
	ajc/[{core/{pos/Cat,form/F},sc/[],sem/SEM}],sem/SEM} );
       wa_compl(Cat,F,Form).

wa_compl(p,Form,Form):-with_case(Form).
wa_compl(n,_,Form) :- without_case(Form).

with_case(to).
with_case(he).
with_case(ni).
with_case(no).

without_case(ga).
without_case(wo).

dict_pos(mo,
       {core/{pos/p,form/Form},ajn/[],sc/[],
	ajc/[{core/{pos/Cat,form/F},sc/[],sem/SEM}],sem/SEM} );
	       mo_compl(Cat,F,Form).

mo_compl(p,wo,wo).
mo_compl(n,F,ga).
mo_compl(p,Form,Form):-with_case(Form).

%%%%%%% general constraint
v_renyou(conj).
v_renyou(vv).
v_renyou(v_y).
v_renyou(v_si).
inf_form(inf).
inf_form(a_inf).

%%%%%%%%%%%%%%% fuku-joshi
%%%%%%%---ba,temo,demo,te,de,tari,dari,shi

dict_pos(ba,
	{core/{pos/adv,form/katei},sc/[],
	ajc/[{core/{pos/v,form/katei},sc/[],sem/SEM1}],
	ajn/[{core/{pos/v},ajc/[],ajn/[],sem/SEM2}],
	sem/if(SEM1,SEM2) } ).

%%%%	--temo,demo  (even if)
temo_demo(Form,
	{core/{pos/adj,form/temo},sc/[],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/SEM1}],
	ajn/[{core/{pos/v},ajc/[],ajn/[],sem/SEM2}],
	sem/even_if(SEM1,SEM2) } ).
dict_pos(temo,Cat):-temo_demo(Form,Cat);te_form(Form).
dict_pos(demo,Cat):-temo_demo(Form,Cat);demo_form(Form).
demo_form(conj_de).
demo_form(na).

%%%%%   --te, de      + iru,miru, etc. 
te_de(Form,
	{core/{pos/v,form/conj2},sc/[],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/SEM}],sem/SEM} ).
dict_pos(te,Cat):-te_de(Form,Cat);te_form(Form).
dict_pos(de,Cat):-te_de(conj_de,Cat).
te_form(vv).
te_form(v_y).
te_form(conj_te).
te_form(v_si).

%%%%	--tari,dari  
tari_dari(Form, 
	{core/{pos/adj,form/tari},sc/[],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/SEM1}],
	ajn/[{core/{pos/vs},ajc/[],ajn/[],sem/SEM2}],
	sem/[SEM1|SEM2]} ).

dict_pos(tari,Cat):-tari_dari(Form,Cat);te_form(Form).
dict_pos(dari,Cat):-tari_dari(conj_de,Cat).

%%%%	--shi    (--shi,--shi)
dict_pos(shi,
%       {core/{pos/adj,form/and},sc/[],       (J.Fry)
       {core/{pos/adj,form/adn},sc/[],        
	ajc/[{core/{pos/v,form/Form},sc/[],sem/SEM1}],
	ajn/[{core/{pos/v,form/Form},ajc/[],ajn/[],sc/[],sem/SEM2}],
	sem/[SEM1|SEM2] } );
	inf_form(Form).

%%%%%%%%%%% weak verbs  
%%%%%	--(te/de)iru,iku,kuru,miru,shimawu: stative verbs
stative_verb(F,
	{core/{pos/v,form/F},ajn/[],sc/[],
	ajc/[{core/{pos/v,form/conj2},sc/[],sem/Sem}],sem/[stative|Sem]}).
dict_pos(i,Cat):-stative_verb(vv,Cat).
dict_pos(ik,Cat):-stative_verb(vck,Cat).
dict_pos(k,Cat):-stative_verb(vk,Cat).
dict_pos(mi,Cat):-stative_verb(vv,Cat).
dict_pos(shimaw,Cat):-stative_verb(vcw,Cat).

%%%%	--dasu,kakeru,hajimeru,owaru,tuzukeru :v(renyou) + v  sub-verb
sub_verb(F,A,
	{core/{pos/v,form/F},ajn/[],sc/[],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/Sem}],sem/[A|Sem]} );
%		tai_set(Form).    (J.Fry 95.12)
		v_renyou(Form).
dict_pos(das,Cat):-sub_verb(vcs,begin,Cat).
dict_pos(kake,Cat):-sub_verb(vv,nearly,Cat).
dict_pos(hajime,Cat):-sub_verb(vv,begin,Cat).
dict_pos(owar,Cat):-sub_verb(vcr,end,Cat).
dict_pos(tuzuke,Cat):-sub_verb(vv,continue,Cat).

%%%%%%%%%%%%%   Auxiliary verbs (jyo-doushi)	%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% 	--seru, --saseru : Causative verb (shieki)
shieki_verb(Form, 
	{core/{pos/v,form/vv},ajn/[],
	ajc/[{core/{pos/v,form/Form},sc/[{core/{pos/p,form/ga},sem/Iob}],
		sem/Act}],
	sc/[{core/{pos/p,form/ga},sem/Sbj},
	    {core/{pos/p,form/ni},sem/Iob}],
	sem/[cause,Sbj,Iob,Act]} ).

dict_pos(sase,Cat):-shieki_verb(Form,Cat);sara_set(Form).
dict_pos(se,Cat):-shieki_verb(Form,Cat);sere_set(Form).
sara_set(vv).
sara_set(vk). 
sere_set(vc_m).
sere_set(v_sa).

%%%%%	--re(ru), --rare(ru) : Passive verb (ukemi)
dict_pos(rare,Cat):-ukemi_verb(Form,Cat);sara_set(Form).
dict_pos(re,Cat):-ukemi_verb(Form,Cat);sere_set(Form).

ukemi_verb(Form,
       {core/{pos/v,form/vv},ajn/[],
	ajc/[{core/{pos/v,form/Form},
		sc/[{core/{pos/p,form/ga},sem/Agt},
		    {core/{pos/p,form/F},sem/Pat}],
		sem/Act}],
	sc/[{core/{pos/p,form/ga},sem/Pat},{core/{pos/p,form/ni},sem/Agt}],
	sem/[passive,Pat,Agt,Act]} );
	obj_case(F).

control_passive([],Sbj,[]).
control_passive(
	[{core/{pos/p,form/Form},ajc/[],ajn/[],sc/[],sem/Sbj}|Rest],
	Sbj,Rest):-obj_case(Form).

obj_case(ni).
obj_case(wo).

%%% general auxirialy verb (syusi,rentai form & others)
%%%   nu, ta,u,you,mai
aux_syu_ren(Form,A,
       {core/{pos/v,form/Fm},ajn/X,sc/[],sem/Z,
	ajc/[{core/{pos/v,form/Form},sc/Y,sem/Sem}]} );
		syu_ren(Fm,X,Y,Z,[A,Sem]).

aux_verb(Fm,Form,A,
	{core/{pos/v,form/Fm},ajn/[],sc/[],sem/[A,Sem],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/Sem}]}).

%%% rel_clause(Form,HSC,CSC,HAdjoin,Csem,Hsem)
syu_ren(inf,[],[],Z,Z).
syu_ren(rel,[{core/{pos/n},sem/inst(A,B)}],[{core/{pos/p},sem/A}],
		inst(A,[B,Z]),Z).

%%%%%	--na(i),--nu  : Not   
dict_pos(na,Cat):-aux_verb(adj,Form,no,Cat); nai_set(Form).
nai_set(vc_m).
nai_set(vv).
nai_set(vk).
nai_set(v_si).
nai_set(mizen).

dict_pos(nu,Cat):-aux_syu_ren(Form,no,Cat);nu_set(Form).
dict_pos(n,Cat):-aux_syu_ren(Form,no,Cat);nu_set(Form).
dict_pos(zu,Cat):-aux_verb(renyou,Form,no,Cat);nu_set(Form).
dict_pos(ne,Cat):-aux_verb(katei,Form,no,Cat);nu_set(Form).
nu_set(vc_m).
nu_set(vv).
nu_set(vk).
nu_set(v_se).

%%%%%	--ta,da : Past 
dict_pos(ta,Cat):-aux_syu_ren(Form,past,Cat);ta_form(Form).
dict_pos(da,Cat):-aux_syu_ren(conj_de,past,Cat).
dict_pos(tara,Cat):-aux_verb(katei,Form,past,Cat);ta_form(Form).
dict_pos(dara,Cat):-aux_verb(katei,conj_de,past,Cat).

ta_form(adj_tt).
ta_form(na_tt).
ta_form(X):-te_form(X).

%%%%%	--u, --you  : suiryou (guess) or ishi(will)
dict_pos(u,Cat):-aux_syu_ren(Form,may,Cat);u_set(Form).
u_set(vc_o).
u_set(mizen).

dict_pos(you,Cat):-aux_syu_ren(Form,may,Cat);you_set(Form).
you_set(vv).
you_set(vk).
you_set(v_si).

%%%%% --rashii : suitei
dict_pos(rashi,Cat):-aux_verb(adj,Form,polite,Cat);rashii_set(Form).
rashii_set(na).
rashii_set(F):-inf_form(F).

%%%%%%  --mai  : not+guess, not+will
dict_pos(mai,Cat):-aux_syu_ren(Form,no,Cat);mai_set(Form).
mai_set(inf).
mai_set(vv).
mai_set(vk).
mai_set(v_si).

%%%%%%	--ta(i)  : hope
dict_pos(ta,Cat):-aux_verb(adj,Form,hope,Cat);v_renyou(Form).

%%%%%  --sou(da). : may & I hear
dict_pos(sou,Cat):-aux_verb(na,Form,A,Cat); souda_set(Form,A).
souda_set(F,may):-souda_may_set(F).
souda_may_set(F):-v_renyou(F).
souda_may_set(adj).
souda_may_set(na).
souda_set(inf,hear).
souda_set(a_inf,hear).

%%%%%  --desu, masu.	: teinei
desu(Inf,Cat):-aux_verb(Inf,Form,polite,Cat);desu_set(Form).
desu_set(rel).
desu_set(adj).
desu_set(na).
dict_pos(desho,Cat):-desu(vc_o,Cat).
dict_pos(deshi,Cat):-desu(v_y,Cat).
dict_pos(desu,Cat):-aux_syu_ren(Form,polite,Cat);desu_set(Form).
masu(Inf,Cat):-aux_verb(Inf,Form,polite,Cat);v_renyou(Form).
dict_pos(mase,Cat):-masu(v_se,Cat).
dict_pos(masho,Cat):-masu(vc_o,Cat).
dict_pos(mashi,Cat):-masu(v_y,Cat).
dict_pos(masu,Cat):-aux_syu_ren(Form,polite,Cat);v_renyou(Form).
dict_pos(masure,Cat):-masu(katei,Cat).
dict_pos(mase,Cat):-masu(imp,Cat).

%%%%%  --nagara, --tsutsu : cont. adverb
dict_pos(nagara,
       {core/{pos/adv,form/adv},sc/[],
	ajc/[{core/{pos/v,form/Form},sc/[],sem/SEM}],
	ajn/[{core/{pos/v1},ajc/[],ajn/[],sem/SEM1}],
	sem/[with,SEM,SEM1]} );
       nagara_set(Form).
nagara_set(a_inf).
nagara_set(F):-v_renyou(F).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%	suffix.p	%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%	verb suffix 	%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%	search_suffix(Form,Word,Cat)	%%%%%%%%%%%%%%
%%	<< Example >>
%%			mizen/	renyou/	syusi/	rentai/	katei/	imp/
%%
%% vc?	yom-mu		ma	mi	mu	mu	me	me
%%			mo(+u)	n
%% vv	iki-ru		_	_	ru	ru	re	ro
%% vk	kuru		ko	ki	kuru	kuru	kure	koi
%% vs1	tanjyou-suru	si	si	suru	suru	sure	seyo
%%			sa					siro
%%			se
%% vs2	ai-suru		sa	si	suru	suru	sure	seyo
%% adj	haya-i		karo	katt	i	i	kere	_
%%				ku
%% na	kirei-da	daro	datt	da	na	nara	_
%%				de
%%				ni
%%	<< Form Table >>
%% vc?:			vc_m	conj	inf	rel	katei	imp
%% (vck,vcs,vct,vcn,	vc_o	conj_te (k,t,r,w,ik)
%%  vcr,vcw,vcg,vcb,		conj_de (g,n,m,b)
%%  vcik)			
%% vv:			vv	vv	inf	rel	katei	imp
%% vk:			mizen	v_y	inf	rel	katei	imp
%% vs1:			v_si	v_si	inf	rel	katei	imp
%%			v_se
%%			v_sa
%% vs2:			vc_m	v_y	inf	rel	katei	imp
%% adj:			mizen	adj_tt	a_inf	rel	katei	__
%%				adj_ku
%% na:			mizen	na_tt	a_inf	rel	katei	__
%%				na_de
%%				na_ni

%%%	exception
search_suffix(adj,i,
      {core/{pos/v,form/Form},ajn/X,sc/[],sem/Z,
	ajc/[{core/{pos/v,form/adj},sc/Y,sem/Sem}]} );
		syu_ren(Form,X,Y,Z,[neg,Sem]).

search_suffix(na,na,
      {core/{pos/v,form/rel},sc/[],
	ajc/[{core/{pos/v,form/na},
		sc/[{core/{pos/p},ajc/[],ajn/[],sc/[],sem/Obj}],
		sem/Sem}],
	ajn/[{core/{pos/n,form/n},ajc/[],ajn/[],sc/[],sem/inst(Obj,Type)}],
	sem/inst(Obj,[and,Type,Sem])} ).

%%%	suffix search
search_suffix(Fm,Word,
	{core/{pos/v,form/Form},ajn/X,sc/[],sem/Z,
	ajc/[{core/{pos/v,form/Fm},sc/Y,sem/Sem}]} )
	:-suff_s(Word,Fm);syu_ren(Form,X,Y,Z,Sem).

search_suffix(Form2,Word,
	{core/{pos/v,form/Form1},ajn/[],sc/[],
	ajc/[{core/{pos/v,form/Form2},sc/[],sem/Sem}],sem/Sem} )
	:-suff(Word,Form1,Form2).

%%%%%	suffix	-  syusi, rentai
suff_s(su,vcs).
suff_s(nu,vcn).
suff_s(mu,vcm).
suff_s(bu,vcb).
suff_s(ku,vck).
suff_s(ku,vcik).
suff_s(tu,vct).
suff_s(u,vcw).
suff_s(ru,vcr).
suff_s(ru,vv).
suff_s(kuru,vk).
suff_s(suru,vs1).
suff_s(suru,vs2).

%%%%%    Suffix ( mizen, renyou, meirei )

%%%	adj, na	
suff(karo,mizen,adj).
suff(katt,adj_tt,adj).
suff(ku,adj_ku,adj).
suff(daro,mizen,na).
suff(datt,na_tt,na).
suff(de,na_de,na).
suff(ni,na_ni,na).
suff(da,a_inf,na).

%%%	vs, vk	- mizen, renyou
suff(se,v_se,vs1).
suff(si,v_si,vs1).
suff(sa,v_sa,vs1).
suff(si,v_y,vs2).
suff(ko,mizen,vk).
suff(ki,v_y,vk).

%%%	v5 mizen
suff(Suf,vc_m,Inf):-vc_m_suff(Suf,Inf).
vc_m_suff(sa,vcs). 
vc_m_suff(sa,vs2).
vc_m_suff(na,vcn).
vc_m_suff(ma,vcm).
vc_m_suff(ba,vcb).
vc_m_suff(ka,vck).
vc_m_suff(ka,vcik).
vc_m_suff(ta,vct).
vc_m_suff(wa,vcw).
vc_m_suff(ra,vcr).

suff(Suf,vc_o,Inf):-vc_o_suff(Suf,Inf).
vc_o_suff(so,vcs). 
vc_o_suff(so,vs2).
vc_o_suff(no,vcn).
vc_o_suff(mo,vcm).
vc_o_suff(bo,vcb).
vc_o_suff(ko,vck).
vc_o_suff(ko,vcik).
vc_o_suff(to,vct).
vc_o_suff(wo,vcw).
vc_o_suff(ro,vcr).

%%%	v5 renyou
suff(si,v_y,vcs).

suff(Suf,conj,Inf):-vc_conj_suff(Suf,Inf).
vc_conj_suff(ni,vcn).
vc_conj_suff(mi,vcm).
vc_conj_suff(bi,vcb).
vc_conj_suff(wi,vcw).
vc_conj_suff(gi,vcg).
vc_conj_suff(ki,vck).
vc_conj_suff(ki,vcik).
vc_conj_suff(ti,vct).
vc_conj_suff(ri,vcr).

%%%	v5 renyou - onbin
suff(i,conj_te,vck).
suff(i,conj_de,vcg).
suff(t,conj_te,vct).
suff(t,conj_te,vcw).
suff(n,conj_de,vcb).
suff(n,conj_de,vcm).
suff(t,conj_te,vcr).
% suff(n,conj_te,vcn).           sin de, not sin te (FRY)
suff(n,conj_de,vcn).
suff(t,conj_te,vcik).

%%%	katei  ( only  -ba)
suff(Suf,katei,Inf):-suff_ba(Suf,Inf).
suff_ba(se,vcs). 
suff_ba(ne,vcn).
suff_ba(me,vcm).
suff_ba(be,vcb).
suff_ba(ke,vck).
suff_ba(ke,vcik).
suff_ba(te,vct).
suff_ba(we,vcw).
suff_ba(re,vcr).
suff_ba(re,vv).
suff_ba(kure,vk).
suff_ba(sure,vs1).
suff_ba(sure,vs2).
suff_ba(kere,adj).
suff_ba(nara,na).


%%%	meirei
suff(Suf,imp,Inf):-imp_suff(Suf,Inf).
imp_suff(se,vcs). 
imp_suff(ne,vcn).
imp_suff(me,vcm).
imp_suff(be,vcb).
imp_suff(ke,vck).
imp_suff(ke,vcik).
imp_suff(te,vct).
imp_suff(we,vcw).
imp_suff(re,vcr).
imp_suff(ro,vv).
imp_suff(koi,vk).
imp_suff(siro,vs1).
imp_suff(sero,vs1).
imp_suff(seyo,vs2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% noun.dic %%%%%%%%%%%%%%%%%%%%%%
%%%%%%% common noun, proper nouns %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%	common nouns.
c_noun(Sem,{core/{pos/n,form/n},sem/inst(Obj,Sem)}).

dict1(ari,Cat):-c_noun(ant,Cat).
dict1(esa,Cat):-c_noun(food,Cat).
dict1(gakusha,Cat):-c_noun(scholar,Cat).
dict1(gyouretsu,Cat):-c_noun(row,Cat).
dict1(hana,Cat):-c_noun(flower,Cat).
dict1(hatarakiari,Cat):-c_noun(worker_ant,Cat).
dict1(hito,Cat):-c_noun(person,Cat).
dict1(hon,Cat):-c_noun(book,Cat).
dict1(ishi,Cat):-c_noun(stone,Cat).
dict1(jimen,Cat):-c_noun(ground,Cat).
dict1(katamari,Cat):-c_noun(block,Cat).
dict1(michi,Cat):-c_noun(road,Cat).
dict1(michishirube,Cat):-c_noun(row,Cat).
dict1(michisuji,Cat):-c_noun(road,Cat).
dict1(mokutekichi,Cat):-c_noun(goal,Cat).
dict1(natsu,Cat):-c_noun(summer,Cat).
dict1(niwa,Cat):-c_noun(garden,Cat).
dict1(satou,Cat):-c_noun(sugar,Cat).
dict1(soto,Cat):-c_noun(out,Cat).
dict1(sumi,Cat):-c_noun(corner,Cat).
dict1(tsubu,Cat):-c_noun(grain,Cat).
dict1(yousu,Cat):-c_noun(yousu,Cat).
dict1(yukute,Cat):-c_noun(way,Cat).

%%%%%%%	proper nouns.
p_noun(Sem,{core/{pos/n,form/n},sem/Sem}).

% dict1(america,Cat):-p_noun(america,Cat).  (Fry)
dict1(amerika,Cat):-p_noun(america,Cat).
dict1(hiroshi,Cat):-p_noun(hiroshi,Cat).
dict1(ken,Cat):-p_noun(ken,Cat).
dict1(naomi,Cat):-p_noun(naomi,Cat).
dict1(wilson,Cat):-p_noun(wilson,Cat).

%%%%% jibun (self)
dict1(jibun, {core/{pos/n,form/n},
	refl/[{core/{pos/p,form/ga},sem/Sem}],
	sem/Sem}).
dict1(jken, {core/{pos/n,form/n},
	refl/[{core/{pos/p,form/ga},sem/ken}],
	sem/ken}).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  verb.dic		  %%%%%%%
%%%%%%  Verbs except sahen-v	%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% vi (|subcat|==1: --ga)
ga_verb(F,Act, 
	{core/{pos/v,form/F},
	sc/[{core/{pos/p,form/ga},sem/Sbj}],
	sem/[Act,Sbj]}).

%%%%% vt (|subcat|==2:)
%%  --ga --wo
ga_wo_verb(F,Act, 
	{core/{pos/v,form/F},
	sc/[{core/{pos/p,form/ga},sem/Sbj},
	    {core/{pos/p,form/wo},sem/Obj}],
	sem/[Act,Sbj,Obj]}).
%%  --ga --ni
ga_ni_verb(F,Act, 
	{core/{pos/v,form/F},
	sc/[{core/{pos/p,form/ga},sem/Sbj},
	    {core/{pos/p,form/ni},sem/Obj}],
	sem/[Act,Sbj,Obj]}).

%%  --ga --wo --ni
ga_wo_ni_verb(F,Act, 
	{core/{pos/v,form/F},
	sc/[{core/{pos/p,form/ga},sem/Sbj},
	    {core/{pos/p,form/wo},sem/Iob},
	    {core/{pos/p,form/ni},sem/Dob}],
	sem/[Act,Sbj,Iob,Dob]}).

%%% temp feature
%% kiru,akeru
temp1({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,2,f,f,AB,AE,AD,AT).
%% anki-suru
temp2({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,0,f,u,AB,AE,AD,AT).
%% aruku,yomu
temp3({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,2,f,0,AB,AE,AD,AT).
%% matu,damaru
temp4({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,1,1,f,0,AB,AE,AD,AT).
%% suwaru,kekkon-suru
temp5({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,2,0,f,AB,AE,AD,AT).
%% suwaru,sinu
temp6({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,0,0,f,AB,AE,AD,AT).
%% niru,tadayou
temp7({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(0,0,0,0,u,AB,AE,AD,AT).
%% odoroku,tumaduku
temp8({core/{view/asp(AB,AE,AD,AT)}});
	temp_cstr(3,2,2,0,0,AB,AE,AD,AT).

%%% lexical entry
dict1(age,Cat):-ga_wo_ni_verb(vv,give,Cat).
dict1(ai,Cat):-ga_wo_verb(vs2,love,Cat).
dict1(ake,Cat):-ga_wo_verb(vv,open,Cat),temp1(Cat).
% dict1(aruku,Cat):-ga_verb(vck,walk,Cat). (Fry)
dict1(aruk,Cat):-ga_verb(vck,walk,Cat).
dict1(chigaw,Cat):-ga_verb(vcw,differ,Cat).
dict1(chirijirininar,Cat):-ga_verb(vcr,scatter,Cat).
dict1(deki,Cat):-ga_verb(vv,can,Cat).
% dict1(der,Cat):-ga_ni_verb(vv,go_out,Cat).  (Fry)
dict1(de,Cat):-ga_ni_verb(vv,go_out,Cat).
% dict1(hashi,Cat):-ga_verb(vcr,run,Cat). (Fry)
dict1(hashir,Cat):-ga_verb(vcr,run,Cat).
dict1(hazure,Cat):-ga_wo_verb(vv,be_off,Cat).
dict1(i,Cat):-ga_verb(vv,be,Cat).
dict1(ik,Cat):-ga_ni_verb(vck,go_to,Cat).
dict1(isog,Cat):-ga_verb(vcg,hurry,Cat).
dict1(kaer,Cat):-ga_ni_verb(vcr,return,Cat).
dict1(kag,Cat):-ga_wo_verb(vcg,smell_of,Cat).
dict1(kak,Cat):-ga_wo_verb(vck,write,Cat).
dict1(kaw,Cat):-ga_wo_verb(vcw,buy,Cat).
dict1(kawar,Cat):-ga_verb(vcr,lose,Cat).
dict1(kat,Cat):-ga_ni_verb(vct,win,Cat).
% dict1(ker,Cat):-ga_wo_verb(vv,kick,Cat). (Fry)
dict1(ke,Cat):-ga_wo_verb(vv,kick,Cat). 
dict1(ki,Cat):-ga_wo(vv,wear,Cat),temp1(Cat).
dict1(majiwar,Cat):-ga_verb(vcr,cross,Cat).
dict1(manab,Cat):-ga_wo_verb(vcb,learn,Cat).
dict1(mayow,Cat):-ga_verb(vcw,be_lost,Cat).
dict1(mi,Cat):-ga_wo_verb(vv,see,Cat).
dict1(midare,Cat):-ga_verb(vv,be_confused,Cat).
dict1(mitsuke,Cat):-ga_wo_verb(vv,find,Cat).
dict1(mot,Cat):-ga_wo_verb(vct,have,Cat).
% dict1(nar,Cat):-ga_ni_verb(vv,become,Cat). (Fry) 
dict1(na,Cat):-ga_ni_verb(vv,become,Cat). 
dict1(nor,Cat):-ga_ni_verb(vcr,get_on,Cat).
dict1(ok,Cat):-ga_wo_ni_verb(vck,put,Cat).
dict1(omow,Cat):-ga_wo_verb(vcw,think,Cat).
dict1(os,Cat):-ga_wo_verb(vcs,push,Cat).
% dict1(saegi,Cat):-ga_wo_verb(vcr,interrupt,Cat). (Fry)
dict1(saegir,Cat):-ga_wo_verb(vcr,interrupt,Cat).
dict1(sagas,Cat):-ga_wo_verb(vcs,seek,Cat).
dict1(shir,Cat):-ga_wo_verb(vcr,know,Cat).
dict1(shin,Cat):-ga_verb(vcn,die,Cat).
dict1(susum,Cat):-ga_ni_verb(vcm,advance,Cat).
dict1(tador,Cat):-ga_wo_verb(vcr,follow,Cat).
% dict1(tasuker,Cat):-ga_wo_verb(vv,help,Cat). (Fry)
dict1(tasuke,Cat):-ga_wo_verb(vv,help,Cat).
dict1(toor,Cat):-ga_ni_verb(vcr,pass,Cat).
% dict1(tsuger,Cat):-ga_wo_ni_verb(vv,tell,Cat). (Fry)
dict1(tsuge,Cat):-ga_wo_ni_verb(vv,tell,Cat).
dict1(tsuk,Cat):-ga_ni_verb(vck,reach,Cat).
dict1(tsuzuku,Cat):-ga_verb(vck,continue,Cat).
dict1(wakar,Cat):-ga_wo_verb(vcr,understand,Cat).
dict1(yom,Cat):-ga_wo_verb(vcm,read,Cat).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%	sahen.dic
%%%%%	sahen-n,v dictionary
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%	verb : SURU
suru_verb(F,
	{core/{pos/vs,form/F},ajc/Adj,sc/SC,sem/Sem}); 
	suru(Adj,SC,Sem).

dict1(shi,Cat):-suru_verb(v_si,Cat).
dict1(se,Cat):-suru_verb(v_se,Cat).
dict1(sa,Cat):-suru_verb(v_sa,Cat).
dict1(sure,Cat):-suru_verb(katei,Cat).
dict1(shiro,Cat):-suru_verb(imp,Cat).
dict1(sero,Cat):-suru_verb(imp,Cat).

%%%%%   sa-hen verbs (do)
sahen_verb(F,Act,
	{core/{pos/v,form/F},sc/[{core/{pos/p,form/ga},sem/Sbj}],
	sem/[Act,Sbj]} ).
dict1(tanjou,Cat):-sahen_verb(vs1,be_born,Cat).

%%%%%	sa-hen nouns.
%% dict1(chousa,
%%       {pos/n,NFORM,[],[],SC,[],[],Sem} );
%%	sahen_noun(NFORM,investigate,SC,SEM).
%% sahen_noun(n,SEM,[],SEM).
%% sahen_noun(ns,SEM1,SC,[SEM1,Sbj,Obj]):-adn_wo_ga(SC,Obj,Sbj).
dict1(chousa, 
	{core/{pos/n,form/ns},sc/SC,sem/[investigate,Sbj,Obj]} );
	adn_wo_ga(SC,Obj,Sbj).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%   adject.dic
%%%%%	adjective, adjective-verb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%   Adjectives	%%%%%%%%%%%%%
adjective(A,
	{core/{pos/v,form/adj},
	sc/[{core/{pos/p,form/ga},sem/Obj}],
	sem/[A,Obj]} ).
dict1(aka,Cat):-adjective(red,Cat).
dict1(siro,Cat):-adjective(white,Cat).
dict1(kuro,Cat):-adjective(black,Cat).
dict1(ooki,Cat):-adjective(big,Cat).
dict1(yo,Cat):-adjective(good,Cat).

%%%%%	na (adjective-verb)
ajverb(A,
	{core/{pos/v,form/na},
	sc/[{core/{pos/p,form/ga},sem/Obj}],
	sem/[A,Obj]} ).
dict1(kirei,Cat):-ajverb(beautifle,Cat).
dict1(kaiteki,Cat):-ajverb(comfortable,Cat).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%		etc.dic
%%%%%%%		dictionary of other words
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%% rentai-shi
rentaishi(A,
	{core/{pos/adn, form/adn}, 
	ajn/[{core/{pos/n,form/n},ajc/[],ajn/[],sc/[],sem/SEM}], 
%	sem/[A|SEM]}
	sem/[A|[SEM]]}
).
dict1(sono,Cat):-rentaishi(the,Cat).
dict1(kono,Cat):-rentaishi(this,Cat).
dict1(ano,Cat):-rentaishi(that,Cat).
dict1(ippikino,Cat):-rentaishi(one,Cat).

%%%%%%% fuku-shi (adverb)

adverb(MODIFY, 
	{core/{pos/adv, form/adv}, ajn/[{core/{pos/v},sem/SEM}], 
	sem/[MODIFY|SEM]}).
dict1(yoku,Cat):-adverb(often,Cat).
dict1(zutto,Cat):-adverb(continue,Cat).
dict1(hajimeni,Cat):-adverb(first,Cat).
dict1(sukoshi,Cat):-adverb(slightly,Cat).
dict1(yagate,Cat):-adverb(in_the_end,Cat).
dict1(tsugitsugito,Cat):-adverb(continue,Cat).
dict1(dandanni,Cat):-adverb(gradually,Cat).
dict1(komakani,Cat):-adverb(minutely,Cat).
dict1(kesshite,
%	{core/{pos/adv,form/adv}, ajn/[{core/{pos/v},sem/[not|SEM]}],(Fry)
	{core/{pos/adv,form/adv}, ajn/[{core/{pos/v},sem/[no|SEM]}],
	sem/[never|SEM]}).


%%  Examples
%% ?-p([ken,ga,naomi,wo,ai,suru]).
%% ?-p([ken,ga,naomi,ni,ai,sa,re,ta]).
%%


syntax highlighted by Code2HTML, v. 0.9.1