Cap´ıtulo 3 – L´ogica de Primeira Ordem · • Baseados nos slides de Andrew Rice, ... –...
Transcript of Cap´ıtulo 3 – L´ogica de Primeira Ordem · • Baseados nos slides de Andrew Rice, ... –...
Capıtulo 3 – Logica de Primeira Ordem
Logica para ProgramacaoLEIC - Tagus Park
1o Semestre, Ano Lectivo 2007/08
c©Ines Lynce and Luısa Coheur
Bibliografia
• Baseados nos slides de Andrew Rice, Universidade deCambridge, 2007.
• Martins J.P., Prolog, Capıtulo 5.
• Ben-Ari M., Mathematical Logic for Computer Science,Springer-Verlag, 2003, Capıtulo 8.
Paradigmas de programacao
• Programacao funcional (e.g. Scheme)
• Programacao imperativa (e.g. C)
• Programacao em logica (e.g. Prolog)– Exemplo: funcao soma - recebe uma lista de inteiros, devolve
um inteiro que corresponde a soma dos elementos da lista◮ soma([],0).
% soma para lista vazia e 0◮ soma([Cabeca|Cauda],N) :-
soma(Cauda,M), N is M+Cabeca.
% a soma da lista com a cabeca Cabeca e a cauda Cauda e N% se a soma da lista Cauda e M e N=M+Cabeca
• Em programacao em logica
– Programa = logica + controlo
PROLOG = PROgramacao em LOGica
• Introduzido em 1973 no ambito do processamento de lınguanatural
– Colmerauer, A., Kanoui, H., Roussel, P . and Pasero, R. “Unsysteme de communication hommemachine en francais”,Groupe de Recherche en Intelligence Artificielle, Universited’Aix-Marseille. 1973.
• SWI-Prolog
– http://www.swi-prolog.org/
– Open-source– Desenvolvido desde 1987– Disponıvel para plataformas Linux, Mac e Windows
Prolog: conceitos basicos
• Programa = factos + regras
• Factos correspondem a afirmacoes; consistem em letras depredicado (iniciados com letra minuscula) com 1 ou +argumentos
– Exemplos◮ numero(1234).◮ pessoa(ana).◮ idade(jose,22).◮ frequenta(rui,lp).
– Correspondem a clausulas de Horn que consistem num literalpositivo
– Terminam com ponto final (.)
Prolog: conceitos basicos (cont.)
• Regras permitem realizar inferencia
– Correspondem a clausulas de Horn com um literal positivo epelo menos um literal negativo
– Exemplo◮ avo(X,Z) :- ascendente directo(Y,X),
ascendente directo(Z,Y).
– Operador “:-” deve ser interpretado como “se” e “,” deve serinterpretada como “e”
◮ Regra anterior deve ser interpretada como “X e avo de Z se Yfor ascendente directo de X e Z for ascendente directo de Y”
• Executar um programa implica colocar questoes– Questoes correspondem a objectivos: clausulas de Horn que
tem somente literais negativos◮ ?- avo(pedro,nuno).
Exemplo basico de interaccao em Prolog
• Janela de interaccao
– Linux: comando pl
– Mac: comando swipl– Windows: comando plwin.exe
◮ Tipicamente e criado um shortcut no Desktop durante ainstalacao
◮ No caso de se pretender trabalhar na linha de comandos(MS-DOS) usar plcon.exe
– Aceita somente comandos e objectivos– Termina com o comando halt. (ou CTRL+D)
Exemplo basico de interaccao em Prolog (cont.)
• Programa (regras ou factos) + Objectivo
– Unificacao e fundamental
• Tipicamente programas sao escritos num ficheiro (.pl)
– ?- [<nome-programa>]. carrega o programa– Alternativa: [user].
• Objectivos tambem podem ser incluıdos no ficheiro
– Antecedidos por :-
• Objectivos com varias respostas
– <Enter> aceita uma resposta– ; pede a resposta seguinte
Exemplo basico de interaccao em Prolog
Exemplo basico de interaccao em Prolog (cont.)
Exemplo basico de interaccao em Prolog (cont.)
Estruturas de dados simples: constantes
• Constantes: atomos + numeros
• Atomos– Cadeias que podem incluir letras, dıgitos e (underscore) e
que tem de ser iniciadas por letra minuscula◮ ana, nuno, ana silva, x 25
– Cadeias de caracteres especiais◮ < −−−− >, . . . , . : .
◮ Atencao: nao podem coincidir com cadeias que tem umsignificado pre-definido (e.g. : −)
– Cadeias de caracteres limitadas por plicas◮ ’ana’, ’Ana Silva’
• Numeros– Inteiros e reais
◮ 1, -97, 3.1415, -0.0035
Estruturas de dados simples: variaveis
• Cadeias que podem incluir letras, dıgitos e e que tem de seriniciadas por letra Maiuscula ou
– X, Resultado, Lista participantes, x23
• Variavel representa uma variavel sem nome
– Variaveis singleton: aparecem somente uma vez numaclausula; podem sempre ser substituıdas por
• Domınio de uma variavel corresponde a uma unica clausula
Literais
• Correspondem a aplicacao de um predicado ao numeroapropriado de termos;
• Permitem criar objectos que agrupam um conjunto deobjectos:
– tipo-de-objecto(componente-1, componente-2, . . .)– Exemplo
◮ data(Dia,Mes,Ano).◮ data(14,novembro,2007).◮ data(25,dezembro,2000).◮ dataDeNascimento(pessoa,(13,junho,1888)).
Regras
• regra(X,Y) :- parte1(X),parte2(X,Y).
– regra(X,Y) corresponde a cabeca– parte1(X),parte2(X,Y) corresponde ao corpo
• Significado: regra(X,Y) e verdadeira se parte1(X) everdadeira e parte2(X,Y) e verdadeira
Variaveis internas sao comuns
• regra2(X) :- algo(X,Z),casocontrario(Z).
• Significado: regra2(X) e verdadeira se existe Z tal quealgo(X,Z) e verdadeiro e casocontrario(Z) e verdadeiro
Overloading de predicados em Prolog
• O mesmo predicado pode ser definido com um numero deargumentos diferente e com significados diferentes:
• A clausulapredicado xpto.
corresponde a predicado xpto/0
• A clausulapredicado xpto(A).
corresponde a predicado xpto/1
Funcoes aritmeticas
• +
• −
• ∗
• \
• etc.
Operadores relacionais numericos em Prolog
• >
• <
• >=
• =<
• =:= (predicado da igualdade aritmetica)
• =\= (negacao do predicado da igualdade aritmetica)
Exemplo
• ?- 3 =:= +(2, 3).
No
?- 3 =:= +(2, 1).
yes
Operadores relacionais
• = (predicado da unificacao – tem sucesso se os dois termossao unificaveis)
• \= (negacao do predicado de unificacao)
• == (predicado de identidade – tem sucesso se os dois termossao identicos)
• \== (negacao do predicado de identidade)
Exemplo
• ?- f(a, 6) = f(X, Y).
X = a,
Y = 6
?- f(a, 6) = f(b, Y).
No
?- f(a, 6) == f(X, Y).
No
?- f(a, 6) == f(a, 6).
yes
O operador de atribuicao
• is (avalia numericamente a expressao do lado direito e unificacom expressao do lado esquerdo)
• ... voltaremos a falar deste operador la para a frente...
Exemplo
• ?- Y = 6 + 3.
Y = 6+3
?- Y is 6 + 3.
Y = 9
Exemplo
• ?- X is 3+4.
X = 7
?- (6>5, 3 =:= 4, X is 3; X is 8).
X = 8
?- (6>5, 3 =\= 4, X is 3; X is 8).
X = 3
Listas
• Representadas por uma sequencia de elementos limitados porparentesis rectos [el1, . . . , eln]
• [] representa a lista vazia
• Sımbolo | permite referencia a cauda da lista– Lista [tenis,judo,natacao] unifica com
◮ [Cabeca|Cauda]◮ [tenis|Cauda]◮ [El1,El2|Cauda]◮ [tenis,judo|Cauda]◮ [tenis,judo,natacao|[]]◮ ...
Regras e listas: outro exemplo
• ultimo([X],X).
• ultimo([ |Cauda],X) :- ultimo(Cauda,X).
Regras, listas e expressoes aritmeticas: exemplo
• soma([],0).
• soma([Cabeca|Cauda],N) :-
soma(Cauda,M), N is M+Cabeca.
Regras, listas e expressoes aritmeticas: execucao
Regras, listas e expressoes aritmeticas: execucao (cont.)
Comprimento de uma lista (O(N))
• Requisitos de memoria: O(N) para lista de comprimento N
comp1([],0).
comp1([ |Cauda],N) :- comp1(Cauda,M), N is M+1.
?- comp1([1,2],X).
comp1([1|[2]],X) :- comp1([2],M), X is M+1.
comp1([2|[]],M) :- comp1([],M1), M is M1+1.
comp1([],0). → M1 = 0
M is M1+1 → M = 1
X is M+1 → X = 2
comp1([1,2],2)
Comprimento de uma lista (O(1))
• Requisitos de memoria: O(1)
comp2(Lista,Res) :- comp2(Lista,0,Res).
comp2([],Acum,Acum).
comp2([ |Cauda],Acum,Res) :-
Acum1 is Acum+1, comp2(Cauda,Acum1,Res).
?- comp2([1,2],X).
comp2([1,2],X) :- comp2([1,2],0,X).
comp2([1|[2]],0,X) :-
Acum1 is 0+1, comp2([2],Acum1,X).
comp2([2|[]],1,X) :-
Acum1 is 1+1, comp2([],Acum1,X).
comp2([],2,2). → X=2
comp2([1,2],2)
Comprimento de uma lista: execucao
Vamos la ver isto a mao...
Predicados amigos
• Existem tres predicados pre-definidos que permitem guardartodos os objectos resultantes de uma resposta correcta
1. bagof guarda coleccoes de instanciacoes possıveis2. setof guarda coleccoes ordenadas e sem repeticoes de
instanciacoes possıveis3. findall igual a bagof mas quantifica existencialmente
variaveis
• Sintaxe:bagof|setof|findall(<Objecto>,<Objectivo>,<Res>)
Guardar solucoes: exemplo
p(3,5,2).
p(1,3,5).
p(2,4,2).
p(2,4,1).
p(4,3,1).
?- bagof(Z,p(X,Y,Z),Saco).
X = 1 Y = 3 Saco = [5] ;
X = 2 Y = 4 Saco = [2,1] ;
X = 3 Y = 5 Saco = [2] ;
X = 4 Y = 3 Saco = [1]
?- setof(Z,p(X,Y,Z),Conjunto).
X = 1 Y = 3 Conjunto = [5] ;
X = 2 Y = 4 Conjunto = [1,2] ;
X = 3 Y = 5 Conjunto = [2] ;
X = 4 Y = 3 Conjunto = [1]
?- findall(Z,p(X,Y,Z),Saco).
Saco = [2, 5, 2, 1, 1]
Guardar solucoes: exemplo (cont.)
• Objectivo bagof(Z,X^Y^p(X,Y,Z),Saco) corresponde ao”Saco de Z’s tal que existe um X e existe um Y para os quaisse verifica p(X,Y,Z)”
– Corresponde a quantificacao existencial de variaveis
?- bagof(Z,X^Y^p(X,Y,Z),Saco).
Saco = [2, 5, 2, 1, 1]
?- setof(Z,X^Y^p(X,Y,Z),Conjunto).
Conjunto = [1, 2, 5]
Guardar solucoes: exemplo (cont.)
• Por analogia...
?- bagof(Z,X^p(X,Y,Z),Saco).
Y = 3, Saco = [5, 1] ;
Y = 4, Saco = [2, 1] ;
Y = 5, Saco = [2]
?- setof(Z,X^p(X,Y,Z),Conjunto).
Y = 3, Conjunto = [1, 5] ;
Y = 4, Conjunto = [1, 2] ;
Y = 5, Conjunto = [2]
Guardar solucoes: exemplo (cont.)
• findall devolve a lista vazia [] se o objectivo nao e satisfeito,enquanto que bagof falha
?- bagof(Z,(p(X,Y,Z),Z>5),Saco).
No
?- findall(Z,(p(X,Y,Z),Z>5),Saco).
Saco = []