![Page 1: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/1.jpg)
Fundamentos
Paradigma de Programacao Logico
Marco A L Barbosa
cba
Este trabalho esta licenciado com uma Licenca Creative Commons - Atribuicao-CompartilhaIgual 4.0 Internacional.
![Page 2: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/2.jpg)
Conteudo
Visao mais detalhada
Definicoes
Constantes, variaveis e estruturas
Operadores
Unificacao
Aritmetica
Escrevendo codigo em Prolog
Referencias
![Page 3: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/3.jpg)
O estudo utilizando apenas este material nao e suficiente para oentendimento do conteudo. Recomendamos a leitura dasreferencias no final deste material e a resolucao (por parte doaluno) de todos os exercıcios indicados.
3 / 32
![Page 4: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/4.jpg)
Visao mais detalhada
![Page 5: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/5.jpg)
Definicoes
![Page 6: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/6.jpg)
Definicoes
I Um predicado e a colecao de fatos e regras com o mesmonome e aridade
I Uma clausula e um fato ou uma regra
6 / 32
![Page 7: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/7.jpg)
Constantes, variaveis e estruturas
![Page 8: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/8.jpg)
Tipos de dados
I Um programa em Prolog e construıdo com termos
I Termos
I Constantes
I AtomosI Numeros
I VariaveisI Estruturas
I Cada termo e definido com uma sequencia de caracteres
I Letras maiusculas: A .. ZI Letras minusculas: a .. zI Dıgitos: 0 .. 9I Sımbolos: + - * /\ ~ ^ < > : . ? @ # $
8 / 32
![Page 9: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/9.jpg)
Constante
I Constantes nomeiam objetos ou relacoes especıficas
I Atomos comecam com letra minuscula ou sımbolo, ou entreapostrofos ’
casa
-->
’Jose da Silva’
’123’
I Numeros
89
-17
2.67e10
9 / 32
![Page 10: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/10.jpg)
Variaveis
I Parecem atomos mas comecam com letras maiusculas ou
X
Reposta
Nome_longo
I Variaveis anonimas sao definidas com o caractere
I Cada ocorrencia de uma variavel anonima refere-se a um valor(que pode ser diferente das ocorrencias anteriores)
I Usamos variaveis anonimas quando nao estamos interessadosno valor
?- gosta(joao, _). % existe alguem que joao gosta?
true.
10 / 32
![Page 11: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/11.jpg)
Estruturas
I Estruturas tambem sao chamadas de termos compostos
I Uma estrutura e um unico objeto composto de outros objetoschamados de argumentos (ou componentes)
I Semelhante a registros em linguagens imperativas, mas oscomponentes nao sao nomeados
I Fato: Joao possui o livro Algoritmos escrito pelo Cormem
possui(joao, livro(algoritmos, cormem)).
I O nome da estrutura e chamado de functor, no exemplo ofunctor e livro
I algoritmos e cormem sao os componentes da estruturalivro(algoritmos, cormem)
I A quantidade de componentes em uma estrutura e a aridadeda estrutura
11 / 32
![Page 12: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/12.jpg)
Operadores
![Page 13: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/13.jpg)
Operadores
I As vezes e conveniente escrever functors como operadores
I x + y ao inves de +(x, y)
I Observe que os dois exemplos descrevem o mesmo objeto, aestrutura com o functor + e os componentes x e y
I O Prolog usa regras de precedencia e associatividadesemelhantes a de outras linguagens
I 2 + 4 * 3 e o mesmo que +(2, \*(4, 3))I 8/2/2 e o mesmo que /(/(8,2), 2)
I Lembre-se: estas construcoes descrevem estruturas, elas sosao interpretadas (e avaliadas) como expressoes aritmeticasem alguns contexto (veremos a seguir)
?- X = 2 + 4 * 3, write_canonical(X).
+(2,*(4,3))
X = 2+4*3.
13 / 32
![Page 14: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/14.jpg)
Igualdade
I Predicados pre-definidos
I = (negacao \=) Verifica se dois termos podem ser unificados
?- casa = casa.
true.
?- X = 4.
X = 4.
?- livro(X, alg) = livro(autor(thomas, cormem), Y).
X = autor(thomas, cormem),
Y = alg.
I == (negacao \==) Verifica se dois termos sao iguais (nao tentafazer a unificacao)
?- casa == casa.
true.
?- X == 4.
false.
?- livro(X, alg) == livro(autor(thomas, cormem), Y).
false.
14 / 32
![Page 15: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/15.jpg)
Igualdade
I Predicados pre-definidos
I = (negacao \=) Verifica se dois termos podem ser unificados
?- casa = casa.
true.
?- X = 4.
X = 4.
?- livro(X, alg) = livro(autor(thomas, cormem), Y).
X = autor(thomas, cormem),
Y = alg.
I == (negacao \==) Verifica se dois termos sao iguais (nao tentafazer a unificacao)
?- casa == casa.
true.
?- X == 4.
false.
?- livro(X, alg) == livro(autor(thomas, cormem), Y).
false.
14 / 32
![Page 16: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/16.jpg)
Unificacao
![Page 17: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/17.jpg)
Unificacao
I Ideia: dois termos unificam se eles sao os mesmos termos ouse eles contem variaveis que podem ser instanciadas demaneira que os termos resultantes sejam iguais
16 / 32
![Page 18: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/18.jpg)
Unificacao
I Dois termos constantes unificam se eles sao iguais
I Um termo que e uma variavel nao instanciada unifica comqualquer outro termo. No caso de duas variaveis naoinstanciadas e criado uma co-referencia, neste caso, quandouma das variaveis e instanciada, a outra tambem e
I Duas estruturas unificam se
I Elas tem o mesmo functor e a mesma aridadeI Todos os argumentos correspondentes unificam (observe que a
definicao e recursiva)I A instanciacao das variaveis sao compatıveis
17 / 32
![Page 19: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/19.jpg)
Unificacao
I Dois termos constantes unificam se eles sao iguais
I Um termo que e uma variavel nao instanciada unifica comqualquer outro termo. No caso de duas variaveis naoinstanciadas e criado uma co-referencia, neste caso, quandouma das variaveis e instanciada, a outra tambem e
I Duas estruturas unificam se
I Elas tem o mesmo functor e a mesma aridadeI Todos os argumentos correspondentes unificam (observe que a
definicao e recursiva)I A instanciacao das variaveis sao compatıveis
17 / 32
![Page 20: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/20.jpg)
Unificacao
I Dois termos constantes unificam se eles sao iguais
I Um termo que e uma variavel nao instanciada unifica comqualquer outro termo. No caso de duas variaveis naoinstanciadas e criado uma co-referencia, neste caso, quandouma das variaveis e instanciada, a outra tambem e
I Duas estruturas unificam se
I Elas tem o mesmo functor e a mesma aridadeI Todos os argumentos correspondentes unificam (observe que a
definicao e recursiva)I A instanciacao das variaveis sao compatıveis
17 / 32
![Page 21: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/21.jpg)
Unificacao
I Dois termos constantes unificam se eles sao iguais
I Um termo que e uma variavel nao instanciada unifica comqualquer outro termo. No caso de duas variaveis naoinstanciadas e criado uma co-referencia, neste caso, quandouma das variaveis e instanciada, a outra tambem e
I Duas estruturas unificam se
I Elas tem o mesmo functor e a mesma aridadeI Todos os argumentos correspondentes unificam (observe que a
definicao e recursiva)I A instanciacao das variaveis sao compatıveis
17 / 32
![Page 22: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/22.jpg)
Unificacao
I Exemplos
?- casa = casa.
true.
?- casa = carro.
false.
?- X = Y, gosta(joao, Y) = gosta(joao, pizza).
X = Y, Y = pizza.
?- livro(X, algoritmos) = livro(autor(thomas, cormem), Y).
X = autor(thomas, cormem),
Y = algoritmos.
18 / 32
![Page 23: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/23.jpg)
Aritmetica
![Page 24: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/24.jpg)
Aritmetica
I Termos que representam expressoes aritmeticas sao avaliadosquando usados com os predicados =:=, =\=, >, >=, <, =<
?- 3 + 4 =:= 10 - 3. % igual
true.
?- 4 * 3 =\= 4 + 4 + 4. % diferente
false.
?- X = 3, Y = 5, X + Y > 2 * X.
X = 3,
Y = 5.
?- X = 3, Y = 5, X + Y < 2 * X.
false.
?- X > 2.
ERROR: >/2: Arguments are not sufficiently instantiated
I Observe que os termos nao podem ter variaveis naoinstanciadas
20 / 32
![Page 25: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/25.jpg)
Aritmetica
I O operador is pode ser usado para instanciar uma variavelcom o resultado de uma expressao aritmetica
I O termo da direita e interpretado como um expressaoaritmetica e o resultado da avaliacao da expressao e unificadocom o termo da esquerda
?- X is 3 + 4 * 2.
X = 11.
?- 2 + 2 is 2 + 2.
false.
?- 2 is X.
ERROR: is/2: Arguments are not sufficiently instantiated
21 / 32
![Page 26: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/26.jpg)
Escrevendo codigo em Prolog
![Page 27: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/27.jpg)
Escrevendo codigo em Prolog
I Documentacao
I De acordo com PLdocI Um predicado pode ser
I det (determinıstico) satisfeito uma vez sem escolhaI semidet (semi determinıstico) falha ou e satisfeito uma vez
sem escolhaI nondet (nao determinıstico) sem limite de vezes que o
predicado e satisfeito e pode deixar escolha na ultima vez quee satisfeito
I Padroes de instanciacao
I + argumento precisa estar completamente instanciadoI - argumento nao pode estar instanciadoI ? argumento pode ou nao estar instanciado
I Testes
I Usaremos a biblioteca plunit
23 / 32
![Page 28: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/28.jpg)
Exemplo 2.1
Defina um predicado quadrado(X, Y) que e verdadeiro seY = X 2.
24 / 32
![Page 29: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/29.jpg)
Exemplo 2.1
:- use_module(library(plunit)).
%% quadrado(+X, ?Y) is semidet
%
% Verdadeiro se Y e o quadrado de X.
:- begin_tests(quadrado).
test(quadrado4) :- quadrado(4, 16).
test(quadrado3, Q == 9) :- quadrado(3, Q).
:- end_tests(quadrado).
25 / 32
![Page 30: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/30.jpg)
Exemplo 2.1
quadrado(X, Y) :-
Y is X * X.
Para executar os utilize o predicado run tests
?- run_tests.
% PL-Unit: quadrado .. done
% All 2 tests passed
true.
26 / 32
![Page 31: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/31.jpg)
Exemplo 2.2
Defina um predicado fatorial(N, F) que e verdadeiro se ofatorial de N e F .
27 / 32
![Page 32: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/32.jpg)
Exemplo 2.2
:- use_module(library(plunit)).
%% fat(+N, ?F) is semidet
%
% Verdeiro se F e o fatorial de N.
:- begin_tests(fatorial).
test(f0) :- fat(0, 1).
test(f1) :- fat(1, 1).
test(f2) :- fat(2, 2).
test(f3) :- fat(3, 6).
test(f4) :- fat(4, 24).
test(f4, [fail]) :- fat(4, 22).
test(f5, F == 120) :- fat(5, F).
:- end_tests(fatorial).
28 / 32
![Page 33: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/33.jpg)
Exemplo 2.2
fat(N, F) :-
N >= 1,
N0 is N - 1,
fat(N0, F0),
F is N * F0.
fat(0, 1).
29 / 32
![Page 34: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/34.jpg)
Referencias
![Page 35: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/35.jpg)
Referencias basicas
I Capıtulos 1 e 2 do livro Programming in Prolog
I Capıtulos 1 , 2 e 5 do livro Learn Prolog Now.
31 / 32
![Page 36: Fundamentos - Paradigma de Programação Lógico · I O Prolog usa regras de preced^encia e associatividade semelhantes a de outras linguagens I 2 + 4 * 3 e o mesmo que +(2, n*(4,](https://reader033.vdocuments.com.br/reader033/viewer/2022050415/5f8b6828506a706cb0219f64/html5/thumbnails/36.jpg)
Referencias complementares
I Introduction to Prolog
32 / 32