Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Tutorial - linguagem Prolog, Notas de estudo de Informática

Tutorial de Prolog - Programming in Logic

Tipologia: Notas de estudo

2020

Compartilhado em 30/06/2020

EdPT
EdPT 🇵🇹

4

(2)

4 documentos

1 / 39

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Tutorial de Prolog
Pro
gramming in
Log
ic
(Programando em Lógica)
Ilaim Costa Júnior Claudio Cesar de
(ilaim@joinville.udesc.br) (claudio@joinville.udesc.br)
UDESC/CCT/DCC - Campus Universitário
Bloco F - 3o. Andar - Sala F. Gauss
89.223-100 - Joinville - SC
Versão 2.5
Joinville, 6 de Março de 2003
6 de Março de 2003
Conteúdo
1 Introdução 4
1.1 Comeceaqui... .................................. 4
1.2 Resolvendo um Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 ApresentaçãoInicial ................................ 7
1.4 Paradigmas de Linguagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Máquina
Prologuiana
............................... 8
1.6 Exemplos ...................................... 9
1.7 SintaxedoProlog.................................. 10
1.8 DetalhandoaSintaxe................................ 11
1.9 OutrosConceitos .................................. 12
1.10 Operações Básicas do SWI-Prolog . . . . . . . . . . . . . . . . . . . . . . . . . 13
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27

Pré-visualização parcial do texto

Baixe Tutorial - linguagem Prolog e outras Notas de estudo em PDF para Informática, somente na Docsity!

Tutorial de Prolog

Programming in Logic

(Programando em Lógica)

Ilaim Costa Júnior Claudio Cesar de Sá

([email protected]) ([email protected])

UDESC/CCT/DCC - Campus Universitário

Bloco F - 3o. Andar - Sala F. Gauss

89.223-100 - Joinville - SC

Versão 2.

Joinville, 6 de Março de 2003

6 de Março de 2003

Conteúdo

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

Lista de Figuras

Tutorial de Prolog

1 Introdução

1.1 Comece aqui...

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

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:

  1. ?- pessoa(X).
  2. ?- cor(Y).
  3. ?- tem_uma_cor(X,Y).
  4. ?- nao_pode_vestir(X,Y).
  5. ?- veste(X,Y,Z).

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.

1.3 Apresentação Inicial

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:

  • Manipula símbolos (objetos) por natureza, logo 7 + 13 pode apresentar várias cono- tações;
  • Átomo, literal ou um objeto: `a', 77, "aa", '7' , "777"...
  • Seu princípio inferencial é o backward chaining (encadeamento regressivo), ou seja, para encontrar algum símbolo como verdade, devemos demonstrar que suas premissas eram também verdadeiras;
  • Apresenta um propósito geral como Linguagem de Programação, bem como tem inter- face com linguagens como Delphi, C, Visual Basic, e outras;
  • Portabilidade entre plataformas para o Prolog padrão. Logo, não é uma linguagem proprietária;
  • Fácil aprendizado;
  • Áreas de aplicações: problemas de IA, provadores de teoremas, sistemas especialistas, pesquisa operacional, construção de compiladores, etc.

Tutorial de Prolog 1.4 Paradigmas de Linguagens

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.

1.5 Máquina Prologuiana

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.

1.7 Sintaxe do Prolog

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!

1.8 Detalhando a Sintaxe

Há alguns detalhes de como se montam esses predicados prologuianos. Essa Receita de Bolo segue abaixo:

  • Os predicados devem ser em letras minúsculas.... OBRIGATORIAMENTE!
  • Os fatos, regras e questões terminam por . (ponto);
  • Seja uma regra, exemplo: irmão(X,Y) :- pai(X,Z), pai(Y,Z), X^ ^ ==^ Y.^.^ Os seguintes elementos são identicados:

 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.

1.10 Operações Básicas do SWI-Prolog

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:

  1. Editar o programa. Use o bloco de notas do windows, ou o edit do DOS. Preferen- cialmente editores ASCII;
  2. Carregar o programa usuário para o ambiente interpretado SWI-Prolog;
  3. Executar os predicados;
  4. Validar os resultados;
  5. Voltar ao passo inicial, se for o caso.
    • Para carregar o programa: pl +

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 ?-

  • Para sair do ambiente SWI-Prolog:

?- halt.

  • Para carregar um programa na Memória de Trabalho (MT) (Working Memory- WM, ou base dinâmica de conhecimento):

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 ?-

  • Para eliminar um predicado da MT:

?- abolish(cor/1). Yes ?- listing(cor/1). [WARNING: No predicates for `cor/1'] No ?-

  • Para executar uma regra:

?- eh_maior_que_10. DIGITE UM NUMERO:: 30 |. < ......... faltou o ponto. > numero maior que 10 Yes ?-

  • Para bisbilhotar o help, bem como inferir novas características do Prolog:

?- 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.

  • Apavoramentos com o modo trace:

===> 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.

  • Não esqueça que:

?- 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

2.1 Exemplos sobre Recursividade

  1. Um simples sistema de menu: além do uso da recursividade, este exemplo mostra o que fazer quando aparentemente não há predicados disponíveis ao que se deseja; ou seja: X <= 3 não existe, mas como opção equivalente temos: - X =< 3  ; - \ + (X >= 3).

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).

  1. Novamente o Sócrates:

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

  1. Cálculo do fatorial: Reformulando sob uma visão matemática, mais especicamente, pela indução nita temos:

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 ) :-