cap´ıtulo 3 – l´ogica de primeira ordem filecap´ıtulo 3 – l´ogica de primeira ordem...

26
Cap´ ıtulo 3 – L´ogica de Primeira Ordem L´ogica para Programa¸ ao LEIC - Tagus Park 1 o Semestre, Ano Lectivo 2007/08 c Inˆ es Lynce and Lu´ ısa Coheur

Upload: lynhi

Post on 26-Apr-2019

218 views

Category:

Documents


0 download

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

Vamos la correr um exemplo a mao!

• merge([1,3,5],[2,3],Xs).

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

merge: exemplo

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

So que...

• E preciso ter muito cuidadinho no uso do corte!!!

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).

Manipulacao da base de conhecimento: exemplo