









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
Apostila para Programacao Logica
Tipologia: Notas de estudo
1 / 16
Esta página não é visível na pré-visualização
Não perca as partes importantes!










Universidade Estadual do Oeste do Paraná CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS Colegiado de Informática
Curso de Bacharelado em Informática
http://www.inf.unioeste.br/~abvicente
Disciplina: Inteligência Artificial (IA) Professora: Suzan Kelly Borges Piovesan
Cascavel Setembro de 2005
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição. Para ver uma cópia desta licença, visite http://creativecommons.org/licenses/by/2.0/br/ ou envie uma carta para Creative
André Abe Vicente
A programação em Prolog consiste em estabelecer relações entre objetos e em formular consultas sobre tais relações de forma não numérica, mas simbólica.
Um programa Prolog é formado por cláusulas. Há três tipos de cláusulas: fatos ou assertivas , regras ou procedimentos e consultas;
Uma relação pode ser especificada por meio de:
Interrogar um programa acerca de suas relações por meio de uma consulta corresponde a consultar uma base de conhecimento. A resposta do sistema Prolog consiste em um conjunto de objetos que satisfazem as condições originalmente estabelecidas pela consulta;
Fatos
Um fato denota uma verdade incondicional,
Todo fato é composto por um predicado que estabelece uma relação entre seus argumentos e encerrado por um ponto (.) ;
Exemplo: progenitor(maria, josé). progenitor(joão, josé). progenitor(joão, ana). progenitor(josé, júlia). progenitor(josé, íris).
Regras
Cláusulas Prolog desse tipo são denominadas regras****.
Há uma diferença importante entre regras e fatos:
o Um fato é sempre verdadeiro ;
o Regras especificam algo que "pode ser verdadeiro se algumas condições forem satisfeitas".
As regras tem:
o Uma parte de conclusão (o lado esquerdo da cláusula - cabeça), e uma parte de condição (o lado direito da cláusula - corpo). O símbolo ":-" significa "se" e separa a cláusula em cabeça e corpo da cláusula.
Se a condição expressa pelo corpo da cláusula - progenitor (X, Y) - é verdadeira então, segue como conseqüência lógica que a cabeça - filho(Y, X) - também o é.
André Abe Vicente
Por outro lado, se não for possível demonstrar que o corpo da cláusula é verdadeiro, o mesmo irá se aplicar à cabeça.
Exemplo: pode-se declarar a relação de filho através de simples fatos como filho(josé, joão).
Entretanto podemos definir a relação "filho" de uma maneira muito mais elegante, fazendo o uso do fato de que ela é o inverso da relação progenitor e esta já está definida. Tal alternativa pode ser baseada na seguinte declaração lógica: Para todo X e Y Y é filho de X se X é progenitor de Y. A declaração acima, escrita em Prolog fica: filho(Y, X) :- progenitor(X, Y). "Para todo X e Y, se X é progenitor de Y, então Y é filho de X".
O sistema reconhece o tipo de um objeto no programa por meio de sua forma sintática.
Variáveis sempre irão iniciar com letras maiúsculas, enquanto que as constantes não- numéricas, ou átomos, iniciam com letras minúsculas.
Nenhuma informação adicional, tal como tipos de dados precisa ser fornecida para que o sistema reconheça a informação com a qual está lidando.
Os argumentos das relações podem ser constantes (como júlia e íris), denominados atomos, ou objetos genéricos denominados variáveis (como X e Y).
O alfabeto básico adotado aqui para a linguagem Prolog consiste dos seguintes símbolos:
Os átomos podem ser construídos de três maneiras distintas:
a. Como cadeias de letras e/ou dígitos, podendo conter o caracter especial
André Abe Vicente
outubro de 1993, pode ser escrita como: data(13, outubro, 1993)
Todos os componentes no exemplo são constantes (dois inteiros e um átomo), entretanto, podem também ser variáveis ou outras estruturas. Um dia qualquer de março de 1996, por exemplo, pode ser representado por: data(Dia, março, 1996)
Sintaticamente todos os objetos em Prolog são denominados termos. O conjunto de termos Prolog , , é o menor conjunto que satisfaz às seguintes condições:
Consultas Uma consulta em Prolog é sempre uma seqüência composta por um ou mais objetivos precedida por um ?-. Para obter a resposta, o sistema Prolog tenta satisfazer todos os objetivos que compõem a consulta, interpretando os como uma conjunção. Satisfazer um objetivo significa demonstrar que esse objetivo é verdadeiro, assumindo que as relações que o implicam são verdadeiras no contexto do programa. Se a questão também contém variáveis, o sistema Prolog deverá encontrar ainda os objetos particulares que, atribuídos às variáveis, satisfazem a todos os sub-objetivos propostos na consulta. A particular instanciação das variáveis com os objetos que tornam o objetivo verdadeiro é então apresentada ao usuário. Se não for possível encontrar, no contexto do programa, nenhuma instanciação comum de suas variáveis que permita derivar algum dos sub-objetivos propostos então a resposta será "não". O sistema Prolog aceita os fatos e regras como um conjunto de axiomas e a consulta do usuário como um teorema a ser provado. A tarefa do sistema é demonstrar que o teorema pode ser provado com base nos axiomas representados pelo conjunto das cláusulas que constituem o programa.
Exercícios:
_1. João nasceu em Pelotas e Jean nasceu em Paris.
André Abe Vicente
Para exemplificar o funcionamento serão construídas duas relações de antepassados: antepassados direto e indireto. Direto (pai):
Para todo X e Z X é antepassado de Z se X é progenitor de Z.
Em Prolog:
antepassado(X, Z) :- progenitor(X, Z).
Avô: antepassado(X, Z) :- progenitor(X, Y), progenitor(Y, Z).
Bisavô antepassado(X, Z) :- progenitor(X, Y1), progenitor(Y1, Y2), progenitor(Y2, Z).
Tataravô antepassado(X, Z) :- progenitor(X, Y1), progenitor(Y1, Y2),
Recursão:
Para todo X e Z X é antepassado de Z se existe um Y tal que
André Abe Vicente
Exemplos:
D é instanciada com X; M é instanciada com março; A é instanciada com 1994.
Por outro lado, os termos data(D, M, 1994) e data(X, Y, 94) não unificam, assim como não unificam data(X, Y, Z) e ponto(X, Y, Z).
triângulo(ponto(1, 1), A, ponto(2, 3))
com
triângulo(X, ponto(4, Y), ponto(2, Z))
O processo de unificação começa pela predicado (o functor principal). Como ambos os functores unificam, o processo parte para a unificação dos argumentos, onde a unificação dos pares de argumentos correspondentes ocorre. Assim o processo completo pode ser visto como a seguinte seqüência de operações de unificação simples: triângulo = triângulo ponto(1, 1) = X A = ponto(4, Y) ponto(2, 3) = ponto(2, Z)
O processo completo de unificação é bem sucedido porque todas as unificações na seqüência acima também o são. A instanciação resultante é:
X = ponto(1, 1) A = ponto(4, Y) Z = 3 e.
Tipos de operadores do prolog
Os nomes dos operadores são átomos e sua prioridade encontra-se delimitada por valores inteiros cujo intervalo depende da implementação.
Assumiremos aqui que esse intervalo varie entre 1 e 1200. Há três tipos básicos de operadores, conforme a tabela abaixo:
Tipos de Operadores Prolog
André Abe Vicente
Infixos xfx xfy yfx Prefixos fx fy - Posfixos xf yf -
Operadores Pré-definidos
:- op(1200, xfx, ':-'). :- op(1200, fx [':-', '?-']). :- op(1100, xfy, ';').
:- op(1000, xfy, ','). :- op( 700, xfx, [is, =, <, >, =<, >=, ==, ==, ==, =:=]). :- op( 500, yfx, [+, -]). :- op( 500, fx, [+, -, not]). :- op( 400, yfx, [,/,div]). :- op( 300, xfx, mod). :- op( 200, xfy, ^).*
Prioridade se dará da esquerda para direita que pode ser modificada com parênteses ( ).
Operadores também podem ser definidos pelo programador, sendo realizada por um tipo especial de cláusulas, denominadas diretivas , que atuam como definidoras de operadores. Exemplo: :- op(600, xfx, tem).
Isso informa ao sistema que se deseja usar tem como um operador de prioridade 600 e cujo tipo é "xfx".
O enfoque de Prolog é a computação simbólica, onde as necessidades de cálculo são comparativamente modestas.
Assim, o instrumental da linguagem Prolog destinado a computações numéricas é algo simples. Alguns operadores pré-definidos:
OPERADOR PRIORIDADE TIPO SIGNIFICADO + 500 yfx adição
- 500 yfx subtração
André Abe Vicente
tan(X) Tangente de X round(X,N) Arredonda X para N casas decimais Pi Valor de p com 15 casas decimais Random Um número aleatório entre 0 e 1
Exemplos
a) Computar o máximo divisor comum de dois números. Dados dois inteiros positivos, X e Y, seu máximo divisor comum D pode ser encontrado segundo três casos distintos:
(1)Se X e Y são iguais, então D é igual a X;
(2)Se X<Y, então D é igual ao mdc entre X e a diferença X-Y; (3)Se X>Y, então cai-se no mesmo caso (2), com X substituído por Y e vice-versa.
As três cláusulas Prolog que que expressam os três casos acima são:
mdc(X, X, X). mdc(X, Y, D) :- X < Y, Y1 is Y-X, mdc(X, Y1, D). mdc(X, Y, D) :- X > Y, mdc(Y, X, D).
Informática Inteligência Artificial Suzan Kelly Borges Piovesan Lista de Exercícios 001 Nome
A x B B^ AC
A x B B AC
2
4
2
4
2 2
2 1
= − −^ −
= − + −
dado por 3 3
V = π R
André Abe Vicente
peso(Massa,Local,Peso) que deve indicar o peso de um corpo, sendo informada sua massa e o local onde tal corpo se encontra.
%EX. 2 progenitor(joao,jose). progenitor(joao,ana). progenitor(maria1,jose). progenitor(jose,julio). progenitor(maria2,julio). progenitor(ana,cris). femea(maria1). femea(maria2). femea(ana). femea(cris). macho(joao). macho(jose). macho(julio). pai(X,Y):- macho(X),progenitor(X,Y). mae(X,Y):- femea(X),progenitor(X,Y). filho(X,Y):- macho(X),progenitor(Y,X). filho(X,Y):- femea(X),progenitor(Y,X). tio(X,Y):- macho(X),progenitor(Z,X),progenitor(Z,W),progenitor(W,Y). tia(X,Y):- femea(X),progenitor(Z,X),progenitor(Z,W),progenitor(W,Y). primo(X,Y):-
macho(X),progenitor(Z,I),progenitor(Z,K),progenitor(I,X),progenitor(K,Y). avo(X,Y):- macho(X),progenitor(X,K),progenitor(K,Y). casado(X,Y):- progenitor(X,K),progenitor(Y,K). cunhada(X,Y):- femea(X),casado(X,K),filho(K,Z),filho(Y,Z). cunhada(X,Y):- femea(X),casado(Y,K),filho(K,Z),filho(X,Z).
%LISTA ARITIMÉTICA ////////////////////////////////
%EX. 1 cliente(joao,700). cliente(maria,1000). item(sabao,20,5). item(bombril,80,10).
validacompra(Cli,Item,Qtdsol):- cliente(Cli,Cred), item(Item,Qtd,Preco),
André Abe Vicente
inverter([], []). inverter([X | Y], Z) :- inverter(Y, Y1), conc(Y1, [X], Z).
%Sublistas sublista(S, L) :- conc(L1, L2, L), conc(S, L3, L2).
%permutacao
permutar([], []). permutar([X | L], P) :- permutar(L, L1), inserir(X, L1, P).
%tamanho
tamanho([_ | R], N) :- tamanho(R, N1), N is N1+1.
%soma soma([], 0). soma([X | Y], S) :- soma(Y, R), S is R+X.
%produto
produto([], 0). produto([X], X). produto(L, P) :-
prod(L, P). prod([], 1). prod([X | Y], P) :- prod(Y, Q), P is Q*X.
mostra(X,Y):- % write('digite seu nome e depois digite .'),
write('seu nome é'), nl, write(X), write('sua idade é'), write(Y).