INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO CAMPUS SÃO LUÍS – MONTE CASTELO DEPARTAMENTO ACADÊMICO DE INFORMÁTICA BACHARELADO

EM SISTEMA DE INFORMAÇÃO DISCIPLINA: MATEMÁTICA DISCRETA PROFESSOR: RAIMUNDO OSVALDO VIEIRA

Atividade Avaliativa
Etapa: 01 Conteúdo: Programação Lógica

4

Fundamentação Teórica
A Lógica de Predicados possui diversas aplicações na Ciência da Computação, merecendo destaque, neste momento, a Programação Lógica.

1. Introdução
(Extraído de ABE, Jair Minoro et al. Introdução à Lógica para a Ciência da Computação. São Paulo: Arte e Ciência, 2001) (Extraído de GERSTING, Judith L. Fundamentos Matemáticos para a Ciência da Computação. Rio de Janeiro: LTC, 2003)

A lógica, desde Aristóteles, sempre esteve ligada ao pensamento científico. Ela constitui a base para deduzir consequências a partir de certas premissas; para estudar a validade ou a falsidade de sentenças dada a validade ou a falsidade de outras sentenças; para verificar a validade de argumentações; e para estabelecer a consistência de um conjunto de sentenças. Já os computadores surgiram na história há muito pouco tempo, ao compará-los com a lógica. Quase todos os computadores de hoje em dia são baseados no modelo (ou máquina) de von Neumann que surgiu na década de 40. Esta máquina é uma concretização da máquina (ideal) de Alain Turing. A máquina proposta por von Neumann é constituída por um “grande” conjunto de células de memória e uma unidade de processamento com algumas células de memória locais chamadas registradores.

Figura 1: Esquema Básico da Máquina de von Neumann

A unidade de processamento pode copiar dados armazenados nas células de memória para os registradores, realizar operações com esses dados nos registradores e transferir os resultados de volta para as células de memória. Um programa para a máquina de von Neumann deverá fornecer instruções que realizem as operações descritas acima. O desenvolvimento de computadores baseados na máquina de Von Neumann encontrou muitas limitações tecnológicas e de engenharia que foram sendo resolvidas através dos anos. Porém, à medida que os problemas relativos à construção de computadores eram resolvidos, os

problemas relativos a como utilizá-los apareciam. A execução de um programa declarativo permite ao usuário colocar perguntas. 2006) Seria muito interessante se.) (Extraído de BARBOSA. a proposta da programação em lógica é a seguinte: um programa lógico é constituído por um conjunto de axiomas e por um conjunto de regras de inferência. diz ao computador como resolver o problema. deu-se o nome de programação em lógica. Figura 2: Funcionamento de um Programa Lógico . 2. linguagens que não fossem meras abstrações do modelo de von Neumann mas que fossem derivadas de um modelo abstrato que não tivesse relação direta ou dependência com nenhuma máquina. linguagens mais fáceis para a compreensão humana começaram a aparecer: Fortran. Notamos que apesar dessas linguagens serem mais fáceis para a compreensão do homem. são linguagens declarativas ou linguagens descritivas. De posse desse programa podemos fazer “perguntas” a ele. ao invés de termos linguagens orientadas à máquina. isto é. A partir do início da década de 70. tivéssemos linguagens “orientadas ao homem”. Em outras palavras. elas ainda eram orientadas à máquina. ou seja. ao invés de procedurais. são conhecidas como linguagens procedurais. A construção de programas escritos em linguagem de máquina era complexa e tomava muito tempo. algumas linguagens de programação. Deste modo. O programador. porém o homem ainda não era plenamente apto a programar os computadores para resolver problemas práticos que surgiam. 2001. Apostila. A única linguagem disponível na época era a linguagem específica de cada máquina através da qual o programador fornecia instruções ao “estilo von Neumann”. As linguagens de programação com as quais você provavelmente já tem familiaridade. trabalhos de Robert Kowalski propunham a utilização da lógica diretamente como uma linguagem de programação. os computadores eram capazes de realizar as instruções fornecidas pelo homem. Um programa escrito em uma linguagem declarativa contém apenas proposições que são declaradas como hipóteses. Em termos gerais. O PROGRAMA CONTÉM APENAS AS HIPÓTESES E NÃO ALGUMA INSTRUÇÃO EXPLÍCITA SOBRE QUE PASSOS FAZER E EM QUE ORDEM. procurando informações sobre conclusões possíveis dedutíveis das hipóteses. UFCG. Essas “perguntas” na verdade são fórmulas as quais desejamos saber se podem ser deduzidas (ou não) a partir dos axiomas e regras de inferência contidos no programa lógico. portanto. Algol e Pascal mas todas elas apresentavam características marcantes da máquina de von Neumann subjacente. Uma linguagem declarativa baseia-se na lógica de predicados. A proposta da Programação Lógica (Extraído de ABE. o homem construía programas nessas linguagens pensando em termos de operações do computador. Introdução à Programação em Lógica. Alexandre de Andrade et al. Jair Minoro et al. tal como Pascal. Os programas construídos utilizando a lógica diretamente como linguagem de programação receberam o nome de programas lógicos. A partir daí. A maior parte dos programas escritos em linguagens procedurais destinam-se a resolver o problema à mão. Introdução à Lógica para a Ciência da Computação. A essa nova área da ciência que nascia. São Paulo: Arte e Ciência.

Portanto. que na verdade são fórmulas. . 2001. diremos que q é a cabeça e p é o corpo da implicação. z) = “x. Ainda com respeito às implicações. z) ← (namorados(x. podemos escrever: p(x). Veja o seguinte exemplo: ∀x∀y∀z((namorados(x.. Dada uma entrada.Em outras palavras. y) = “x e y namoram” triangulo(x. y e z formam um triângulo amoroso” Utilizaremos. . y) ∧ namorados(y. q ← p. y. podemos escrever uma implicação do tipo p → q de maneira inversa.) A linguagem que utilizamos para trabalhar com a programação em lógica é um subconjunto da linguagem do cálculo de predicados e recebe o nome de linguagem das cláusulas de Horn. tn são termos. duas regras de inferência que vimos no cálculo de predicados. t2. .. y) ∧ namorados(y. as quais submetemos ao programa lógico constituem a entrada do programa lógico. t2. Cláusulas de Horn (Extraído de ABE. z)) → triangulo(x. 3. Além disso. Dizemos que as “perguntas”. y. t1. Considerações Preliminares Dizemos que uma fórmula no cálculo de predicados é atômica quando ela é do tipo p(t1. y). tn) na qual: p é um predicado.. São Paulo: Arte e Ciência.1. Dizemos que as fórmulas atômicas são literais positivas. 3. ou seja. . y. mãe(x. basicamente. em alguns . z)) Escrito de maneira inversa: ∀x∀y∀z(triangulo(x. O motivo disso é simplesmente destacar a conclusão da implicação. z) Corpo: namorados(x. São elas a regra de modus ponens e a regra de particularização.. A negação de uma fórmula atômica é uma literal negativa. Jair Minoro et al. y. y). y) ∧ namorados(y. Como exemplo de fórmulas atômicas. dizemos que o processo de tentarmos demonstrar essa entrada a partir dos axiomas e regras de inferência do programa lógico é a execução do programa lógico. Essa teoria formal seria constituída pelos axiomas e regras de inferência do programa lógico. trabalharemos com o cálculo de predicados restrito à linguagem das cláusulas de Horn. z))) Cabeça: triangulo(x. Em programação lógica. as “perguntas” nada mais são do que fórmulas as quais desejamos saber se são teoremas na teoria formal fornecida pelo programa lógico. q(x. Introdução à Lógica para a Ciência da Computação. z) Os predicados acima se referem a pessoas e são definidos da seguinte maneira: namorados(x.

. se não escrevermos ∀x1 . ∨ Ar)) Passo 4: Notação Clausal. ∨ Lm) (1) na qual Li é uma literal positiva ou negativa e x1 .. para escrevermos Diremos que a cláusula..... ∧ Bs) ∨ (A1 ∨.. Então. explicitando cada passo: Passo 1: Separação das literais positivas e negativas..momentos....... ∨ Ar)) Passo 2: Aplicação das Leis de De Morgan. 2) O corpo de (5) é composta de uma conjunção de literais: então ao invés de escrevermos o conectivo “∧” poderemos escrever uma vírgula (“.. Porém... ∀xk((¬B1 ∨. vamos reescrever a cláusula (1) na notação clausal.... ∧ Bs) → (A1 ∨... na notação clausal. Ar ← B1..”) e não haverá perigo de confusão. ∨ Ar)) Passo 3: Formato de implicação pela equivalência implicação material. ∀x1 . fazendo uso da lei associativa e da comutativa.z) ∨ menor(x.. está no os programas lógicos.. ∀xk(¬(B1 ∧ . em seguida.z) ) .. ∨ ¬Bs) ∨ (A1 ∨. ∨ Lm.z) ∨ igual(x.. ... 3.. ∨ Ar) ← (B1 ∧ .2. tal como escrita em (1)...... 3) A cabeça de (5) é composta de uma disjunção de literais: então ao invés de escrevermos o conectivo “∨” poderemos escrever uma vírgula (“.. Com isso em mente. utilizaremos a contrapositiva de uma implicação conforme vista no cálculo proposicional e de predicados. Cláusula Uma cláusula é uma fórmula (do cálculo de predicados) do seguinte tipo: ∀x1∀x2.. ∀xk(L1 ∨ L2 ∨ . ∀x1 . podemos escrever (5) da seguinte maneira: A1. . ∧ Bs)) Observações 1) Todas as variáveis que ocorrem nas literais componentes de (5) estão quantificadas universalmente. ∀x1 .. (6) (5) (4) (3) (2) . xk são as variáveis que ocorrem em L1 ∨ L2 ∨ . ∀xk((B1 ∧ .. Escrever uma cláusula na notação clausal é reescrevê-la utilizando-se o conectivo de implicação (←). Por exemplo: ∀x∀z (maior(x.. .. Para entendermos melhor.... as positivas.... ∀xk não tem problema pois já saberemos que todas as variáveis que ocorrem em (5) já estão quantificadas universalmente.... Deve-se escrever primeiro as literais negativas e..”) e não haverá perigo de confusão. escrevendo de maneira inversa.. Bs E dizemos que (6) está escrita na notação clausal. ∀xk((A1 ∨. ∀x1 .. é conveniente escrever (1).

Exemplo: Escrever a cláusula ∀x∀y∀z(¬pai(y. Introdução à Lógica para a Ciência da Computação. Um programa Prolog constitui-se de uma coleção de fatos (base de dados) e regras (relações lógicas). Cláusula de Horn Uma cláusula de Horn é uma wff composta por predicados ou negações de predicados (com variáveis ou constantes como argumentos) unidos por disjunções. temos: ∀x∀y∀z((pai(y. Apostila. x)) Notação Clausal: tio(z. Fundamentos Matemáticos para a Ciência da Computação. A Linguagem PROLOG (Extraído de ABE. Pode-se afirmar. z)) ∨ tio(z. x) ← pai(y. Introdução à Programação em Lógica. Deve-se. Exemplos: 1) A wff predicativa P(x. pode ser escrita como: ¬(P(x.3. x)) em notação clausal. As literais já estão devidamente separadas. y) ∧ A(x)) → Pr(x) ⇔ Pr(x) ← P(x. Dizemos que uma cláusula tem cabeça vazia se não possui literais positivas no formato original de disjunção. um programa Prolog não possui código para manipular a memória ou realizar desvios condicionais. que a linguagem é mais adequada para solucionar uma determinada categoria de problemas. z) ∧ irmão(y. x)) Escrevendo no formato de implicação. 2006) (Extraído de GERSTING. y) ∧ A(x)) ∨ Pr(x) ⇔ (P(x. onde no máximo um predicado não é negado. Rio de Janeiro: LTC. y) é um exemplo de cláusula de Horn porque contém um único predicado não negado. 2001. z) ∧ irmão(y. z) 3. y). por exemplo. Esta wff. Esta descrição do problema é avaliada por um interpretador. o qual utilizando um “motor de inferência” realiza . 2003) A linguagem Prolog é a representante mais famosa da Programação em Lógica. irmão(y. z)) → tio(z. y) ∨ ¬A(x) ∨ Pr(x) é um exemplo de cláusula de Horn porque consiste em três predicados unidos por disjunções onde apenas Pr(x) não está negado. z) . Jair Minoro et al. UFCG. Alexandre de Andrade et al.Dizemos que uma cláusula tem corpo vazio se não possui literais negativas no formato original de disjunção. z) ∨ tio(z. São Paulo: Arte e Ciência. como veremos a seguir. portanto. 4. aplicar a lei de De Morgan: ∀x∀y∀z(¬(pai(y. Prolog foi criada em 1972 por Colmerauer e Roussel. 2) A wff ¬P(x. A(x) Este tipo de cláusula é a chave da programação em linguagem PROLOG. no formato clausal.) (Extraído de BARBOSA. na compreensão de linguagem natural ou em sistemas especialistas. portanto. esses itens descrevem o domínio de um determinado problema. Esta categoria diz respeito aos problemas onde é necessário representar algum tipo de conhecimento. em aplicações que realizem computação simbólica. Judith L. z) ∨ ¬irmão(y.

Isto mostra que Prolog considera A(a) ∧ (A(a) → B(b)) ⇒ B(b) Como um teorema. Assim. pode-se definir o predicado homem(x) e utilizá-lo para definir quais elementos do universo possuem tal predicado.pai(z. O número 4 identifica o prompt de comandos. Portanto. então. Pode-se observar que a tela se divide em duas janelas editáveis. resultará na impressão da string 'Teste'. Duas cláusulas de Horn em uma base de dados Prolog são resolvidas em uma nova cláusula de Horn se uma delas contiver um predicado não-negado que corresponda a um predicado negado na outra cláusula. ele não deve ser digitado. pode-se definir o predicado tio(x. Apostila. Por exemplo. resolução e encadeamento para trás (backtracking). podese afirmar que a computação destes programas é equivalente a prova de um teorema em lógica. disponível para uso em respostas às perguntas. O símbolo ?. a regra de inferência do Prolog inclui o modus ponens como um caso especial. será apresentada a tela deste. onde ao menos um predicado não é uma negação. Para que se possa realizar qualquer interação com o programa que está sendo editado é necessário. no caso x é homem. identificadas na imagem com os números 1 e 2. irmão(x. identificado com o número 3. 5. A área 1 corresponde a janela de edição do programa.será usado nos exemplos e exercícios apresentados para representar o prompt de comandos. Caso o arquivo seja alterado e o botão não seja acionado o interpretador irá trabalhar com a última versão do programa que foi consultada. a área 2 é a janela de interação do usuário com o interpretador. A regra de inferência usada pelo Prolog é chamada resolução. clicar sobre botão de consulta. As computações em Prolog utilizam os conceitos de cláusulas de Horn. Tanto fatos quanto regras são representados através de cláusulas de Horn. Por exemplo A(a) ¬A(a) ∨ B(b) É resolvida para B(b). Utilizando a regra de inferência da particularização universal repetidas vezes. y) :. 2006) Após realizar o download e a instalação do SWI-Prolog e do SWI-Prolog-Editor. com estes é possível realizar a computação de maneira equivalente a uma dedução em Lógica de 1a ordem. inicie o editor.write(Teste) não resultará em uma impressão. UFCG. o comando ?. significando que “x é tio de y” se “z é pai de y e x é irmão de z”. O usuário interage com o programa através de consultas (queries). Quantificadores não são representados explicitamente. Introdução à Programação em Lógica. z). ou seja. a qual deve ser similar a exibida na Figura 3. a linguagem trata uma regra como se ela estivesse universalmente quantificada. . Alexandre de Andrade et al. a partir deste é que podem ser enviados os comandos para o interpretador. A nova cláusula elimina o termo de correspondência e fica. são fórmulas que contém predicados ou negação de predicados conectados por disjunções. Por exemplo. enquanto o comando ?. o que é uma simples aplicação do modus ponens.). Todo comando enviado para o interpretador deve obrigatoriamente ser finalizado pelo caractere ponto (. As regras Prolog são descrições de predicados por meio de condicionais. é possível retirar os quantificadores e fazer com que uma variável assuma qualquer valor do domínio de representação. y). Os fatos de Prolog permitem a definição de predicados por meio da declaração de quais itens pertencentes ao universo (ou domínio) satisfazem os predicados.write(Teste).deduções em busca de conclusões válidas para consultas realizadas pelos usuários. Usando o SWI-PROLOG (Extraído de BARBOSA. após salvar o arquivo. porém. Por exemplo.

Regras e Consultas (Extraído de BARBOSA. Apostila.Figura 3: Tela Inicial do SWI-Prolog Editor Atividade Prática 1. Trabalhando com Fatos. Alexandre de Andrade et al. UFCG. 2006) Consideremos a seguinte árvore genealógica: . Introdução à Programação em Lógica.

entre outras. jim é filho de pat. Estas cláusulas descrevem toda a informação sobre a relação genitor existente na árvore apresentada (domínio). No A mesma consulta poderia ser realizada através da seguinte pergunta: ?.y). pois o poder de expressão obtido é muito maior. Para se representar estas relações em Prolog. ann). bob ). homem(bob). e digitar perguntas no prompt de comandos. y). Outro conectivo importante é a negação.genitor(X. genitor(tom. liz). bob). jim ). ann é irmã de pat.x). significando que “x é homem” e “x é mulher”. ou seja. para isso basta clicar no botão de consulta.) representa uma disjunção. Após definidos os fatos. genitor(bob. Então. Para isso. Para isso. pode-se digitar no prompt de comandos a seguinte pergunta: ?. Não há necessidade de declaração. pam é avó de ann. genitor(tom. pode-se criar a seguinte regra na janela de edição do programa: . podemos indagar. OBSERVAÇÃO 1: qualquer termo iniciado com letra maiúscula representa uma variável. por exemplo. por exemplo. OBSERVAÇÃO 2: para o SWI-Prolog a vírgula representa uma conjunção. mulher(ann). inicialmente pode-se criar a relação genitor(x. genitor(pat . Para exemplificar a utilização deste conectivo serão definidos os predicados homem(x) e mulher(x). mulher(liz). mulher(pam). No Muitas outras consultas podem ser realizadas sobre uma base de fatos. significando que “y é prole de x”. mulher (X). deseja-se saber quem é o genitor de bob que é mulher. assim. bob). Após a definição desta relação podem ser realizadas consultas no sistema. significando que “x é genitor de y”. bob é pai de pat. not(homem(X)). pode-se afirmar que “y é prole de x se x é genitor de y”. respectivamente. mulher(pat). homem(jim). bob). Para exemplificar o uso de regras será definida a relação prole(y. enquanto um ponto e vírgula (. é muito mais interessante utilizar regras. nesta é possível observar que existem diversos tipos de relação. podemos inserir na janela de edição do programa os seguintes fatos: genitor(pam. pat ). X = pam. homem(tom).genitor(X. “quem é a mãe de bob”. Esta relação é a relação inversa de genitor(x. X = pam. porém.A figura exibe a árvore genealógica de uma família. genitor(bob.

genitor(W. O símbolo :. já uma regra precisa ser avaliada para que se possa determinar se esta é verdadeira ou não. são utilizadas substituições. descendente (Z. assim. Assim. É possível definir esta relação utilizando a relação genitor. Y) . Z). Y) . A recursão é um dos elementos mais importantes da linguagem Prolog. y). irma(x. Usando recursão é possível obter uma solução bem mais simples e completa para a relação de descendência. até que se satisfaça a parte condicional ou não existam mais possibilidades de substituição.genitor (X. x).genitor(X. x seja genitor de y e z seja um descendente de y”. Para isso. y). A construção de uma regra recursiva será apresentada através da definição da relação descendente(z. A parte da regra a esquerda do símbolo :. genitor (Y. para responder a consulta o interpretador Prolog precisa satisfazer parte condicional da regra. uma descendência direta.prole(Y. y). genitor (Y. Para outros casos de descendência. X) :. tal que. Z). esta solução seria limitada e trabalhosa. a seguinte regra descreve isso: . tal como ilustrado na figura. é necessário definir a seguinte afirmação “z é um descendente de x se existe um y. poderiam ser utilizadas seguintes regras: descendente (Z. este conceito permite a resolução de problemas significativamente complexos de maneira relativamente simples. Uma diferença básica entre uma regra e um fato é que um fato é sempre uma informação verdadeira. já a parte a direita deste é chamada de condição (ou corpo). X) :. PROBLEMA PROPOSTO: defina as relações mae(x. quando x é genitor de z. Regras podem depender diretamente de um fato. avos(x. X) :. uma vez que não existem fatos relacionados a prole. Y) . Z). X) :- genitor(X.é denominada de conclusão (ou cabeça).pode ser lido como se. ou seja. Para isso. seria representada com a seguinte regra: descendente (Z. Regras definidas em termos de si mesma são chamadas de regras recursivas ou recorrentes.genitor(X. significando que “z é um descendente de x”. W) . que não uma descendência direta. como no exemplo anterior ou de outras regras (inclusive dela mesma). Porém. para então obter uma conclusão.

Uma avestruz é um tipo de pássaro grande que não voa. 4.descendente (Z.genitor(X. As vacas dão leite. genitor(X. Mimosa. Embora tubarões sejam peixes. que é um morcego. Formule consultas para descobrir: a) Quem são os pais de Pat. Y). como. que é um canário. e é considerado uma delícia. pássaros são outro tipo e mamíferos são um terceiro tipo. seus filhotes nascem já formados. 2. enquanto os pássaros têm asas e podem voar. pode-se descrever a relação de descendência de maneira correta. descendente (Z. Considere as seguintes hipóteses Todos os animais têm pele. eles não põem ovos. Assim. Se por um lado os pássaros e os peixes põem ovos. que é um tubarão. enquanto o uso exclusivo da segunda regra levaria a uma busca infinita de descendência. Piupiu. por exemplo. jim). utilizando as duas regras. mas também servem elas mesmas de comida (carne). Contudo. mas não põem ovos? . os peixes têm nadadeiras e podem nadar. que é um salmão. Xica. Salmão é outro tipo de peixe. apenas anda. Considere ainda que existem os seguinte animais: 1. que é um peixe. As duas regras são necessárias. Insira novos fatos para realizar consultas sobre esta relação. Normalmente. b) Liz possui filhos? c) Quem é o irmão de Bob? 3. Alfred. Nemo. Quais as respostas para as seguintes consultas? a) genitor(X. Y) . Vamp. X) :. 6. nem todos os mamíferos andam para se mover. Defina fatos e regras Prolog que representam as premissas acima. e formule consultas Prolog para responder às seguintes perguntas: a) O Piupiu voa? b) Qual a cor do Piupiu? c) A Xica voa? d) A Xica tem asas? e) Quais os nomes dos animais que põem ovos? f) Quais os nomes dos animais que são comestíveis? g) Quais os nomes dos animais que se movem nadando. o morcego voa. Por exemplo. O canário é um pássaro amarelo. pois o uso somente da primeira regra só seria suficiente para casos de descendência direta (equivalente à relação genitor). Atividade Avaliativa 1. X). 7. os mamíferos não põem. 3. 5. 4. pat). Peixe é um tipo de animal. que é uma vaca. 2. Tutu. uma vaca. Formule Regras para as seguintes relações: a) tio (a) b) ascendente c) primo (a). Os mamíferos normalmente andam para se mover. b) genitor(pam. que é uma avestruz.

Sign up to vote on this title
UsefulNot useful