A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Prolog: Predicados Built-in 1 Jacques Robin, DI-UFPE www.di.ufpe.br/~jr.

Apresentações semelhantes


Apresentação em tema: "Prolog: Predicados Built-in 1 Jacques Robin, DI-UFPE www.di.ufpe.br/~jr."— Transcrição da apresentação:

1 Prolog: Predicados Built-in 1 Jacques Robin, DI-UFPE

2 Predicados built-in * op de unificação = e lista. * op aritméticos: is, +, -, *, /, mod, =:=, >, <, etc. * teste e conversão de tipos: atom, integer, real, var, name, list, =... * controle de busca: !, fail, true, repeat * negação por falha: not * entrada/saída: read, write, nl, consult, reconsult, etc. * meta-programação: assert, retract, call * manipulação de conjuntos: bagof, setof Maioria funcionam por efeitos colaterais sem semântica declarativa em L1

3 Prolog: operadores * Predicados binários ou unários sem parênteses: precedência: inteiro entre 1 e 255 posição: prefixo, infixo, sufixo associatividade: esquerda, direita, ambos * Built-in:. (lista), not, aritméticos, etc. * Definidos pelo usuário em 2 declarações: declaração semântica como predicado qualquer declaração sintática como operador t :- op(Preced,Posição-Assoc,Nome) t Posição-Assoc t x = associativo, y = não associativo

4 Prolog: exemplo de declaração de operador * :- op(600, xfx, isa). * :- op(700,xfx,subsumes). % declaração sintática * subsumes(Gl,Sp) :- Sp isa Gl. % declaração * subsumes(Gl,Sp) :- Sp isa C, subsumes(Gl,C). % semântica * piupiu isa passaro. * passaro isa vertebrado. * vertebrado isa animal. * > animal subsumes C. * C = vertebrado ; * C = passaro ; * C = piupiu ; * no. * >

5 Igualdade x unificação * Ao invés de L1, Prolog não inclui operador de igualdade semântica. * = operador de unificação sintática: não declara nada, apenas teste se 2 termos podem se tornar igual por unificação das suas variáveis falha com termos ground sintaticamente diferentes * == operador de igualdade sintática: também apenas teste igualdade de 2 termos, sem tentar unificar as suas variáveis falha com termos sintaticamente diferentes, mesmo universais

6 Igualdade x unificação: exemplos * ?- geber = senior -> no. ?- prof(X,disc(Y,dept(di,ufpe))) = prof(geber,disc(ia,Z)). -> X = geber, Y = ia, Z = dept(di,ufpe). ?- prof(X,disc(Y,dept(di,ufpe))) == prof(geber,disc(ia,Z). -> no. ?- prof(X,disc(Y,dept(di,ufpe))) == prof(U,disc(V,dept(di,ufpe))). -> no. ?- prof(X,disc(Y,dept(di,ufpe))) == prof(X,disc(Y,dept(di,ufpe))). -> yes. * prof(ia,di,ufpe,geber). musico(senior). ?- geber = senior, prof(X,ia,di,ufpe), musico(X). -> no. e não: X = geber = senior. * prof(ia,di,ufpe,pessoa(geber,_). musico(pessoa(_,senior)). pessoa(geber, senior). ?- prof(X,ia,di,ufpe), musico(X). -> X = pessoa(geber,senior).

7 Prolog: listas * [ e ]: início e fim de lista, separação entre eltos |: separação entre 1o elto e resto da lista açúcar sintático para predicado.(Head,Tail) ex.: [a,[b,c],d] açúcar sintático para.(a,.(.(b,.(c,[])),.(d,[]))) * ?- [a,b,X,p(Y,C)] = [Head|Tail] Head = a, Tail = [b,X,p(Y,C)] ?- [[p(X),[a]],q([b,c])] = [[H|T1]|T2] H = p(X), T1 = [[a]], T2 = [q([b,c])] * member(X,[X|_]). member(X,[Y|Z]) :- member(X,Z). ?- member(b,[a,b,c]) -> yes. ?- member(X,[a,b,c]) -> X = a ; X = b ; X = c ; no.

8 Evitar backtracking inútil: ! (o cut) * op built-in de pruning, logicalmente sempre verificado * com efeito colateral de impedir backtracking: na sua esquerda na cláusula que ocorre em outras cláusulas com a mesma conclusão * ex: A :- B, C, D. C :- M, N, !, P, Q. C :- R. impede backtracking P -> N permite backtracking N -> M, Q -> P, D -> (R xor Q), (P xor R) -> B R tentado: t unicamente se M ou N falha t nunca se P ou Q falha

9 Cut: exemplo f1(X,0) :- X < 3. f1(X,2) :- 3 =< X, X < 6. f1(X,4) :- 6 =< X. * f1(1,Y), 2 < Y? <- no f1(1,Y)? -> X = 1, Y = 0 t 1 yes 2 no f1(1,Y)? -> X = 1, Y = 2 t 3 = no f1(1,Y)? -> X = 1, Y = 4 t 6 = no f2(X,0) :- X < 3, !. f2(X,2) :- 3 =< X, X < 6, !. f2(X,4) :- 6 <= X, !. * f2(1,Y), 2 < Y? <- no f2(1,Y)? -> X = 1, Y = 0 t 1 yes 2 no

10 Cut: exemplo (cont.) f3(X,0) :- X < 3, !. f3(X,2) :- X < 6, !. f3(X,4). ?- f3(1,Y). Y = 0 ?- ; no. ?- * Esses cuts modificam até a semântica declarativa do programa f4(X,0) :- X < 3. f4(X,2) :- X < 6. f4(X,4). ?- f4(1,Y). Y = 0 ?- ; Y = 2. ?-

11 Hipótese do mundo fechado * Ao invés de L1, Prolog não permite nem fatos, nem conclusões de regras negativos, cex: ~animal_lover(geber). ~kill(X,Y) :- animal_lover(X), animal(Y). * Princípio de economia: declarar e deduzir apenas o que é verdadeiro, supor que tudo que não é mencionado nem deduzível é falso (hipótese do mundo fechado) * Operador de negação por falha em premissas: not p(X) verificado sse p(X) falha =/= de ~p(X) verificado sse ~p(X) no BDE ou na conclusão de uma regra com premissas verificadas

12 Negação por Falha (NF) 1 * Permite raciocínio não monótono, ex: ave(piupiu). road_runner(bipbip). ave(X) :- road_runner(X). voa1(X) :- ave(X), not road_runner(X). voa1(X)? -> X = piupiu ; no. * Sem semântica declarativa em L1 * Depende da ordem, ex: voa2(X) :- not road_runner(X), ave(X). voa2(X)? -> no.

13 Negação por Falha 2 * NF pode ser implementado apenas com !, fail (nunca verificado) e true (sempre verificado), ex: voa3(X) :- road_runner(X), !, fail. voa3(X) :- ave(X). não(X) :- X, !, fail ; true. * NF torna resolução de Prolog (Select Depth-1st Linearly w/ Negation as Failure (SDLNF)) inconsistente ex: edge(a,b). sink(X) :- not edge(X,Y). sink(a)? -> no. sink(b)? -> yes. sink(X)? -> no.


Carregar ppt "Prolog: Predicados Built-in 1 Jacques Robin, DI-UFPE www.di.ufpe.br/~jr."

Apresentações semelhantes


Anúncios Google