talk :- nl, write($Digite uma sentenca com um dos padroes abaixo:$), nl, write($______eh um(a)______.$), nl, write($um(a)______eh um(a)______.$), nl, write($______eh um(a)______?$), nl, nl, write($Digite stop. para sair.$), nl, nl, repeat, read_in(Lista), reacao1(Lista, Reacao), call(Reacao), Reacao = stop, !. /* Ler uma sentenca */ read_in([W|Ws]):- get0(C), readword(C, W, C1), restsent(W, C1, Ws). /* Dado uma palavra e um caracter apos a palavra, ler o resto da sentenca */ restsent(W,_, []):- lastword(W), !. restsent(W, C, [W1|Ws]):- readword(C, W1, C1), restsent(W1, C1, Ws). /* ler uma palavra simples, dado um caracter inicial, lembras qual caracter vem apos a palavra */ readword(C, W, C1):- single_character(C), !, name(W, [C]), get0(C1). readword(C, W, C2):- in_word(C, NewC), !, get0(C1), restword(C1, Cs, C2), name(W, [NewC|Cs]). readword(C, W, C2):- get0(C1), readword(C1, W, C2). restword(C, [NewC|Cs], C2):- in_word(C, NewC), !, get0(C1), restword(C1, Cs, C2). restword(C, [], C). single_character(44). /* , */ single_character(59). /* ; */ single_character(58). /* : */ single_character(63). /* ? */ single_character(33). /* ! */ single_character(46). /* . */ /* caracteres que podem aparecer com uma palavra */ in_word(C, C):- C>96, C<123. /* a, b, ....z*/ in_word(C, L):- C>64, C<91, L is C+32. /* A, B, ....Z */ in_word(C, C):- C>47, C<58. /* 1, 2, 3, ....9*/ in_word(39, 39). in_word(45, 45). /* Pontuacao */ lastword('.'). lastword('!'). lastword('?'). artigo(um). artigo(uma). reacao1(X, Y) :- reacao(X, Y), !. reacao([X, eh, A, Y, '.'], ((retractall(NovoFato), assert(NovoFato)), write($Ok!$), nl)) :- artigo(A), NovoFato =.. [Y,X]. reacao([A1, X, eh, A2, Y, '.'], (retractall(Regra), assert(Regra), write($Ok!$), nl)) :- artigo(A1), artigo(A2), Cab =.. [Y,Z], Corpo =.. [X, Z], Regra = (Cab :- Corpo). reacao([X, eh, A, Y, '?'], ((call(Pergunta) -> write($Sim$); write($Nao sei$)), nl)) :- artigo(A), Pergunta =.. [Y,X]. reacao([stop,'.'],stop). reacao(_, (write($Padrao de sentenca nao reconhecido.$), nl)). stop.