Programação lógica: operadores, repe ções e listas

Documentos relacionados
Racket Básico: Tipos e QuickCheck

Funcional V: estruturas de dados puramente funcionais

PROLOG OPERADORES PRÉ-DEFINIDOS

Funcional IV: listas e funções de ordem superior

Fundamentos. Paradigma de Programação Lógico. Marco A L Barbosa

Prolog. MATA56 - Paradigmas de Linguagens de Programação, UFBA, Prof. Rodrigo Rocha Prolog. Iniciando.

Prof. A. G. Silva. 24 de agosto de Prof. A. G. Silva Programação em Lógica 24 de agosto de / 1

Estudo de caso: codificação de Huffman (parte II)

Introdução à linguagem Prolog

Programação Lógica PROLOG. Programação Lógica: Prolog

Paralelismo de dados com futures

Linguagem Computacional

7 Operadores e Expressões

A linguagem Prolog. Sintaxe, terminologia e semântica informal: Os objectos de dados em Prolog são chamados termos.

Ciência da Computação A&P

Paradigma de Programação Lógico. Marco A L Barbosa

Linguagens de Programação

Capítulo 3 Lógica de Primeira Ordem

CENTRO UNIVERSITÁRIO LUTERANO DE PALMAS PROLOG. Elias Melgaço Chaves Júnior Jonatas Luiz da Costa Rafael Gonçalves Barreira

Linguagens de Programação

Variáveis o nome de uma variável pode ser qualquer sequência de caracteres alfanuméricos que começa com uma letra maiúscula ou com um underscore (_).

Aula prática 5. Funções Recursivas

Aula prática 14. Expressão Lambda

Programação Introdução

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Oficina de Introdução de Programação usando Linguagem Python Prof. Ms. Perini

= = = = = = = = = = = = = = = =

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Estrutura de Condição, Escolha e Repetição

Programação de Computadores III

Lição 4 Fundamentos da programação

Programação de Computadores III

Material Didático Unificado.

Programação em MATLAB

Oficina de Python Prof. Me. José Carlos Perini

Programação de Computadores I. Professor Ilaim Costa Junior

03/04/2016 LÓGICA MATEMÁTICA. Prof. Esp. Fabiano Taguchi. Introdução ao Prolog

Introdução à Programação Funcional

Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes

Introdução à Programação Aula 06. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Programação de Computadores:

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Programação Estruturada

Módulo Lógica Programação com aplicações em Java. Projeto khouse Profissionalizante Profª Larissa Brandão

Funcional II: recursão e iteração

3. Linguagem de Programação C

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Oficina de Python Prof. Me. José Carlos Perini

Recursão PROGRAMAÇÃO EM LÓGICA. Recursão. Sonho Recursivo. Recursão. Recursão. Linguagem Prolog Parte IV

Programação de Computadores III

Aula 4 Expressões e Operadores Cleverton Hentz

Funções de Ordem Superior

ALGORITMOS VARIÁVEIS E OPERADORES. Prof. Angelo Augusto Frozza, M.Sc.

Descrição do Mundo de Wumpus. Inteligência Artificial

Programação Lógica. Controle (Bactracking, Cut, Fail) Paulo Henrique Ribeiro Gabriel

Familiarização com as ferramentas para Prolog

Laboratório de Programação II

Algoritmos: Conceitos Fundamentais. Slides de autoria de Rosely Sanches e Simone Senger de Souza

Conceitos de Linguagens de Programação

Prof. Leandro Tonietto Introdução a computação e suas aplicações Curso de Segurança da Informação UNISINOS jun-09

Agenda. Programação estruturada. Sequência. Decisão: Desvio de fluxo INTRODUÇÃO. Expressões lógicas.

Programação de Computadores:

Material Didático Unificado.

Programação Orientada a Objetos

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ PROLOG PROF. CESAR A. TACLA UTFPR/CURITIBA

Linguagens de Programação Programação Funcional (Haskell)

Programação com Acesso a BD. Programação com OO Acesso em Java

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab.

Linguagens de Programação. Marco A L Barbosa

Linguagem C Operadora

EXPRESSÕES BOOLEANAS. Ex: boolean b = false; // declara uma variável do tipo boolean e atribui false

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Introdução à Programação uma Abordagem Funcional

UNIDADE ACADÊMICA: Faculdade de

Conceitos básicos de programação

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Linguagem C Operadores

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Introdução à Computação

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

LISP - Introdução. Existem vários dialectos de LISP: COMMON LISP (o mais sofisticado e mais utilizado) Outros: MAC LISP, INTERLISP, XLISP

Introdução à Computação

Lista de Exercícios 4

Estruturas condicionais

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Universidade Federal de Uberlândia Faculdade de Computação. Expressões aritméticas, relacionais e lógicas Estruturas condicionais

Capítulo 7. Expressões e Sentenças de Atribuição

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

4. Constantes. Constantes pré-definidas

Expressões e sentença de atribuição

Algoritmos: Conceitos Fundamentais. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

Introdução ao Scilab. Comandos de entrada e saída de dados.

Transcrição:

Programação lógica: operadores, repe ções e listas Profs. Diogo S. Mar ns e Emilio Francesquini {santana.mar ns,e.francesquini}@ufabc.edu.br MCTA016 - Paradigmas de Programação (Prá ca) 14 de agosto de 2018 Crédito de parte das imagens, a menos se especificado: Wikipedia

Obje vos Compreender o mecanismo de operadores na linguagem Prolog Aprender a desenvolver programas que envolvam repe ção Analisar o processamento de listas em Prolog 1 / 31

Instalação SWI Prolog 2 / 31

SWI Prolog Implementação de Prolog com múl plas extensões (inclusive mul paradigma, web semân ca, etc.): Instalação, documentação, etc.: http://www.swi-prolog.org/ Man da desde 1987, originou-se na Universidade de Amsterdam¹ Instalação no Ubuntu: $ sudo apt-add-repository ppa:swi-prolog/stable $ sudo apt-get update $ sudo apt-get install swi-prolog Teste: $ echo "hello :- write('hello world '), nl." > hello.pl $ swipl -l hello.pl Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4) SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software. Please run?- license. for legal details. For online help and background, visit http://www.swi-prolog.org For built -in help, use?- help(topic). or?- apropos(word).?- hello. hello world?- halt. $ ¹SWI refere-se a Sociaal-Wetenschappelijke Informa ca, nome de um grupo de pesquisa da UvA 3 / 31

Operadores 4 / 31

Operadores Em Prolog, operadores são um açúcar sintá co Obje vo: tornar as cláusulas menos verbosas Sem sintaxe especial, notação seria similar a S-expressions: +(2, /(*(5, 7), 2), 5) Operador Termo binário ou unário (aridade 1 ou 2) que pode ser sinta camente usado na notação infixa ou sufixa, sem parênteses. É possível definir seus próprios operadores (não veremos) Operações aritmé cas são efetuadas via operadores pré-definidos 5 / 31

Operações aritmé cas Expressão aritmé ca Expressão construída via operadores aritmé cos. REPL não aceita resultados numéricos, é preciso encapsular o valor de uma expressão em algo que retorne um valor-verdade Solução: amarração de resultados de operações aritmé cas envolve operador especial Operador is Operador binário com as seguintes propriedades: 1 O operando da direita é uma expressão aritmé ca 2 A operação consiste em unificar o operando da direita com o operando da esquerda Unificação pode ser bem sucedida ou não, a depender do operando da direita 6 / 31

Operadores Operadores são funções, e não predicados Predicados têm um valor lógico como resultado Funções podem ter valores numéricos como resultado 7 / 31

Operações aritmé cas Exemplo?- X is 10.5 + 3. X = 13.5.?- X is 10, Z is X+1. X = 10, Z = 11.?- X is sqrt(36). X = 6.0.?- X is 7, X is 6+1. X = 7.?- X is 7, X is 6+2. false.?- A is 10, B is 11. A = 10, B = 11.?- C is A+B. ERROR: is/2: Arguments are not sufficiently instantiated?- X is "a". X = 97.?- X is "ab". ERROR: is/2: Type error: `[]' expected, found `"ab"' (a string) ("x" must hold one character)?- 2 mod 2. ERROR: toplevel: Undefined procedure: (mod)/2 (DWIM could not correct goal)?- X is 2 mod 2. X = 0. 8 / 31

Operações aritmé cas Exemplo Exemplo: crie um programa que incremente um número N com passo P Tenta va 1: 1 increase(n,p) :- N is N + P.?- increase(10,3). false. Tenta va 2: 1 increase2(n,p) :- R is N + P.?- increase2(10,3). Tenta va 3: 1 increase3(n,p,r) :- R is N+P.?- increase3(10,3,x). X = 13. 9 / 31

Operadores e funções aritmé cos Exemplos [?] 10 / 31

Operadores relacionais Igualdade entre expressões aritmé cas Exemplos: Igualdade entre expressões aritmé cas?- 6 + 4 =:= 6 * 3-8.?- sqrt(36)+4 =:= 5 * 11-45. Exemplo: construa um predicado que determine se um inteiro é par. Alterna va 1: 1 even?(n) :- N mod 2 =:= 0.?- even?(4).?- even?(11). false. Alterna va 2: 1 even2?(n) :- N mod 2 =\= 1.?- even2?(2).?- even2?(13). 11 / 31

Operadores relacionais Igualdade de termos Igualdade de átomos Dois átomos são iguais se podem ser unificados.?- term1 == term2. false.?- term1 == term1. Igualdade de amarrações Duas amarrações são iguais se amarram o mesmo valor (i.e. se os valores unificam).?- X = 'a', Y = 'a', X == Y. X = Y, Y = a.?- X = 1, Y is 0 + 1, X == Y. X = Y, Y = 1.?- X = 1, Y is 1 + 1, X == Y. false. 12 / 31

Operadores relacionais Igualdade de termos Igualdade de termos Dois termos são iguais se: 1 Possuem o mesmo funtor 2 Possuem a mesma aridade 3 Os argumentos são iguais?- likes(x,prolog) == likes(x,prolog).?- likes(x,prolog) == likes(y,prolog). false.?- X is 10, pred1(x) == pred1(10). X = 10.?- 6 + 4 == 3 + 7. false.?- +(6,4) == +(3,7). false.?- 6 + 4 == 6 + 4.?- 6 + 4 \== 3 + 7. 13 / 31

Operador de unificação Operador de unificação Operador que é bem sucedido se é possível unificar dois termos.?- 1 = 1.?- a = a.?- pred(10) = pred(10).?- pred(x) = pred(10). X = 10.?- likes(x, prolog) = likes(john, Y). X = john, Y = prolog.?- 6 + 3 = 3 * 3. false.?- 6 + X = 6 + 3. X = 3.?- likes(x, prolog) = likes(y,prolog). X = Y.?- likes(x, prolog) = likes(y, java). false.?- Z = prolog, likes(x, Z) = likes(y, prolog). Z = prolog, X = Y.?- 6 + 3 \= 3 * 3. 14 / 31

Operadores lógicos Negação:?- not(x is 0). false.?- assert(dog(fido)).?- dog(fido).?- not(dog(fido)). false. Conjunção:?- X = 0, X is 0. X = 0.?- X = 0, X is 1-1. X = 0.?- X = 0, not(x is 1). X = 0. 15 / 31

Operadores lógicos Disjunção:?- 6 < 3 ; 7 is 5 + 2.?- 6 * 6 == 36 ; 10 = 8 + 3. false. 16 / 31

Precedência de operadores http://www.swi-prolog.org/pldoc/man?predicate=op/3 17 / 31

Repe ção 18 / 31

Repe ções Exemplos Repe ções em Prolog são construídas via recursão Análogo ao que vimos em Lisp Exemplo: construa um programa que imprima os inteiros no intervalo (0, N] 1 count(0). 2 count(n) :- N > 0, write(n), nl, M is N-1, count(m).?- count(6). 6 5 4 3 2 1 true 19 / 31

Repe ções Exemplos Exemplo: construa um programa que imprima os inteiros no intervalo (I, N] 1 count(i, I). 2 count(i, N) :- N > I, write(n), nl, M is N-1, count(i, M).?- count(2,11). 11 10 9 8 7 6 5 4 3 true Exercício: adapte o programa para imprimir no intervalo [I, N]. 20 / 31

Repe ções Exemplos Exemplo: construa um programa que resulte na soma dos inteiros no intervalo [0, N] 1 sum_n(0,0). 2 sum_n(n, S) :- N > 0, N1 is N-1, sum_n(n1, S1), S is N + S1.?- sum_n(10,s). S = 55. 21 / 31

Repe ções Exemplos Exemplo: construa um programa que calcule o fatorial de N. Tenta va 1: 1 fatorial(0,1). 2 fatorial(n,f) :- N1 is N - 1, fatorial(n1, F1), 3 F is F1 * N.?- fatorial(4,f). F = 24 ; ERROR: Out of local stack Tenta va 2: 1 fatorial2(0,1). 2 fatorial2(n,f) :- N > 0, N1 is N - 1, fatorial2(n1, F1), 3 F is F1 * N.?- fatorial2(4,f). F = 24 ; false. 22 / 31

Listas 23 / 31

Listas Lista Estrutura de dados com as seguintes propriedades: 1 [] é uma lista vazia 2 [A B] é uma lista não vazia em que A é cabeça e B é a cauda da lista 3 A cauda de uma lista é sempre uma lista 4 A cabeça de uma lista pode ser qualquer termo Exemplos:?- Z = [john, mary, 10, robert, 20, jane, X, bill]. Z = [john, mary, 10, robert, 20, jane, X, bill].?- Z = [[john,28], [mary,56,teacher], robert, parent(victoria,albert), [a,b,c,[d,e,f],g]]. Z = [[john, 28], [mary, 56, teacher], robert, parent(victoria, albert), [a, b, c, [......]...]].?- X = alpha, Y = 27, Z = [alpha, beta], write('list is: '), write([x, Y, Z]), nl. List is: [alpha,27,[alpha,beta]] X = alpha, Y = 27, Z = [alpha, beta]. 24 / 31

Construção de listas Operador cons Listas são construídas via o operador cons ( ), que é análogo ao u lizado em Lisp?- X = [], Y = [a X], Z = [b Y], W = [c Z]. X = [], Y = [a], Z = [b, a], W = [c, b, a].?- write([1 [2,3,4,5]]). [1,2,3,4,5]?- write([[6,7] [2,3,4,5]]). [[6,7],2,3,4,5] 25 / 31

Decomposição de listas Operador cons A unificação do operador cons com uma lista pode ser usada para decompor a lista?- [H T] = [1,2,3,4]. H = 1, T = [2, 3, 4].?- [a,b,c,d] = [X Y]. X = a, Y = [b, c, d]. Exemplo: construa um programa que imprima elemento a elemento de uma lista. 1 write_all([]). 2 write_all([h T]) :- write(h), nl, write_all(t).?- write_all([1,2,3,4]). 1 2 3 4 26 / 31

Processamento de listas Exemplos Exemplo: construa um programa que some todos os valores de uma lista de inteiros. 1 list_sum([],0). 2 list_sum([h T], S) :- list_sum(t,s1), S is S1 + H.?- list_sum([0,0,1,2,3,4,5,6,7,8,9,10], S). S = 55. Exemplo: construa um programa que gere uma lista dos quadrados dos valores de outra lista. 1 list_square([], []). 2 list_square([h T], L) :- Sq is H * H, list_square(t, L1), 3 L = [Sq L1].?- list_square([1,2,3,4,5,6,6,7], R). R = [1, 4, 9, 16, 25, 36, 36, 49].?- list_square([], R). R = []. 27 / 31

Processamento de listas Exemplos Exemplo: Construa um procedimento que determine a quan dade de elementos em uma lista. Tenta va 1: 1 list_length([], 0). 2 list_length([h T], L) :- list_length(t, L1), L is L1 + 1.?- consult("length.pro"). Warning: (...) Singleton variables: [H]?- list_length([], L). L = 0.?- list_length([1,2,3,4], L). L = 4. Tenta va 2: 1 list_length2([], 0). 2 list_length2([_ T], L) :- list_length2(t, L1), L is L1 + 1. 28 / 31

Amarração anônima Amarração anônima Amarração sem iden ficador na qual cada ocorrência corresponde a um endereço diferente de memória. 1?- write(x), nl, write(y), nl, X is 10, nl, write(x), nl, 2 Y = X, nl, write(y). 3 _G11335 4 _G11337 5 6 10 7 8 10 9 X = Y, Y = 10. 10 11?- write(_), nl, write(_), nl, _ is 10, write(_), nl. 12 _G11335 13 _G11337 14 _G11342 15 29 / 31

Exercícios Nos exercícios a seguir não é permi do usar predicados pré-definidos, a menos se especificado em contrário. 1 Construa um programa que verifique se um inteiro é membro de uma lista de inteiros. Você não pode usar predicados pré-definidos. 2 Adapte o programa anterior para que a lista possa conter termos e números. Se precisar verificar o po do elemento da lista, você pode usar um dos predicados pré-definidos listados em: http: //www.swi-prolog.org/pldoc/man?section=typetest 3 Defina a operação shi (L1, L2) que faça uma rotação à esquerda em L1 e amarre o resultado em L2. Exemplo: L1 = [1,2,3,4] L2 = [2,3,4,1]. 4 Defina a operação reverse que apresente os elementos de uma lista em ordem reversa. 5 Defina a operação max que determine se o maior elemento de uma lista de inteiros. 30 / 31

Materiais complementares Caps. 4, 6 e 9: Bramer, Max. Logic programming with Prolog. 2ⁿ edi on (2013). 31 / 31

Programação lógica: operadores, repe ções e listas Profs. Diogo S. Mar ns e Emilio Francesquini {santana.mar ns,e.francesquini}@ufabc.edu.br MCTA016 - Paradigmas de Programação (Prá ca) 14 de agosto de 2018 Crédito de parte das imagens, a menos se especificado: Wikipedia