:- op(1197,xfx,['-->','-*>']). :- op(600,fx,'?'). % metaoperador opcional :- op(600,fx,'*'). % metaoperador repetitivo :- op(600,xf,'?'). :- op(600,xf,'*'). :- op(600,xfy,'::'). % tipagem classe::instancia %:- dynamic lex /3. /* ---------------------------------------------------------------------- Metaoperadores ---------------------------------------------------------------------- */ perm(nil) -+-> []. perm(L) -+-> {pickone(X, L, L1)}, X, perm(L1). % pickone : Ele x (Ele, Ele, ...Ele) x (Ele, Ele, ...Ele) % seleciona um elemento de uma conjuncao de elementos, dando ainda uma % conjuncao dos que ficaram por selecionar. % No caso de haver repetitivos (*Ele ) a seleccao nao invalida % possibilidade de voltar a selecionar posteriormente esse elemento pickone(_, nil, _):- !,fail. pickone(X, (A,B), W):- !,( pickone(X,A,R), X\==[], (R==nil -> W=B ; W=(R,B) ) ; pickone(X,B,R), X\==[],(R==nil -> W=A ; W=(A,R))). pickone(X, *X2, L2 ):- !,( t_value(F,[H|T],X2), X=F-H, L2= *F-T ; t_value(F,[], X2), X=[], L2=nil). pickone(X, X, nil):- !. %---------------------------------------------------------------------- conj(X) -+-> X=F-S, F-H, ( [conj-e], conj(F-T), {S=(H,T)}; [conj-mas], conj(F-T), {S=(H,T)}; [conj-ou], conj(F-T), {S=(H;T)}; {S=H} ). /* --------------------------------------------------------------------- Definicao da sintaxe de definicao da sintaxe --------------------------------------------------------------------- */ :- multifile ==> /2. :- multifile ==> /3. gram ! (A > []) ==> ( H -+-> [] ) :- val(A,[],H). gram ! (A > B) ==> ( H -+-> T ) :- val(A,Sem,H), val(B,Sem,T). gram ! (A < B) ==> ( H -+-> T ) :- val(A,Sem,T), val(B,Sem,H). gram ! (Re -(F)-->Arg) ==> ( H ---> Tail_term ) :- mktail(Arg,Tail_term,SemT), SemRe =.. [F|SemT], val(Re,SemRe,H). gram ! (Re -(F)-*>Arg) ==> ( H ---> perm(Tail_term) ) :- mktail(Arg,Tail_term,SemT), SemRe =.. [F|SemT], val(Re,SemRe,H). mktail((Fa,B),(Ta,C),Se) :- void(Fa,Ta),!, mktail(B,C,Se). mktail((Fa,B),(Ta,C),[Sa|Se]) :- !,val(Fa,Sa,Ta), mktail(B,C,Se). mktail(Fa,Ta,[]) :- void(Fa,Ta),!. mktail(Fa,Ta,[Sa]) :- !,val(Fa,Sa,Ta). void(-X,Y) :- val(X,_,Y). /* simbolos sem semantica (que interesse)*/ val([A-Sem],Sem,[A-Sem]). val(conj(X),Sem,conj(Y)) :- val(X,Sem,Y). val((X|Y),Sem,(T1;T2)) :- val(X,Sem,T1),val(Y,Sem,T2). val(A,Sem,Fu) :- t_value(A,Sem,Fu). /* ---------------------------------------------------------------------- Estado ---------------------------------------------------------------------- */ state(Atrib,Value) :- var(Value),!, recorded(state(Atrib),Value,Ref). state(Atrib,Value) :- nonvar(Value),!, recorda(state(Atrib),Value,Ref),(true; erase(Ref),fail).