/*+-------------------------------------------+ | implementação dos predicados da gramática | +-------------------------------------------+*/ ptrans --> [Verbo], {pertence_lista(Verbo,[foi,saiu])}. mtrans --> [Verbo], {pertence_lista(Verbo,[pediu])}. atrans --> [Verbo], {pertence_lista(Verbo,[entregou])}. ingest --> [Verbo], {pertence_lista(Verbo,[comeu,bebeu])}. artigo_definido(masculino,singular) --> [o]. artigo_definido(masculino,plural) --> [os]. artigo_definido(feminino,singular) --> [a]. artigo_definido(feminino,plural) --> [as]. artigo_indefinido(masculino,singular) --> [um]. artigo_indefinido(masculino,plural) --> [uns]. artigo_indefinido(feminino,singular) --> [uma]. artigo_indefinido(feminino,plural) --> [umas]. preposicao1 --> [de]. preposicao2 --> [para]. preposicao3 --> [ao]. contracao1(masculino,singular) --> [do]. contracao1(masculino,plural) --> [dos]. contracao1(feminino,singular) --> [da]. contracao1(feminino,plural) --> [das]. contracao2(masculino,singular) --> [no]. contracao2(masculino,plural) --> [nos]. contracao2(feminino,singular) --> [na]. contracao2(feminino,plural) --> [nas]. substantivo(feminino,singular,Nome) --> [Nome],{pertence_lista(Nome, [mulher,cliente,conta,mesa,pizzaria,pizza,bebida,rua])}. substantivo(masculino,singular,Nome) --> [Nome],{pertence_lista(Nome, [homem,cliente,garcon,cardapio,dinheiro,refrigerante])}. substantivo_proprio(feminino,singular,Nome) --> [Nome],{pertence_lista(Nome, [sonia,elaine,pizzariaamichi])}. substantivo_proprio(masculino,singular,Nome) --> [Nome],{pertence_lista(Nome,[gazeta,joao])}. /*+--------------------------------------+ | implementação das regras gramaticais | +--------------------------------------+*/ sintagma_nominal(Genero,Numero,Palavras) --> substantivo(Genero,Numero,Palavras). sintagma_nominal(Genero,Numero,Palavras) --> substantivo_proprio(Genero,Numero,Palavras). sintagma_nominal(Genero,Numero,Palavras) --> artigo_definido(Genero,Numero), substantivo(Genero,Numero,Palavras). sintagma_nominal(Genero,Numero,Palavras) --> artigo_indefinido(Genero,Numero), substantivo(Genero,Numero,Palavras). sintagma_verbal(Genero,Numero,Palavras, [ptrans,Palavras,Palavras,Objeto1,Objeto2]) --> ptrans, (contracao1(Genero1,Numero1);preposicao1), sintagma_nominal(Genero1,Numero1,Objeto1), preposicao2, sintagma_nominal(Genero2,Numero2,Objeto2). sintagma_verbal(Genero,Numero,Palavras, [atrans,Palavras,Objeto1,Palavras,Objeto2]) --> atrans, sintagma_nominal(Genero1,Numero1,Objeto1), preposicao2, sintagma_nominal(Genero2,Numero2,Objeto2). sintagma_verbal(Genero,Numero,Palavras, [mtrans,Palavras,Objeto1,Objeto2]) --> mtrans, sintagma_nominal(Genero1,Numero1,Objeto1), preposicao2, sintagma_nominal(Genero2,Numero2,Objeto2). sintagma_verbal(Genero,Numero,Palavras, [ingest,Palavras,Objeto1]) --> ingest, sintagma_nominal(Genero1, Numero1,Objeto1). ponto --> [Ponto], {pertence_lista(Ponto, ['.'])}. sentenca(Trans) --> sintagma_nominal(Genero,Numero,Palavras), sintagma_verbal(Genero,Numero,Palavras,Trans), ponto. /*+----------------------------------------+ | implementação de predicados auxiliares | +----------------------------------------+*/ pertence_lista(X,[X|_]). pertence_lista(X,[_|Cauda]) :- pertence_lista(X,Cauda). /*+-----------------------------------------+ | especificação do script para a pizzaria | +-----------------------------------------+*/ script(pizzaria, [[ptrans,Ator,Ator,Rua,Pizzaria], [ptrans,Ator,Ator,Porta,Mesa], [mtrans,Ator,Cardapio,Garcon], [atrans,Ator,Garcon,Ator,Cardapio], [mtrans,Ator,Bebida,Garcon], [mtrans,Ator,Pizza,Garcon], [atrans,Ator,Garcon,Ator,Bebida], [atrans,Ator,Garcon,Ator,Pizza], [ingest,Ator,Pizza], [ingest,Ator,Bebida], [mtrans,Ator,Conta,Garcon], [atrans,Ator,Garcon,Ator,Conta], [atrans,Garcon,Ator,Garcon,Dinheiro], [ptrans,Ator,Ator,Pizzaria,Rua]], [[Ator,cliente], [Rua,rua], [Pizzaria,pizzariaamichi], [Porta,porta], [Mesa,mesa], [Bebida,refrigerante], [Pizza,pizza], [Cardapio,cardapio], [Dinheiro,dinheiro], [Conta,conta], [Garcon,garcon]]). /*+--------------------------------+ | implementação do VT_SAM | +--------------------------------+*/ vt_sam(Estoria,Script) :- busca(Estoria, Script, Padroes), combina(Script,Estoria), nomes_padrao(Padroes). vt_sam(Estoria,[]) :- write('A estoria não pode ser apresentada como um script.'),nl. busca(Estoria,Script,Padroes) :- autor(Slot,Estoria), nonvar(Slot), trigger(Slot,Nome), script(Nome,Script,Padroes). combina(_,[]). combina([Linha | Script],[Linha | Estoria]) :- combina(Script,Estoria). combina([_ | Script],Estoria) :- combina(Script,Estoria). autor(Slot,Estoria) :- pertence_lista([_ | Argumentos],Estoria), pertence_lista(Slot,Argumentos). nomes_padrao([]). nomes_padrao([[N,N] | Lista]) :- nomes_padrao(Lista). nomes_padrao([[N1,N2] | Lista]) :- nomes_padrao(Lista). trigger(pizzaria,pizzaria). trigger(pizzariaamichi,pizzaria). trigger(garcon,pizzaria). trigger(pizza,pizzaria). trigger(comeu,pizzaria). trigger(bebida,pizzaria). trigger(refrigerante,pizzaria). trigger(foi,pizzaria). trigger(pediu,pizzaria). trigger(entregou,pizzaria). /*+---------------------------+ | Ler uma sentenca | +---------------------------+*/ le_sentenca([W|Ws]):- get0(C), le_palavra(C, W, C1), le_resto_sentenca(W, C1, Ws). le_resto_sentenca(W,_, []):- ultima_palavra(W), !. le_resto_sentenca(W, C, [W1|Ws]):- le_palavra(C, W1, C1), le_resto_sentenca(W1, C1, Ws). le_palavra(C, W, C1):- caractere(C), !, name(W, [C]), get0(C1). le_palavra(C, W, C2):- pertence_palavra(C, NewC), !, get0(C1), resto_palavra(C1, Cs, C2), name(W, [NewC|Cs]). le_palavra(C, W, C2):- get0(C1), le_palavra(C1, W, C2). resto_palavra(C, [NewC|Cs], C2):- pertence_palavra(C, NewC), !, get0(C1), resto_palavra(C1, Cs, C2). resto_palavra(C, [], C). caractere(44). caractere(59). caractere(58). caractere(63). caractere(33). caractere(46). pertence_palavra(C, C):- C>96, C<123. pertence_palavra(C, L):- C>64, C<91, L is C+32. pertence_palavra(C, C):- C>47, C<58. pertence_palavra(39, 39). pertence_palavra(45, 45). ultima_palavra('.'). ultima_palavra('!'). ultima_palavra('?'). ler_estoria(Estoria) :- le_sentenca(Frase), (Frase == [sair,.] -> Estoria = [], !; sentenca(Frase2,Frase,[]), ler_estoria(Estoria1), Estoria = [Frase2|Estoria1]). gera_script([]) :- !. gera_script([Frase | Outras]) :- traduz(Frase), nl, !, gera_script(Outras), !. traduz([ptrans,Ator,Ator,Lugar1,Lugar2]) :- write(Ator), write(' foi de '), write(Lugar1), write(' para '), write(Lugar2). traduz([ptrans,Ator,Ator,Lugar1,Lugar2]) :- write(Ator), write(' saiu de '), write(Lugar1), write(' para '), write(Lugar2). traduz([atrans,Ator1,Ator2,Ator1,Objeto]) :- pertence_lista(Objeto,[cardapio,pizza, bebida,refrigerante,conta,dinheiro]), write(Ator2), write(' entregou '), write(Objeto), write(' para '), write(Ator1). traduz([mtrans,Ator1,Objeto,Ator2]) :- write(Ator1), write(' pediu '), write(Objeto), write(' para '), write(Ator2). traduz([ingest,Ator,Objeto]) :- Objeto = pizza, write(Ator), write(' comeu '), write(Objeto). traduz([ingest,Ator,Objeto]) :- pertence_lista(Objeto,[bebida,refrigerante]), write(Ator), write(' bebeu '), write(Objeto). pizzaria:- nl, write('============================================='), nl, write('PLN-pizzaria:--> Digite uma sentenca:'), nl, write('============================================='), nl, write('PLN-pizzaria:--> Digite "sair." para terminar'), nl, write('============================================='), nl, repeat, ler_estoria(Estoria), nl, write('============================================='), nl, vt_sam(Estoria,Script),!, gera_script(Script), write('============================================='),nl, write('PLN-pizzaria:--> Fim da estória...'),nl, write('=============================================').