cap´ıtulo 3 – l´ogica de primeira ordem filecap´ıtulo 3 – l´ogica de primeira ordem...
Post on 26-Apr-2019
218 Views
Preview:
TRANSCRIPT
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.
Programa de festas
• Semantica do Prolog
• Listas em Prolog
• Aspectos nao puros do Prolog
– Atribuicao– Corte– O Falhanco Forcado– A negacao– Definicao de novas operacoes
Operador de corte
• Predicado cut, denotado !, permite alterar o comportamentodo mecanismo subjacente ao Prolog
– Objectivo: reduzir o espaco de procura◮ Evita que o Prolog siga caminhos que nao levam a solucoes
merge(Xs,Ys,Zs)
• Predicado merge: junta duas listas ordenadas produzindo umalista ordenada
merge(Xs,[],Xs).
merge([],Ys,Ys).
merge([X|Xs],[Y|Ys],[X|Zs]) :-
X < Y, merge(Xs,[Y|Ys],Zs).
merge([X|Xs],[Y|Ys],[X,Y|Zs]) :-
X =:= Y, merge(Xs,Ys,Zs).
merge([X|Xs],[Y|Ys],[Y|Zs]) :-
X > Y, merge([X|Xs],Ys,Zs).
merge: observacoes
• Duas clausulas (factos) para casos terminais
• Tres clausulas (regras) para casos recursivos
– X < Y, X =:= Y, X > Y
• merge e determinıstico
– Um objectivo unifica com uma unica clausula– Logo, uma vez encontrada a clausula com que unifica nao vale
a pena tentar unificar com outras clausulas
mergeC: com corte
• Usar operador de corte !
mergeC(Xs,[],Xs) :- !.
mergeC([],Ys,Ys) :- !.
mergeC([X|Xs],[Y|Ys],[X|Zs]) :-
X < Y, !, mergeC(Xs,[Y|Ys],Zs).
mergeC([X|Xs],[Y|Ys],[X,Y|Zs]) :-
X =:= Y, !, mergeC(Xs,Ys,Zs).
mergeC([X|Xs],[Y|Ys],[Y|Zs]) :-
X > Y, !, mergeC([X|Xs],Ys,Zs).
• Operador de corte na segunda e na ultima clausula nao tem efeitospraticos
Operador de corte: semantica
• Se o objectivo anterior ao corte e satisfeito entao clausulasunificadas posteriormente a unificacao da cabeca da clausulaonde ocorre o corte sao eliminadas da procura
• De um modo geral, se tivermos uma clausular :- p1,..., pm,!,q1,..., qn
entao se o corte for atingido nao serao consideradas:
– Alternativas a p1,..., pm
– Alternativas a r
Independentemente do que acontecer a q1,..., qn
Exemplo
• Sao eliminados da procura os nos correspondentes a1=:=2,!,mergeC([3,5],[3],Xs1) e a1>2,!,mergeC([1,3,5],[3],Xs1)
Consequencias
• Um corte elimina todas as clausulas que aparecem abaixo daclausula onde ocorre o corte
• Um corte elimina solucoes alternativas a conjuncao deobjectivos que aparecem a sua esquerda
– Uma conjuncao de objectivos seguida de um corte produzirano maximo uma solucao
• Um corte nao afecta os objectivos a sua direita
– Estes objectivos podem produzir mais do que uma solucao nocaso de retrocesso; caso estes objectivos falhem a procurasegue a partir da ultima alternativa anterior a clausulacontendo o corte
minimum(X,Y,Min)
• Min corresponde ao menor numero de X e Y
minimum(X,Y,X) :- X <= Y, !.
minimum(X,Y,Y) :- X > Y, !.
split5(Xs,Ys,Zs)
• split5 cria duas lista a partir de uma lista de inteiros - umalista com os elementos <5 e outra com os elementos ≥5
split5([],[],[]).
split5([H|T],[H|L],R) :- H<5, !, split5(T,L,R).
split5([H|T],L,[H|R]) :- H>=5, split5(T,L,R).
split(Xs,Ys,Zs): alternativa
• Comparacao na terceira clausula e desnecessaria
split5([],[],[]).
split5([H|T],[H|L],R) :- H<5, !, split5(T,L,R).
split5([H|T],L,[H|R]) :- split5(T,L,R).
• Terceira clausula deixa de ter um significado por si so - EVITAR...
Outras utilizacoes do corte
• Para acelerar a procura!
isDifferent(A,A) :- !, fail.
isDifferent( , ).
• isDifferent(A,B) e verdadeiro se A e B nao unificam
E que existem dois tipos de cortes...
• Cortes verdes– Nao alteram a logica do programa
◮ Exemplos anteriores
• Cortes vermelhos– Alteram a logica do programa
◮ Nao devem ser utilizados!
Cortes vermelhos: exemplo
• Alteram a logica do programa
p :- a,b.
p :- c.
• Significa ((a ∧ b) ∨ c) → p
p :- a,!,b.
p :- c.
• Significa ((a ∧ b) ∨ (¬a ∧ c)) → p
Negacao
• Operador not esta definido na linguagem
– Versoes mais recentes utilizam \+
• not corresponde a implementacao
not(A) :- A,!,fail.
not( ).
• not(A) e verdadeiro se nao pudermos mostrar que A e falso
– \+ <termo> e verdadeiro se nao for possıvel provar <termo>
• Negacao por falha: assume que o mundo e fechado, ou seja,que tudo o que e verdadeiro pode ser inferido
Negacao: exemplo
boaAlimentacao(cantinaIST).
boaAlimentacao(restauranteXPTO).
caro(restauranteXPTO).
bomNegocio(R) :- boaAlimentacao(R), \+ caro(R).
?- bomNegocio(X).
X = cantinaIST
Negacao: outro exemplo alterado
bomNegocio(R) :- \+ caro(R), boaAlimentacao(R).
?- bomNegocio(X).
No
• Prolog comeca por tentar encontrar R tal que caro(R) e verdadeiro
– \+ caro(R) falha se existem restaurantes caros
Negacao: exemplo alterado
• Assumindo que caro/1 foi declarado como dynamic
retract(caro(restauranteXPTO)).
?- bomNegocio(X).
X = cantinaIST;
X = restaurante(XPTO)
Manipulacao da base de conhecimento
• assert(Clausula) adiciona a clausula Clausula a base deconhecimento (em tempo de execucao)
• retract(Clausula) remove a clausula Clausula da base deconhecimento
• abolish(Nome Predicado,Aridade Predicado) removetodas as clausulas do predicado Nome Predicado com aridadeAridade Predicado da base de conhecimento
• Predicados assert e retract so podem ser aplicados apredicados novos ou a predicados ja definidos como dynamic
Manipulacao da base de conhecimento: exemplo
• Ficheiro pai avo.pl
:- dynamic ad/2.
ad(jose,rita).
ad(jose,joao).
ad(luis,jose).
avo(X,Y) :- ad(X,Z), ad(Z,Y).
top related