/***
LUCIEN ISMAEL FANTIN    RA: 880518

Universidade                            UNICAMP
Instituto                               IC - Instituto de Computacao
Curso:                                  Mestrado em Ciencia da Computacao
Area:                                   Processamento de Lingua Natural
Tese:                                   Analisador Sintatico para o Portugues
Orientadora:                            Ariadne Carvalho
Co-orientador:                          Jorge Stolfi
Auxiliar de iniciacao cientifica:       Sheila Almeida  RA: 993255
Inicio:                                 Marco/2000

	Programa em Prolog com gramatica de clausulas definidas 
para analisar a estrutura sintatica de sentencas. 
	Como resultado, gera a arvore de derivacao correspondendo 
as sentencas gramaticais, enquanto rejeita as sentencas agramaticais.

Para iniciar o programa digite:
?- gram.
***/



/*** CONTROLE PRINCIPAL ***/

/* Chamada do programa */
gram:-
	no(Last_Node),
	apres_result(Last_Node).

/* Faz o backtrack apresentando todos os resultados possiveis */
apres_result(Last_Node):-
	(
		retractall(arvore(_,_)),
		retractall(vez(_)),
		assert(vez(0)),
		sentenca(1,Last_Node,1,Last_Node,d,Arvore),
		retract(vez(N)),
		N1 is N+1,
		assert(vez(N1)),
		escreve_arv(Arvore,N1),
		assert(arvore(N1,Arvore)),
		fail
	;
		retract(vez(X)),
		avalia_result(X)
	).

/* Avalia o resultado, informando se nao conseguiu encontrar nenhuma arvore sintatica */
avalia_result(0):-
	!,
	tell(user_error),
	write('Sentença incorreta!'),
	nl,nl,
	told.
avalia_result(N):-
	gera_mae(N,[],AM),
	escreve_arv_mae(AM,N).



/*** EXIBICAO DA ARVORE DE DERIVACAO IDENTADA ***/

/* Escreve a N-esima arvore na saida padrao(tela) */
escreve_arv(Arvore,N):-
	escreve_cab_arv(N),
	formata_estrutura(Arvore,0),
	nl,nl.

/* Escreve o cabecalho de identificacao da arvore */
escreve_cab_arv(N):-
	write('Árvore de derivação '),
	write(N),
	write(':'),
	nl.

/* Exibicao da estrutura da sentenca - arvore */
formata_estrutura(Estrut,Ident):-
	Estrut=..[Nome|[Arco,LParam,LSubArv]],
	tab(Ident),
	write(Nome),
	write(Arco),
	write(LParam),
	nl,
	Ident_args is Ident + 2,
	trata_args(LSubArv,Ident_args).

/* Trata lista de subarvores da arvore */
trata_args([],_):-!.
trata_args([C|L],Ident):-
	formata_estrutura(C,Ident),
	trata_args(L,Ident).



/*** EXIBICAO DA ARVORE MAE IDENTADA ***/

/* Escreve a arvore mae na saida padrao(tela) */
escreve_arv_mae(AM,N):-
	escreve_cab_arv_mae(N),
	formata_estrutura_mae(AM,0),
	nl,nl.

/* Escreve o cabecalho da arvore mae */
escreve_cab_arv_mae(N):-
	nl,
	write('Árvore Mãe do total de '),
	write(N),
	write(' árvore(s):'),
	nl,
	nl.

/* Exibicao da estrutura da sentenca - arvore mae */
formata_estrutura_mae(AM,Ident):-
	AM=..[Nome|[Arco,LParam,LSol]],
	tab(Ident),
	write(Nome),
	write(Arco),
	write(LParam),
	nl,
	Ident_sol is Ident + 2,
	trata_sol(LSol,Ident_sol).

/* Trata lista de solucoes da arvore mae */
trata_sol([],_):-!.
trata_sol([C],Ident):-
	!,
	trata_subarv(C,Ident).
trata_sol([C|L],Ident):-
	trata_subarv(C,Ident),
	tab(Ident),
	write('-------------------- OU --------------------'),
	nl,
	trata_sol(L,Ident).

/* Trata lista de subarvores de uma solucao da arvore mae */
trata_subarv([],_):-!.
trata_subarv([C|L],Ident):-
	formata_estrutura_mae(C,Ident),
	trata_subarv(L,Ident).



/*** CONSTRUCAO DA ARVORE MAE A PARTIR DAS ARVORES UNICAS ***/

/* Explicacao dos parametros a seguir: E-entrada, S-saida */
/* Geracao da arvore mae atraves da insercao de todas as arvores obtidas */

gera_mae(0,AM,AM):-!.
gera_mae(N,AME,AMS):-
	N1 is N-1,
	gera_mae(N1,AME,AM),
	arvore(N,Arv),
	insere_arv(Arv,AM,AMS).


/* Insercao de uma arvore na arvore mae */
/* Parametros: arvore a inserir(E), arvore mae fornecida(E), arvore mae retornada(S) */
/* Regra 1: Insere arvore(ou subarvore) em arvore mae ainda sem nenhuma arvore */
/* Regra 2: Se a arvore e a arvore mae tem os mesmos parametros, insere esta nova solucao na arvore mae 
   Obs.: Isto e' garantido para a raiz raiz que e' sempre sentenca e nao tem parametros */

insere_arv(Arv,[],AMS):-
	!,
	Arv=..[Raiz|[Arco,LParam,LSubArvE]],
	formata_lsubarv(LSubArvE,LSubArvS),
	AMS=..[Raiz|[Arco,LParam,[LSubArvS]]].
insere_arv(Arv,AME,AMS):-
	Arv=..[Raiz|[Arco,LParam,LSubArv]],
	AME=..[Raiz|[Arco,LParam,LSolAnt]],
	insere_sol(LSubArv,LSolAnt,LSolNova),
	AMS=..[Raiz|[Arco,LParam,LSolNova]].


/* Insere uma solucao na lista de solucoes da arvore mae (cada solucao e' uma lista de subarvores) */
/* Parametros: lista de subarvores da arvore(E),
               lista de solucoes ja existentes na arvore mae(E),
               lista de solucoes atualizada da arvore mae(S) */
/* Regra 1: se a lista vazia de subarvores ja existe como uma solucao */
/* Regra 2: se a lista de subarvores ja e' uma das solucoes */
/* Regra 3: senao cria uma nova solucao como sendo a lista de subarvores formatada */

insere_sol([],[[]],[[]]):-!.
insere_sol(LSubArv,LSolAnt,LSolNova):-
	membro_sol(LSubArv,LSolAnt,LSolNova),
	!.
insere_sol(LSubArvE,LSolAnt,[LSubArvS|LSolAnt]):-
	formata_lsubarv(LSubArvE,LSubArvS).


/* Verifica se uma lista de subarvores da arvore ja e' uma das solucoes da arvore mae,
   se sim, retorna a lista de solucoes ja atualizada */
/* Parametros: lista de subarvores da arvore(E),
               lista de solucoes existentes na arvore mae(E),
               lista atualizada de solucoes da arvore mae(S) */
/* Regra 1: se e' a primeira solucao da lista de solucoes */
/* Regra 2: senao verifica se membro do resto da lista de solucoes */

membro_sol(LSubArv,[CabSol|RestoSol],[CabSolS|RestoSol]):-
	igual_lsubarv(LSubArv,CabSol,CabSolS),
	!.
membro_sol(LSubArv,[CabSol|RestoSol],[CabSol|RestoSolS]):-
	membro_sol(LSubArv,RestoSol,RestoSolS).


/* Verifica se a (lista de subarvores) de uma arvore e de uma solucao da arvore mae
   tem os mesmo parametros, se sim, insere cada subarvore na lista de subarvores da
   solucao de parametros iguais da arvore mae */
/* Parametros: lista de subarvores da arvore(E), 
               lista de subarvores de uma solucao da arvore mae(E),
               lista de subarvores modificada(atualizada) de uma solucao da arvore mae(S) */
/* Regra 1: condicao de parada - uma lista vazia e' igual a uma lista vazia */
/* Regra 2: verifica os parametros da enesima subarvore da lista, inserindo-a 
            na mesma profundidade na arvore mae */

igual_lsubarv([],[],[]):-!.
igual_lsubarv([Arv|RestoArv],[AM|RestoAM],[AMS|RestoAMS]):-
	Arv=..[Raiz|[Arco,LParam,_]],
	AM=..[Raiz|[Arco,LParam,_]],
	insere_arv(Arv,AM,AMS),
	igual_lsubarv(RestoArv,RestoAM,RestoAMS).


/* Formata a lista de subarvores de uma arvore para inserir na mae,
   isto e', coloca sua lista de subarvores(e recursivamente de suas subs)
   em uma lista vazia de solucoes, tornando-se assim a primeira das solucoes
   para a arvore(ou subarvore) em questao */
/* Parametros: lista de subarvores da arvore(E), lista de subarvores da arvore mae(S) */
/* Regra 1: uma lista vazia de subarvores se torna uma lista vazia de subarvores na arvore mae */
/* Regra 2: formata cada uma da lista de subarvores */

formata_lsubarv([],[]):-!.
formata_lsubarv([CabE|RestoE],[CabS|RestoS]):-
	formata_lsubarv(RestoE,RestoS),
	insere_arv(CabE,[],CabS).



/*** MONTAGEM DA ARVORE - CHAMADA PELAS REGRAS DA GRAMATICA ***/

/*Monta uma arvore com a raiz dada e os elementos da lista de subarvores
que nao forem .(_,_,[]),
se a raiz do elemento for ., adiciona somente seus subelementos
ex. da chamada: monta_arv(Arv,sint_nom,[AE,N,AD])*/

monta_arv(Arv,Raiz,Arco,LParam,LSubArv):-
	analisa([],Lexist,LSubArv),
	Arv=..[Raiz|[Arco,LParam,Lexist]].

analisa(L,L,[]):-!.
analisa(Lja,LS,[Cab|Resto]):-
	analisa(Lja,LR,Resto),
	inclui_elem(Cab,LR,LS).

inclui_elem(.(_,_,[]),LE,LE):-!.
inclui_elem(Elem,LE,LS):-
	Elem=..[.|[_,_,Lsub]],
	!,
	append(Lsub,LE,LS).
inclui_elem(Elem,LE,[Elem|LE]).


sentenca(S1,S,INF,SUP,_,A):-
	sint_orac(S1,S,INF,SUP,d,A1,ora,fin,ind),
	monta_arv(A,sentenca,[S1,S],[],[A1]).

sint_orac(S1,S,INF,SUP,_,A,ora,FV,MV):-
	sint_pred(S2,S,INF,SUP,d,A2,prd,_,FV,MV,P,G,N),
	e_sint_nom(S1,S2,INF,S2,e,A1,suj,P,G,N),
	monta_arv(A,sint_orac,[S1,S],[ora,FV,MV],[A1,A2]).

sint_orac(S1,S,INF,SUP,_,A,ora,FV,MV):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,nul,sim,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,suj,P,G,N),
	monta_arv(A,sint_orac,[S1,S],[ora,FV,MV],[A1,A2]).

sint_orac(S1,S,INF,SUP,_,A,ora,FV,MV):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,nul,sim,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S3,S2,SUP,d,A2,suj,P,G,N),
	sint_nom(S3,S,S3,SUP,d,A3,odn,_,_,_),
	monta_arv(A,sint_orac,[S1,S],[ora,FV,MV],[A1,A2,A3]).

sint_orac(S1,S,INF,SUP,_,A,ora,FV,MV):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,nul,com,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S3,S2,SUP,d,A2,suj,P,G,N),
	sint_orac_incompl_suj(S3,S,S3,SUP,d,A3,odc,_,_,_),
	monta_arv(A,sint_orac,[S1,S],[ora,FV,MV],[A1,A2,A3]).

sint_orac(S1,S,INF,SUP,_,A,ora,FV,MV):-
	sint_pred(S1,S2,INF,SUP,d,A1,prd,com,FV,MV,P,G,N),
	sint_nom(S2,S,S2,SUP,d,A2,suj,P,G,N),
	monta_arv(A,sint_orac,[S1,S],[ora,FV,MV],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S,INF,SUP,d,A1,lvp,nul,_,sim,FV,MV,P,G,N,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S,INF,SUP,d,A1,lvp,odp,_,sim,FV,MV,P,G,N,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,_,sim,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,odn,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,com,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,nul,com,FV,MV,P,G,N,_,_,_),
	sint_orac_incompl_suj(S2,S,S2,SUP,d,A2,odc,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,com,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,_,sim,FV,MV,P,G,N,_,_,_),
	cj_nom_nom(S2,S,S2,SUP,d,A2,opo),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,_,sim,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,pob,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,_,sim,FV,MV,P,G,N,_,G2,N2),
	sint_adj_prep(S2,S,S2,SUP,d,A2,pob,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,_,sim,FV,MV,P,G,N,_,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,pob,_,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,_,sim,FV,MV,P,G,N,_,_,_),
	sint_adj(S2,S,S2,SUP,d,A2,pob,_,_),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,nul,sim,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_suj(S2,S,S2,SUP,d,A2,odo,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,com,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,nul,com,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_suj(S2,S,S2,SUP,d,A2,odc,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,com,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,_,sim,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_impess_obj(S2,S,S2,SUP,d,A2,odo,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,com,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,odp,_,com,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_impess_obj(S2,S,S2,SUP,d,A2,odc,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,com,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,sim,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,oip,sim,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_suj(S2,S,S2,SUP,d,A2,odo,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,sim,FV,MV,P,G,N],[A1,A2]).

sint_pred(S1,S,INF,SUP,_,A,prd,com,FV,MV,P,G,N):-
	sint_verb(S1,S2,INF,SUP,d,A1,lvp,nul,oip,com,FV,MV,P,G,N,P2,G2,N2),
	sint_orac_incompl_suj(S2,S,S2,SUP,d,A2,odc,P2,G2,N2),
	monta_arv(A,sint_pred,[S1,S],[prd,com,FV,MV,P,G,N],[A1,A2]).

sint_orac_incompl_impess_obj(S1,S,INF,SUP,_,A,odo,P2,G2,N2):-
	sint_verb(S1,S,INF,SUP,d,A1,lvp,nul,nul,_,nom,iim,3,mas,sin,_,_,_),
	monta_arv(A,sint_orac_incompl_impess_obj,[S1,S],[odo,P2,G2,N2],[A1]).

sint_orac_incompl_impess_obj(S1,S,INF,SUP,_,A,odc,P2,G2,N2):-
	sint_verb(S1,S,INF,SUP,d,A1,lvp,nul,nul,sim,nom,par,3,mas,sin,_,_,_),
	monta_arv(A,sint_orac_incompl_impess_obj,[S1,S],[odc,P2,G2,N2],[A1]).

sint_orac_incompl_suj(S1,S,INF,SUP,_,A,odo,3,mas,sin):-
	sint_pred(S1,S,INF,SUP,d,A1,prd,_,nom,iim,3,mas,sin),
	monta_arv(A,sint_orac_incompl_suj,[S1,S],[odo,3,mas,sin],[A1]).

sint_orac_incompl_suj(S1,S,INF,SUP,_,A,odc,3,mas,sin):-
	sint_pred(S1,S,INF,SUP,d,A1,prd,sim,nom,par,3,mas,sin),
	monta_arv(A,sint_orac_incompl_suj,[S1,S],[odc,3,mas,sin],[A1]).

sint_orac_incompl_suj(S1,S,INF,SUP,_,A,prd,P,G,N):-
	sint_pred(S1,S,INF,SUP,d,A1,prd,_,fin,ind,P,G,N),
	monta_arv(A,sint_orac_incompl_suj,[S1,S],[prd,P,G,N],[A1]).

sint_orac_incompl_obj(S1,S,INF,SUP,_,A,oio,P2,G2,N2):-
	sint_verb(S2,S,INF,SUP,d,A2,lvp,nul,_,sim,fin,ind,P,G,N,_,_,_),
	e_sint_nom(S1,S2,INF,S2,e,A1,suj,P,G,N),
	monta_arv(A,sint_orac_incompl_obj,[S1,S],[oio,P2,G2,N2],[A1,A2]).

sint_orac_incompl_sn(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	sint_orac_incompl_suj(S1,S,INF,SUP,d,A1,Fu,P,G,N),
	monta_arv(A,sint_orac_incompl_sn,[S1,S],[Fu,P,G,N],[A1]).

sint_orac_incompl_sn(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	sint_orac_incompl_obj(S1,S,INF,SUP,d,A1,Fu,P,G,N),
	monta_arv(A,sint_orac_incompl_sn,[S1,S],[Fu,P,G,N],[A1]).

sint_verb(S1,S,INF,SUP,_,A,lvp,ODP,OIP,sim,FV,MV,P,G,N,P2,G2,N2):-
	verbo(S1,S2,INF,SUP,d,A1,_,_,FV,MV,_,P,G,N),
	e_cj_pron_at(S2,S,S2,SUP,d,A2,ODP,OIP,enc,P2,G2,N2),
	monta_arv(A,sint_verb,[S1,S],[lvp,ODP,OIP,sim,FV,MV,P,G,N,P2,G2,N2],[A1,A2]).

sint_verb(S1,S,INF,SUP,_,A,lvp,ODP,OIP,sim,FV,MV,P,G,N,P2,G2,N2):-
	verbo(S2,S,INF,SUP,d,A2,_,_,FV,MV,_,P,G,N),
	cj_pron_at(S1,S2,INF,S2,e,A1,ODP,OIP,pro,P2,G2,N2),
	monta_arv(A,sint_verb,[S1,S],[lvp,ODP,OIP,sim,FV,MV,P,G,N,P2,G2,N2],[A1,A2]).

sint_verb(S1,S,INF,SUP,_,A,lvp,ODP,OIP,com,FV,MV,P,G,N,P2,G2,N2):-
	verbo_aux(S1,S2,INF,SUP,d,A1,_,_,FV,MV,_,P,G,N),
	e_cj_pron_at(S2,S,S2,SUP,d,A2,ODP,OIP,enc,P2,G2,N2),
	monta_arv(A,sint_verb,[S1,S],[lvp,ODP,OIP,com,FV,MV,P,G,N,P2,G2,N2],[A1,A2]).

sint_verb(S1,S,INF,SUP,_,A,lvp,ODP,OIP,com,FV,MV,P,G,N,P2,G2,N2):-
	verbo_aux(S2,S,INF,SUP,d,A2,_,_,FV,MV,_,P,G,N),
	cj_pron_at(S1,S2,INF,S2,e,A1,ODP,OIP,pro,P2,G2,N2),
	monta_arv(A,sint_verb,[S1,S],[lvp,ODP,OIP,com,FV,MV,P,G,N,P2,G2,N2],[A1,A2]).

verbo_aux(S1,S,INF,SUP,_,A,PAL,'ter',FV,MV,TV,P,G,N):-
	verbo(S1,S,INF,SUP,d,A1,PAL,'ter',FV,MV,TV,P,G,N),
	monta_arv(A,verbo_aux,[S1,S],[PAL,'ter',FV,MV,TV,P,G,N],[A1]).

verbo_aux(S1,S,INF,SUP,_,A,PAL,'haver',FV,MV,TV,P,G,N):-
	verbo(S1,S,INF,SUP,d,A1,PAL,'haver',FV,MV,TV,P,G,N),
	monta_arv(A,verbo_aux,[S1,S],[PAL,'haver',FV,MV,TV,P,G,N],[A1]).

cj_pron_at(S1,S,INF,SUP,_,A,odp,nul,pro,P2,G2,N2):-
	sint_pron(S1,S,INF,SUP,d,A1,adp,P2,G2,N2),
	monta_arv(A,cj_pron_at,[S1,S],[odp,nul,pro,P2,G2,N2],[A1]).

cj_pron_at(S1,S,INF,SUP,_,A,odp,nul,enc,P2,G2,N2):-
	sint_pron(S1,S,INF,SUP,d,A1,ade,P2,G2,N2),
	monta_arv(A,cj_pron_at,[S1,S],[odp,nul,enc,P2,G2,N2],[A1]).

cj_pron_at(S1,S,INF,SUP,_,A,nul,oip,pro,P2,G2,N2):-
	sint_pron(S1,S,INF,SUP,d,A1,aip,_,_,_),
	monta_arv(A,cj_pron_at,[S1,S],[nul,oip,pro,P2,G2,N2],[A1]).

cj_pron_at(S1,S,INF,SUP,_,A,nul,oip,enc,P2,G2,N2):-
	sint_pron(S1,S,INF,SUP,d,A1,aie,_,_,_),
	monta_arv(A,cj_pron_at,[S1,S],[nul,oip,enc,P2,G2,N2],[A1]).

cj_pron_at(S1,S,INF,SUP,_,A,odp,oip,pro,P2,G2,N2):-
	sint_pron(S2,S,INF,SUP,d,A2,adp,P2,G2,N2),
	sint_pron(S1,S2,INF,S2,e,A1,aip,_,_,_),
	monta_arv(A,cj_pron_at,[S1,S],[odp,oip,pro,P2,G2,N2],[A1,A2]).

cj_pron_at(S1,S,INF,SUP,_,A,odp,oip,enc,P2,G2,N2):-
	sint_pron(S2,S,INF,SUP,d,A2,ade,P2,G2,N2),
	sint_pron(S1,S2,INF,S2,e,A1,aie,_,_,_),
	monta_arv(A,cj_pron_at,[S1,S],[odp,oip,enc,P2,G2,N2],[A1,A2]).

cj_nom_nom(S1,S,INF,SUP,_,A,opo):-
	sint_nom(S1,S2,INF,SUP,d,A1,odn,_,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,pob,_,_,_),
	monta_arv(A,cj_nom_nom,[S1,S],[opo],[A1,A2]).

cj_nom_nom(S1,S,INF,SUP,_,A,opo):-
	sint_nom(S1,S2,INF,SUP,d,A1,odn,_,G2,N2),
	sint_adj_prep(S2,S,S2,SUP,d,A2,pob,G2,N2),
	monta_arv(A,cj_nom_nom,[S1,S],[opo],[A1,A2]).

cj_nom_nom(S1,S,INF,SUP,_,A,opo):-
	sint_nom(S2,S,INF,SUP,d,A2,odn,_,G2,N2),
	sint_adj_prep(S1,S2,INF,S2,e,A1,pob,G2,N2),
	monta_arv(A,cj_nom_nom,[S1,S],[opo],[A1,A2]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	subst(S3,S4,INF,SUP,d,A3,_,_,G,N,_),
	e_r_mod_ant(S2,S3,INF,S3,e,A2,adn,G,N),
	e_det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_mod_int_post(S4,S5,S4,SUP,d,A4,adn,G,N),
	e_mod_med_post(S5,S6,S5,SUP,d,A5,adn,G,N),
	e_r_mod_ext_post(S6,S,S6,SUP,d,A6,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3,A4,A5,A6]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	subst(S1,S2,INF,SUP,d,A1,_,_,G,N,_),
	pron(S2,S3,S2,SUP,d,A2,_,'nenhum',ind,adj,3,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	subst(S1,S2,INF,SUP,d,A1,_,_,G,N,_),
	pron(S2,S3,S2,SUP,d,A2,_,'algum',ind,adj,3,G,sin),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	subst(S2,S3,INF,SUP,d,A2,_,_,G,N,_),
	art(S1,S2,INF,S2,e,A1,_,_,ind,G,N),
	pron(S3,S4,S3,SUP,d,A3,_,'qualquer',ind,adj,3,G,N),
	e_r_mod_ext_post(S4,S,S4,SUP,d,A4,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3,A4]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	adj(S2,S3,INF,SUP,d,A2,_,_,G,N,_),
	det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S2,S3,INF,SUP,d,A2,_,_,pos,adj,3,G,N),
	det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S2,S3,INF,SUP,d,A2,_,_,dmi,adj,3,G,N),
	det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S2,S3,INF,SUP,d,A2,_,_,dmr,sub,3,G,N),
	e_det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S2,S3,INF,SUP,d,A2,_,_,ind,sub,3,G,N),
	e_det(S1,S2,INF,S2,e,A1,adn,G,N),
	e_r_mod_ext_post(S3,S,S3,SUP,d,A3,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S1,S2,INF,SUP,d,A1,_,_,int,sub,3,G,N),
	e_r_mod_ext_post(S2,S,S2,SUP,d,A2,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S1,S2,INF,SUP,d,A1,_,_,tra,sub,3,G,N),
	e_r_mod_ext_post(S2,S,S2,SUP,d,A2,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S1,S2,INF,SUP,d,A1,_,_,dmp,adj,3,G,N),
	e_r_mod_ext_post(S2,S,S2,SUP,d,A2,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S2,S3,INF,SUP,d,A2,_,_,dmp,sub,3,G,N),
	e_pron(S1,S2,INF,S2,e,A1,'tudo','tudo',ind,sub,3,G,N),
	e_pron(S3,S4,S3,SUP,d,A3,'tudo','tudo',ind,sub,3,G,N),
	e_r_mod_ext_post(S4,S,S4,SUP,d,A4,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2,A3,A4]).

sint_nom(S1,S,INF,SUP,_,A,Fu,3,G,N):-
	pron(S1,S2,INF,SUP,d,A1,_,_,dmo,sub,3,G,N),
	r_mod_ext_post(S2,S,S2,SUP,d,A2,adn,3,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,3,G,N],[A1,A2]).

sint_nom(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	sint_pron(S1,S2,INF,SUP,d,A1,Fu,P,G,N),
	e_pron(S2,S3,S2,SUP,d,A2,_,_,dmi,adj,3,G,N),
	e_sint_adjrel(S3,S,S3,SUP,d,A3,adn,P,G,N),
	monta_arv(A,sint_nom,[S1,S],[Fu,P,G,N],[A1,A2,A3]).

sint_nom(S1,S,INF,SUP,_,A,suj,3,mas,sin):-
	sint_orac(S1,S,INF,SUP,d,A1,ora,nom,ipe),
	monta_arv(A,sint_nom,[S1,S],[suj,3,mas,sin],[A1]).

sint_nom(S1,S,INF,SUP,_,A,odn,3,mas,sin):-
	sint_orac(S1,S,INF,SUP,d,A1,ora,nom,ipe),
	monta_arv(A,sint_nom,[S1,S],[odn,3,mas,sin],[A1]).

sint_pron(S1,S,INF,SUP,_,A,adp,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,adp,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[adp,P,G,N],[A1]).

sint_pron(S1,S,INF,SUP,_,A,ade,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,ade,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[ade,P,G,N],[A1]).

sint_pron(S1,S,INF,SUP,_,A,aip,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,aip,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[aip,P,G,N],[A1]).

sint_pron(S1,S,INF,SUP,_,A,aie,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,aie,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[aie,P,G,N],[A1]).

sint_pron(S1,S,INF,SUP,_,A,suj,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,ret,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[suj,P,G,N],[A1]).

sint_pron(S1,S,INF,SUP,_,A,nsp,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,ton,sub,P,G,N),
	monta_arv(A,sint_pron,[S1,S],[nsp,P,G,N],[A1]).

sint_adj_prep(S1,S,INF,SUP,_,A,Fu,G,N):-
	sint_prep(S1,S,INF,SUP,d,A1,Fu),
	monta_arv(A,sint_adj_prep,[S1,S],[Fu,G,N],[A1]).

sint_adj_prep(S1,S,INF,SUP,_,A,Fu,G,N):-
	sint_adj(S1,S,INF,SUP,d,A1,Fu,G,N),
	monta_arv(A,sint_adj_prep,[S1,S],[Fu,G,N],[A1]).

sint_prep(S1,S,INF,SUP,_,A,Fu):-
	prep(S1,S2,INF,SUP,d,A1,_,_),
	sint_nom(S2,S,S2,SUP,d,A2,nsp,_,_,_),
	monta_arv(A,sint_prep,[S1,S],[Fu],[A1,A2]).

sint_adj(S1,S,INF,SUP,_,A,Fu,G,N):-
	adj(S1,S,INF,SUP,d,A1,_,_,G,N,_),
	monta_arv(A,sint_adj,[S1,S],[Fu,G,N],[A1]).

sint_adjrel(S1,S,INF,SUP,_,A,adn,P,G,N):-
	rel(S1,S2,INF,SUP,d,A1,_,'que',adj,sub,P,G,N),
	sint_orac_incompl_sn(S2,S,S2,SUP,d,A2,_,P,G,N),
	monta_arv(A,sint_adjrel,[S1,S],[adn,P,G,N],[A1,A2]).

det(S1,S,INF,SUP,_,A,adn,G,N):-
	art(S1,S,INF,SUP,d,A1,_,_,def,G,N),
	monta_arv(A,det,[S1,S],[adn,G,N],[A1]).

det(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,dmp,adj,3,G,N),
	monta_arv(A,det,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,pos,adj,3,G,N),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,dmi,adj,3,G,N),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,dmr,adj,3,G,N),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,ind,adj,3,G,N),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,int,adj,3,G,N),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_ant(S1,S,INF,SUP,_,A,adn,G,N):-
	adj(S1,S,INF,SUP,d,A1,_,_,G,N,_),
	monta_arv(A,mod_ant,[S1,S],[adn,G,N],[A1]).

mod_int_post(S1,S,INF,SUP,_,A,adn,G,N):-
	subst(S1,S,INF,SUP,d,A1,_,_,_,_,_),
	monta_arv(A,mod_int_post,[S1,S],[adn,G,N],[A1]).

mod_int_post(S1,S,INF,SUP,_,A,adn,G,N):-
	pron(S1,S,INF,SUP,d,A1,_,_,pos,adj,3,G,N),
	monta_arv(A,mod_int_post,[S1,S],[adn,G,N],[A1]).

mod_med_post(S1,S,INF,SUP,_,A,adn,G,N):-
	sint_adj(S3,S,INF,SUP,d,A3,adn,G,N),
	e_r_sint_prep(S2,S3,INF,S3,e,A2,adn),
	e_adj(S1,S2,INF,S2,e,A1,_,_,G,N,_),
	monta_arv(A,mod_med_post,[S1,S],[adn,G,N],[A1,A2,A3]).

mod_ext_post(S1,S,INF,SUP,_,A,adn,P,G,N):-
	sint_prep(S1,S,INF,SUP,d,A1,adn),
	monta_arv(A,mod_ext_post,[S1,S],[adn,P,G,N],[A1]).

mod_ext_post(S1,S,INF,SUP,_,A,adn,P,G,N):-
	sint_adjrel(S1,S,INF,SUP,d,A1,adn,P,G,N),
	monta_arv(A,mod_ext_post,[S1,S],[adn,P,G,N],[A1]).

e_det(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_det(S1,S,INF,SUP,_,A,Fu,G,N):-
	det(S1,S,INF,SUP,d,A1,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1]).

e_r_mod_ant(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_r_mod_ant(S1,S,INF,SUP,_,A,Fu,G,N):-
	mod_ant(S1,S2,INF,SUP,d,A1,Fu,G,N),
	e_r_mod_ant(S2,S,S2,SUP,d,A2,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1,A2]).

e_mod_int_post(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_mod_int_post(S1,S,INF,SUP,_,A,Fu,G,N):-
	mod_int_post(S1,S,INF,SUP,d,A1,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1]).

e_mod_med_post(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_mod_med_post(S1,S,INF,SUP,_,A,Fu,G,N):-
	mod_med_post(S1,S,INF,SUP,d,A1,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1]).

e_r_mod_ext_post(S,S,_,_,_,.([S,S],[Fu,P,G,N],[]),Fu,P,G,N).

e_r_mod_ext_post(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	mod_ext_post(S1,S2,INF,SUP,d,A1,Fu,P,G,N),
	e_r_mod_ext_post(S2,S,S2,SUP,d,A2,Fu,P,G,N),
	monta_arv(A,.,[S1,S],[Fu,P,G,N],[A1,A2]).

r_mod_ext_post(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	mod_ext_post(S1,S2,INF,SUP,d,A1,Fu,P,G,N),
	e_r_mod_ext_post(S2,S,S2,SUP,d,A2,Fu,P,G,N),
	monta_arv(A,.,[S1,S],[Fu,P,G,N],[A1,A2]).

e_sint_prep(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_sint_prep(S1,S,INF,SUP,_,A,Fu,G,N):-
	sint_prep(S1,S,INF,SUP,d,A1,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1]).

e_r_sint_prep(S,S,_,_,_,.([S,S],[Fu,G,N],[]),Fu,G,N).

e_r_sint_prep(S1,S,INF,SUP,_,A,Fu,G,N):-
	sint_prep(S1,S2,INF,SUP,d,A1,Fu,G,N),
	e_r_sint_prep(S2,S,S2,SUP,d,A2,Fu,G,N),
	monta_arv(A,.,[S1,S],[Fu,G,N],[A1,A2]).

e_sint_adjrel(S,S,_,_,_,.([S,S],[Fu,P,G,N],[]),Fu,P,G,N).

e_sint_adjrel(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	sint_adjrel(S1,S,INF,SUP,d,A1,Fu,P,G,N),
	monta_arv(A,.,[S1,S],[Fu,P,G,N],[A1]).

e_cj_pron_at(S,S,_,_,_,.([S,S],[nul,nul,PPron,P,G,N],[]),nul,nul,PPron,P,G,N).

e_cj_pron_at(S1,S,INF,SUP,_,A,ODP,OID,PPron,P,G,N):-
	cj_pron_at(S1,S,INF,SUP,d,A1,ODP,OID,PPron,P,G,N),
	monta_arv(A,.,[S1,S],[ODP,OID,PPron,P,G,N],[A1]).

e_sint_nom(S,S,_,_,_,.([S,S],[Fu,P,G,N],[]),Fu,P,G,N).

e_sint_nom(S1,S,INF,SUP,_,A,Fu,P,G,N):-
	sint_nom(S1,S,INF,SUP,d,A1,Fu,P,G,N),
	monta_arv(A,.,[S1,S],[Fu,P,G,N],[A1]).

e_adj(S,S,_,_,_,.([S,S],[PAL,CAN,G,N,Gr],[]),PAL,CAN,G,N,Gr).

e_adj(S1,S,INF,SUP,_,A,PAL,CAN,G,N,Gr):-
	adj(S1,S,INF,SUP,d,A1,PAL,CAN,G,N,Gr),
	monta_arv(A,.,[S1,S],[PAL,CAN,G,N,Gr],[A1]).

e_pron(S,S,_,_,_,.([S,S],[PAL,CAN,TPron,F,P,G,N],[]),PAL,CAN,TPron,F,P,G,N).

e_pron(S1,S,INF,SUP,_,A,PAL,CAN,TPron,F,P,G,N):-
	pron(S1,S,INF,SUP,d,A1,PAL,CAN,TPron,F,P,G,N),
	monta_arv(A,.,[S1,S],[PAL,CAN,TPron,F,P,G,N],[A1]).

adj(S1,S,INF,SUP,_,A,PAL,CAN,G,N,Gr):-
	x_adj(S1,S,PAL,CAN,G,N,Gr),
	INF =< S1,
	SUP >= S,
	monta_arv(A,adjetivo,[S1,S],[PAL,CAN,G,N,Gr],[]).

x_adj(0,0,_,_,_,_,_).

adv(S1,S,INF,SUP,_,A,PAL,CAN,TAdv,Gr):-
	x_adv(S1,S,PAL,CAN,TAdv,Gr),
	INF =< S1,
	SUP >= S,
	monta_arv(A,adverbio,[S1,S],[PAL,CAN,TAdv,Gr],[]).

x_adv(0,0,_,_,_,_).

art(S1,S,INF,SUP,_,A,PAL,CAN,Tart,G,N):-
	x_art(S1,S,PAL,CAN,Tart,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,artigo,[S1,S],[PAL,CAN,Tart,G,N],[]).

x_art(0,0,_,_,_,_,_).

avos(S1,S,INF,SUP,_,A,PAL,CAN,G,N):-
	x_avos(S1,S,PAL,CAN,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,avos,[S1,S],[PAL,CAN,G,N],[]).

x_avos(0,0,_,_,_,_).

cod(S1,S,INF,SUP,_,A,PAL,CAN,TCod,G,N):-
	x_cod(S1,S,PAL,CAN,TCod,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,codificacao,[S1,S],[PAL,CAN,TCod,G,N],[]).

x_cod(0,0,_,_,_,_,_).

coord(S1,S,INF,SUP,_,A,PAL,CAN,TCoord,GCoord,C):-
	x_coord(S1,S,PAL,CAN,TCoord,GCoord,C),
	INF =< S1,
	SUP >= S,
	monta_arv(A,coordenador,[S1,S],[PAL,CAN,TCoord,GCoord,C],[]).

x_coord(0,0,_,_,_,_,_).

comp(S1,S,INF,SUP,_,A,PAL,CAN,TComp):-
	x_comp(S1,S,PAL,CAN,TComp),
	INF =< S1,
	SUP >= S,
	monta_arv(A,comparador,[S1,S],[PAL,CAN,TComp],[]).

x_comp(0,0,_,_,_).

conj(S1,S,INF,SUP,_,A,PAL,CAN,TConj,FV,MV):-
	x_conj(S1,S,PAL,CAN,TConj,FV,MV),
	INF =< S1,
	SUP >= S,
	monta_arv(A,conjuncao,[S1,S],[PAL,CAN,TConj,FV,MV],[]).

x_conj(0,0,_,_,_,_,_).

interj(S1,S,INF,SUP,_,A,PAL,CAN,TInterj):-
	x_interj(S1,S,PAL,CAN,TInterj),
	INF =< S1,
	SUP >= S,
	monta_arv(A,interjeicao,[S1,S],[PAL,CAN,TInterj],[]).

x_interj(0,0,_,_,_).

nome(S1,S,INF,SUP,_,A,PAL,CAN,G,N):-
	x_nome(S1,S,PAL,CAN,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,nome_proprio,[S1,S],[PAL,CAN,G,N],[]).

x_nome(0,0,_,_,_,_).

num(S1,S,INF,SUP,_,A,PAL,CAN,TNum,GNum,F,G,N,ONum):-
	x_num(S1,S,PAL,CAN,TNum,GNum,F,G,N,ONum),
	INF =< S1,
	SUP >= S,
	monta_arv(A,numeral,[S1,S],[PAL,CAN,TNum,GNum,F,G,N,ONum],[]).

x_num(0,0,_,_,_,_,_,_,_,_).

pont(S1,S,INF,SUP,_,A,PAL,CAN,TPont):-
	x_pont(S1,S,PAL,CAN,TPont),
	INF =< S1,
	SUP >= S,
	monta_arv(A,pontuacao,[S1,S],[PAL,CAN,TPont],[]).

x_pont(0,0,_,_,_).

prep(S1,S,INF,SUP,_,A,PAL,CAN):-
	x_prep(S1,S,PAL,CAN),
	INF =< S1,
	SUP >= S,
	monta_arv(A,preposicao,[S1,S],[PAL,CAN],[]).

x_prep(0,0,_,_).

pron(S1,S,INF,SUP,_,A,PAL,CAN,TPron,F,P,G,N):-
	x_pron(S1,S,PAL,CAN,TPron,F,P,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,pronome,[S1,S],[PAL,CAN,TPron,F,P,G,N],[]).

x_pron(0,0,_,_,_,_,_,_,_).

rel(S1,S,INF,SUP,_,A,PAL,CAN,FE,FI,P,G,N):-
	x_rel(S1,S,PAL,CAN,FE,FI,P,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,relativo,[S1,S],[PAL,CAN,FE,FI,P,G,N],[]).

x_rel(0,0,_,_,_,_,_,_,_).

sigla(S1,S,INF,SUP,_,A,PAL,CAN,TSigla,G,N):-
	x_sigla(S1,S,PAL,CAN,TSigla,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,sigla,[S1,S],[PAL,CAN,TSigla,G,N],[]).

x_sigla(0,0,_,_,_,_,_).

simb(S1,S,INF,SUP,_,A,PAL,CAN):-
	x_simb(S1,S,PAL,CAN),
	INF =< S1,
	SUP >= S,
	monta_arv(A,simbolos,[S1,S],[PAL,CAN],[]).

x_simb(0,0,_,_).

subst(S1,S,INF,SUP,_,A,PAL,CAN,G,N,Gr):-
	x_subst(S1,S,PAL,CAN,G,N,Gr),
	INF =< S1,
	SUP >= S,
	monta_arv(A,substantivo,[S1,S],[PAL,CAN,G,N,Gr],[]).

x_subst(0,0,_,_,_,_,_).

verbo(S1,S,INF,SUP,_,A,PAL,CAN,FV,MV,TV,P,G,N):-
	x_verbo(S1,S,PAL,CAN,FV,MV,TV,P,G,N),
	INF =< S1,
	SUP >= S,
	monta_arv(A,verbo,[S1,S],[PAL,CAN,FV,MV,TV,P,G,N],[]).

x_verbo(0,0,_,_,_,_,_,_,_,_).

no(00019).
x_art(1,4,'o','o',def,mas,sin).
x_adv(7,10,'que','que',qua,nor).
x_conj(7,10,'que','que',adv,fin,ind).
x_conj(7,10,'que','que',adv,fin,sub).
x_conj(7,10,'que','que',int,fin,ind).
x_coord(7,10,'que','que',pol,esp,ver).
x_comp(7,10,'que','que',dif).
x_pron(1,4,'o','o',adp,sub,3,mas,sin).
x_pron(1,4,'o','o',dmo,sub,3,mas,sin).
x_pron(7,10,'que','que',int,adj,3,fem,plu).
x_pron(7,10,'que','que',int,adj,3,fem,sin).
x_pron(7,10,'que','que',int,adj,3,mas,plu).
x_pron(7,10,'que','que',int,adj,3,mas,sin).
x_pron(7,10,'que','que',int,sub,3,mas,sin).
x_pron(10,13,'eles','ele',ret,sub,3,mas,plu).
x_pron(10,13,'eles','ele',ton,sub,3,mas,plu).
x_prep(7,10,'que','que').
x_rel(7,10,'que','que',adj,sub,1,fem,plu).
x_rel(7,10,'que','que',adj,sub,1,fem,sin).
x_rel(7,10,'que','que',adj,sub,1,mas,plu).
x_rel(7,10,'que','que',adj,sub,1,mas,sin).
x_rel(7,10,'que','que',adj,sub,2,fem,plu).
x_rel(7,10,'que','que',adj,sub,2,fem,sin).
x_rel(7,10,'que','que',adj,sub,2,mas,plu).
x_rel(7,10,'que','que',adj,sub,2,mas,sin).
x_rel(7,10,'que','que',adj,sub,3,fem,plu).
x_rel(7,10,'que','que',adj,sub,3,fem,sin).
x_rel(7,10,'que','que',adj,sub,3,mas,plu).
x_rel(7,10,'que','que',adj,sub,3,mas,sin).
x_rel(7,10,'que','que',adj,adv,3,_,_).
x_subst(10,13,'eles','ele',mas,plu,nor).
x_subst(4,7,'menino','menino',mas,sin,nor).
x_verbo(13,16,'viram','ver',fin,ind,pmq,3,_,plu).
x_verbo(13,16,'viram','ver',fin,ind,ppe,3,_,plu).
x_verbo(16,19,'saiu','sair',fin,ind,ppe,3,_,sin).
x_verbo(13,16,'viram','virar',fin,ind,pre,3,_,plu).
arco(00001,00004,'O',0).
arco(00004,00007,'menino',0).
arco(00007,00010,'que',0).
arco(00010,00013,'eles',0).
arco(00013,00016,'viram',0).
arco(00016,00019,'saiu',0).
