Lógica para Programação
O PROLOG como linguagem de
programação
• Programação em lógica
• Baseada no princípio da resolução, sendo guiado pela operação de unificação
• De um modo geral, não faz a distinção entre dados de entrada e dados de saída (polimodalidade)
• O programador indica as propriedades lógicas de um valor desconhecido, não especificando o algoritmo para atingir um resultado, mas relegando para o processo de computação o modo de o descobrir (ou de dizer que este não existe)
• Idealmente, o programador não define a ordem exata pela qual as instruções são executadas, sendo esta ordem estabelecida pelo mecanismo de inferência
O PROLOG como linguagem de
programação
• Aspetos que tipicamente são considerados na comparação de linguagens de programação
• tipos de dados
• mecanismos de ligação de valores a variáveis
• mecanismos de controle de execução das instruções
• mecanismos de definição e manipulação de estruturas de dados
• Aspeto menos vulgar em linguagens de programação (homoiconicidade),
comum a algumas linguagens desenvolvidas na área de Inteligência Artificial, nomeadamente, o PROLOG e o LISP
O PROLOG como linguagem de
programação –
tipos de dados
• Linguagem sem declaração de tipos
• Utiliza estruturas de dados de modo flexível e sem declaração prévia (exceção dynamic)
O PROLOG como linguagem de
programação –
tipos de dados
• Linguagem sem declaração de tipos
• Utiliza estruturas de dados de modo flexível e sem declaração prévia(exceção dynamic)
• Domínio de uma variável
• A cláusula em que esta se encontra
O PROLOG como linguagem de
programação –
tipos de dados
• Linguagem sem declaração de tipos
• Utiliza estruturas de dados de modo flexível e sem declaração prévia(exceção dynamic)
• Domínio de uma variável
• A cláusula em que esta se encontra
• Domínio de qualquer outro nome
• O programa completo
• As variáveis são ligadas durante a execução do programa como resultado da unificação
O PROLOG como linguagem de
programação –
tipos de dados
• Tipos de dados elementares • Átomos e números
• Tipos estruturados
• Definidos através de termos compostos (estruturas)
• Lista como um tipo pré-definido, com uma representação externa própria, sendo representada internamente pelo functor “.”.
O PROLOG como linguagem de
programação –
mecanismos de controle
• Um programa não especifica explicitamente o algoritmo para atingir os resultados
• Especificam-se entidades, propriedades e relações entre entidades
• A dependência do programa da ordem pela qual são escritas as cláusulas difere da programação em lógica teórica
• A ordem pela qual as cláusulas são escritas num programa tem uma influência determinante na execução do programa
O PROLOG como linguagem de
programação –
mecanismos de controle
• Um programa não especifica explicitamente o algoritmo para atingir os resultados
• Especificam-se entidades, propriedades e relações entre entidades
• A dependência do programa da ordem pela qual são escritas as cláusulas difere da programação em lógica teórica
• A ordem pela qual as cláusulas são escritas num programa tem uma influência determinante na execução do programa
• Sob o ponto de vista dos mecanismos de controle da execução das instruções, é semelhante a uma linguagem convencional, desde que não exista retrocesso
• Numa regra, os literais são executados da esquerda para a direita, sendo a procura de literais a executar realizada pela ordem em que as cláusulas aparecem no programa
• Adicionalmente o operador de corte que permite o controle sobre a ordem de execução das cláusulas
O PROLOG como linguagem de
programação –
mecanismos de controle
• Não existem, explicitamente, estruturas de seleção
• Operação condicional permite traduzir para a programação em lógica as instruções “if--then--” e “if--then--else--”
condicional :- teste, !, literal1. condicional :- literal2.
O PROLOG como linguagem de
programação –
mecanismos de controle
• Operação condicional realizada através do predicado pré-definido ->/2 • Sintaxe
<operação condicional> ::= <teste> -> <literais> |
<teste> -> <literais> ; <literais> • Semântica (teste -> literais_1 ; literais_2)
• O PROLOG executa o literal teste
• Se este tem sucesso, compromete-se com a substituição obtida, proibindo o retrocesso e executa os literais literais_1, em caso contrário, executa os literais literais_2.
• O mecanismo de retrocesso pode gerar soluções alternativas para literais_1 ou para literais_2, mas não pode gerar soluções alternativas para teste
O PROLOG como linguagem de
programação –
mecanismos de controle
Menor
O PROLOG como linguagem de
programação –
mecanismos de controle
Menor menor(X, Y, Z) :- X =< Y -> Z = X ; Z = Y. Fatorial fatorial(N, F) :- N = 1 -> F is 1 ; Nmenos1 is N - 1, fatorial(Nmenos1, FNmenos1), F is FNmenos1 * N.
O PROLOG como linguagem de
programação –
mecanismos de controle
• Ciclos podem ser simulados recorrendo a um gerador
• Qualquer mecanismo que faz com que uma expressão enumere múltiplos valores, quando solicitados
O PROLOG como linguagem de
programação –
mecanismos de controle
• Ciclos podem ser simulados recorrendo a um gerador
• Qualquer mecanismo que faz com que uma expressão enumere múltiplos valores, quando solicitados
• Gerador de inteiros g_inteiro(1).
O PROLOG como linguagem de
programação –
mecanismos de controle
• Ciclos podem ser simulados recorrendo a um gerador
• Qualquer mecanismo que faz com que uma expressão enumere múltiplos valores, quando solicitados • Gerador de inteiros g_inteiro(1). g_inteiro(N) :- g_inteiro(M), N is M+1. ?- g_inteiro(X). X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5
O PROLOG como linguagem de
programação –
mecanismos de controle
• Ciclos
repete.
O PROLOG como linguagem de
programação –
mecanismos de controle
• Ciclos
repete.
repete :- repete.
O PROLOG como linguagem de
programação –
procedimentos e parâmetros
• Não fornece notação para a definição de funções (como produtoras de valores), apenas de relações
• Num programa, cada função de n argumentos deve ser transformada numa relação de n+1 argumentos
• Em linguagens de programação tradicionais, existe uma diferença clara entre argumentos de uma função e valores de funções
• Em PROLOG esta distinção não existe, exceto em casos em que a utilização de certas operações assim o impõem
O PROLOG como linguagem de
programação –
procedimentos e parâmetros
Em PROLOG, a execução de um objetivo pode ser considerada a invocação de um procedimento, utilizando passagem de parâmetros por referência
A regra
c(<args_c>) :- l_1(<args_1>), ..., l_n(<args_n>)
pode ser considerada como o procedimento:
procedimento c(<args_c>) l_1(<args_1>)
...
l_n(<args_n>) fim
O PROLOG como linguagem de
programação –
homoiconicidade
Homoiconicidade
O PROLOG como linguagem de
programação –
homoiconicidade
Homoiconicidade
Do Grego “homo”, significando o mesmo, e “ícone” significando representação
Homoiconicidade
A propriedade de algumas linguagens de programação, nas quais a representação dos programas corresponde à principal estrutura de dados da linguagem
A primeira linguagem com esta propriedade foi o LISP, tendo esta sido herdada por todos os seus descendentes, incluindo o Scheme. O PROLOG é outra linguagem com esta propriedade
O PROLOG como linguagem de
programação –
homoiconicidade
Em PROLOG, a estrutura de dados básica é o termo composto, a aplicação de um functor a um certo número de argumentos
As listas correspondem internamente à aplicação do functor “.”
Em PROLOG não existe diferença sintática entre um termo composto e um literal, sendo a distinção semântica realizada durante a execução do programa
O PROLOG como linguagem de
programação –
homoiconicidade
Conjunto de predicados pré-definidos que permitem criar termos compostos e extrair informação neles contida, functor/3, arg/3 e =../2
O literal functor(T_c, F, Ar) afirma que o termo composto T_c utiliza o functor F com aridade Ar
?- functor(ad(pedro_I, joao_I), ad, 2). true.
?- functor(ad(pedro_I, joao_I), F, Ar). F = ad,
Ar = 2.
?- functor(T, ad, 2). T = ad(_313, _314).
O PROLOG como linguagem de
programação –
homoiconicidade
O literal arg(N, T_c, Arg) afirma que Arg é o N-ésimo argumento do termo composto T_c
?- arg(1, ad(pedro_I, joao_I), pedro_I). true.
?- arg(2, ad(pedro_I, joao_I), Arg2). Arg2 = joao_I.
?- arg(1, ad(X, Y), pedro_I). X = pedro_I.
O PROLOG como linguagem de
programação –
homoiconicidade
O literal =..(T_c, Lst) afirma que o primeiro elemento da lista Lst corresponde ao functor do termo composto T_c e que o resto da lista Lst corresponde aos
argumentos do termo composto T_c
?- =..(T, [ad, pedro_I, joao_I]). T = ad(pedro_I, joao_I).
?- =..(ad(pedro_I, joao_I), [P | R]). P = ad,
O PROLOG como linguagem de
programação –
homoiconicidade
O PROLOG fornece também a possibilidade de criar um objetivo para provar um literal
O predicado pré-definido call/1 tem sucesso apenas se o objetivo que é seu argumento tem sucesso
Pode parecer que este predicado é redundante, pois para um literal existente, por exemplo, ant(pedro_I, X), o objetivo
..., call(ant(pedro_I, X)), ... é equivalente a
O PROLOG como linguagem de
programação –
homoiconicidade
A utilidade de call torna-se evidente quando, num programa, se criam literais recorrendo aos predicados functor, arg e =..
Assumindo que P, X e Y são variáveis adequadamente instanciadas, a construção de um literal e a execução do objetivo correspondente a esse literal pode ser
efetuada através da sequência
..., =..(L, [P, X, Y]), call(L), ... ao passo que, nas mesmas circunstâncias a sequência
..., P(X, Y), ... origina um erro.