Você está na página 1de 70

Introdução 

à Inteligência Artificial  – IIA


Introdução à Programa de IA - Prolog
(Parte I)
Tópicos

• Lógica e Programação
• A Linguagem Prolog
• Exercícios
Lógica e Programação
• Lógica - ciência do pensamento “correto”.

• Afirmação dos filósofos da lógica – “para entender o que realmente


acontece no mundo, precisamos entender o que não acontece”.

• Uso da lógica na representação dos processos de raciocínio


• Boole (1815-1864)
• De Morgan (1806-1871)
• Frege no seu "Begriffsschrift" ("Notação de conceito", ideografia, 1879)
A Linguagem Prolog
• Programação em lógica - tem suas raízes no cálculo de predicados,
proposto por Frege em 1879.

• Primeira implementação da linguagem Prolog - Alain Colmerauer e


sua equipe, na Universidade de Aix-Marseille em 1972.

• Objetivo inicial: integrar uma técnica de prova automática de


teoremas (Princípio de Resolução de Robinson) numa linguagem de
programação para processamento de linguagem natural.
A Linguagem Prolog
• Uma das principais idéias - um algoritmo é constituído por dois
elementos disjuntos: a lógica e o controle.

• Componente lógico - corresponde à definição do que deve ser


solucionado.

• Componente de controle - estabelece como a solução pode ser obtida.


A Linguagem Prolog
PROGRAMAS CONVENCIONAIS PROGRAMAS
EM LÓGICA
Processamento Numérico Processamento Simbólico
Soluções Algorítmicas Soluções Heurísticas
Estruturas de Controle e Conhecimento Estruturas de Controle e
Integradas Conhecimento Separadas
Difícil Modificação Fácil Modificação
Somente Respostas Totalmente Corretas Incluem Respostas Parcialmente
Corretas
Somente a Melhor Solução Possível Incluem Todas as Soluções Possíveis
A Linguagem Prolog
• Propriedades dos sistemas de programação em lógica em geral (em
particular a linguagem Prolog):
Funcionam simultaneamente como linguagem de programação e de
especificação,
Possuem capacidade dedutiva,
Operam de forma não-determinística,
Permitem a representação de relações reversíveis,
Permitem interpretação declarativa, procedimental e operacional,
São naturalmente recursivos.
A Linguagem Prolog
• Principais aplicação da programação em lógica:
• Sistemas Baseados em Conhecimento (SBCs),
• Sistemas de Bases de Dados (BDs),
• Sistemas Especialistas (SEs),
• Processamento da Linguagem Natural (PLN),
• Educação, e
• Modelagem de Arquiteturas Não-Convencionais.
A Linguagem Prolog
• Constituída basicamente de

• predicados (mostra as relações entre os objetos),

• regras (estruturação do conhecimento) e

• variáveis (os objetos).


Prolog – Exercício 1
Considere a árvore genealógica.

maria joao

jose ana

julia iris

jorge
Prolog – Exercício 1 ...
• Considere a relação denominada progenitor - associa um indivíduo a
um dos seus progenitores.

• Defina, utilizando Prolog, a relação progenitor completa.

• Responda, em Prolog, as seguintes questões:


• “José é o progenitor de Íris?”
• “Ana é um dos progenitores de Jorge?”
• “Luís é progenitor de Maria?”
• “Quem é progenitor de Íris?”
• “Quem são os filhos de José?”
Prolog – Exercício 1 ...
Relação progenitor completa:

• progenitor(maria, jose).
• progenitor(joao, jose).
• progenitor(joao, ana).
• progenitor(jose, julia).
• progenitor(jose, iris).
• progenitor(iris, jorge).
Prolog – Exercício 1 ...
Questões e respectivas respostas:

• "José é o progenitor de Íris?"


?-progenitor(jose, iris).
yes

• "Ana é um dos progenitores de Jorge?"


?-progenitor(ana, jorge).
no

• "Luís é progenitor de Maria?"


?-progenitor(luis, maria).
no
Prolog – Exercício 1 ...
Questões e respectivas respostas:

• “Quem é progenitor de Íris?”


?-progenitor(X, iris).
X=jose

• “Quem são os filhos de José?”


?-filho(jose, X).
X=julia;
X=iris;
no
A última resposta obtida - "não" - significa que todas as soluções válidas já foram fornecidas.
Exercício 1
Questões e respectivas respostas:

• Uma questão mais geral para o programa seria: "Quem é progenitor de quem?"
ou:
"Encontre X e Y tal que X é progenitor de Y“
• ?-progenitor(X, Y).
• X=maria Y=jose;
• X=joao Y=jose;
• X=joao Y=ana.

• Z=X+Y
Exercício 2
• Sejam os axiomas:
• Todos os homens são falíveis.
• "Para todo X, se X é um homem então X é falível".
• Sócrates é um homem.

• Um teorema que deriva logicamente desses dois axiomas é:


• Sócrates é falível

Exercício: Faça a descrição acima em Prolog.


Exercício 2
Solução:

• falivel(X) :- homem(X).
• homem(socrates).

Consulta
• ?-falivel(X).
• X=socrates
Prolog – Conceitos Básicos
Tipos de dados

• Variáveis
• não variáveis
• Atômicas
• átomos
• inteiros
• número de ponto flutuante
• strings
• não atômicas
• listas
• estruturas
Prolog – Conceitos Básicos
Variáveis

• o nome de uma variável pode ser qualquer seqüência de caracteres alfanuméricos


que começa com uma letra maiúscula ou com um “underscore” ( _ ).

• Se usar somente o “underscore”( _ ) no predicado significará que você não quer


saber o valor - variáveis anônimas.

• As variáveis podem se unificar com um valor definido (um átomo) ou outra variável
(só que ficam dependentes uma da outra, uma guarda o endereço da outra).
Prolog – Conceitos Básicos
Átomos

• São constantes textuais.

• Podem conter letras, números ou símbolos.

• Ex: bola, ‘Bola’, ‘12’, mary’’s, ‘Mary’’s’


• (Obs: Se o átomo começar com letra maiúscula ou se for um número deve-se
usar aspas simples. Se o átomo tiver apóstrofo usa-se duas aspas. )
Prolog – Conceitos Básicos
Números inteiros

• São os permitidos pelo computador: positivos e negativos.

• Caracteres ASCII são também considerados inteiros se colocar aspas


simples antes da letra: ‘a = 97.
Prolog – Conceitos Básicos
š Números de ponto flutuante

• São os permitidos pelo computador: positivos e negativos.

• Devem ter pelo menos uma casa depois do ponto decimal definida: 5.0
(está correto) e 7. (não está correto)

• Pode-se definir expoentes da base dez usando a letra E(e): -8.3 e 21


Prolog – Conceitos Básicos
Strings

• São constantes usadas para manipular texto. A constante deverá estar


entre $ ou entre aspas.

• Ex: $Ele foi ao cinema$ ou 'Ele foi ao cinema'


Prolog – Conceitos Básicos
Estruturas

• São tipos de dados que podem ser usados para agrupar ou expressar
uma relação entre os termos.

• Exemplos:
• aniversario(jose,5,maio,1985)
• nasceu(jose,brasilia)
• amigo(maria, estela)
Prolog – Conceitos Básicos
Listas

• Seqüência de elementos ordenados


• Cada elemento da lista é separado por uma vírgula e o conjunto é
colocado entre colchetes: [a, b, c]
• Uma característica principal dessas listas: é possível separar a cabeça
da lista (10 elemento) da cauda (demais elementos), permitindo
escrever: [a | b, c]
• Uma lista de caracteres é uma lista que tem notação própria: “abc” =
[97,98,99]
Prolog – Conceitos Básicos
Estruturas de controle do programa

• , conjunção de metas.
• Se uma cláusula contém uma seqüência de metas, separadas por vírgula, todas elas devem ser satisfeitas
para que a cláusula seja satisfeita.

• ; disjunção de metas.
• Se uma cláusula contém uma seqüência de metas, separadas por ponto e vírgula, ao menos uma meta
deve ser satisfeita para que a cláusula seja satisfeita.

• not P negação
• P or Q operador lógico
• P and Q operador lógico
Prolog – Conceitos Básicos
Aritmética e expressões aritméticas

• Os normais: +, -, *, ^, cos, exp, ln, log, sin, sqrt, mod, etc

• x / y = divisão normal com resultado em ponto flutuante (se necessário)

• x // y = divisão inteira

• Os números inteiros quando relacionados numa expressão com números de ponto


flutuante são transformados para números de ponto flutuante
Prolog – Conceitos Básicos
Aritmética e expressões aritméticas

• Os números de ponto flutuante podem ser convertidos para números


inteiros: integer(X)

• Os números inteiros podem ser convertidos em números de ponto


flutuante: float(X)

• Atribuição:
• A is ln(X)
• write(A)
Prolog – Conceitos Básicos
Aritmética e expressões aritméticas

• Avaliações para números:


• relacionais comuns: >, <, > =, = <
• X is E1: se X já tiver um valor, verifica se X(variável) unifica com
E1(expressão)
• E1 =:= E2 : avalia E1 e E2 verificando se o resultado das expressões é igual
• E1 =\= E2 : avalia E1 e E2 verificando se o resultado das expressões é
diferente
Prolog – Conceitos Básicos
• Resumindo, Prolog consiste em:
• Declarar alguns fatos sobre objetos e suas relações;

• Definir algumas regras sobre objetos e suas relações;

• Fazer consultas sobre objetos e suas relações.


Prolog – Declarando Fatos
• gosta(maria,joao).

1.Os nomes de todas as relações e objetos devem começar com minúsculas.


2.A relação (gosta) vem em primeiro lugar, seguida pelos objetos entre parênteses
e separados por vírgula
3.Deve-se colocar um ponto “.” ao final do fato
4.A ordem de apresentação dos objetos é arbitrária, mas uma vez escolhida deve
ser respeitada para evitar inconsistências.
5.O exemplo acima significa “maria gosta de joao”.
Prolog – Declarando Fatos
• Predicado - nome de uma relação.

• Argumentos - nomes dos objetos dentro dos parênteses.

• Aridade de um predicado - número de argumentos que possui.

• Fatos em Prolog permitem expressar relações arbitrárias entre objetos.

• base de dados - uma coleção de fatos em Prolog.


Prolog - Regras
• São utilizadas quando se deseja afirmar que um fato depende de um
grupo de outros fatos.

• As regras também são utilizadas para expressar definições.

• Exemplo: “Um indivíduo X é avô de outro indivíduo Y se existe um


indivíduo Z que é filho de X e pai de Y”
Prolog - Regras
• Em Prolog uma regra consiste de uma cabeça e um corpo.

• A cabeça e o corpo são separados pelo símbolo “:-” (dois pontos e hífen),
que se pronuncia “se”.

• O exemplo de regra anterior pode ser expresso em Prolog como:


avo(X,Y) :- filho(Z,X), pai(Z,Y).
neto(Y,X):-filho(Z,X), pai(Z,Y).
Neto(_,X).
Avo(Y,_)
Prolog - Regras
• Escopo de uma variável - definido como sendo toda a regra (da
cabeça até o ponto) na qual a variável se encontra.

• Sempre que uma variável X está instanciada, todos os outros “Xs”


dentro do escopo da variável também devem estar instanciados com
este mesmo objeto.
Prolog - Exemplo de Regra
homem(joao).
homem(jose).
homem(pedro).
mulher(maria).
mulher(ana).
mulher(paula).
mulher(joana).
mulher(alice).
pais(joao,maria,jose).
pais(paula,alice,pedro).
pais(ana,maria,jose).
pais(joana,alice,pedro).
irma_de(X,Y) :- mulher(X), pais(X,M,P), pais(Y,M,P).
Prolog – Fazendo Consultas
• Uma consulta é semelhante a um fato, exceto que se coloca um símbolo especial
“?-” antes dela.
• Exemplo: ?- pai(jose,joao).

• Uma consulta desencadeia uma busca na base de dados tentando-se casar o fato
contido na questão (objetivo) com um daqueles contidos na base de dados. Se um
fato é encontrado, a resposta é sim “yes”, caso contrário não “no”.

• Dois fatos casam se seus predicados são os mesmos e se cada um de seus


argumentos correspondentes são os mesmos.
Prolog – Exemplos de Consultas
gosta(maria,joao).
gosta(jose,cristina).
gosta(teresa,jose).

Consultas:
?-gosta(joao,maria).
no
?-gosta(teresa,jose).
yes
Prolog – Exemplos de Consultas
nasceu(jose,paraiba).
nasceu(joao,pernambuco).
brasileiro(paulo).
brasileiro(joao).

?-nasceu(jose,paraiba).
yes
?-brasileiro(joao).
yes
?-brasileiro(jose).
no
• Em Prolog, a resposta negativa é utilizada com o significado de “nada casa com a questão” e não com o
significado que a questão é falsa!
Prolog – Consultas (Variáveis)
• “X é filho de Pedro?”: neste caso Prolog deve apresentar todas as
possibilidades para o significado de X

• Nomes de variáveis representam objetos a serem determinados por


Prolog

• Instanciadas: quando assumiram o valor de um objeto

• Não Instanciadas: caso contrário


Prolog – Consultas (Variáveis)
gosta(paulo,teresa).
gosta(joao,natureza).
gosta(maria,chocolate).
gosta(maria,natureza).
gosta(joao,maria).

?- gosta(joao,X).
X=natureza
• Para concluir a consulta, basta pressionar RETURN
• Para tentar re-satizfazer a questão, pressiona-se “;” (ponto-e-vírgula) seguido por RETURN.
X=natureza;
X=maria;
Prolog – Consultas (Conjunções)
• A consulta “Maria gosta de João e João gosta de Maria?” pode ser
expressa por:
?-gosta(joao,maria), gosta(maria,joao).
no

• A vírgula “,” é lida como “e”, servindo para separar qualquer


número de objetivos diferentes.

• Todos os objetivos precisam ser satisfeitos para que a conjunção


de objetivos também seja.
Prolog – Consultas (Conjunções e Variáveis)
• “Existe um objeto tal que João e Maria gostam?”
?- gosta(maria,X), gosta(joao,X).

1. A base de dados é pesquisada para o 1o objetivo. X é instanciada com chocolate.


2. Agora a base de dados é pesquisada para gosta(joao,chocolate).
3. Como não existe tal fato, o último objetivo falha e tenta-se re-satisfazer o anterior.
4. Parte-se do ponto em que X foi instanciada pela última vez. X é instanciada desta vez com
natureza.
5. Prolog tenta satisfazer o 2o objetivo na forma gosta(joao,natureza), o que é possivel.
6. Neste ponto como ambos os objetivos puderam ser satisfeitos, Prolog responde então com
X=natureza.
LPA WIN-PROLOG 5.0

http://www.lpa.co.uk/win.htm
Introdução à Programa de IA - Prolog
(Parte III)
Tópicos

• Processamento de Listas
Processamento de Listas
• Lista - seqüência ordenada de elementos que pode ter qualquer comprimento.

• Os elementos de uma lista podem ser uma variável, uma constante, ou qualquer
estrutura do Prolog. Esses elementos são separados por vírgulas.

• Formas de identificação das listas em Prolog:


[X|Y]
[ Cabeça | Cauda ]
[ Topo | Cauda ]
[ Primeiro | Resto ]
• A Cauda pode ser uma lista vazia.
Processamento de Listas - Exemplo
Lista Cabeça Cauda

[casa] [casa] []

[3, 4, 5] [3] [4, 5]

[ o, gato, morreu, ontem ] [o] [gato, morreu,ontem]


Processamento de Listas
• Construção de Listas

cons(X,Y,[X|Y]).

?-cons(a,b,Z).
Z=[a,b] ou Z=[a|b]

?-cons(a,[],Z).
Z=[a]

?-cons(a,X,[a,b,c]).
X=[b,c]

?-cons([a,b,c],[d,e],Z).
Z = [[a,b,c],d,e]
Elementos de uma Lista
membro(X,L).
membro(b,[a,b,c]).
membro([b,c],[a,[b,c],d]).
membro(b,[a,[b,c]]). (Falso)

X é membro de L se
1. X é a cabeça de L, ou
2. X é membro do corpo de L
Elementos de uma Lista
membro(X,[X|C]).
membro(X,[_|C]) :- membro(X,C).
O uso de _ indica que o
conteúdo não é
?-membro(a,[a,b,c]). importante.

yes

?-membro(‘Natal’, [‘Recife’, ‘Natal’, ‘Campina’]).


yes

?-membro(1,[[1,2],3,4]).
no
Processamento de Listas
Unificação de Listas (“matching”)

Dados dois termos, diz-se que eles se unificam se:

1. São idênticos ou

2. As variáveis em ambos os termos podem ser instanciadas em


objetos, de maneira que após a substituição das variáveis por esses
objetos, os termos se tornam idênticos.
Processamento de Listas
Unificação de Listas

• A unificação de uma lista [X | Y] com X e Y variáveis, com uma


lista do tipo [ a1, a2, a3, ..., an ] resulta em:

{ X/a1, Y/[ a2, a3, ..., an ]} , se n > 1


{ X/a1, Y/[ ]} , se n = 1
Processamento de Listas-Exemplo
Lista 1 Lista 2 Unificação
[mesa] [X|Y] X/mesa
Y/ [ ]
[a,b,c,d] [ X, Y | Z ] X/a
Y/b
Z/[c,d]
[ano, bissexto] [ X, Y, Z] não unifica
[X, Y | Z] X/ano
Y/bissexto
Z/[ ]
Processamento de Listas
• Elementos de uma lista:
pertence(Elemento, Lista)

• o Elemento pertence a Lista se ele é a cabeça da Lista ou


• o Elemento pertence à cauda da Lista.

pertence(Elemento, [Elemento | _ ]).

pertence(Elemento, [ _ |Cauda]) :-
pertence(Elemento, Cauda).
Processamento de Listas
• Último elemento de uma lista:
ultimo(Lista, Elemento)

• se a Lista tem só um elemento, este é o último Elemento.


• o último elemento de uma Lista com mais de um elemento é o último elemento
da Cauda da Lista.

ultimo([Elemento], Elemento).
ultimo([ _ | Cauda], Elemento):- ultimo(Cauda, Elemento).
Processamento de Listas
• Soma dos elementos de uma lista numérica:
soma( Lista, S)

• se a Lista é vazia, a soma dos elementos é zero.


• se a Lista é [Cabeça | Cauda], a soma dos elementos é a soma dos elementos da Cauda
mais a Cabeça.

soma([ ], 0).
soma([Cabeça | Cauda], S):- soma(Cauda, S1),
S is S1 + Cabeça.
Processamento de Listas
soma([ ], 0).
soma([Cabeça | Cauda], S):- soma(Cauda, S1),
S is S1 + Cabeça.
L = [1,2,3,4]
soma([1| 2,3,4], S) :- soma ([2,3,4], S1), S is S1 + 1.
soma([2| 3,4], S1) :- soma ([3,4], S2), S1 is S2 + 2.
soma([3| 4], S2) :- soma ([4], S3), S2 is S3 + 3.
soma([4], S3) :- soma ([ ], S4), S3 is S4 + 4.
soma([ ], S4).
Processamento de Listas
• Elementos consecutivos em uma lista consecutivos( Elemento1,
Elemento2, Lista)
• dois elementos Elemento1 e Elemento2 são consecutivos se eles são o
primeiro e o segundo elementos da Lista.
• ou se são consecutivos na cauda da Lista.

consecutivos(Elemento1, Elemento2, [Elemento1, Elemento2 |


Cauda]).
consecutivos(Elemento1, Elemento2, [ _ | Cauda]):-
consecutivos(Elemento1, Elemento2, Cauda).
Processamento de Listas
• conc(L1,L2,L3)
• L1 e L2 são duas listas e L3 é a concatenação resultante.
• conc([a,b],[c,d],[a,b,c,d]).

• Casos que devem ser considerados para a definição de conc/3:


1. Se o primeiro argumento é uma lista vazia - o segundo e o terceiro argumentos
devem ser a mesma lista.
2. Se o primeiro argumento não for uma lista vazia - pode ser denotado por [X|
L1]. A concatenação de [X|L1] com L2 é uma terceira lista com a mesma
cabeça X da primeira e um corpo L3 que é a concatenação do corpo de L1 com
L2.
Concatenação de Listas
X L1 L2

X L3

• Exemplo:

conc([ ],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
?-conc([a,b,c],[1,2,3],L).
L=[a,b,c,1,2,3]
?-conc([a,[b,c],d],[a,[],b],L).
L=[a,[b,c],d,a,[ ],b]
Concatenação de Listas
• Apesar de muito simples o programa conc/3 pode ser usado em inúmeras
aplicações:

• Decomposição:
• Exemplo: ?-conc(L1,L2,[a,b,c]).
L1 = [ ] ,
L2 = [a,b,c] ;
L1 = [a] ,
L2 = [b,c] ;
L1 = [a,b] ,
L2 = [c] ;
L1 = [a,b,c] ,
L2 = [] ;
no
Concatenação de Listas
• Apagando de uma lista todos os elementos que se seguem a um
determinado padrão:

• Exemplo:
?-conc(T,[sab|_],[seq,ter,qua,qui,sex,sab,dom]).
T=[seg,ter,qua,qui,sex]
Remoção de Elementos de uma Lista
• remover(X,L,L1)
• L1 é a mesma lista L com o elemento X removido.

• Existem novamente 2 casos a estudar:


1. Se X é a cabeça de L, então L1 será seu corpo.
2. Se X está no corpo de L, então L1 é obtida removendo X desse corpo.

• Exemplo:
remover(X,[X|C],C).
remover(X,[Y|C],[Y|D]):-remover(X,C,D).
remover(1,[1|2,3,4],[2,3,4])
remover(2,[1|2,3,4],[1|NT]) –remover(2, [2|3,4],NT).
remover(2, [2|3,4], [3,4]).
Exemplos de remoção
?-remover(a,[a,b,a,a],L).
L=[b,a,a];
L=[a,b,a];
L=[a,b,a];
no

?-remover(a,L,[b,c,d]).
L=[a,b,c,d];
L=[b,a,c,d];
L=[b,c,a,d];
L=[b,c,d,a];
no
Outros usos de remover/3
remover(X,[X|C],C).
remover(X,[Y|C],[Y|D]):-remover(X,C,D).
inserir(X,L,L1):- remover(X,L1,L).
membro2(X,L) :- remover(X,L,_).

• Exemplo:
?-inserir(a,[b,c],L). ?-membro2(a,[c,b,a]).
L=[a,b,c]; yes
L = [b,a,c] ;
L = [b,c,a] ;
no
Inversão de Listas
inverter([a,b,c],[c,b,a]).
inverter([],[]).
inverter([a,[b,c],d],[d,[b,c],a]).

• Inversão ingênua (O(N2))


1. Tomar o primeiro elemento da lista
2. Inverter o restante
3. Concatenar o inverso do restante à lista formada pelo primeiro elemento

inverter([],[]).
inverter([X|Y],Z) :- inverter(Y,Y1),
conc(Y1,[X],Z).
Inversão de Listas
• Inversão eficiente (O(N))
inverter(X,Y):-aux([],X,Y).
aux(L,[ ],L).
aux(L,[X|Y],Z) :- aux([X|L],Y,Z).

L = [a, b, c, d]

L1=[1,2,3,...100]
L2=[1,2,3,...10000]
Sublistas
• S é uma sublista de L se:
(1) L pode ser decomposta em duas listas L1 e L2
(2) L2 pode ser decomposta em S e L3

sublista(S,L) :- conc(L1,L2,L),
conc(S,L3,L2).

?-sublista(S,[a,b,c]).
Sublistas
•Exemplo:
•?-sublista(S,[a,b,c]).
conc([ ],L,L). •S = [ ] ;
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3). •S = [a] ;
•S = [a,b] ;
sublista(S,L) :- conc(L1,L2,L),
conc(S,L3,L2). •S = [a,b,c] ;
•S = [ ] ;
•S = [b] ;
•S = [b,c] ;
•S = [ ] ;
•S = [c] ;
•S = [ ] ;
•no
Capacitação Inovadora
para o Futuro das Pessoas
e Organizações

Você também pode gostar