DIE-UFPI rbritto@ufpi.edu.br Sumrio ! Introduo ao Prolog e ao SWI-Prolog ! Fatos, operadores, regras ! Questes, Variveis e operadores relacionais ! Definies recursivas ! Unificao Introduo ! Prolog: termo derivado da expresso Programming in Logic e baseado em lgica de primeira ordem. ! Desenvolvido em 1973 na Universidade de Marseille, Frana. ! No padronizada. o livro de Clocksin e Mellish, Programming in Prolog (1984) um padro no oficial. ! Algumas implementaes bastante conhecidas so o ARITY Prolog, o Borland Turbo Prolog, e o SWI-Prolog. ! Geralmente interpretado, mas pode ser compilado. Prolog x Outras linguagens ! Linguagens procedimentais: especificam como fazer alguma coisa. Exemplo: C, Pascal, Basic. ! Linguagens orientadas a objeto: especificam um objeto e seus mtodos. Exemplo: C++, SmallTalk. ! Linguagens declarativas: especificam o qu se sabe sobre um problema e o qu deve ser feito. Mais direcionada a conhecimento, e menos direcionada a algoritmos. No possui estruturas de controle como do- while, repeat-until, if-then-else, for, case, etc. Aplicaes ! Lgica matemtica e soluo de equaes simblicas. ! Prova automtica de teoremas. ! Processamento da linguagem natural. ! Sistemas especialistas. ! Planejamento de atividades. ! Soluo geral de problemas. Fatos ! Nomes de constantes e predicados iniciam com letra minscula. ! O predicado (relao unria, n-ria ou funo) escrito primeiro e os objetos relacionados so escritos depois entre parnteses. ! Todo fato termina com o caracter . ! Exemplo: ! gosta(maria, jose). Operadores Lgicos Regras ! Regras so utilizadas para expressar dependncia entre um fato e outro fato: ! criana(X) :- gosta(X,sorvete). ! criana(X) :- not odeia(X,sorvete). ! ou grupo de fatos: ! av(X,Z) :- (me(X,Y),me(Y,Z)); (me (X,Y),pai(Y,Z)). SWI-Prolog ! Desenvolvido no departamento de cincias sociais e informtica (Sociaal Wetenschappelijkea Informatica) da Universidade de Amsterd (Universiteit van Amsterdam). ! SWI-Prolog diferente do Prolog padro assim como Turbo Pascal diferente do Pascal e Turbo C diferente do C ANSI. ! Seu uso regido pela licena GPL (GNU General Public License). ! Possui uma interface com C e C++ . Principais Comandos ! ?- help(arg). - Aciona a ajuda com o argumento. help(help) apresenta mais opes. ! ?- apropos(arg). - Apresenta predicados, funes e sees que contenham o argumento em seu sumrio. ! ?- halt. - Encerra o interpretador. ! ?- consult(file). - Carrega um programa de um arquivo. ! ?- [filename]. - Faz o mesmo que consult. Debug e Trace ! ?- trace. - Habilita o modo trace, onde cada ao executada mostrada. ! ?- notrace. - Desabilita o modo trace. ! ?- debug. - Habilita o modo debug, onde o prolog para em pontos previamente estabelecidos. ! ?- nodebug. - Desabilita o modo debug. ! ?- guitracer. - Habilita o trace em modo grfico. ! ?- noguitracer. - Desabilita o modo guitracer. Comandos write e read ! O comando write exibe o valor do parmetro no dispositivo de sada corrente. ! Tem a forma write(texto). ! Uma variante deste comando o writef, que permite formatao do que se deseja imprimir. ! Tem a forma writef(Formato, Argumentos). Comandos write e read ! Para gerar alguns caracteres deve se usar sequencias de escape, estas so: ! \n - cria uma nova linha; ! \l - criar um separador de linha, o resultado igual ao produzido por \n; ! \r - retorna ao incio da linha; ! \t - tabulao; ! \% - imprime o smbolo %; ! \nnn - onde n um nmero decimal, produz o caractere ASCII com o cdigo informado. Comandos write e read ! As opes de formatao so: ! %w - imprime o termo; ! %d - imprime o termo ignorando seu tipo, por exemplo, \n impresso como uma string. ! %s - imprime o termo como uma string; ! %Nc - imprime o termo de modo centralizado numa quantidade N de colunas; ! %Nl - imprime o termo alinhado esquerda numa quantidade N de colunas; ! %Nr - imprime o termo alinhado direita numa quantidade N de colunas; Comandos write e read ! O comando read l um valor no dispositivo de entrada corrente e unifica (atribui) o valor uma varivel. ! O dispositivo de entrada padro o teclado, assim, o comando read(X). ir ler um valor do teclado e unificar este valor com a varivel X. Exemplo: Definio de Homen ! mortal(X) : homem(X) , writef(%w%w %w, ['Sim, ', X, ' mortal ']). ! homem( socrates ). Exemplo: Progenitores Gregos Carregando e Visualizando a KB ! Para se carregar a KB do exemplo devemos executar o comando [exercicio1]. ! Para visualizar o contedo da KB devemos executar: ! listing lista toda a KB carregada; ! listing(arg) lista todas as linhas da KB que contenham o argumento como predicado. Questes ! Iniciam sempre com o smbolo ? e terminam com o smbolo . ! Exemplos: ! ?- parent(zeus, apollo). ! Yes ! ?- parent(apollo,zeus). ! No Variveis ! Iniciam sempre com letra maiscula. Exemplos: ! ?- parent(X,zeus). ! X = chronos; ! X = rhea ; ! No ! ?- parent(X,Y). ! X = chaos ! Y = gaea ; ! X = gaea ! Y = cyclope ; ! X = gaea ! Y = chronos ; ... Elaborando Questes ! Questo 1: Hades tem filhos? ! ?- parent(hades,X). ! Questo 2: Gaea tem um filho que progenitor de poseidon. Quem ? ! ?- parent(gaea,X), parent(X,poseidon). Elaborando Questes ! Questo 3: Quem so os pais de zeus? ! ?- parent(X,zeus), parent(Y,zeus), not(X=Y). Operadores Relacionais Exerccio Carregando a KB ! Carregar o arquivo exercicio2.pl: ! ?- [exercicio2]. Adicionando Regras ! Adicionar na KB a relao: ! grandparent(X,Z) :- parent(X,Y),parent(Y,Z). ! Adicionar na KB a relao: ! Uma pessoa irm de outra se seu sexo feminino e se as duas tm um progenitor em comum ! sister(X,Y) :- female(X), parent(Z,X), parent (Z,Y), not(X=Y). Definies Recursivas ! Questo: definir predecessor ! Forma usual: ! predecessor(X,Z):- parent(X,Z). ! predecessor(X,Z):- parent(X,Y), parent(Y,Z). ! predecessor(X,Z):- parent(X,Y1),parent(Y1,Y2), parent(Y2,Z). ! Forma recursiva: ! predecessor(X,Z) :- parent(X,Z). ! predecessor(X,Z) :- parent(X,Y),predecessor(Y,Z). Definies Recursivas ! Rhea predecessora de quem? ! ?- predecessor(rhea,X). ! Quem predecessor de Zeus? ! ?- predecessor(X,zeus). Unificao ! Seja a questo: ?- sister(X,Y). ! Aps localizada na KB a regra: ! sister(X,Y) :- female(X), parent(Z,X), parent (Z,Y), not(X=Y). ! o PROLOG tenta satisfaz-la da esquerda para a direita e observando a ordem em que as clusulas aparecem na KB. Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Unificao Consideraes ! No Prolog: ! Executa-se encadeamento para trs; ! Executa-se busca em profundidade; ! As clusulas so experimentadas na ordem em que so escritas na KB.