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

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

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

Apresentações semelhantes


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

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

2 Prolog: aritmética * 3 tipos de operadores built-in aritméticos: calculadores (n-ários infixos): +, -, *, /, mod comparadores (binários infixos): =:=, =\=,, = o atribuídor is: Variável is ExpressãoAritmética * Expressão aritmética: fórmula atômica contendo apenas números e calculadores aritméticos todos os argumentos dos calculadores e comparadores devem ser instanciados com expressões aritméticas

3 Prolog: exemplos de aritmética 1 > ? < yes > ? =:= yes > ? = no > ?- 1 + A = B + 2. A = 2 B = 1 > ?- 1 + A =:= B + 2. Error > ?- A = 2, B = 1, 1 + A =:= B + 2. A = 2 B = 1 > ?- C = C = 1+2 > ?- C == no > ?- C is C = 3 > ?- C is D, D = Error. > ?- D = 1 + 2, C is D. D=1+2 C=3 > ? = +(-(1),2). no > ? =:= +(-(1),2). yes

4 Prolog: exemplos de aritmética 2 fac(0,1) :- !. fac(I,O) :- I1 is I - 1, fac(I1,O1), O is I * O1. ?- fac(1,X). X = 1 ?- fac(3,X). X = 6 ?- fac(5,X). X = 120 sum([],0). sum([H|T],N) :- sum(T,M), N is H + M. ?- sum([2,1,3,1],S). S = 7 ?- sum([2,10,1],S). S = 13

5 Prolog: teste de tipos * semântica declarativa de var fora de L1

6 Prolog: exemplos de teste de tipos ?- var(X). X = _3 ?- var(2). no ?- var(a). no ?- var(p(a,X)). no ?- nonvar(2), nonvar(p(2,X,a)). X = _11 ?- X is 2 + 3, var(X). no ?- var(X), X is X = 5 ?- numberp(Term) :- integer(Term). numberp(Term) :- real(Term). structp(Term) :- nonvar(Term), not atomic(Term). listp(Term) :- nonvar(Term), listp1(term). listp1([]). listp1([H|T]) :- listp1(T). factp(Term) :- strucp(Term), not listp(Term).

7 Prolog: conversão de tipos name(Átomo,Caracteres): * conversão bi-direcional entre átomo e cadeia de caracteres que constitui o seu nome list(CódigosAscii,Caracteres): * conversão bi-direcional entre um lista de inteiros vistos como códigos ascii e cadeia de caracteres correspondente Fato =.. Lista: * conversão bi-direcional entre fato e lista, funtor sendo cabeça e argumentos sendo resto ?- name(A,"blabla"). A = blabla ?- name(blabla,S). S = "blabla" ?- list(X,"bla"). X = [98,108,97] ?- list([98,108,97],Y). Y = "bla ?- p(a,X,c) =.. Y. X = _5, Y = [p,a,_5,c] ?- Y =.. [p,a,X,c]. Y = p(a,_20,c), X = _20

8 Prolog: entrada/saída 1 * Ler/escrever estrutura de dados dificilmente pode ser visto como resultando de uma dedução: E/S não se integre naturalmente no paradigma de PL requer predicados extra-lógicos sem semântica declarativa em L1 * Predicados built-in de Prolog para E/S: sempre verificados cumprem sua tarefa por efeitos colaterais não podem ser re-satisfeitos por backtracking

9 Prolog: entrada/saída 2 * Ler e escrever termos: read, write, display. * Ler e escrever caracteres: get, get0, put. * Formatar a saída legívelmente: nl, tab. * Ligar um canal de E/S com a tela ou com arquivos: tell, telling, told, see, seeing, seen. * Carregar arquivo fonte no ambiente do interpretador: consult, reconsult * ex.: ?- read(X), Z is X + 1, write(Z) X = 2, Z = 3; no ?

10 Prolog: meta-programação 1 assert(F)., assert((C :- P)).: * sempre verificado; * efeito colateral adiciona nova cláusula no fim do programa; * F, P e C devem ser instanciados com uma estrutura de funtor especificado; * não pode ser re-satisfeito por backtracking. * variante asserta coloca novo fato no início do programa. retract(F), retract((C :- P)).: * busca cláusula no programa se unificando com seu argumento; * se encontrar um: responde yes, efeito colateral apaga cláusula encontrada do programa; * caso contrário: falha sem efeito colateral; * em caso de backtracking: busca o próxima cláusula do programa se unificando com seu argumento.

11 Prolog: meta-programação 2 assert/retract permitem: * meta-programação * raciocínio não monótono * variáveis globais * memoização caching de sub-deduções compartilhadas mas ao preço de: * em geral perda da semântica declarativa em L1 * perda da encapsulação das variáveis como argumentos de predicados * sacrifício da legibilidade, facilidade de manutenção e re-utilização do código * re-introdução de algumas limitações da programação imperativa

12 Prolog: failure-driven loop * Loop gerada por backtracking forçado com fail e repeat. * repeat sempre verificado e re-verificado no backtracking (true sempre verificado mas falha no backtracking) consult(File) :- see(File), consult-loop, seen. consult-loop :- repeat, read(Clause), process(Clause), !. process(X) :- end_of_file(X), !. process(Clause) :- assert(Clause), fail.

13 Prolog: manipulação de conjuntos (bagof e setof) * Forçam backtracking e retornam todas as soluções de uma vez em uma lista * Semântica declarativa apenas em L2 * bagof(Termo,Objetivo,Resultado): busca todas as instanciações das variáveis comuns de Termo e Objetivo tal que Objetivo seja verificado unifica lista das instanciações de Termo assim obtidas com Resultado * setof estende bagof por: descartar soluções duplicadas ordenar as restantes alfanumericamente

14 Prolog: exemplos de manipulação de conjuntos p(e,j). p(b,i). p(c,i). p(a,i). p(d,j). q(1,a). q(2,d). q(2,c). q(2,b). q(3,d). q(3,e). r(1,j). r(1,i). ^ permite especificar indiferença para uma variável de Objetivo ?- bagof(X,p(X,Y),L). X = _3, Y = j, L = [e,d] ; X = _3, Y = i, L = [b,c,a] ?- bagof(q(N,X),p(X,i),L). N = _4, X = _12, L = [q(_87,b),q(_73,c),q(_59,a)] ?- q(N,X), p(X,i), R = q(N,X). N = 1, X = a, R = q(1,a) ; N = 2, X = c, R = q(2,c) ; N = 2, X = b, R = q(2,b) ; no ?- bagof(r(1,Y),X^p(X,Y),L). Y = _6, X = _17, L = [r(1,j),r(1,i),r(1,i),r(1,i),r(1,j)] ? - setof(r(1,Y),X^p(X,Y),L). Y = _6, X = _17, L = [r(1,i),r(1,j)] ?-


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

Apresentações semelhantes


Anúncios Google