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

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

Programação Declarativa 1 Procedimentos Pré-definidos em prolog comunicação Vários tipos de comunicação utilizador/programa:  Comunicação básica (questão,

Apresentações semelhantes


Apresentação em tema: "Programação Declarativa 1 Procedimentos Pré-definidos em prolog comunicação Vários tipos de comunicação utilizador/programa:  Comunicação básica (questão,"— Transcrição da apresentação:

1 Programação Declarativa 1 Procedimentos Pré-definidos em prolog comunicação Vários tipos de comunicação utilizador/programa:  Comunicação básica (questão, em seguida, resposta em termos instanciações de variáveis).  Comunicação (input) de dados sobre outras formas (quais?).  Comunicação (output) de dados em qualquer formato.  Comunicação (input e output) para ficheiro ou outro dispositivo que não seja o terminal. As implementações do PROLOG disponibilizam alguns procedimentos pré-definidos para tratar os diversos tipos comunicação.

2 Programação Declarativa 2 Comunicação  O programa pode utilizar vários ficheiros simultaneamente para leitura, designados por input streams ou para escrita, designados por output streams.  Durante a execução de um programa em PROLOG são abertos, inicialmente, um ficheiro de leitura, designado por current input stream e um ficheiro de escrita, designado por current output stream. terminal P  file_in 1 file_in 2 file_out 1 file_out 2 output streams input streams user_inuser_out

3 Programação Declarativa 3 Processamento de ficheiros de termos PROCEDIMENTO read O procedimento (de input ) read faz a leitura de termos a partir do current input stream. O objectivo read (X). faz a leitura de um termo T (a introduzir após validar o objectivo) e, seguidamente, X é substituído por T, se X é uma variável; senão read (X) falha sem retrocesso. Exemplo ?  read (X).?  read (atomo).?  read (X). |: termo.|: atomoX.|: Y. X = termo;noX = _G111 noyes Observação A introdução de um termo termina com um ponto.

4 Programação Declarativa 4 Procedimentos Pré-Definidos em PROLOG PROCEDIMENTO write O procedimento (de output ) write faz a escrita de termos no current output stream. O objectivo write (T). escreve o termo T na forma sintática utilizada para as instâncias das variáveis. Exemplo ?  write (termo).?  write (X).?  write ([a,b,c]). termo._G117[a,b,c] yesX = _G117;yes no Observação O procedimento write escreve um termo, no current output stream, independentemente da sua complexidade sintáctica.

5 Programação Declarativa 5 PROCEDIMENTO tab Exemplos ?  read(X),tab(10),write(X). |: [a,b,c]. [a,b,c] X = [a,b,c]; no ?- write(ola), tab(5), write(amigos). ola amigos Yes O procedimento (de output) tab faz a inserção de espaços em branco no current output stream. O objectivo tab(N) introduz N espaços em branco no current output stream.

6 Programação Declarativa 6 PROCEDIMENTO nl O procedimento nl faz deslocar a escrita de termos, no current output stream, para o início da próxima linha. Exemplo ?  write(ola),nl,write([a,b,c]). ola [a,b,c] yes

7 Programação Declarativa 7 Exemplo cube :- write('proximo numero: '), read(X), process(X). process(stop) :- !. process(N) :- C is N * N * N, write('o cubo de '),write(N),write(' e '), write(C),nl,cube. ?  cube. proximo numero: 5. o cubo de 5 e 125 proximo numero: 4. o cubo de 4 e 64 proximo numero: stop. yes

8 Programação Declarativa 8 Manipulação de caracteres  PROCEDIMENTO put O procedimento (de output) put escreve, no current output stream, um carácter codificado em ASCII. O objectivo put (C) escreve o carácter que corresponde ao código ASCII C.  PROCEDIMENTO get O procedimento get0 faz a leitura, a partir do current input stream, de um carácter codificado em ASCII. No objectivo get0 (C) C é instanciado com o código ASCII do carácter a ler. O procedimento get (C) não faz a leitura dos espaços em branco.

9 Programação Declarativa 9 (De)Composição de átomos name ( A, L ) é verdadeiro se L é a sequência (representada por uma lista) dos códigos ASCII que correspondem aos caracteres que formam o átomo A. Exemplo getsentence(Wordlist) :- get0(Char), getrest(Char,Wordlist). getrest(46,[]) :- !. getrest(32,Wordlist) :- !, getsentence(Wordlist). getrest(Letter,[Word|Wordlist]) :- getletters(Letter,Letters,Nextchar), name(Word,Letters),getrest(Nextchar,Wordlist). getletters(46,[],46) :- !. getletters(32,[],32) :- !. getletters(Let,[Let|Letters],Nextchar) :- get0(Char),getletters(Char,Letters,Nextchar). ?  getsentence(W). |: Mary was pleased to see the robot fail. ['Mary','was','pleased','to','see','the','robot','fail'] yes

10 Programação Declarativa 10 Leitura de programas Podemos comunicar os nossos programas ao PROLOG através dos predicados pré-definidos: consult e reconsult.  PROCEDIMENTO consult O efeito da execução do objectivo ?  consult (F) é disponibilizar todas as cláusulas no ficheiro F, na sessão actual do PROLOG, para serem utilizadas, posteriormente, na execução de objectivos introduzidos pelo utilizador. Se, na mesma sessão do PROLOG, outro ficheiro ( e.g. G ) é lido através da execução do objectivo ?  consult (G), então é adicionado, ao fim do ficheiro actual, as cláusulas do (novo) ficheiro G.  PROCEDIMENTO reconsult O efeito da execução do objectivo ?  reconsult (F) é análogo à execução do objectivo ?  consult (F), excepto que, todas as cláusulas do ficheiro F, que foram previamente definidas, são redefinidas pelas cláusulas na nova versão de F.

11 Programação Declarativa 11 Verificar o tipo dos termos integer (X) é verdadeiro se X é um inteiro. var (X) é verdadeiro se X é uma variável não instanciada. nonvar (X) é verdadeiro se X é um termo, que não seja uma variável, ou X é uma variável instanciada. atom (X) é verdadeiro se X é um átomo. real (X) é verdadeiro se X é um real. atomic (X) é verdadeiro se X é um inteiro ou um átomo. Exemplo % count(A,L,N) onde N é o número de ocorrências do átomo A na lista L. count(_,[],0). count(A,[B|L],N) :- atom(B),A = B,!, count(A,L,N1), N is N1 + 1 ; count(A,L,N).

12 Programação Declarativa 12 PROCEDIMENTO =.. T =.. L é verdadeiro se L é uma lista que contém o functor principal do termo T seguido dos seus argumentos. Exemplo enlarge(Fig,F,Fig1) :- Fig =.. [Type|Parameters], multiplylist(Parameters,F,Parameters1), Fig1 =.. [Type|Parameters1]. multiplylist([],_,[]). multiplylist([X|L],F,[X1|L1]) :- X1 is F * X,multiplylist(L,F,L1). ?- multiplylist([1,2,3],3,L). L = [3, 6, 9] Yes

13 Programação Declarativa 13 PROCEDIMENTO functor functor (Term,F,N) é verdadeiro se F é o functor principal de Term e N a aridade de F. PROCEDIMENTO arg arg (N,Term,A) é verdadeiro se A é o N-ésimo argumento do termo Term (assumindo que os argumentos são numerados da esquerda para a direita).

14 Programação Declarativa 14 Controlo de execução - o Corte !  O corte, denotado por !, elimina o retrocesso. fail é um objectivo que falha sempre. true é um objectivo que é sempre bem sucedido not (P) é tipo de negação que se comporta exactamente como se tivesse definido da seguinte forma: not(P) :- P,!,fail;true. call (P) invoca P. call (P) é bem sucedido se P é bem sucedido. repeat é um objectivo (não determinista) que é sempre bem sucedido. Exemplo dosquares :-repeat, read(X), (X = stop,! ; Y is X*X,write(Y),fail).

15 Programação Declarativa 15 Controlo de execução - o Corte ! Adição de elementos sem duplicação adic(X,L,L1). Se x é membro de L então L=L1 senão L1 é L com a inserção de X na cabeça. adic(X,L,L):- membro(X,L),!,Adic(X,L,L1). Exemplos ?- adic(a,[b,c],L).

16 Programação Declarativa 16 Controlo de execução - If-then-else ifThenElse(X,Y,Z). Pode ser simulado em Prolog por ifThenElse(X,Y,Z):- X,!,Y. ifThenElse(X,Y,Z)_- Z. Exemplo ?- ifThenElse(X,Y is Z+1,Y is 0).


Carregar ppt "Programação Declarativa 1 Procedimentos Pré-definidos em prolog comunicação Vários tipos de comunicação utilizador/programa:  Comunicação básica (questão,"

Apresentações semelhantes


Anúncios Google