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

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

Prolog: Predicados Built-in 1

Apresentações semelhantes


Apresentação em tema: "Prolog: Predicados Built-in 1"— 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 :- op(Preced,Posição-Assoc,Nome) Posição-Assoc 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: unicamente se M ou N falha nunca se P ou Q falha

9 Cut: exemplo f1(X,0) :- X < 3. f1(X,2) :- 3 =< X, X < 6.
f1(1,Y), 2 < Y? <- no f1(1,Y)? -> X = 1, Y = 0 1 < 3? -> yes 2 < 0? -> no f1(1,Y)? -> X = 1, Y = 2 3 =< 1? -> no f1(1,Y)? -> X = 1, Y = 4 6 =< 1? -> 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 1 < 3? -> yes 2 < 0? -> no

10 Cut: exemplo (cont.) f3(X,0) :- X < 3, !. f3(X,2) :- X < 6, !.
?- 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"

Apresentações semelhantes


Anúncios Google