Escolar Documentos
Profissional Documentos
Cultura Documentos
• Lógica e Programação
• A Linguagem Prolog
• Exercícios
Lógica e Programação
• Lógica - ciência do pensamento “correto”.
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.
• 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:
• 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.
• 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
• 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
• Devem ter pelo menos uma casa depois do ponto decimal definida: 5.0
(está correto) e 7. (não está correto)
• 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
• , 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
• x // y = divisão inteira
• Atribuição:
• A is ln(X)
• write(A)
Prolog – Conceitos Básicos
Aritmética e expressões aritméticas
• A cabeça e o corpo são separados pelo símbolo “:-” (dois pontos e hífen),
que se pronuncia “se”.
• 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”.
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
?- 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
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.
[casa] [casa] []
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(1,[[1,2],3,4]).
no
Processamento de Listas
Unificação de Listas (“matching”)
1. São idênticos ou
pertence(Elemento, [ _ |Cauda]) :-
pertence(Elemento, Cauda).
Processamento de Listas
• Último elemento de uma lista:
ultimo(Lista, Elemento)
ultimo([Elemento], Elemento).
ultimo([ _ | Cauda], Elemento):- ultimo(Cauda, Elemento).
Processamento de Listas
• Soma dos elementos de uma lista numérica:
soma( Lista, S)
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.
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.
• 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]).
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