Sintaxe e Semântica de Programas Prolog
|
|
|
- Paulo de Carvalho Caires
- 9 Há anos
- Visualizações:
Transcrição
1 Inteligência Artificial Sintaxe e Semântica de Programas Prolog José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP Nesta aula será vista a sintaxe e semântica de conceitos básicos em Prolog e introduz objetos de dados estruturados Os tópicos abordados são: Objetos simples (átomos, números, variáveis) Objetos estruturados Unificação como operação fundamental em objetos Operadores Significado declarativo e procedural [email protected] URL: Objetos em Prolog Átomos Constantes (Atômicos) Objetos Simples Números Objetos (Termos) Variáveis Estruturas 2 Átomos Números São cadeias compostas pelos seguintes caracteres: letras maiúsculas: A, B,..., Z letras minúsculas: a, b,..., z dígitos: 0, 1,..., 9 caracteres especiais: + - * / < > = :. & _ ~ Podem ser construídos de três maneiras: cadeias de letras, dígitos e o caractere _, começando com uma letra minúscula: anna, nil, x25, x_25, x_25ab, x_, x y, tem_filhos, tem_um_filho cadeias de caracteres especiais: <--->, =====>,...,.:., ::= cadeias de caracteres entre apóstrofos: Abraão, América_do_Sul, América_Latina Números usados em Prolog incluem números inteiros e números reais Operadores Aritméticos adição + subtração - multiplicação * divisão / divisão inteira // resto divisão inteira mod potência ** atribuição is X > Y X < Y X >= Y X =< Y X =:= Y X = Y X =\= Y Operadores Relacionais X é maior do que Y X é mer do que Y X é maior ou igual a Y X é mer ou igual a Y X é igual a Y X unifica com Y X é diferente de Y 3 4 Números O operador = tenta unificar apenas?- X = X = O operador is força a avaliação aritmética?- X is X = 3 Se a variável à esquerda do operador is já estiver instanciada, Prolog apenas compara o valor da variável com o resultado da expressão à direita de is?- X = 3, X is X = 3?- X = 5, X is Variáveis São cadeias de letras, dígitos e caracteres _, sempre começando com letra maiúscula ou com o caractere _ X, Resultado, Objeto3, Lista_Alus, ListaCompras, _x25, _32 O escopo de uma variável é dentro de uma mesma regra ou dentro de uma pergunta Isto significa que se a variável X ocorre em duas regras/perguntas, então são duas variáveis distintas Mas a ocorrência de X dentro de uma mesma regra/pergunta significa a mesma variável 5 6
2 Variáveis Variável Anônima Uma variável pode estar: Instanciada: quando a variável já referencia (está unificada a) algum objeto Livre ou não-instanciada: quando a variável não referencia (não está unificada a) um objeto, ou seja, quando o objeto a que ela referencia ainda não é conhecido Uma vez instanciada, somente Prolog pode torná-la não-instanciada através de seu mecanismo de inferência (nunca o programador) Quando uma variável aparece em uma única cláusula, não é necessário utilizar um me para ela Utiliza-se a variável anônima, que é escrita com um simples caracter _. Por exemplo temfilho(x) :- progenitor(x,y). Para definir temfilho, não é necessário o me do filho(a) Assim, é o lugar ideal para a variável anônima: temfilho(x) :- progenitor(x,_). 7 8 Variável Anônima Estruturas Cada vez que um underscore _ aparece em uma cláusula, ele representa uma va variável anônima Por exemplo alguém_tem_filho :- progenitor(_,_). equivale à: alguém_tem_filho :- progenitor(x,y). que é bem diferente de: alguém_tem_filho :- progenitor(x,x). Quando utilizada em uma pergunta, seu valor não é mostrado. Por exemplo, se queremos saber quem tem filhos mas sem mostrar os mes dos filhos, podemos perguntar:?- progenitor(x,_). Objetos estruturados (ou simplesmente estruturas) são objetos de dados que têm vários componentes Cada componente, por sua vez, pode ser uma estrutura Por exemplo, uma data pode ser vista como uma estrutura com três componentes: dia, mês, a Mesmo possuindo vários componentes, estruturas são tratadas como simples objetos 9 10 Estruturas Estruturas De forma a combinar componentes em um simples objeto, deve-se escolher um functor Um functor para o exemplo da data seria data Então a data de 4 de maio de 2003 pode ser escrita como: data(4,maio,2003) 11 Qualquer dia em maio pode ser representado pela estrutura: data(dia,maio,2003) Note que Dia é uma variável que pode ser instanciada a qualquer objeto em qualquer momento durante a execução Sintaticamente, todos objetos de dados em Prolog são termos Por exemplo, são termos: maio data(4,maio,2003) 12
3 Estruturas Todos os objetos estruturados podem ser representados como árvores A raiz da árvore é o functor e os filhos da raiz são os componentes Para a estrutura data(4,maio,2003): Estruturas Por exemplo, o triângulo pode ser representado como triângulo(ponto(2,4),ponto(3,6),ponto(4,2)) (3,6) triângulo data (2,4) ponto ponto ponto (4,2) 4 maio Estruturas Predicados para Verificação dos Tipos de Termos P1=ponto 1 1 P2=ponto 2 3 S=seg ponto ponto triângulo ponto ponto ponto Predicado var(x) É verdadeiro se: X é uma variável não instanciada (6,4) 7 1 nvar(x) atom(x) integer(x) X não é uma variável ou X é uma variável instanciada X é um átomo X é um inteiro P2=(2,3) float(x) X é um número real S P1=(1,1) (4,2) T (7,1) atomic(x) compound(x) X é uma constante (átomo ou número) X é uma estrutura Predicados para Verificação dos Tipos de Termos?- var(z), Z = 2. Z = 2?- Z = 2, var(z).?- integer(z), Z = 2.?- Z = 2, integer(z), nvar(z). Z = 2?- atom(3.14).?- atomic(3.14).?- atom(==>).?- atom(p(1)).?- compound(2+x). Unificação de Termos Dois termos unificam (matching) se: Eles são idênticos ou As variáveis em ambos os termos podem ser instanciadas a objetos de maneira que após a substituição das variáveis por esses objetos os termos se tornam idênticos Por exemplo, há unificação entre os termos data(d,m,2003) e data(d1,maio,a) instanciando D = D1, M = maio, A =
4 Unificação de Termos Unificação de Termos?- data(d,m,2003) = data(d1,maio,a), data(d,m,2003) = data(15,maio,a1). D = 15 M = maio D1 = 15 A = 2003 A1 = 2003?- triângulo = triângulo, ponto(1,1) = X, A = ponto(4,y), ponto(2,3) = ponto(2,z). X = ponto(1,1) A = ponto(4,_g652) Y = _G652 Z = 3 Por outro lado, não há unificação entre os termos data(d,m,2003) e data(d1,m1,1948) data(x,y,z) e ponto(x,y,z) A unificação é um processo que toma dois termos e verifica se eles unificam Se os termos não unificam, o processo falha (e as variáveis não se tornam instanciadas) Se os termos unificam, o processo tem sucesso e também instancia as variáveis em ambos os termos para os valores que os tornam idênticos Unificação de Termos Comparação de Termos As regras que regem se dois termos S e T unificam são: se S e T são constantes, então S e T unificam somente se são o mesmo objeto se S for uma variável e T for qualquer termo, então unificam e S é instanciado para T se S e T são estruturas, elas unificam somente se S e T têm o mesmo functor principal e todos seus componentes correspondentes unificam X = Y X \= Y X == Y X \== Y Y Y Y Y X não unifica com Y que é o complemento de X=Y X precede Y Y precede X Operadores Relacionais X unifica com Y que é verdadeiro quando dois termos são o mesmo. Entretanto, se um dos termos é uma variável, o operador = causa a instanciação da variável porque o operador causa unificação X é literalmente igual a Y (igualdade literal), que é verdadeiro se os termos X e Y são idênticos, ou seja, eles têm a mesma estrutura e todos os componentes correspondentes são os mesmos, incluindo o me das variáveis X não é literalmente igual a Y que é o complemento de X==Y X precede ou é igual a Y Y precede ou é igual a X Comparação de Termos Precedência de Termos?- f(a,b) == f(a,b).?- f(a,b) == f(a,x).?- f(a,x) == f(a,y).?- X == X.?- X == Y.?- X \== Y.?- X \= Y.?- g(x,f(a,y)) == g(x,f(a,y)). A precedência entre termos simples é determinado para ordem alfabética ou numérica Variável estruturas Uma estrutura precede outra se o functor da primeira tem mer aridade que o da segunda Se duas estruturas têm mesma aridade, a primeira precede a segunda se seu functor é mer que o da outra Se duas estruturas têm mesma aridade e functores iguais, então a precedência é definida (da esquerda para a direita) pelos functores dos seus componentes 25 26
5 Precedência de Termos Unificação de Termos?- 10.?- isaque.?- f(x,y).?- sara.?- f(x,y).?- sara.?- f(x,y).?- f(a,a).?- 13.?- 20.?- g(x,f(b,y)). Unificação em Prolog é diferente da unificação em Lógica A unificação Lógica requer a verificação de ocorrência de uma variável em um termo (occurs check), que, por razões de eficiência, não é implementado em Prolog Mas de um ponto de vista prático, a aproximação de Prolog é bem adequada Exemplo:?- X = f(x). X = f(f(f(f(f(f(f(f(f(f(...)))))))))) Um macaco encontra-se próximo à porta de uma sala. No meio da sala há uma banana pendurada teto. O macaco tem fome e quer comer a banana mas ela está a uma altura fora de seu alcance. Perto da janela da sala encontra-se uma caixa que o macaco pode utilizar para alcançar a banana. O macaco pode realizar as seguintes ações: caminhar chão da sala; subir na caixa (se estiver ao lado da caixa); empurrar a caixa pelo chão da sala (se estiver ao lado da caixa); pegar a banana (se estiver parado sobre a caixa diretamente embaixo da banana) É conveniente combinar essas 4 peças de informação em uma estrutura, cujo functor será estado Observe que o estado inicial é determinado pela posição dos objetos: estado na_porta _piso na_janela não_tem O estado final é qualquer estado onde o último componente da estrutura é o átomo tem estado(_,_,_,tem) Possíveis valores para os argumentos da estrutura estado 1º argumento (posição horizontal do macaco): na_porta, _centro, na_janela 2º argumento (posição vertical do macaco): _chão, acima_caixa 3º argumento (posição da caixa): na_porta, _centro, na_janela 4º argumento (macaco tem ou não tem banana): tem, não_tem 31 32
6 Quais os movimentos permitidos que alteram o mundo de um estado para outro? Pegar a banana Subir na caixa Empurrar a caixa Caminhar chão da sala Nem todos os movimentos são possíveis em cada estado do mundo pegar a banana somente é possível se o macaco está acima da caixa diretamente abaixo da banana e o macaco ainda não tem a banana Vamos formalizar em Prolog usando a relação move move(estado1,movimento,estado2) onde Estado1 é o estado antes do movimento, Movimento é o movimento executado e Estado2 é o estado após o movimento O movimento pegar a banana com sua pré-condição estado antes do movimento pode ser definido por: move(estado(_centro,acima_caixa,_centro,não_tem), pegar_banana, estado(_centro,acima_caixa,_centro,tem) ). Este fato diz que após o movimento o macaco tem a banana e ele permanece acima da caixa meio da sala Vamos expressar o fato que o macaco chão pode caminhar de qualquer posição horizontal Pos1 para qualquer posição Pos2 move(estado(pos1,_chão,caixa,banana), caminhar(pos1,pos2), estado(pos2,_chão,caixa,banana) ). De maneira similar, os movimentos empurrar e subir podem ser especificados A pergunta principal que sso programa deve responder é: O macaco consegue, a partir de um estado inicial Estado, pegar a banana? Isto pode ser formulado usando o predicado consegue/1 que pode ser formulado baseado em duas observações: Para qualquer estado qual o macaco já tem a banana, o predicado consegue/1 certamente deve ser verdadeiro; nenhum movimento é necessário consegue(estado(_,_,_,tem)). Nos demais casos, um ou mais movimentos são necessários; o macaco pode obter a banana em qualquer estado Estado1 se há algum movimento de Estado1 para algum estado Estado2 tal que o macaco consegue pegar a banana Estado2 (em zero ou mais movimentos) consegue(estado1) :- move(estado1,movimento,estado2), consegue(estado2). move(estado(_centro,acima_caixa,_centro,não_tem), % antes de mover pegar_banana, % pega banana estado(_centro,acima_caixa,_centro,tem) ). % depois de mover move(estado(p,_chão,p,banana), subir, % subir na caixa estado(p,acima_caixa,p,banana) ). move(estado(p1,_chão,p1,banana), empurrar(p1,p2), % empurrar caixa de P1 para P2 estado(p2,_chão,p2,banana) ). move(estado(p1,_chão,caixa,banana), caminhar(p1,p2), % caminhar de P1 para P2 estado(p2,_chão,caixa,banana) ). consegue(estado(_,_,_,tem)). consegue(estado1) :- move(estado1,movimento,estado2), consegue(estado2). % macaco já tem banana % movimentar e tentar conseguir % a banana Listas?- consegue(estado(na_porta,_chão,na_janela,não_tem)). estado(na_porta,_chão,na_janela,não_tem) estado(p2,_chão,na_janela,não_tem) subir backtrack estado(na_janela,acima_caixa,na_janela,não_tem) Nenhum movimento possível caminhar(na_porta,p2) empurrar(p2,p2 ) P2=na_janela estado(p2,_chão,p2,não_tem) subir estado(p2,acima_caixa,p2,não_tem) pegar_barana P2 =_centro estado(_centro,acima_caixa,_centro,tem) Lista é uma das estruturas mais simples em Prolog, muito comum em programação não numérica Ela é uma seqüência ordenada de elementos Uma lista pode ter qualquer comprimento Por exemplo uma lista de elementos tais como ana, tênis, pedro pode ser escrita em Prolog como: [ana, tênis, pedro] 37 38
7 Listas Listas O uso de colchetes é apenas uma melhoria da tação, pois internamente listas são representadas como árvores, assim como todos objetos estruturados em Prolog Para entender a representação Prolog de listas, é necessário considerar dois casos A lista é vazia, escrita como [ ] em Prolog Uma lista (não vazia) consiste: primeiro item, chamado cabeça (head) da lista na parte restante da lista, chamada cauda (tail) No exemplo [ana, tênis, pedro] ana é a Cabeça da lista [tênis, pedro] é a Cauda da lista A cabeça de uma lista pode ser qualquer objeto (inclusive uma lista); a cauda tem que ser uma lista A Cabeça e a Cauda são então combinadas em uma estrutura pelo functor especial..(cabeça, Cauda) Como a Cauda é uma lista, ela é vazia ou ela tem sua própria cabeça e sua cauda Listas Assim, para representar listas de qualquer comprimento, nenhum princípio adicional é necessário O exemplo [ana, tênis, pedro] é. representando como o termo:.(ana,.(tênis,.(pedro, []) ) ) ana. O programador pode escolher ambas tações tênis. pedro [ ] Listas?- Lista1 = [a,b,c], Lista2 =.(a,.(b,.(c,[]))). Lista1 = [a, b, c] Lista2 = [a, b, c]?- Hobbies1 =.(tênis,.(música,[])), Hobbies2 = [esqui, comida], L = [ana,hobbies1,pedro,hobbies2]. Hobbies1 = [tênis,música] Hobbies2 = [esqui,comida] L = [ana, [tênis,música], pedro, [esqui,comida]] Listas Unificação em Listas Em geral, é comum tratar a cauda como um objeto simples Por exemplo, L = [a,b,c] pode ser escrito como Cauda = [b,c] L =.(a,cauda) Para expressar isso, Prolog fornece uma tação alternativa, a barra vertical, que separa a cabeça da cauda L = [a Cauda] A tação é geral por permitir qualquer número de elementos seja seguido por e o restante da lista: [a,b,c] = [a [b,c]] = [a,b [c]] = [a,b,c [ ]] Lista1 [mesa] [a,b,c,d] [[ana,y] Z] [a,bissexto] [a,bissexto] Lista2 [X Y] [X,Y Z] [[X,foi],[ao,cinema]] [X,Y Z] [X,Y,Z] Lista1 = Lista2 X=mesa Y=[ ] X=a Y=b Z=[c,d] X=ana Y=foi Z=[[ao,cinema]] X=a Y=bissexto Z=[ ] Não unifica 43 44
8 Operações em Listas Freqüentemente, é necessário realizar operações em listas, por exemplo, buscar um elemento que faz parte de uma lista Para isso, a recursão é o recurso mais amplamente empregado Para verificar se um me está na lista, é preciso verificar se ele está na cabeça ou se ele está na cauda da lista Se o final da lista for atingido, o me não está na lista Predicado de Pertinência Inicialmente, é necessário definir o me do predicado que verifica se um elemento X pertence ou não a uma lista Y, por exemplo, pertence(x,y) A primeira condição especifica que um elemento X pertence à lista se ele está na cabeça dela. Isto é indicado como: pertence(x,[x Z]). A segunda condição especifica que um elemento X pertence à lista se ele pertencer à sua cauda. Isto pode ser indicado como: pertence(x,[w Z]) :- pertence(x,z) Predicado de Pertinência Sempre que um programa recursivo é definido, deve-se procurar pelas condições limites (ou condições de parada) e pelo caso(s) recursivo(s): pertence(elemento,[elemento Cauda]). pertence(elemento,[cabeca Cauda]) :- pertence(elemento,cauda). Após a definição do programa, é possível interrogá-lo. Por exemplo,?- pertence(a,[a,b,c]). Predicado de Pertinência?- pertence(d,[a,b,c]).?- pertence(x,[a,b,c]). X = a ; X = b ; X = c ; Entretanto, se as perguntas forem:?- pertence(a,x).?- pertence(x,y). deve-se observar que cada uma delas tem infinitas respostas, pois existem infinitas listas que validam essas perguntas para o programa pertence/ Modo de Chamada de Predicados Para documentar como um predicado deve ser chamado, utiliza-se a tação (como comentário programa): + o argumento é de entrada (deve estar instanciado) o argumento é de saída (não deve estar instanciado)? o argumento é de entrada e saída (pode ou não estar instanciado) O predicado pertence/2 documentado com o modo de chamada é: % pertence(?elemento, +Lista) pertence(e, [E _]). pertence(e, [_ Cauda]) :- pertence(e,cauda). Exercícios Definir predicado último que encontra o último elemento de uma lista O último elemento de uma lista que tenha somente um elemento é o próprio elemento O último elemento de uma lista que tenha mais de um elemento é o ultimo elemento da cauda Concatenar duas listas, formando uma terceira Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X L1]; concatenar [X L1] com uma segunda lista L2 resulta na lista [X L3], onde L3 é a concatenação de L1 e L2 Defina uma va versão do predicado último utilizando a concatenação de listas 49 50
9 Último Elemento de uma Lista O último elemento de uma lista que tenha somente um elemento é o próprio elemento ultimo(elemento, [Elemento]). O último elemento de uma lista que tenha mais de um elemento é o ultimo elemento da cauda ultimo(elemento, [Cabeca Cauda]) :- ultimo(elemento,cauda). Programa completo: % ultimo(?elemento, +Lista) ultimo(elemento, [Elemento]). ultimo(elemento, [Cabeca Cauda]) :- ultimo(elemento,cauda). Concatenar Listas Se o primeiro argumento é a lista vazia, então o segundo e terceiro argumentos devem ser o mesmo concatenar([ ],L,L). Se o primeiro argumento é a lista não-vazia, então ela tem uma cabeça e uma cauda da forma [X L1]; concatenar [X L1] com uma segunda lista L2 resulta na lista [X L3], onde L3 é a concatenação de L1 e L2 concatenar([x L1],L2,[X L3]) :- [X L1] concatenar(l1,l2,l3). Programa completo: X L1 L2 % concatenar(?/+l1,?/?l2,+/?l) concatenar([ ],L,L). L3 concatenar([x L1],L2,[X L3]) :- concatenar(l1,l2,l3). X L3 [X L3] Operadores move(estado(_centro,acima_caixa,_centro,não_tem), % antes de mover pegar_banana, % pega banana estado(_centro,acima_caixa,_centro,tem) ). % depois de mover move(estado(p,_chão,p,banana), subir, % subir na caixa estado(p,acima_caixa,p,banana) ). move(estado(p1,_chão,p1,banana), empurrar(p1,p2), % empurrar caixa de P1 para P2 estado(p2,_chão,p2,banana) ). move(estado(p1,_chão,caixa,banana), caminhar(p1,p2), % caminhar de P1 para P2 estado(p2,_chão,caixa,banana) ). consegue(estado(_,_,_,tem),[]). % macaco já tem banana consegue(estado1,[movimento Resto]) :- % movimentar e tentar conseguir move(estado1,movimento,estado2), % a banana consegue(estado2,resto).?- consegue(estado(na_porta,_chão,na_janela,não_tem),x). X = [caminhar(na_porta,na_janela), empurrar(na_janela, _centro), subir, pegar_banana] Em várias situações é conveniente escrever functores como operadores Esta é uma forma sintática que facilita a leitura de estruturas Por exemplo, numa expressão aritmética como 2*a+b*c + e * são operadores 2, a, b são argumentos Esta expressão aritmética na sintaxe rmal de estruturas (termos) é: +( *(2,a), *(b,c) ) Entretanto, é importante lembrar que os operadores não realizam nenhuma aritmética: o 3+4 não é a mesma coisa que 7 O termo 3+4 é representado como +(3,4), que é uma estrutura Assim, escrever 3+4 é equivalente a escrever +(3,4) Operadores De forma que Prolog entenda apropriadamente expressões tais como a+b*c, Prolog deve conhecer que * tem precedência sobre + Assim, a precedência de operadores decide qual é a correta interpretação de expressões Prolog permite a declaração de vos operadores, por exemplo, podemos definir os átomos tem e suporta como operadores e escrever programa fatos tais como: pedro tem informação. chão suporta mesa. Estes fatos são equivalentes à: tem(pedro,informação). suporta(chão,mesa). Operadores A definição de um operador deve aparecer através de uma diretiva antes da expressão contendo o operador No exemplo anterior, o operador tem pode ser definido através da diretiva :- op(600,xfx,tem). Isso informa Prolog que desejamos usar tem como operador, cuja precedência é 600 e seu tipo é xfx, que é um tipo de operador infixo A forma xfx sugere que o operador, detado pela letra f está entre dois argumentos, detados por x Novamente, a definição de operadores não especifica nenhuma operação ou ação e são usados apenas para combinar objetos em estruturas 55 56
10 Operadores Os mes dos operadores devem ser átomos A precedência varia em algum intervalo, dependendo da implementação Prolog (1-1200) Há 3 grupos tipos de operadores, indicados pelos especificadores tal como xfx: (1) Operadores infixos de três tipos: xfx, xfy, yfx (2) Operadores pré-fixos de dois tipos: fx, fy (3) Operadores pós-fixos de dois tipos: xf, yf Operadores Os especificadores são escolhidos para refletir a estrutura da expressão, onde: f representa o operador x representa um argumento cuja precedência é estritamente mer que a do operador y representa um argumento cuja precedência é mer ou igual à do operador A precedência de um argumento colocado entre parênteses ou de um objeto não estruturado é zero Se um argumento é uma estrutura, então sua precedência é igual à precedência de seu functor principal Operadores Operadores Por exemplo a-b-c é entendido como (a-b)-c e não como a-(b-c) Assumindo que tenha precedência 500 O operador tem que ser definido como yfx a c b precedência 500 prec. 0 a prec. 0 b c precedência 500 Interpretação inválida porque a precedência de b-c não é mer do que a precedência de - Exemplo de alguns operadores pré-definidos :-op(1200,xfx,[-->,:-]). :-op(1200,fx,[:-,?-]). :-op(1100,xfy,[ ;, ]). :-op(1050,xfy,->). :-op(1000,xfy,, ). :-op(954,xfy,\). :-op(900,fy,[ \+,t]). :-op(700,xfx,[is,<,=,=..,=@=,=:=,=<,==,=\=, :-op(600,xfy,:). :-op(500,yfx,[+,-]). :-op(500,fx,[+,-]). :-op(400,yfx,[*,/,//,mod]). :-op(200,xfx,**). :-op(200,xfy,^) Exemplo Assumindo as diretrizes :-op(800,xfx,<===>). :-op(700,xfy,ou). :-op(600,xfy,e). :-op(500,fy,~). Como é interpretada a expressão ~(a e b) <===> ~a ou ~b Exemplo ~(a e b) <===> ~a ou ~b é interpretado como <===>(~(e(a, b)), ou(~(a), ~(b)) <===> ~ ou e ~ ~ a b a b 61 62
11 Predicados para (De)composição Termos atom_chars(a,l): converte um átomo A em uma lista L composta pelos caracteres (e vice-versa)?- atom_chars(laranja,x). X = [l,a,r,a,n,j,a]?- atom_chars(z,[m,a,c,a,c,o]). Z = macaco number_chars(a,l): Similar ao predicado atom_chars, mas para números?- number_chars(123.5,x). X = ['1', '2', '3', '.', '5']?- number_chars(x,['1', '2', '3']). Z = 123 Algumas implementações Prolog fornecem o predicado name(a,l) que tem a mesma funcionalidade que atom_chars(a,l) e number_chars(a,l) combinados Predicados para (De)composição Termos Termo =.. L: é verdadeiro se L é uma lista contendo o functor principal de Termo, seguido pelos seus argumentos =.. é lido como univ functor(termo,f,n): é verdadeiro se Termo é uma estrutura com functor F e aridade N arg(n,termo,a): é verdadeiro se o N- ésimo argumento do Termo é A Predicados para (De)composição Termos?- f(a,b) =.. L. L = [f,a,b]?- T =.. [retângulo,3,5]. T = retângulo(3,5)?- Z =.. [p,x,f(x,y)]. Z = p(x,f(x,y))?- (a+b) =.. [F,X,Y]. F = +, X = a, Y = b?- [a,b,c,d] =.. L. L = [.,a,[b,c,d]]?- [a,b,c,d] =.. [X Y]. X =., Y = [a,[b,c,d]]?- X =.. [a,b,c,d]. X = a(b,c,d)?- X =.. [concatenar,[a,b],[c],[a,b,c]]. X = concatenar([a,b],[c],[a,b,c]) Predicados para (De)composição Termos?- functor(t(f(x),x,t),f,aridade). F = t, Aridade = 3?- functor(a+b,f,n). F = +, N = 2?- functor(f(a,b,g(z)),f,n). Z = _G309, F = f, N = 3?- functor([a,b,c],f,n). F =., N = 2?- functor(laranja,f,n). F = laranja, N = 0?- functor([a,b,c],.,3).?- functor([a,b,c],a,z) Predicados para (De)composição Termos?- arg(1,t(f(x),y,t),arg). Arg = f(x)?- arg(2,t(f(x),y,t),arg). Arg = y?- arg(1,a+(b+c),arg). Arg = a?- arg(2,[a,b,c],x). X = [b,c]?- arg(1,a+(b+c),b).?- functor(d,data,3), arg(1,d,29), arg(2,d,janeiro), arg(3,d,2004). D = data(29,janeiro,2004) Predicados para (De)composição Termos Termos construídos com o predicado =.., podem ser usados como metas A vantagem é que o programa pode modificar-se a si próprio durante a execução, gerando e executando metas de formas que não foram necessariamente previstas quando o programa foi escrito O seguinte fragmento ilustra essa idéia obter(functor), calcular(listaargumentos), Meta =.. [Functor ListaArgumentos], Meta. obter/1 e calcular/1 são predicados definidos pelo usuário para obter os componentes da meta a ser construída; a meta é então construída por =.. e disparada sua execução simplesmente através de seu me, Meta 67 68
12 Predicados para (De)composição Termos Algumas implementações Prolog exigem que todas as metas sejam átomos ou estruturas com um átomo como functor principal Assim, uma variável, mesmo que instanciada, não é sintaticamente aceita como uma meta O problema é solucionado através do predicado call/1, assim o fragmento anterior torna-se: obter(functor), calcular(listaargumentos), Meta =.. [Functor ListaArgumentos], call(meta). Semântica de Programas Prolog Considere a cláusula onde P, Q e R são termos: P :- Q, R. Significado Declarativo: P é verdadeiro se Q e R são verdadeiros P segue (conseqüência) de Q e R De (a partir de) Q e R segue P Significado Procedural: Para resolver o problema P, resolva primeiro sub-problema Q e então o sub-problema R Para satisfazer P, primeiro satisfaça Q e então R A diferença entre os significados declarativo e procedural é que o último não apenas define as relações lógicas entre a cabeça da cláusula e as condições corpo, mas também a ordem na qual as condições são executadas Semântica de Programas Prolog O significado declarativo determina quando uma dada condição é verdadeira e, se for, para quais valores das variáveis ela é verdadeira O significado procedural determina como Prolog responde perguntas Significado Declarativo Em geral, uma meta em Prolog é uma lista de condições separadas por vírgulas que é verdadeira se todas as condições na lista são verdadeiras para uma determinada instanciação de variáveis A vírgula deta conjunção (e): todas as condições devem ser verdadeiras: X, Y neste exemplo X e Y devem ser ambos verdadeiros para X,Y ser verdadeiro O ponto-e-vírgula deta disjunção (ou): qualquer uma das condições em uma disjunção tem que ser verdadeira X;Y neste exemplo basta que X (ou Y) seja verdadeiro para X;Y ser verdadeiro O operador \+ deta a negação (não): é verdadeiro se o que está sendo negado não puder ser provado por Prolog \+X é verdadeiro se X falha Na sintaxe de Edinburgh o operador \+ é detado por t O predicado true/0 sempre é verdadeiro O predicado fail/0 sempre falha Significado Declarativo A cláusula P :- Q ; R. é lida como: P é verdade se Q é verdade ou R é verdade. É equivalente às duas cláusulas: P :- Q. P :- R. A conjunção (,) tem precedência sobre a disjunção (;), assim a cláusula: P :- Q, R; S, T, U. é interpretada como: P :- (Q, R) ; (S, T, U). e tem o mesmo significado que: P :- Q, R. P :- S, T, U. Significado Procedural peque(gato). % Cláusula
13 Significado Procedural Significado Procedural peque(gato). % Cláusula 3 (Passo 1) Pergunta inicial: escuro(x), grande(x). peque(gato). % Cláusula 3 (Passo 2) Procure de cima para baixo por uma cláusula cuja cabeça unifique com a primeira condição da pergunta escuro(x) Significado Procedural Significado Procedural peque(gato). % Cláusula 3 (Passo 2) Procure de cima para baixo por uma cláusula cuja cabeça unifique com a primeira condição da pergunta escuro(x). Cláusula 7 encontrada escuro(z) :- Troque a primeira condição pelo corpo instanciado da cláusula 7, obtendo a va lista de condições: preto(x), grande(x). peque(gato). % Cláusula 3 (Passo 3) Nova meta: preto(x), grande(x). Procure por uma cláusula que unifique com preto(x) Cláusula 5 encontrada preto(gato) Esta cláusula não tem corpo, assim a lista de condições depois de instanciada tornase: grande(gato). uma vez que já se provou preto(gato) X instancia com gato Significado Procedural Significado Procedural peque(gato). % Cláusula 3 (Passo 4) Nova meta: grande(gato). Procure por uma cláusula que unifique com grande(gato). Nenhuma cláusula é encontrada. Volte (backtrack) para o Passo 3, desfazendo a instanciação X=gato Novamente a meta é preto(x), grande(x). peque(gato). % Cláusula 3 (Passo 4) meta: preto(x), grande(x). Continue procurando após a Cláusula 5. Nenhuma cláusula é encontrada. Volte (backtrack) ao Passo 2 e continue procurando após a cláusula 7. Cláusula 8 encontrada: escuro(z) :- Troque a primeira condição pelo corpo instanciado da cláusula 8, obtendo a va lista de condições: marrom(x), grande(x)
14 Significado Procedural Significado Procedural peque(gato). % Cláusula 3 (Passo 5) meta: marrom(x), grande(x). Procure por uma cláusula que unifique com marrom(x) Cláusula 4 encontrada marrom(urso) Esta cláusula não tem corpo, assim a lista de condições depois de instanciada torna-se: grande(urso). uma vez que já se provou marrom(urso) X instancia com urso peque(gato). % Cláusula 3 (Passo 6) meta: grande(urso). Procure por uma cláusula que unifique com grande(urso) Cláusula 1 encontrada grande(urso) Esta cláusula não tem corpo, assim a lista de condições torna-se vazia. Isto indica um térmi com sucesso e a instanciação correspondente é X = urso Ordem das Cláusulas Macaco & Banana (Original) No exemplo do Macaco & Banana, as cláusulas sobre a relação move foram ordenadas como: pegar a banana, subir na caixa, empurrar a caixa e caminhar Estas cláusulas dizem que pegar é possível, subir é possível, etc De acordo com o significado procedural de Prolog, a ordem das cláusulas indica que o macaco prefere pegar a subir, subir a empurrar, etc. Esta ordem, na realidade, ajuda o macaco a resolver o problema Todavia, o que aconteceria se a ordem fosse diferente? Por exemplo, vamos assumir que a cláusula sobre caminhar apareça em primeiro lugar move(estado(_centro,acima_caixa,_centro,não_tem), % antes de mover pegar_banana, % pega banana estado(_centro,acima_caixa,_centro,tem) ). % depois de mover move(estado(p,_chão,p,banana), subir, % subir na caixa estado(p,acima_caixa,p,banana) ). move(estado(p1,_chão,p1,banana), empurrar(p1,p2), % empurrar caixa de P1 para P2 estado(p2,_chão,p2,banana) ). move(estado(p1,_chão,caixa,banana), caminhar(p1,p2), % caminhar de P1 para P2 estado(p2,_chão,caixa,banana) ). consegue(estado(_,_,_,tem)). consegue(estado1) :- move(estado1,movimento,estado2), consegue(estado2). % macaco já tem banana % movimentar e tentar conseguir % a banana Macaco & Banana (Ordem Alterada) Ordem das Cláusulas move(estado(p1,_chão,caixa,banana), caminhar(p1,p2), % caminhar de P1 para P2 estado(p2,_chão,caixa,banana) ). move(estado(_centro,acima_caixa,_centro,não_tem), % antes de mover pegar_banana, % pega banana estado(_centro,acima_caixa,_centro,tem) ). % depois de mover move(estado(p,_chão,p,banana), subir, % subir na caixa estado(p,acima_caixa,p,banana) ). move(estado(p1,_chão,p1,banana), empurrar(p1,p2), % empurrar caixa de P1 para P2 estado(p2,_chão,p2,banana) ). consegue(estado(_,_,_,tem)). consegue(estado1) :- move(estado1,movimento,estado2), consegue(estado2). % 1a cláusula de consegue/1 % 2a cláusula de consegue/1 Vamos analisar a execução da versão com ordem alterada da pergunta?- consegue(estado(na_porta,_chão,na_janela,não_tem)). Que produz a seguinte execução (variáveis remeadas apropriadamente): (1) consegue(estado(na_porta,_chão,na_janela,não_tem)) A segunda cláusula de consegue/1 é aplicada (2) move(estado(na_porta,_chão,na_janela,não_tem),m,s2 ), consegue(s2 ) Através do movimento caminhar(na_porta,p2 ) temos: (3) consegue(estado(p2,_chão,na_janela,não_tem)) A segunda cláusula de consegue/1 é aplicada vamente (4) move(estado(p2,_chão,na_janela,não_tem),m,s2 ), consegue(s2 ) Agora ocorre a diferença: a primeira cláusula cuja cabeça unifica com a primeira meta acima é caminhar (e não subir como antes). A instanciação é S2 = estado(p2,_chão,na_janela,não_tem), portanto a lista de metas se torna (5) consegue(estado(p2,_chão,na_janela,não_tem)) Novamente, a segunda cláusula de consegue/1 é aplicada (6) move(estado(p2,_chão,na_janela,não_tem),m,s2 ), consegue(s2 ) Novamente, caminhar é tentado primeiro, produzindo (7) consegue(estado(p2,_chão,na_janela,não_tem)) As metas (3), (5) e (7) são as mesmas, exceto por uma variável; e o sucesso de uma meta não depende do me particular das variáveis envolvidas Assim a partir da meta (3) a execução não mostra progresso algum 85 86
15 Ordem das Cláusulas Nota-se que a segunda cláusula de consegue/1 e cláusula caminhar de move/1 são usadas repetidamente O macaco caminha sem nunca tentar usar a caixa Como não há progresso, isso procede infinitamente: Prolog não percebe que não há sentido em continuar utilizando esta linha de raciocínio Este exemplo mostra Prolog tentando resolver um problema de modo que a solução nunca é encontrada, embora exista uma solução O programa está declarativamente correto, mas proceduralmente incorreto sentido que ele não é capaz de produzir uma resposta à pergunta Pontos Importantes Objetos simples em Prolog são átomos, números e variáveis Objetos estruturados, ou estruturas, são utilizados para representar objetos que possuem vários componentes Estruturas são construídas através de functores; cada functor é definido por seu me e aridade O escopo léxico de uma variável é uma cláusula; assim o mesmo me de variável em duas cláusulas significam duas variáveis diferentes Pontos Importantes Estruturas podem ser vistas como árvores; Prolog pode ser vista como uma linguagem para processamento de árvores A operação de unificação toma dois termos e tenta torná-los idênticos através da instanciação das variáveis em ambos os termos A ordem das cláusulas pode afetar a eficiência do programa; uma ordem indevida pode até mesmo causar chamadas recursivas infinitas Slides baseados em: Bratko, I.; Prolog Programming for Artificial Intelligence, 3rd Edition, Pearson Education, Clocksin, W.F.; Mellish, C.S.; Programming in Prolog, 5th Edition, Springer-Verlag, Programas Prolog para o Processamento de Listas e Aplicações, Monard, M.C & Nicoletti, M.C., ICMC-USP, 1993 Material elaborado por José Augusto Baranauskas
Sintaxe e Semântica de Programas Prolog
Inteligência Artificial Sintaxe e Semântica de Programas Prolog José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP Sala 228 Bloco P2 Fone (16) 602-4439 Esta aula trata da sintaxe e
Sintaxe e Semântica de Programas Prolog
Sintaxe e Semântica de Programas Prolog Esta aula trata da sintaxe e semântica de conceitos básicos em Prolog relacionados à manipulação de listas Lista é uma das estruturas mais simples em Prolog, muito
Listas em Prolog. Listas
Listas em Prolog Esta aula trata da estrutura de dados lista e programas Prolog para processamento de listas Inteligência Artificial 1 Listas Lista é uma das estruturas mais simples em Prolog, muito comum
Sintaxe e Semântica de Programas Prolog
Sintaxe e Semântica de Programas Prolog Thiago A. S. Pardo Solange Rezende Inteligência Artificial 1 Objetos em Prolog Objetos (Termos) Objetos Simples Estruturas Constantes (Atômicos) Variáveis Átomos
Recursão PROGRAMAÇÃO EM LÓGICA. Recursão. Sonho Recursivo. Recursão. Recursão. Linguagem Prolog Parte IV
PROGRAMAÇÃO EM LÓGICA Recursão CIÊNCIA DA COMPUTAÇÃO FACAPE Faculdade de Ciências Aplicadas e Sociais de Petrolina Linguagem Prolog Parte IV Usado desde a arte (em figuras, telas, etc) como também em Matemática
6. OPERADORES E ARITMÉTICA
6. OPERADORES E ARITMÉTICA 6.1 OPERADORES Na matemática costuma-se escrever expressões como 2*a + b*c onde + e * são operadores e 2, a, b e c são argumentos. Em particular, + e * são denominados operadores
INF 1771 Inteligência Artificial
INF 1771 Inteligência Artificial Aula 09 Introdução ao Prolog Edirlei Soares de Lima Introdução O Prolog é uma linguagem de programação baseada em lógica de primeira ordem. Não é
03/04/2016 LÓGICA MATEMÁTICA. Prof. Esp. Fabiano Taguchi. Introdução ao Prolog
LÓGICA MATEMÁTICA Prof. Esp. Fabiano Taguchi [email protected] http://fabianotaguchi.wordpress.com Introdução ao Prolog 1 PROLOG PROgramming in LOGic Linguagem utilizada para resolver problemas
Prof. A. G. Silva. 24 de agosto de Prof. A. G. Silva Programação em Lógica 24 de agosto de / 1
Programação em Lógica Prof. A. G. Silva 24 de agosto de 2017 Prof. A. G. Silva Programação em Lógica 24 de agosto de 2017 1 / 1 Termos Referem-se a todas as construções sintáticas da linguagem Um termo
BUSCA DE SOLUÇÕES EM PROLOG
PR UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ BUSCA DE SOLUÇÕES EM PROLOG Resolução em PROLOG: Unificação e substituição 1 UNIFICAÇÃO EM PROLOG HISTÓRICO 2 HISTÓRIA A PARTIR DE 1950 1958 forma clausal:
INF 1771 Inteligência Artificial
INF 1771 Inteligência Artificial Aula 09 Introdução ao Prolog 2016.2 Prof. Augusto Baffa Introdução O Prolog é uma linguagem de programação baseada em lógica de primeira ordem.
Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO
Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO Dados em Algoritmos Quando escrevemos nossos programas, trabalhamos com: Dados que nós fornecemos ao programa Dados
SCC Capítulo 5 Representação de Conhecimento através do Prolog
SCC-630 - Capítulo 5 Representação de Conhecimento através do Prolog João Luís Garcia Rosa 1 1 Departamento de Ciências de Computação Instituto de Ciências Matemáticas e de Computação Universidade de São
PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA
PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA SUMÁRIO Introdução Conceitos básicos Formato básico Tipos primitivos Variáveis Constantes Operadores Operações
Aula 4 Expressões e Operadores Cleverton Hentz
Aula 4 Expressões e Operadores Cleverton Hentz Sumário de Aula } Expressões } Operadores } Linearização de Expressões 2 Expressões Uma expressão é composta por variáveis, constantes, ou qualquer combinação
ALGORITMOS E APLICAÇÕES. FATEC IPIRANGA ADS Noturno 1º semestre de 2012 Prof. Luiz Carlos de Jesus Junior
ALGORITMOS E APLICAÇÕES FATEC IPIRANGA ADS Noturno 1º semestre de 2012 Prof. Luiz Carlos de Jesus Junior Formato Básico do Pseudocódigo Tipos de dados O VisuAlg prevê quatro tipos de dados: inteiro, real,
Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi
Algoritmos Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi Conceitos Linhas de Código de um Algoritmo ou Programa escrita do programa linha a linha, ou seja, a sintaxe do programa, podendo-se
Introdução à Ciência da Computação
Créditos Introdução à Ciência da Computação Tópicos Preliminares em Programação Exceto por adaptações e complementos menores, o material a seguir é composto de slides gentilmente cedidos por: Prof. Rudinei
Exemplo:- CONTROLE DE RETROCESSO. Construir um programa Prolog para implementar a função:
CONTROLE DE RETROCESSO O retrocesso (backtracking) é um processo pelo qual todas as alternativas de solução para uma dada consulta são tentadas exaustivamente. No Prolog, o retrocesso é automático. É possível
Programação de Computadores:
Instituto de C Programação de Computadores: Introdução a Algoritmos (Parte II) Luis Martí Instituto de Computação Universidade ederal luminense [email protected] - http://lmarti.com Roteiro da Aula de Hoje
Controle de Retrocesso. Programação Lógica. Controle de Retrocesso. Controle de Retrocesso
Programação Lógica Prolog: controle de retrocesso, predicado especial corte (!), verificação de tipos, exemplos O retrocesso (backtracking) é um processo pelo qual todas as alternativas de solução para
2. Linguagem de Programação Prolog
Inteligência Artificial - IBM1024 2. Linguagem de Programação Prolog Prof. Renato Tinós Local: Depto. de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 2. Linguagem de Programação Prolog 2.1.
EXERCÍCIOS DE PROGRAMAÇÃO EM LÓGICA
FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO EXERCÍCIOS DE PROGRAMAÇÃO EM LÓGICA LUÍS PAULO REIS DANIEL CASTRO SILVA MESTRADO INTEGRADO EM ENGENHARIA INFORMÁTICA E COMPUTAÇÃO PROGRAMAÇÃO EM LÓGICA
UNIDADE ACADÊMICA: Faculdade de
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE COMPUTAÇÃO BACHARELADO EM SISTEMAS DE INFORMAÇÃO PLANO DE DISCIPLINA DISCIPLINA: Programação Lógica ( X ) SEMESTRAL - ( ) ANUAL CÓDIGO: GSI010 PERÍODO: 2
Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes
Programação de Computadores III Aula 3 Professor Leandro Augusto Frata Fernandes [email protected] Material disponível em http://www.ic.uff.br/~laffernandes/teaching/2011.1/tcc-03.063 Roteiro da Aula
Programação Orientada a Objetos. Programação Lógica
Programação Orientada a Objetos Programação Lógica Cristiano Lehrer, M.Sc. Introdução Uma metodologia de programação diferente. Expressar programas na forma de lógica simbólica e a utilização de inferência
Introdução à Programação em Prolog
Introdução à Programação em Prolog Thiago A. S. Pardo Solange Rezende Exercício em duplas Introdução (1 de 4) Escrever um programa completo em C que armazene quem gosta de quem e que responda sim ou não
Programação Lógica. Controle (Bactracking, Cut, Fail) Paulo Henrique Ribeiro Gabriel
Programação Lógica Controle (Bactracking, Cut, Fail) Paulo Henrique Ribeiro Gabriel [email protected] Faculdade de Computação Universidade Federal de Uberlândia 7 de outubro de 2015 Paulo H. R. Gabriel (FACOM/UFU)
Objetos Estruturados Listas Recursão Exercícios. Inteligência Artificial
Prolog Objetos Estruturados Objetos Estruturados Listas Recursão Exercícios Inteligência Artificial Exercícios Relembrando a introdução: 1. Escreva um programa Prolog para representar: João nasceu em Campos
Aula prática 5. Funções Recursivas
Programação Funcional UFOP DECOM 2014.1 Aula prática 5 Funções Recursivas Resumo Definições recursivas são comuns na programação funcional. Nesta aula vamos aprender a definir funções recursivas. Sumário
Professora Martha Spalenza Professora de Informática da Faetec
Algoritmos em Estrutura seqüencial 1. Tipos de dados São quatro os tipos básicos de dados, e podem assumir os seguintes valores válidos: - números inteiros: -,, -3, -2, -1, 0, 1, 2, 3,, + ; - números reais:
Algoritmo e Programação Matemática
Algoritmo e Programação Matemática Fundamentos de Algoritmos Parte 1 Renato Dourado Maia Instituto de Ciências Agrárias Universidade Federal de Minas Gerais Dados A funcionalidade principal de um computador
Java e sua Sintaxe. Estrutura mínima de um programa em Java: public class Exemplo { }
Java e sua Sintaxe Java e sua Sintaxe Estrutura mínima de um programa em Java: public class Exemplo { } Como todo programa deve ter um início, convenciona-se que a primeira ação de um programa é a execução
5. Expressões aritméticas
5. Expressões aritméticas 5.1. Conceito de Expressão O conceito de expressão em termos computacionais está intimamente ligado ao conceito de expressão (ou fórmula) matemática, onde um conjunto de variáveis
USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio
USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS Bruno Maffeo Departamento de Informática PUC-Rio MÉTODO INDUTIVO O método indutivo para resolver problemas aqui empregado inspira-se na formulação mais
Programação em Lógica. UCPEL/CPOLI/BCC Lógica para Ciência da Computação Luiz A M Palazzo Maio de 2010
Programação em Lógica UCPEL/CPOLI/BCC Lógica para Ciência da Computação Luiz A M Palazzo Maio de 2010 Roteiro Introdução Conceitos Básicos Linguagens Lógicas Semântica de Modelos Semântica de Prova Programação
Programação de Computadores I. Professor Ilaim Costa Junior
Programação de Computadores I Professor Ilaim Costa Junior [email protected] Roteiro da Aula de Hoje ariável Tipos básicos Declaração Expressões Aritméticas Lógicas Atribuição 2 ariável Representa uma região
Introdução à Programação Prolog (Tutorial) Introdução. Programação Lógica. Programação em Prolog. Programação Lógica. Definindo Relações por Fatos
Introdução à Programação Prolog (Tutorial) Inteligência Artificial Nesta aula são introduzidos conceitos básicos da linguagem de programação lógica Prolog Os conceitos são introduzidos através de um tutorial
Programação Introdução
PROGRAMAÇÃO Programação Introdução Prof. Dr. Adriano Mauro Cansian 1 Introdução Para armazenar um algoritmo na memória de um computador e para que ele possa, em seguida, comandar as operações a serem executadas,
Capítulo 3 Lógica de Primeira Ordem
Capítulo 3 Lógica de Primeira Ordem Lógica para Programação LEIC - Tagus Park 1 o Semestre, Ano Lectivo 2007/08 c Inês Lynce and Luísa Coheur Bibliografia Baseados nos slides de Andrew Rice, Universidade
Fundamentos de Lógica Matemática
Webconferência 5-22/03/2012 Prova por resolução Prof. L. M. Levada http://www.dc.ufscar.br/ alexandre Departamento de Computação (DC) Universidade Federal de São Carlos (UFSCar) 2012/1 Introdução É possível
Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas
Estrutura de um Algoritmo, Variáveis, Comandos de Entrada e Saída e Expressões Aritméticas Estrutura de um Programa em Linguagem Algorítmica Nesse curso nós vamos utilizar a linguagem algorítmica para
ESTRUTURA CONDICIONAL E SELEÇÃO
Algoritmos e Estruturas de Dados 1 Prof. Eduardo 1 ESTRUTURA CONDICIONAL E SELEÇÃO 1 - ESTRUTURA CONDICIONAL (ESTRUTURAS DE CONTROLE OU DECISÃO) Até o momento da disciplina vimos algoritmos e programas
ALGORITMOS AULA 2. Profª Amanda Gondim
ALGORITMOS AULA 2 Profª Amanda Gondim LINEARIZAÇÃO DE EXPRESSÕES Para a construção de algoritmos que realizam cálculo matemáticos, todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas
Compiladores. Análise Léxica
Compiladores Análise Léxica Regras Léxicas Especificam o conjunto de caracteres que constituem o alfabeto da linguagem, bem como a maneira que eles podem ser combinados; Exemplo Pascal: letras maiúsculas
LÓGICA DE PROGRAMAÇÃO. Algoritmos Computacionais. Sérgio Carlos Portari Júnior
LÓGICA DE PROGRAMAÇÃO Algoritmos Computacionais Sérgio Carlos Portari Júnior [email protected] Tópicos abordados Algoritmos Computacionais Estrutura de Dados Tipos Primitivos Constantes Variáveis
LINGUAGEM C: VARIÁVEIS E EXPRESSÕES
LINGUAGEM C: VARIÁVEIS E EXPRESSÕES Prof. André Backes LINGUAGENS DE PROGRAMAÇÃO Linguagem de Máquina Computador entende apenas pulsos elétricos Presença ou não de pulso 1 ou 0 Tudo no computador deve
Conceitos Básicos de Programação
BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de
Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação
Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Programação em C Variáveis e Expressões DCA0800 Algoritmos e Lógica de Programação Heitor Medeiros Florencio
Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.
Variáveis e Entrada de Dados Marco André Lopes Mendes [email protected] [email protected] marcoandre.googlepages.com Algoritmos é a base Primeiro programa Este programa possui apenas uma
ALGORITMOS 3ª Aula. 3. Introdução Tipos de dados, variáveis e operadores Tipos de dados
3. Introdução Segundo alguns especialistas, qualquer programa de computador pode ser escrito utilizando apenas três estruturas básicas: Seqüência, Condição e Repetição. Isto significa que, na construção
Algoritmos. Seqüência finita e ordenada de procedimentos que resolvem um determinado problema. Exemplo: O que preciso fazer para preparar um omelete?
Algoritmos Seqüência finita e ordenada de procedimentos que resolvem um determinado problema Exemplo: O que preciso fazer para preparar um omelete? Pegar os ovos na geladeira; Bater os ovos; Escolher o
Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2
Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas Aula Tópico 2 1 Problema 3 Exibir o maior número inteiro que pode ser representado no computador. 2 Qual o maior número inteiro? Para o compilador
Definições de Algoritmos. Algoritmos e Programação I. Conceitos Básicos de Algoritmos. Relação entre Algoritmos e Programação
Definições de Algoritmos Algoritmos e Programação I Aula 2 Prof a. Márcia Cristina Moraes [email protected] Prof a. Sílvia M.W. Moraes [email protected] Algoritmo é um conjunto finito de regras, bem
Pseudocódigo. Regras para nomear um algoritmos: Variáveis. Exemplo: Exemplo: Exemplo: O valor do dolar; O peso de uma pessoa;
Pseudocódigo Português estruturado Mais formal e estruturado Facilidade de compreensão /* Algoritmo que descreve os passos para trocar uma lâmpada */ comentário Algoritmo TrocaLampada nome do algoritmo
ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO Docente: Éberton da Silva Marinho e-mail: [email protected] [email protected]
Material Didático Unificado.
Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Comissão da Disciplina Programação de Computadores I CDPCI Programação de Computadores I BCC701 www.decom.ufop.br/bcc701 Material
Introdução à Computação
Introdução à Computação Tipos de Dados, Expressões, Operadores e Comandos Básicos Prof.: Julliano Rosa Nascimento [email protected] Roteiro Tipos de Dados: Revisão Expressões Operadores Comandos Básicos
Ambiente de desenvolvimento
Linguagem C Ambiente de desenvolvimento Um programa em C passa por seis fases até a execução: 1) Edição 2) Pré-processamento 3) Compilação 4) Linking 5) Carregamento 6) Execução Etapa 1: Criação do programa
