%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % pertinencia de elementos a listas /* X foi encontrado, portanto pertence `a lista */ pertence(X,[X|_]). /* X ainda nao foi encontrado, portanto pode pertencer ao resto da lista */ pertence(X,[Y|L]) :- pertence(X,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % concatenação de listas /* a concatenacao de uma lista com a lista vazia e' a propria lista */ concat([],L,L). /* o resultado da concatenacao de uma lista nao vazia L (representada por [H|L1] com outra lista qualquer L2 e' uma lista que contem o primeiro elemento da primeira lista (H) e cuja cauda e' o resultado da concatenacao da cauda da primeira lista com a segunda lista. */ concat([H|L1],L2,[H|L3]) :- concat(L1,L2,L3). /* a concatenacao de uma lista com a lista vazia e' a propria lista */ concat([],L,L). /* o resultado da concatenacao de uma lista nao vazia L (representada por [H|L1] com outra lista qualquer L2 e' uma lista que contem o primeiro elemento da primeira lista (H) e cuja cauda e' o resultado da concatenacao da cauda da primeira lista com a segunda lista. */ concat([H|L1],L2,[H|L3]) :- concat(L1,L2,L3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* o reverso de uma lista vazia e' a lista vazia */ rev([],[]). /* o reverso de uma lista nao vazia [H|L1] e' obtido atraves da concatenacao do reverso da cauda desta lista (L1) com o primeiro elemento da lista (H) */ rev([H|L1],R) :- rev(L1,L2), concat(L2,[H],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* o tamanho da lista vazia e' zero */ tam([],0). /* o tamanho da lista nao vazia L ([H|L1]) e' obtido atraves do tamanho da lista menor L1 (sem o primeiro elemento) mais 1. */ tam([H|L1],N) :- tam(L1,N1), N is N1 + 1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* remove X de lista vazia e' lista vazia */ remove([],X,[]). /* remove X de lista que contem X e' a lista sem X */ remove([X|L],X,L). /* ainda nao encontrou X. Continua procurando */ remove([Y|L],X,[Y|L1]) :- remove(L,X,L1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* chave foi encontrada ou e' inserida */ lookup(K,arvbin(K,_,_,I),I). /* chave ainda nao foi encontrada, pode estar na sub-arvore da esquerda, se for menor do que a chave corrente, ou na sub-arvore da direita, se for maior do que a chave corrente. */ lookup(K,arvbin(K1,E,_,I1),I) :- K < K1, lookup(K,E,I). lookup(K,arvbin(K1,_,D,I1),I) :- K > K1, lookup(K,D,I). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* a interpretacao do termo basico true deve ser sempre satisfeita (axioma) */ interp(true). /* a interpretacao de uma conjuncao e' satisfeita, se a interpretacao de cada termo/literal da conjuncao for satisfeita */ interp((G1,G2)) :- interp(G1), interp(G2). /* a interpretacao de uma disjuncao e' satisfeita, se pelo menos uma interpretacao de alguma disjuncao for satisfeita */ interp((G1;G2)) :- interp(G1); interp(G2). /* a interpretacao de um literal simples e' satisfeita, se o literal existir no programa e seu antecedente for satisfeito */ interp(G) :- clause(G,B), interp(B). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* Chegar de A a Z, retornando caminho percorrido P, comecando de um caminho vazio */ path(A,Z,P) :- path1(A,Z,[],P). /* Se ja' cheguei ao destino, parar a busca e incluir destino na lista contendo o caminho percorrido */ path1(Z,Z,L,[Z|L]). /* Se ainda nao cheguei no destino, encontrar caminho parcial de A para Y, verificar se este caminho e' valido (isto e', ja' passei por Y antes?). Se for um caminho valido, adicionar `a lista contendo o caminho parcial e continuar a busca a partir de Y */ path1(A,Z,L,P) :- (conectado(A,Y); /* encontra caminho parcial */ conectado(Y,A)), /* de A para Y ou de Y para A */ \+ member(Y,L), /* verifica se ja passei por Y */ path1(Y,Z,[Y|L],P). /* encontra caminho parcial de */ /* Y a Z */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Programa para transformar frases em linguagem natural para lógica % ?- sentence(P,[every,man,loves,a,woman],[]). % qual é o valor de P? :-op(500,xfy,&). :-op(600,xfy,'->'). sentence(P) --> noun_phrase(X,P1,P), verb_phrase(X,P1). noun_phrase(X,P1,P) --> determiner(X,P2,P1,P), noun(X,P3), rel_clause(X,P3,P2). noun_phrase(X,P,P) --> proper_noun(X). verb_phrase(X,P) --> trans_verb(X,Y,P1), noun_phrase(Y,P1,P). verb_phrase(X,P) --> intrans_verb(X,P). rel_clause(X,P1,(P1&P2)) --> [that], verb_phrase(X,P2). rel_clause(_,P,P) --> [].