• Nenhum resultado encontrado

Lógica para Programação. João Pavão Martins

N/A
N/A
Protected

Academic year: 2021

Share "Lógica para Programação. João Pavão Martins"

Copied!
29
0
0

Texto

(1)

Lógica para Programação

(2)

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

(3)

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

(4)

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)

(5)

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

(6)

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

(7)

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 “.”.

(8)

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

(9)

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

(10)

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.

(11)

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

(12)

O PROLOG como linguagem de

programação –

mecanismos de controle

Menor

(13)

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.

(14)

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

(15)

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).

(16)

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

(17)

O PROLOG como linguagem de

programação –

mecanismos de controle

• Ciclos

repete.

(18)

O PROLOG como linguagem de

programação –

mecanismos de controle

• Ciclos

repete.

repete :- repete.

(19)

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

(20)

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

(21)

O PROLOG como linguagem de

programação –

homoiconicidade

Homoiconicidade

(22)

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

(23)

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

(24)

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).

(25)

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.

(26)

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,

(27)

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

(28)

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.

(29)

Referências

Documentos relacionados

Algoritmos e Programação Estruturada – Conceitos Importantes Estrutura de dados.. Algoritmos e Programação Estruturada –

Na informática, o algoritmo é o &#34;projeto do programa“, ou seja, antes de se fazer um programa (software) na Linguagem de Programação desejada (Pascal, Java, C, Delphi,

● Dica: ao utilizar o método puts com as aspas (para escrever textos), dentro das aspas você pode acessar as variáveis com #{IDENTIFICADOR} , trocando IDENTIFICADOR pelo

Fazer a modelagem (grafo de estados) e codificação do problema para obter moedas para formar um troco de T , colocando um custo maior em oferecer moedas mais escassas e um custo

• Uma lógica ser completa significa que podemos provar todas as proposições verdadeiras, tendo em atenção as premissas. •

As professoras envolvidas na formação proposta pela PAPPTEC na utilização do programa de lógica de programação, em conjunto com os seus alunos e alunas, não

O seguinte exemplo, composto por 5 comandos em alto nível, representa um algoritmo de extrema complexidade de ser implementado, pois os comandos são muito

[r]