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
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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 linguagemPrologAprender a desenvolver programas que envolvam repe çãoAnalisar o processamento de listas em Prolog
1 / 31
Instalação SWI Prolog
2 / 31
SWI PrologImplementação de Prolog com múl plas extensões (inclusivemul paradigma, web semân ca, etc.):Instalação, documentação, etc.: http://www.swi-prolog.org/Man da desde 1987, originou-se na Universidade deAmsterdam¹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.plWelcome 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.orgFor built-in help, use ?- help(Topic). or ?- apropos(Word).
?- hello.hello worldtrue.?- halt.$
¹SWI refere-se a Sociaal-Wetenschappelijke Informa ca, nome de um grupo de pesquisa da UvA3 / 31
Em Prolog, operadores são um açúcar sintá coObje vo: tornar as cláusulas menos verbosasSem sintaxe especial, notação seria similar a S-expressions:+(2, /(*(5, 7), 2), 5)
OperadorTermo binário ou unário (aridade 1 ou 2) que pode sersinta camente usado na notação infixa ou sufixa, semparênteses.
É possível definir seus próprios operadores (não veremos)Operações aritmé cas são efetuadas via operadorespré-definidos
5 / 31
Operações aritmé casExpressão aritmé caExpressão construída via operadores aritmé cos.
REPL não aceita resultados numéricos, é preciso encapsularo valor de uma expressão em algo que retorne umvalor-verdadeSolução: amarração de resultados de operações aritmé casenvolve operador especial
Operador isOperador binário com as seguintes propriedades:
1 O operando da direita é uma expressão aritmé ca2 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 dooperando da direita
6 / 31
Operadores
Operadores são funções, e não predicadosPredicados têm um valor lógico como resultadoFunções podem ter valores numéricos como resultado
7 / 31
Operações aritmé casExemplo
?- 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 notsufficiently instantiated
?- X is "a".X = 97.
?- X is "ab".ERROR: is/2: Type error: `[]'expected, found `"ab"' (astring) ("x" must holdone character)
?- 2 mod 2.ERROR: toplevel: Undefinedprocedure: (mod)/2 (DWIMcould not correct goal)
?- X is 2 mod 2.X = 0.
8 / 31
Operações aritmé casExemplo
Exemplo: crie um programa que incremente um número Ncom 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).true.
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é cosExemplos
[?]10 / 31
Operadores relacionaisIgualdade entre expressões aritmé cas
ExercíciosNos exercícios a seguir não é permi do usar predicadospré-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 usarpredicados pré-definidos.
2 Adapte o programa anterior para que a lista possa contertermos e números. Se precisar verificar o po do elementoda lista, você pode usar um dos predicados pré-definidoslistados 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 deuma lista em ordem reversa.
5 Defina a operação max que determine se o maior elementode uma lista de inteiros.