
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% part(L,C,E): la secuencia de palabras L se particiona de acuerdo a lista
%              constituyentes C para generar estructura E

part([],[],[]).

part(L,[P|LRP],[E|RE]) :- not(P=opt(_)),not(P=opt+(_)),!,
  E=(P=_),L1=[_|_],append(L1,L2,L),analisis(L1,E),
  part(L2,LRP,RE).

part(L,[opt(_)|LRP],E) :- part(L,LRP,E).

part(L,[opt+(_)|LRP],E) :- part(L,LRP,E).

part(L,[opt(P)|LRP],E) :- part(L,[P|LRP],E).

part(L,[opt+(P)|LRP],E) :- part(L,[P,opt+(P)|LRP],E).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% analisis(L,E): la secuencia de palabras L se analiza como E
%

analisis(L,C=L) :- lexico(L,C).
analisis(L,C=E) :- length(L,_),regla(C,LC),part(L,LC,E).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% regla(C,LC): la categoria gramatical C se puede construir a partir de la
%             lista de constituyentes LC (opt: 0 o uno, opt+: 0 o mas).

regla(o,[sn,sp]).

regla(sp,[v,sn,opt+(sprep)]).
regla(sp,[vi,opt+(sprep)]).

regla(sn,[opt(det),n,opt+(sprep),opt(srel)]).
regla(sn,[det,opt+(sprep),opt(srel)]).
regla(sn,[opt(det),np,opt+(sprep),opt(srel)]).

regla(sprep,[prep,sn]).

regla(srel,[prel,sp]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% lexico(L,C): la secuencia de palabras L es un caso de categoria C
%

lexico([una],det). % det: determinante
lexico([manzana],n). % n: nombre (sustantivo)
lexico([pera],n).
lexico([amiga],n).
lexico([maria],np). % np: nombre propio
lexico([santiago],np).
lexico([come],v). % v: verbo
lexico([vive],vi). % vi: verbo intransitivo
lexico([de],prep). % prep: preposicion
lexico([en],prep).
lexico([que],prel). % prel: pronombre relativo

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% display(E): muestra la estructura E
%

display(E) :- displayRec(E,0).

displayRec([],_) :- !.
displayRec([E|RE],N) :- !,displayRec(E,N),displayRec(RE,N).
displayRec(C=LC,N) :- !,writef('%r%d\n',['| ',N,C]), M is N+1, displayRec(LC,M).
displayRec(T,N) :- writef('%r%d\n',['| ',N,T]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% uso:
%
% ? consult(gram).
% ...
% ? analisis([maria,come,una,manzana,de,una,amiga],o=E),display(o=E).
% ...
% ? analisis(L,o=E),display(o=E).
%


