Departamento de Fsica e Matemtica FFCLRP-USP E-mail: augusto@usp.br URL: http://dfm.fmrp.usp.br/~augusto Inteligncia Artificial Introduo Programao Introduo Programao Prolog (Tutorial) Prolog (Tutorial) Nesta aula so introduzidos conceitos bsicos da linguagem de programao lgica Prolog Os conceitos so introduzidos atravs de um tutorial sobre relaes familiares Maiores detalhes sobre terminologia e notao sero vistos nas prximas aulas 2 Introduo Introduo Prolog = Programming in Logic Linguagem de programao utilizada para resolver problemas envolvendo objetos e relaes entre objetos Conceitos bsicos: fatos, perguntas, variveis, conjunes e regras Conceitos avanados: listas e recurso 3 Programao Lgica Programao Lgica Programao Procedural (procedimental): Programa = Algoritmo + Estruturas de Dados Programao Lgica Algoritmo = Lgica + Controle Programa = Lgica + Controle + Estruturas de Dados Em PL, programa-se de forma declarativa, ou seja, especificando o que deve ser computado ao invs de como deve ser computado 4 Programao em Prolog Programao em Prolog Programar em Prolog envolve: declarar alguns fatos a respeito de objetos e seus relacionamentos definir algumas regras sobre os objetos e seus relacionamentos e fazer perguntas sobre os objetos e seus relacionamentos 5 Definindo Relaes por Fatos Definindo Relaes por Fatos A figura ao lado mostra um exemplo da relao famlia O fato que Abrao um progenitor de Isaque pode ser escrito em Prolog como: progenitor(abrao,isaque). Neste caso definiu-se progenitor como o nome de uma relao; abrao e isaque so seus argumentos Abrao Sara Isaque Ismael Esa Jac Jos 6 Definindo Relaes por Fatos Definindo Relaes por Fatos A rvore familiar completa em Prolog : progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). Este programa consiste de seis clusulas Cada uma dessas clusulas declara um fato sobre a relao progenitor Abrao Sara Isaque Ismael Esa Jac Jos 2 7 Definindo Relaes por Fatos Definindo Relaes por Fatos Por exemplo progenitor(abrao,isaque). uma instncia particular da relao progenitor Esta instncia tambm chamada de relacionamento Em geral, uma relao definida como o conjunto de todas suas instncias Abrao Sara Isaque Ismael Esa Jac Jos 8 Definindo Relaes por Fatos Definindo Relaes por Fatos A ordem dos argumentos em uma relao definida arbitrariamente, mas deve ser seguida e usada de forma consistente progenitor(abrao,isaque) significa que Abrao progenitor de Isaque progenitor(isaque,abrao) significa que Isaque progenitor de Abrao Note que progenitor(abrao,isaque) no tem o mesmo significado que progenitor(isaque,abrao) 9 Definindo Relaes por Fatos Definindo Relaes por Fatos Os nomes das relaes e seus argumentos so arbitrrios, ou seja: progenitor(abrao,isaque) a(b,c) so semanticamente equivalentes desde que a signifique progenitor b signifique abrao e c signifique isaque Normalmente, o programador escolhe nomes significativos 10 Definindo Relaes por Fatos Definindo Relaes por Fatos Quando o programa interpretado/compilado, pode-se questionar Prolog sobre a relao progenitor, por exemplo: Isaque o pai de Jac? Esta pergunta pode ser comunicada Prolog digitando: ?- progenitor(isaque,jac). Como Prolog encontra essa pergunta como um fato inserido em sua base, Prolog responde: yes Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 11 Definindo Relaes por Fatos Definindo Relaes por Fatos Uma outra pergunta pode ser ?- progenitor(ismael,jac). Prolog responde: no porque o programa no menciona nada sobre Ismael como sendo o progenitor de Jac Prolog tambm responde no pergunta: ?- progenitor(jac,moiss). no Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 12 Definindo Relaes por Fatos Definindo Relaes por Fatos Perguntas mais interessantes tambm podem ser efetuadas: Quem o progenitor de Ismael? ?- progenitor(X,ismael). Neste caso, Prolog no vai responder apenas yes ou no. Prolog fornecer o valor de X tal que a pergunta acima seja verdadeira Assim a resposta : X = abrao Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 3 13 Definindo Relaes por Fatos Definindo Relaes por Fatos A pergunta Quais os filhos de Isaque? pode ser escrita como: ?- progenitor(isaque,X). Neste caso, h mais de uma resposta possvel; Prolog primeiro responde com uma soluo: X = esa Pode-se requisitar uma outra soluo (digitando ;) e Prolog encontra: X = jac Se mais solues forem requisitadas, Prolog responde no pois todas as solues foram exauridas (no = sem mais solues) Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 14 Definindo Relaes por Fatos Definindo Relaes por Fatos Questes mais amplas podem ser efetuadas: Quem o progenitor de quem? Reformulando: encontre X e Y tais que X o progenitor de Y ?- progenitor(X,Y). Prolog encontra todos os pares progenitor-filho um aps o outro As solues so mostradas uma de cada vez: X = sara Y = isaque; X = abrao Y = isaque; X = abrao Y = ismael; ... As solues podem ser interrompidas digitando [enter] ao invs de ; Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 15 Definindo Relaes por Fatos Definindo Relaes por Fatos Perguntas mais complexas tambm podem ser efetuadas, tais como: Quem o av de Jos? Como nosso programa no conhece diretamente a relao av, esta pergunta deve ser desmembrada em dois passos (1) Quem o progenitor de Jos? Assuma que um Y (2) Quem o progenitor de Y? Assuma que um X Esta pergunta composta pode ser escrita em Prolog como: ?-progenitor(Y,jos),progenitor(X,Y). X = isaque Y = jac X Y Jos progenitor progenitor av 16 Definindo Relaes por Fatos Definindo Relaes por Fatos A pergunta composta ?- progenitor(Y,jos), progenitor(X,Y). Pode ser lida como: Encontre X e Y tais que satisfaam os seguintes requisitos progenitor(Y,jos) e progenitor(X,Y) De maneira similar, podemos perguntar: Quem so os netos de Abrao? ?- progenitor(abrao,X), progenitor(X,Y). X = isaque Y = esa; X = isaque Y = jac 17 Definindo Relaes por Fatos Definindo Relaes por Fatos Outro tipo de pergunta pode ser efetuado: Esa e Jc tm um progenitor em comum? Isso pode ser expresso em duas etapas: Quem o progenitor, X, de Esa? (este mesmo) X um progenitor de Jac? A pergunta correspondente em Prolog : ?- progenitor(X,esa), progenitor(X,jac). X = isaque 18 Pontos Importantes Pontos Importantes O nome de uma relao deve comear com uma letra minscula A relao escrita primeiro e os seus argumentos so separados por vrgulas e colocados entre parnteses O ponto final . deve seguir o final do fato fcil definir uma relao em Prolog, por exemplo a relao progenitor, escrevendo n- tuplas de objetos que satisfazem a relao O usurio pode perguntar ao sistema Prolog sobre relaes definidas no programa 4 19 Pontos Importantes Pontos Importantes Um programa Prolog consiste de clusulas; cada clusula termina com um ponto final Os argumentos das relaes podem (entre outras coisas) ser: objetos concretos ou constantes (tais como abrao e isaque) ou objetos gerais tais como X e Y. Objetos do primeiro tipo so chamados tomos; objetos do segundo tipo so chamados variveis A aridade de uma relao o seu nmero de argumentos e denotada como uma barra seguida pela aridade progenitor/2 significa que a relao progenitor possui 2 argumentos, ou que a relao progenitor tem aridade 2 20 Pontos Importantes Pontos Importantes Perguntas consistem em uma ou mais clusulas Uma seqncia de clusulas, tal como: progenitor(X,esa), progenitor(X,jac) Significa a conjuno das clusulas X um progenitor de Esa e X um progenitor de Jac A resposta a uma pergunta pode ser Positiva: a pergunta satisfatvel e teve sucesso (suceeded) Negativa: a pergunta insatisfatvel e falhou (failed) Se vrias respostas satisfazem uma pergunta, Prolog encontra tantas quantas possveis Se o usurio estiver satisfeito com a resposta, basta digitar return Se desejar mais respostas, usa-se ponto-e-vrgula ; 21 Exerccio Exerccio Expressar em portugus: valioso(ouro). femea(jane). possui(joao,ouro). pai(joao,maria). da(joao,livro,maria). 22 Exerccio Exerccio gosta(joao, peixe). gosta(joao,maria). gosta(maria,livro). gosta(pedro,livro). gosta(maria,flor). gosta(maria,vinho). Quais as respostas dadas por Prolog? ?- gosta(maria,X). ?- gosta(X,livro). ?- gosta(Quem,Oque). ?- gosta(X,Y). ?- gosta(X,X). ?- gosta(_a,_b). ?- gosta(A,peixe). 23 Exerccio Exerccio Quais as respostas dadas por Prolog? (a) ?- progenitor(jos,X). (b) ?- progenitor(X,jos). (c) ?- progenitor(sara,X), progenitor(X,jac). (d) ?- progenitor(sara,X), progenitor(X,Y), progenitor(Y,jos). Abrao Sara Isaque Ismael Esa Jac Jos progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). 24 Definindo Relaes por Regras Definindo Relaes por Regras Nosso programa sobre famlias pode ser estendido de vrias formas Vamos adicionar a informao sobre o sexo das pessoas envolvidas na relao progenitor Por exemplo: mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos). As relaes mulher e homem so relaes unrias Uma relao binria, como progenitor, define um relacionamento entre pares de objetos Relaes unrias so usadas para declarar propriedades simples sim/no dos objetos A primeira clusula unria pode ser lida como Sara uma mulher 5 25 Definindo Relaes por Regras Definindo Relaes por Regras Informao sobre o sexo das pessoas envolvidas na relao progenitor: mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos). Podemos declarar a mesma informao usando uma relao binria sexo: sexo(sara,feminino). sexo(abrao,masculino). sexo(isaque,masculino). sexo(ismael,masculino). sexo(esa,masculino). sexo(jac,masculino). sexo(jos,masculino). 26 Escolhendo Objetos e Relaes Escolhendo Objetos e Relaes Como representar: Sara uma mulher mulher(sara). Permite responder: Quem mulher? No permite responder: Qual o sexo de Sara? sexo(sara,feminino). Permite responder: Quem mulher? Permite responder: Qual o sexo de Sara? No permite responder: Qual a propriedade de Sara que tem o valor feminino? propriedade(sara,sexo,feminino). Permite responder todas as perguntas Representao objeto-atributo-valor 27 Definindo Relaes por Regras Definindo Relaes por Regras Vamos estender o programa introduzindo a relao filho_geral como o inverso da relao progenitor Podemos definir filho_geral de maneira similar relao progenitor, ou seja enumerando uma lista de fatos sobre a relao filho_geral, por exemplo filho_geral(isaque,sara). filho_geral(isaque,abrao). filho_geral(ismael,abrao). ... 28 Definindo Relaes por Regras Definindo Relaes por Regras Entretanto, a relao filho_geral pode ser definida de modo mais elegante: Para todo X e Y, Y um filho_geral de X se X um progenitor de Y. Em Prolog: filho_geral(Y,X) :- progenitor(X,Y). Esta clusula tambm pode ser lida como: Par todo X e Y, se X um progenitor de Y ento Y um filho_geral de X 29 Definindo Relaes por Regras Definindo Relaes por Regras Clusulas Prolog como: filho_geral(Y,X) :- progenitor(X,Y). so chamadas regras (rules) H uma diferena importante entre fatos e regras: Um fato sempre verdadeiro (verdade incondicional) Regras especificam coisas que so verdadeiras se alguma condio satisfeita 30 Definindo Relaes por Regras Definindo Relaes por Regras filho_geral(Y,X) :- progenitor(X,Y). Cabea (head) ou concluso da regra (lado esquerdo da regra) Corpo (body) ou condio da regra (lado direito da regra) 6 31 Definindo Relaes por Regras Definindo Relaes por Regras Vamos perguntar se Ismael filho_geral de Abrao: ?- filho_geral(ismael,abrao). Como no h fatos sobre a relao filho_geral, a nica forma de Prolog responder esta pergunta aplicando a regra sobre filho_geral filho_geral(Y,X) :- progenitor(X,Y). A regra geral no sentido que aplicvel a quaisquer objetos X e Y; portanto ela pode tambm ser aplicada a objetos particulares tais como ismael e abrao Para aplicar a regra a ismael e abrao, Y tem que ser substitudo por ismael e X por abrao Neste caso, dizemos que as variveis X e Y esto instanciadas a: X = abrao e Y = ismael Depois da instanciao, obtemos um caso especial da regra geral, que : filho_geral(ismael,abrao) :- progenitor(abrao,ismael). 32 Definindo Relaes por Regras Definindo Relaes por Regras A condio da regra com as variveis instanciadas filho_geral(ismael,abrao) :- progenitor(abrao,ismael). : progenitor(abrao,ismael). Assim, Prolog tenta provar que a condio verdadeira Para provar a condio, trivial por Prolog encontra um fato correspondente no programa Isso implica que a concluso da regra tambm verdadeira e Prolog responde afirmativamente pergunta: ?- filho_geral(ismael,abrao). yes 33 Definindo Relaes por Regras Definindo Relaes por Regras Vamos incluir a especificao da relao me, com base no seguinte fundamento lgico: Para todo X e Y, X a me de Y se X um progenitor de Y e X uma mulher. Traduzindo para Prolog: me(X,Y) :- progenitor(X,Y), mulher(X). Uma vrgula entre duas condies indica a conjuno das condies, significando que ambas condies tm que ser verdadeiras 34 Definindo Relaes por Regras Definindo Relaes por Regras Exemplo: de Portugus para Prolog Uma pessoa me se tiver algum filho e essa pessoa for mulher Uma pessoa me se for progenitor de algum e essa pessoa for mulher Uma pessoa X me de Y se X for progenitor de Y e X for mulher X me de Y se X progenitor de Y e X mulher me(X,Y) :- progenitor(X,Y), mulher(X). 35 Definindo Relaes por Regras Definindo Relaes por Regras Em Prolog, uma regra consiste de uma cabea e uma corpo A cabea e o corpo so conectados pelo smbolo :-, denominado neck, formado por dois pontos e hfen :- pronunciado se me(X,Y) :- progenitor(X,Y), mulher(X). 36 Exerccio Exerccio Identifique a cabea e cauda de cada regra. Expressar cada regra em Portugus: gosta(joao,X) :- gosta(X,vinho), gosta(X,comida). gosta(joao,X) :- mulher(X), gosta(X,vinho). 7 37 Exerccio Exerccio Usando a base ao lado, defina a regra: Uma pessoa pode roubar algo se essa pessoa um ladro e ela gosta de um objeto Qual a resposta dada por Prolog a pergunta: Joo rouba o qu? ladrao(joao). ladrao(pedro). gosta(maria,flor). gosta(maria,queijo). gosta(maria,vinho). gosta(joao,rubi). gosta(joao,X) :- gosta(X,vinho). 38 Grafos Definindo Relaes Grafos Definindo Relaes Relaes como progenitor, filho_geral e me podem ser ilustradas por diagramas que seguem as seguintes convenes Ns nos grafos correspondem a objetos (argumentos das relaes) Arcos entre ns correspondem a relaes binrias (2 argumentos) Arcos so orientados apontando do primeiro argumento da relao para o segundo argumento Relaes unrias so indicadas nos diagramas simplesmente marcando os objetos correspondentes com o nome da relao As relaes sendo definidas so representadas por arcos tracejados X progenitor progenitor av_geral Y Z X progenitor filho_geral Y X progenitor me Y mulher 39 Grafos Definindo Relaes Grafos Definindo Relaes Cada diagrama deve ser interpretado da seguinte forma: se as relaes mostradas pelos arcos slidos so verdadeiras ento a relao mostrada pelo arco tracejado tambm verdadeira Assim, a relao av_geral pode ser imediatamente escrita como: av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). X progenitor progenitor av_geral Y Z X progenitor filho_geral Y X progenitor me Y mulher 40 Layout de um Programa Prolog Layout de um Programa Prolog Prolog fornece liberdade na escrita do layout do programa Entretanto, os programas devem ter um aspecto compacto e, acima de tudo, fcil de ler Assim, um padro escrever a cabea de uma clusula bem como cada condio em seu corpo em uma linha separada Alm disso, as condies so deslocadas de modo a melhor separar a cabea do corpo de uma regra 41 Layout de um Programa Prolog Layout de um Programa Prolog Por exemplo, a relao av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). deve ser escrita da seguinte forma: av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). 42 Definindo Relaes por Regras Definindo Relaes por Regras A relao irmo pode ser definida como: Para todo X e Y, X irmo de Y se ambos X e Y tm um progenitor em comum e X um homem. Em Prolog: irmo(X,Y) :- progenitor(Z,X), progenitor(Z,Y), homem(X). Note a forma de expressar ambos X e Y tm um progenitor em comum: Algum Z deve ser o progenitor de X e este mesmo Z deve ser o progenitor de Y Uma forma alternativa, mas menos elegante seria: Z1 progenitor de X e Z2 progenitor de Y e Z1 igual a Z2 Z progenitor progenitor irmo X Y homem 8 43 Definindo Relaes por Regras Definindo Relaes por Regras Podemos perguntar a Prolog: ?- irmo(esa,jac). yes Portanto, poderamos concluir que a relao irmo, como definida, funciona corretamente Entretanto h uma falha em nosso programa que revelada se perguntamos Quem o irmo de Jac? ?- irmo(X,jac). Prolog fornecer duas respostas X = esa ; X = jac Assim, Jac irmo dele mesmo? Provavelmente isso no era bem o que tnhamos em mente quando definimos a relao irmo Entretanto, de acordo com nossa definio sobre irmos, a resposta de Prolog perfeitamente lgica 44 Definindo Relaes por Regras Definindo Relaes por Regras Nossa regra sobre irmos no menciona que X e Y no devem ser a mesma pessoa se X deve ser irmo de Y Como isso no foi definido, Prolog (corretamente) assume que X e Y podem ser a mesma pessoa e como conseqncia encontra que todo homem que tem um progenitor irmo de si prprio Para corrigir a regra sobre irmos, devemos adicionar a restrio que X e Y devem ser diferentes Veremos nas prximas aulas como isso pode ser efetuado de diversas maneiras, mas para o momento, vamos assumir que a relao diferente j conhecida de Prolog e que diferente(X,Y) satisfeita se e somente se X e Y no so iguais Isso nos leva seguinte regra sobre irmos: irmo(X,Y) :- progenitor(Z,X), progenitor(Z,Y), homem(X), diferente(X,Y). 45 Pontos Importantes Pontos Importantes Programas Prolog podem ser estendidos simplesmente pela adio de novas clusulas Clusulas Prolog so de trs tipos: fatos, regras e perguntas Fatos declaram coisas que so sempre (incondicionalmente) verdadeiras Regras declaram coisas que so verdadeiras dependendo de determinadas condies Atravs de perguntas, o usurio pode questionar o programa sobre quais coisas so verdadeiras Clusulas Prolog consistem em uma cabea e o corpo; o corpo uma lista de condies separadas por vrgulas (que significam conjunes) Fatos so clusulas que tm uma cabea e o corpo vazio; perguntas tm apenas o corpo; regras tm uma cabea e um corpo (no vazio) 46 Pontos Importantes Pontos Importantes Durante a computao, uma varivel pode ser substituda por um objeto: dizemos que a varivel est instanciada As variveis so universalmente quantificadas e so lidas como Para todo Todavia, leituras alternativas so possveis para variveis que aparecem apenas no corpo Por exemplo: temfilhos(X) :- progenitor(X,Y). Pode ser lida de duas formas: Para todo X e Y, se X um progenitor de Y ento X tem filhos Para todo X, X tem filhos se existe algum Y tal que X um progenitor de Y 47 Exerccios Exerccios Traduza para Prolog: Todo mundo que tem filho feliz (defina a relao unria feliz) Defina as relaes irm e irmo_geral Defina a relao neto_geral usando a relao progenitor Defina a relao tio(X,Y) em termos das relaes progenitor e irmo 48 Regras Recursivas Regras Recursivas Vamos adicionar a relao ancestral Esta relao ser definida por duas regras: a primeira ser o caso base (no recursivo) e a segunda ser o caso recursivo Para todo X e Z, X um ancestral de Z se X um progenitor de Z. ancestral(X,Z) :- progenitor(X,Z). X progenitor ancestral Z 9 49 Regras Recursivas Regras Recursivas X progenitor progenitor ancestral Y Z X progenitor Z Y1 Y2 ancestral progenitor progenitor X progenitor ancestral Y3 Z Y1 Y2 progenitor progenitor progenitor ancestral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). ancestral(X,Z) :- progenitor(X,Y1), progenitor(Y1,Y2), progenitor(Y2,Z). ancestral(X,Z) :- progenitor(X,Y1), progenitor(Y1,Y2), progenitor(Y2,Y3), progenitor(Y3,Z). 50 Regras Recursivas Regras Recursivas Para todo X e Z, X um ancestral de Z se h algum Y tal que X um progenitor de Y e Y um ancestral de Z. ancestral(X,Z) :- progenitor(X,Y), ancestral(Y,Z). X progenitor ancestral Z Y ... ancestral 51 Regras Recursivas Regras Recursivas ancestral(X,Z) :- % caso base progenitor(X,Z). ancestral(X,Z) :- % caso recursivo progenitor(X,Y), ancestral(Y,Z). Podemos perguntar: quais os descendentes de Sara? ?- ancestral(sara,X). X = isaque; X = esa; X = jac; X = jos 52 Programa da Famlia Bblica Programa da Famlia Bblica progenitor(sara,isaque). progenitor(abrao,isaque). progenitor(abrao,ismael). progenitor(isaque,esa). progenitor(isaque,jac). progenitor(jac,jos). mulher(sara). homem(abrao). homem(isaque). homem(ismael). homem(esa). homem(jac). homem(jos). filho_geral(Y,X) :- progenitor(X,Y). me(X,Y) :- progenitor(X,Y), mulher(X). av_geral(X,Z) :- progenitor(X,Y), progenitor(Y,Z). irmo(X,Y) :- progenitor(Z,X), progenitor(Z,Y), homem(X). ancestral(X,Z) :- progenitor(X,Z). ancestral(X,Z) :- progenitor(X,Y), ancestral(Y,Z). 53 Exerccio Exerccio Vimos a seguinte definio da relao ancestral ancestral(X,Z) :- progenitor(X,Z). ancestral(X,Z) :- progenitor(X,Y), ancestral(Y,Z). Considere a seguinte definio alternativa: ancestral(X,Z) :- progenitor(X,Z). ancestral(X,Z) :- progenitor(Y,Z), ancestral(X,Y). Esta uma definio correta de ancestrais? possvel modificar o diagrama de forma a corresponder a esta nova definio? X progenitor ancestral Z Y ... ancestral 54 Slides baseados nos livros: Bratko, I.; Prolog Programming for Artificial Intelligence, 3rd Edition, Pearson Education, 2001. Clocksin, W.F.; Mellish, C.S.; Programming in Prolog, 5th Edition, Springer-Verlag, 2003. Material elaborado por Jos Augusto Baranauskas 2004