140 likes | 380 Views
Prolog: Predicados Built-in 2. Jacques Robin, DI-UFPE www.di.ufpe.br/~jr. Prolog: aritmética. 3 tipos de operadores built-in aritméticos: calculadores (n-ários infixos): +, -, *, /, mod comparadores (binários infixos): =:=, ==, <, >, =<, >=
E N D
Prolog: Predicados Built-in 2 Jacques Robin, DI-UFPE www.di.ufpe.br/~jr
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ávelisExpressã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 Jacques Robin (DI-UFPE)
> ?- 1 + 1 < 1 + 2. yes > ?- 1 + 3 =:= 2 + 2. yes > ?- 1 + 3 = 2 + 2. 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 = 1 + 2. C = 1+2 > ?- C == 1 + 2. no > ?- C is 1 + 2. C = 3 > ?- C is D, D = 1 + 2. Error. > ?- D = 1 + 2, C is D. D=1+2 C=3 > ?- -1+2 = +(-(1),2). no > ?- -1+2 =:= +(-(1),2). yes Prolog: exemplos de aritmética 1 Jacques Robin (DI-UFPE)
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 Prolog: exemplos de aritmética 2 Jacques Robin (DI-UFPE)
Prolog: teste de tipos • semântica declarativa de var fora de L1 Jacques Robin (DI-UFPE)
?- 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 2 + 3. 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). Prolog: exemplos de teste de tipos Jacques Robin (DI-UFPE)
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 Prolog: conversão de tipos Jacques Robin (DI-UFPE)
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 Jacques Robin (DI-UFPE)
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). 2. 3 X = 2, Z = 3; no ? Jacques Robin (DI-UFPE)
assert(F)., assert((P :- C)).: 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((P :- C)).: 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. Prolog: meta-programação 1 Jacques Robin (DI-UFPE)
assert/retract permitem: meta-programação raciocínio não monótono variáveis globais memoização caching de sub-deduções compartilhadas masao 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 Prolog: meta-programação 2 Jacques Robin (DI-UFPE)
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. Jacques Robin (DI-UFPE)
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 Jacques Robin (DI-UFPE)
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)] ?- Prolog: exemplos de manipulação de conjuntos Jacques Robin (DI-UFPE)