































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Tutorial de Prolog - Programming in Logic
Tipologia: Notas de estudo
1 / 39
Esta página não é visível na pré-visualização
Não perca as partes importantes!
































1 Introdução 4
1.1 Comece aqui..................................... 4
1.2 Resolvendo um Problema.............................. 5
1.3 Apresentação Inicial................................ 7
1.4 Paradigmas de Linguagens............................. 8
1.5 Máquina Prologuiana............................... 8
1.6 Exemplos...................................... 9
1.7 Sintaxe do Prolog.................................. 10
1.8 Detalhando a Sintaxe................................ 11
1.9 Outros Conceitos.................................. 12
1.10 Operações Básicas do SWI-Prolog......................... 13
Tutorial de Prolog
1 Introdução
Antes de iniciar a leitura deste tutorial, assegure que tenhas em mãos uma das últimas versões de algum Prolog padrão. Caso esta resposta seja negativa, veja a seção 9, onde se encontra uma boa documentação disponível sobre a linguagem Prolog. Há vários Prolog gratuitos na WEB, particularmente, usaremos o SWI-Prolog http://www.swi-prolog.org/, para Windows (95, 98 ou NT) ou Linux (Unix-like). Recentemente, cou disponível o XPCE (http://www.swi-prolog.org/) que é o SWI-Prolog com recursos grácos, análogo a qualquer ambiente de desenvolvimento. Com um detalhe: também é gratuito!
Para o curso de Lógica e Programação em Lógica (UDESC), este material pode ser encontrado no seguinte servidor:
\200.19.107.36\disciplinas\lpl-logica
(inclusive uma versão on-line deste material) a partir de um navegador qualquer em um dos laboratórios do 3o. andar.
Nestas notas, apenas os principais tópicos da linguagem são apresentados, outros de- talhes o aluno terá que correr atrás. Ou seja, nestas páginas o aluno tem um guia de sobrevivência com o Prolog, pois consta a parte mais complicada da linguagem. Os livros e manuais sobre o assunto são indispensáveis, ver a seção 9.
Os termos enfatizados ou em itálicos, são explicados em sala de aula, bem como, parte do material complementar da disciplina. Eventualmente, o aluno deve repassar todas estas notas, antes de insistir numa compreensão sequencial do texto. A propósito, o Prolog não apresenta o conceito de sequencialidade e uxo linear de programas, a exemplo de outras linguagens tradicionais de programação. Vale a proposta de experimentar, sem se preocupar numa sequencialidade.
Este tutorial encontra-se relaxado no que concerne a terminologia da lógica (não é a lógica de programação, comumente confundida) e do Prolog. Para aqueles que quiserem investigar o Prolog e seus fundamentos lógicos, aconselho o livro: Logic, Programming and Prolog", de Ulf Nilsson e Jan Maluszyns, editado pela by John Wiley & Sons, 2000; mas também disponível gratuitamente em: http://www.ida.liu.se/ ulfni/lpp/.
Finalmente, a proposta é tornar o texto acessível a todas as pessoas que não tenham base em lógica, e até mesmo aqueles que nunca tenham utilizado nenhuma outra linguagem de programação.
Tutorial de Prolog 1.2 Resolvendo um Problema
Esse exemplo é instigante e contém todos conceitos iniciais do Prolog, acompanhe com aten- ção a discussão em sala de aula. A proposta é resolver de imediato um problema interessante, antes de entrar nos detalhes da linguagem. Seja o enunciado:
Alexandra, Barbara, e Rosa tem roupas em azul, verde, lilás, vermelho e amarelo. Nenhuma delas veste amarelo com vermelho. Cada uma delas veste roupas com duas cores, isto é, roupas tipo blusa e saia. Alexandra está vestindo o azul. Barbara está vestindo o amarelo mas não o verde. Rosa veste o verde mas não se veste nem de azul e nem lilás. Uma delas está de vermelho. Uma das cores é usada tanto por Barbara como por Rosa. Alexandra e Barbara tem 04 cores entre elas.
Acompanhe o texto e verique como o mesmo foi escrito na sintaxe Prolog (a ser apre- sentada em breve), no programa abaixo:
/* Aqui começa o programa ... */
pessoa(ale). /* Alexandra / pessoa(babe). / Barbara */ pessoa(rosa).
cor(azul). cor(amarelo). cor(vermelho). cor(lilaz). cor(verde).
/* este pedaço é importante... pois.... está dito no problema e define uma cor para cada moça */
tem_uma_cor(babe,amarelo). tem_uma_cor(rosa,verde). tem_uma_cor(ale,azul).
/* aqui pode-se ampliar as restrições */ nao_pode_vestir(babe,verde). nao_pode_vestir(rosa,azul). nao_pode_vestir(rosa,lilaz).
veste(X, Cor1, Cor2) :- pessoa(X), cor(Cor1), cor(Cor2), tem_uma_cor(X,Cor1),
Tutorial de Prolog 1.3 Apresentação Inicial
?- guitracer. /* atriva o trace gráfico / .... ?- trace, ache_tudo. / faz uma pergunta com o trace */
2 o. Exercício: Faça as seguintes experimentações na console do interpretador:
Não avance ao exercício seguinte, caso não tenhas entendido o que levou a Máquina Prolog, deduzir tais respostas. Caso tenhas dúvida, habilite o trace (?- trace, ...) no prexo das questões acima.
3 o. Exercício: Altere e/ou inclua algumas regras, am de restringir a quantidade de respostas.
Denição: Prolog é uma linguagem de programação implementada sobre um paradigma lógico. A base de tal lógica é o Cálculo dos Predicados ou Lógica de 1 a. Ordem (LPO). Logo, a concepção da linguagem apresenta uma terminologia própria, mas fundamentada sobre a LPO. As restrições da completude e corretude da LPO são contornadas com um método de prova sistemático e completo. Detalhes: Logic, Programming and Prolog", de Ulf Nilsson e Jan Maluszyns, editado pela by John Wiley & Sons, 2000; e gratuitamente em: http://www.ida.liu.se/ ulfni/lpp/.
Características:
Tutorial de Prolog 1.4 Paradigmas de Linguagens
Há outros paradigmas de linguagens de programação, além do lógico cujo principal represen- tante é o Prolog. São eles:
Imperativo : Linguagem C, Pascal, Fortran,... etc. Orientação a Objetos : Smalltalk, Simula Funcional : Lisp, Miranda, Haskell, ML,... etc. Híbridas : Delphi, C++, C-Builder, Kylix,... etc. Baseada em Regras de Produção : CLIPS, OPSS5, Shell para SE's,... etc. Especícas : GPSS, e outras com hardware especícos.
Uma arquitetura típica dessa linguagem de programação, encontra-se na gura 1.5. Sua fundamentação teórica encontra-se no processo de raciocínio típico do backward chaining. A operacionalidade é a mesma desse esquema de raciocínio, logo, consulte o material em questão, ou não perca as explicações do professor.
Tutorial de Prolog 1.7 Sintaxe do Prolog
Veja os exemplos iniciais:
No ?- 2 == 2. Yes ?- mae(eva, abel). No ?- 3 > 2. Yes
Caso queiras carregar um programa usuário, previamente editado e salvo no padrão ASCII, para ser usado no SWI-Prolog, então:
?- consult('c:/temp/teste.pl').
% teste.pl compiled 0.00 sec, 560 bytes Yes ?- homem( X ). X = joao Yes ?- homem( x ). No
Adiantando, as letras maiúsculas são as variáveis da linguagem Prolog, isto é, aceitam qualquer objeto.
A sintaxe Prologuiana é simples. Esta é construída a partir de formulações com os predi- cados lógicos, logo, o conceito de predicado reete o espírito do Prolog.
As construções (linhas de código em Prolog) seguem uma sintaxe de três tipos.
1o. tipo: são as questões ou goals, isto é, uma pergunta à uma base de conhecimento (que ca instanciado e referenciado neste ambiente inferencial do Prolog)
... a idéia a de um teorema a ser demonstrado...
?- >(3,2). /* ou ?- 3 > 2. Ou seja, 3 é maior que 2 */ ?- Yes
Tutorial de Prolog 1.8 Detalhando a Sintaxe
2o. tipo: são os fatos ... algo sempre verdadeiro ou verdades incondicionais, encontrados na base de conhecimento.
?- listing(homem). homem(joao). homem(jose). homem(jedro). Yes
3o. tipo: são as regras... que aproximadamente são verdades ou teoremas condicionais, isto é: necessitam de uma prova lógica!
?- listing(mortal). mortal(A) :- homem(A). /* obs. :- eh o implica ao contrário <- / / homem ---> mortal leia-se ... para demonstrar que algum X é mortal, preciso demonstrar e provar que A eh um homen */ Yes
Conclusão: a construção de um programa em Prolog, é feita de: fatos, questões e regras... e nada mais!
Há alguns detalhes de como se montam esses predicados prologuianos. Essa Receita de Bolo segue abaixo:
irmão/2, pai/2 e \ == /2, são predicados binários (i. é. aridade igual a dois); A vírgula (,) é o and lógico; O or lógico é o ponto-e-vírgula (;) ; O :- e o pescoço da regra; O ponto no nal . é o pé da regra; Logo a regra possui uma cabeça, que é o predicado irmão/2; O corpo é composto pelos predicados: pai/2 e \ == /2.
Tutorial de Prolog 1.10 Operações Básicas do SWI-Prolog
Figura 2: Fluxo Aproximado"de Inferências em Prolog
Verique se a interpretação desse esquema da pilha abstrata de questões que Prolog faz, representado na gura 1.9, foi realmente entendido. Em caso negativo, solicite ao professor a explicação, ou referencie na bibliograa sugerida.
Exceto o Visual Prolog (http://www.visual-prolog.com/), todos os demais Prolog são basica- mente idênticos. Atualmente deve existir ter uns dez (10) fabricantes de Prolog comerciais e um outro tanto oriundos da academia. Todos oferecem algo gratuito como chamariz ao seu sistema.
O SWI-Prolog não foge a regra, as suas características são: velocidade, portabilidade (interoperacionabilidade), padrão, robustez, facilidades de uso, interface com várias outras linguagens de programação, free-source, etc.
Os passos básicos para se usar o SWI-Prolog em seu ambiente interpretado são:
Welcome to SWI-Prolog (Version 3.2.3) Copyright (c) 1993-1998 University of Amsterdam. All rights reserved. For help, use ?- help(Topic). or ?- apropos(Word). Yes ?-
?- halt.
Tutorial de Prolog 1.10 Operações Básicas do SWI-Prolog
?- consult('d:/curso/udesc/autind/iia/ex1'). d:/curso/udesc/autind/iia/ex1 compiled, 0.00 sec, 52 bytes. Yes ?- ou ?- load_files('nomes','opcoes'). /* para conferir....se está na ``{\em Working Memory}'' */ ?- ensure_loaded(rosa). Yes ?-
?- abolish(cor/1). Yes ?- listing(cor/1). [WARNING: No predicates for `cor/1'] No ?-
?- eh_maior_que_10. DIGITE UM NUMERO:: 30 |. < ......... faltou o ponto. > numero maior que 10 Yes ?-
?- help(nome_do_predicado). ou ?- apropos(padrão_desejado). ou ?- explain(nome_do_predicado). ?- apropos(setenv). setenv/2 Set shell environment variable unsetenv/1 Delete shell environment variable Yes ?-
Isto é, pretendendo fazer uma leitura do teclado, mas não conhece o predicado que faz tal função, procure os predicados relacionados com o apropos, algo como: ?- apro- pos(read).
Tutorial de Prolog 1.11 Outros Detalhes
?- prato(X, Y), write(X), nl, fail. alho cebola tomate No ?-
Logo o fail é um predicado que provoca uma falha na regra, ou seja, torna-a sempre falsa; esse fail força o mecanismo backtracking.
===> sai do debug/trace ou da pendencia... ou + de abort ou ?- abort. Execution Aborted Typing an 'h' gets us:
a: abort b: break c: continue e: exit g: goals t: trace h (?): help Action (h for help)?
What does this mean?, that's my first question. 'e' exits the program immediately 'a' aborts whatever you've type so far 'c' continues where you left off 'h' gets us the 'Action' help menu, again So what does 'g', 't' and 'b' do? I don't know yet, but I suspect: 'g' lists possible goals ===> os pendentes 't' traces the program, a debugging tool 'b' breaks the current script (whatever your working on) and give a new shell.
?- trace, t. e ?- spy(t), t.
são equivalentes!
Antes da próxima seção, sugiro que saibas a resposta do seguinte programa 1 : (^1) Este exemplo veio por sugestão de um aluno.
Tutorial de Prolog
x(7). x(5). x(3).
par(Xpar) :- x(N1), x(N2), N1 == N2, Xpar is (N1+N2), write(N1) , write(' .... '), write(N2), write(' .... '), write(Xpar), nl, fail.
?- par(N).
Cuja árvore de busca é dada pela gura 1.11:
Figura 3: Árvore de busca construída pelo Prolog para regra par
Aconselho estudar cada ponto deste exemplo, pois o mesmo sumariza todo conhecimento até o momento sobre Prolog. Avance à próxima seção, apenas se este exercício for dominado em detalhes. Use guitracer no XPCE, funciona muito bem e é gráco.
2 Recursividade
A recursividade em Prolog é a sua própria denição em lógica. Apesar da ineciência de soluções recursivas, esta é uma das elegâncias do Prolog. Os exemplos falarão por si.
A exemplo das demais linguagens de programação, uma função recursiva é aquela que busca em si próprio a solução para uma nova instância, até que esta encontre uma instância conhecida e retorne um valor desejado.
Exemplo: Calcular a soma dos primeiros n-valores inteiros:
S(n) = 1 + 2 + 3 + 4 + ..... + (n − 1) + n
Este problema pode ser reformulado sob uma visão matemática, mais especicamente, pela indução nita como:
S(n) =
1 para n = 1 S(n − 1) + n para n > 2
O que é um fato verdadeiro pois:
Tutorial de Prolog 2.1 Exemplos sobre Recursividade
menu(0). menu(_) :- repeat, write('......'), nl, ....................... write('......'), nl, write(' DIGITE A OPCAO: '), read(X), X >= 0, +(X >= 3), /* isto é: X =< 3 / / X == 0 é equivalente a: +(X == 3 ) / acao(X), menu(X). %%%%%%%%%%%%%%%%%%%%%%%%%%% acao(0). / continua acoes etc */ acao(1). acao(2). acao(3).
human(socrates). % facts about who is human human(aristotle). human(plato). god(zeus). % and who is a god god(apollo). mortal(X) :-human(X). % a logical assertion that X is mortal if X is
Fazendo as perguntas: ?-mortal(plato). % is Plato mortal? yes ?-mortal(apollo). % is apollo mortal? no ?-mortal(X). % for which X is X mortal? X = socrates ->; X = aristotle ->; X = plato ->;
Tutorial de Prolog 2.1 Exemplos sobre Recursividade
no %human
Evitando este ultimo "no", usando a recursividade:
mortal_report :- write('Mostre todos mortais conhecidos:'), nl, nl, mortal(X), write(X), nl, fail. mortal_report. /* ou:: mortal_report :- true. */
Entao: ?- mortal_report. Mostre todos mortais conhecidos:' socrates aristotle plato yes
F at(n) =
1 para n = 0 F at(n − 1) ∗ n para n > 1
O que é um fato verdadeiro pois:
F at(n) =
1 ∗ 2 ∗ 3 ∗ ..... ∗ (n − 1) ︸ ︷︷ ︸ ∗ n F at(n − 1)
Como o procedimento é recursivo, temos de encontrar a denição para parada da recursividade. Como n não tem limite superior, é para qualquer n, então vamos começar pelo que conhece:
#1. O fatorial de 0 é 1, logo: fatorial(0,1). #2. O fatorial do n-ésimo termo, é necessário o fatorial do (n − 1)-ésimo termo, logo: fatorial(N, Fat) :: Nant = (N-1), fatorial(Nant, Fat_Nant) e Fat = (N ∗ Fat_Nant).
em termos de Prolog temos:
fatorial( 0, 1 ). fatorial( X, Fat ) :-