Introdução. Inteligência Artificial. Prolog x Outras Linguagens. Programação em Prolog. Programar em Prolog envolve:



Documentos relacionados
INF 1771 Inteligência Artificial

INF 1771 Inteligência Artificial

30/04/2013. Prof. Hudson Costa

EXERCÍCIOS DE PROGRAMAÇÃO EM LÓGICA

Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de Exercícios de Programação Lógica.

Linguagem de Programação I

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

Origem do PROLOG. Lógica e PROLOG

Bases Matemáticas. Daniel Miranda de maio de sala Bloco B página: daniel.miranda

Lógica para computação Professor Marlon Marcon

Orientação a Objetos

Notas de aula de Lógica para Ciência da Computação. Aula 11, 2012/2

1. À primeira coluna (P), atribui-se uma quantidade de valores V igual à metade do total de linhas

INF 1771 Inteligência Artificial

Noções básicas de Lógica

Programação Lógica. (Prática em Prolog) LÓGICA APLICADA A COMPUTAÇÃO. Professor: Rosalvo Ferreira de Oliveira Neto

Cálculo proposicional

RACIOCÍNIO LÓGICO QUANTITATIVO

Estruturas de Repetição

03/04/2016 LÓGICA MATEMÁTICA. Prof. Esp. Fabiano Taguchi. Introdução ao Prolog

(Equivalência e Implicação lógica aula 10

Universidade Federal do ABC Disciplina: Natureza da Informação Lista de Exercícios 02 Códigos e conversão A/D Prof. João Henrique Kleinschmidt

LÓGICA FORMAL Tabelas Verdade

Recursão PROGRAMAÇÃO EM LÓGICA. Recursão. Sonho Recursivo. Recursão. Recursão. Linguagem Prolog Parte IV

Escola Secundária c/3º CEB José Macedo Fragateiro. Curso Profissional de Nível Secundário. Componente Técnica. Disciplina de

Programação Linear - Parte 4

Montadores e Compiladores

LINGUAGEM JAVA - RESUMO

03. [Sebesta, 2000] Descreva a operação de um gerador de linguagem geral.

Relações. Antonio Alfredo Ferreira Loureiro. UFMG/ICEx/DCC MD Relações 1

GUIA DE FUNCIONAMENTO DA UNIDADE CURRICULAR

1 Teoria de conjuntos e lógica

Módulo IV Programação Visual Basic. Programação

* Lógica Proposicional Formas de Argumento

Álge g bra b B ooleana n Bernardo Gonçalves

RACIOCÍNIO LÓGICO Simplificado

PROPOSIÇÕES. Proposições Simples e Proposições Compostas. Conceito de Proposição

Programação Lógica. Programação Lógica PROLOG

Maratona de Programação - Dicas Para Iniciantes

2. Tipos Abstratos de Dados

Lista de Exercícios 5: Soluções Teoria dos Conjuntos

CAPÍTULO O Método Simplex Pesquisa Operacional

Matrizes e Sistemas Lineares. Professor: Juliano de Bem Francisco. Departamento de Matemática Universidade Federal de Santa Catarina.

Os conceitos aprendidos são fundamentais, essenciais para escrever um programa macro. Mas o que é um programa macro?

Tabela de um Enunciado Simbolizado

Tipos de problemas de programação inteira (PI) Programação Inteira. Abordagem para solução de problemas de PI. Programação inteira

Gramáticas Livres de Contexto

UM JOGO DE DOMINÓ PARA A LÓGICA PROPOSICIONAL

OBSERVAÇÕES: EXERCÍCIOS

Algoritmos APRENDENDO A PROGRAMAR COM C#

Avaliação e Desempenho Aula 1 - Simulação

Árvores Parte 1. Aleardo Manacero Jr. DCCE/UNESP Grupo de Sistemas Paralelos e Distribuídos

Métodos Formais. Agenda. Relações Binárias Relações e Banco de Dados Operações nas Relações Resumo Relações Funções. Relações e Funções

CURSO DE MATEMÁTICA BÁSICA PROGRAMA DE EDUCAÇÃO TUTORIAL CENTRO DE ENGENHARIA DA MOBILIDADE

Fundamentos de Lógica Matemática

2. Qual dos gráficos abaixo corresponde à função y= x? a) y b) y c) y d) y

Programação de Computadores I. Linguagem C Função

Fundamentos e prática de Prolog

Bases de Dados BDDAD. Álgebra Relacional. Nelson Freire (ISEP LEI-BDDAD 2015/16) 1/33

Álgebra Relacional. Banco de Dados. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Profa. Dra. Cristina Dutra de Aguiar Ciferri

PROGRAMAÇÃO ORIENTADA A OBJETO INTRODUÇÃO

Comandos de Desvio 1

Processo de Desenvolvimento de Software

UNIDADE ACADÊMICA: Faculdade de

Árvores de Derivação para GLC Ambigüidade nas GLC Precedência, Prioridade e Associatividade de operadores

alocação de custo têm que ser feita de maneira estimada e muitas vezes arbitrária (como o aluguel, a supervisão, as chefias, etc.

Jorge Figueiredo, DSC/UFCG. Análise e Técnicas de Algoritmos Jorge Figueiredo, DSC/UFCG. Análise e Técnicas de Algoritmos 2005.

Ficha de Exercícios nº 2

Silogística Aristotélica

Introdução à Programação. Funções e Procedimentos. Prof. José Honorato F. Nunes honoratonunes@gmail.com

TUTORIAL MATLAB Victor Breder 2016

Operações relacionais e Álgebra relacional

CAPÍTULO 2 SISTEMAS DE NUMERAÇÃO E CÓDIGOS

Afirmação verdadeira: frase, falada ou escrita, que declara um facto que é aceite no momento em que é ouvido ou lido.

Matemática - Módulo 1

Inteligência Artificial. Lógica Relacional. (Parte I)

SCC Capítulo 5 Representação de Conhecimento através do Prolog

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

VEJA O CONTEÚDO DO ÚLTIMO EDITAL (2011/2012, ORGANIZADO PELA FCC)

Resolução de Questões!!!

(1, 6) é também uma solução da equação, pois = 15, isto é, 15 = 15. ( 23,

3.3 Qual o menor caminho até a Escola? 28 CAPÍTULO 3. CICLOS E CAMINHOS

Forma Normal de Boyce-Codd

Roteiro. Mapeamento dos Modelos ER e EER. Processo de Projeto de Banco de Dados. BCC321 - Banco de Dados I. Ementa. Posicionamento

INVESTIGAÇÃO OPERACIONAL. Programação Linear. Exercícios. Cap. III Método Simplex

Matemática Aplicada às Ciências Sociais- 11º ano

Formação WEB com PHP. Subtítulo

Transcrição:

Inteligência Artificial PROLOG Introdução O Prolog é uma linguagem de programação baseada em lógica de primeira ordem. Não é padronizada. Prof. Ms. Luiz Alberto Contato: lasf.bel@gmail.com Algumas implementações: SICStus Prolog, Borland Turbo Prolog, SWI-Prolog... Geralmente é interpretado, mas pode ser compilado. 1 Prolog x Outras Linguagens Linguagens Procedimentais (C, Pascal, Basic...): Especifica-se como realizar determinada tarefa. Linguagens Orientadas a Objetos (C++, Java, C#...): Especifica-se objetos e seus métodos. Prolog: Especifica-se o quê se sabe sobre um problema e o quê deve ser feito. É mais direcionada ao conhecimento e menos direcionada a algoritmos. Programação em Prolog Programar em Prolog envolve: Declarar alguns fatos a respeito de objetos e seus relacionamentos. Definir algumas regras sobre os objetos e seus relacionamentos. Fazer perguntas sobre os objetos e seus relacionamentos. 2 3

SWI-Prolog SWI-Prolog - Interface Open Source. Multiplataforma. Possui interface com as linguagens C e C++. www.swi-prolog.org 4 5 Sentenças Prolog Operadores Lógicos Nomes de constantes e predicados iniciam sempre com letra minúscula. O predicado (relação unária, n-ária ou função) é escrito primeiro e os objetos relacionados são escritos depois entre parênteses. Variáveis sempre começam por letra maiúscula. Símbolo Conectivo Operação Lógica :- IF Implicação, AND Conjunção ; OR Disjunção not NOT Negação Toda sentença termina com ponto. Exemplo: gosta(maria, jose). 6 7

Operadores Relacionais Regras Operador X = Y X \= Y X < Y Y > X Y =< X Y >= X Significado Igual a Não igual a Menor que Maior que Menor ou igual a Maior ou igual a Regras são utilizadas para expressar dependência entre um fato e outro fato: criança(x) :- gosta(x,sorvete). criança(x) :- not odeia(x,sorvete). Ou grupo de fatos: avó(x,z) :- (mãe(x,y),mãe(y,z)); (mãe(x,y),pai(y,z)). Podem conter listas: compra(ana, [roupa, comida, brinquedo]) 8 9 Exemplo de relações familiares: Árvore familiar completa em Prolog: O fato que Abraão é um progenitor de Isaque pode ser escrito em Prolog como: progenitor(abraão, isaque). Neste caso definiu-se progenitor como o nome de uma relação; abraão e isaque são seus argumentos. Cada cláusula declara um fato sobre a relação progenitor. 10 11

Quando o programa é interpretado, pode-se questionar o Prolog sobre a relação progenitor, por exemplo: Isaque é o pai de Jacó??- Uma outra pergunta pode ser:?- progenitor(ismael,jacó). O Prolog responde: false Como o Prolog encontra essa pergunta como um fato inserido em sua base, ele responde: true 12 O Prolog também pode responder a pergunta:?- progenitor(jacó,moisés). false 13 Perguntas mais interessantes também podem ser efetuadas: Quem é o progenitor de Ismael? A pergunta Quais os filhos de Isaque? pode ser escrita como:?- progenitor(isaque,x).?- progenitor(x,ismael). Neste caso, o Prolog não vai responder apenas true ou false. O Prolog fornecerá o valor de X tal que a pergunta acima seja verdadeira. Assim a resposta é: X = abraão 14 Neste caso, há mais de uma resposta possível. O Prolog primeiro responde com uma solução: X = esaú Pode-se requisitar uma outra solução (digitando ;) e o Prolog a encontra: X = jacó Se mais soluções forem requisitadas, o Prolog ira responder false, pois todas as soluções foram retornadas (false = sem mais soluções). 15

Perguntas mais complexas também podem ser efetuadas, tais como: Quem é o avô de José? De maneira similar, podemos perguntar: Quem são os netos de Abraão? Como o programa não conhece diretamente a relação avô, esta pergunta deve ser desmembrada em dois passos (1) Quem é o progenitor de José? Assuma que é um Y (2) Quem é o progenitor de Y? Assuma que é um X Esta pergunta composta pode ser escrita em Prolog como:?- progenitor(y,josé), progenitor(x,y). X = isaque Y = jacó 16?- progenitor(abraão,x), progenitor(x,y). X = isaque Y = esaú X = isaque Y = jacó 17 É possível expandir o programa sobre relações familiares de várias formas. Pode-se, por exemplo, adicionar a informação sobre o sexo das pessoas envolvidas. Pode-se estender o programa utilizando regras. Por exemplo, criando a relação filho como o inverso da relação progenitor. mulher(sara). homem(abraão). homem(isaque). homem(ismael). homem(esaú). homem(jacó). homem(josé). 18 É possível definir filho de maneira similar à relação progenitor, ou seja enumerando uma lista de fatos sobre a relação filho, mas esta não é a forma correta! filho(isaque,sara). filho(isaque,abraão). filho(ismael,abraão).... 19

A relação filho pode ser definida de modo mais elegante: A cláusula Prolog filho(y,x) :- progenitor(x,y) é chamada de regra (rule). Para todo X e Y, Y é um filho de X se X é um progenitor de Y. Em Prolog: Há uma diferença importante entre fatos e regras: Um fato é sempre verdadeiro (verdade incondicional). Regras especificam coisas que são verdadeiras se alguma condição é satisfeita. filho(y,x) :- progenitor(x,y). 20 21 Após definir a regra filho, é possível perguntar ao Prolog se Ismael é filho de Abraão: Para aplicar a regra a ismael e abraão, Y tem que ser substituído por ismael e X por abraão. Ou seja, as variáveis X e Y estão instanciadas a:?- filho(ismael, abraão). X = abraão e Y = ismael Como não existem fatos sobre a relação filho, a única forma do Prolog responder esta pergunta é aplicando a regra filho: filho(y,x) :- progenitor(x,y). A regra filho é aplicável a qualquer objeto X e Y; portanto ela pode também ser aplicada a objetos ismael e abraão. Depois da instanciação, obtêm-se um caso especial da regra: filho(ismael,abraão) :- Se o Prolog provar que progenitor(abraão,ismael) é verdadeiro, então ele pode afirmar que filho(ismael,abraão) também é verdade. 22 23

É possível também incluir a especificação da relação mãe, com base no seguinte fundamento lógico: Para todo X e Y, X é a mãe de Y se X é um progenitor de Y e X é uma mulher. Traduzindo para Prolog: mãe(x,y) :- progenitor(x,y), mulher(x). A relação irmão pode ser definida como: Para todo X e Y, X é irmão de Y se ambos X e Y têm um progenitor em comum. Em Prolog: irmão(x,y) :- progenitor(z,x), progenitor(z,y). 24 25 Interpretação Prolog Programas Prolog A interpretação do programa pode Prolog ser lógica ou procedimental. A interpretação procedimental corresponde a satisfazer cada subgoal mediante processos sucessivos de matching. Exemplo: pai(fred, marcos). pai(ricardo, pedro). pai(pedro, paulo). avo(x,y) :- pai(x, Z), pai(z, Y). ---?- avo(x,paulo). Programas Prolog podem ser estendidos simplesmente pela adição de novas cláusulas. Cláusulas Prolog são de três tipos: fatos, regras e perguntas. Fatos declaram coisas que são sempre (incondicionalmente) verdadeiras. Regras declaram coisas que são verdadeiras dependendo de determinadas condições. Através de perguntas, o usuário pode questionar o programa sobre quais coisas são verdadeiras. 26 27

Regras Recursivas Programa Exemplo Para criar uma relação ancestral é necessária a criação de uma regra recursiva: ancestral(x,z) :- progenitor(x,z). ancestral(x,z) :- progenitor(x,y), ancestral(y,z). Quais os descendentes de Sara??- ancestral(sara,x). X = isaque; X = esaú; X = jacó; X = josé 28 mulher(sara). homem(abraão). homem(isaque). homem(ismael). homem(esaú). homem(jacó). homem(josé). filho(y,x) :- progenitor(x,y). mae(x,y) :- progenitor(x,y), mulher(x). avo(x,z) :- progenitor(x,y), progenitor(y,z). irmao(x,y) :- progenitor(z,x), progenitor(z,y). ancestral(x,z) :- progenitor(x,z). ancestral(x,z) :- progenitor(x,y), ancestral(y,z). 29 Variáveis Variáveis Variáveis são representadas através de cadeias de letras, números ou _ sempre começando com letra maiúscula: X, Resultado, Objeto3, Lista_Alunos, ListaCompras... O escopo de uma variável é valido 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. 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. Uma vez instanciada, somente Prolog pode torná-la não-instanciada através de seu mecanismo de inferência (nunca o programador). A ocorrência de X dentro de uma mesma regra/pergunta significa a mesma variável. 30 31

Variável Anônima Variáveis anônimas podem ser utilizadas em sentenças cujo valor atribuído a variável não é importante. Por exemplo, a regra tem_filho: Tem_filho(X) :- progenitor(x,y). Para relação ter filhos não é necessário saber o nomes dos filhos. Neste vaso utiliza-se uma variável anônima representada por _. Variável Anônima Cada vez que uma variável anônima aparece em uma cláusula, ele representa uma nova variável anônima. Por exemplo: alguém_tem_filho :- progenitor(_,_). É equivale à: alguém_tem_filho :- progenitor(x,y). Tem_filho(X) :- progenitor(x,_). 32 33 Bibliografia Complementar Bratko, I., Prolog Programming for Artificial Intelligence (3rd edition), Addison Wesley, 2000. Clocksin, W.F., Mellish, C.S., Programming in Prolog (5th edition), Springer, 2003. Sterling, L., Shapiro, E., The Art of Prolog (2th edition), MIT Press, 1994. Exercício Suponha a seguinte Base de Factos Prolog: cargo(tecnico, rogerio). cargo(tecnico, ivone). cargo(engenheiro, daniel). cargo(engenheiro, isabel). cargo(engenheiro, oscar). cargo(engenheiro, tomas). cargo(engenheiro, ana). cargo(supervisor, luis). cargo(supervisor_chefe, sonia). cargo(secretaria_exec, laura). cargo(diretor, santiago). chefiado_por(tecnico, engenheiro). chefiado_por(engenheiro, supervisor). chefiado_por(analista, supervisor). chefiado_por(supervisor, supervisor_chefe). chefiado_por(supervisor_chefe, director). chefiado_por(secretaria_exec, director). Sem utilizar o computador responda qual seria a primeira resposta encontrada pelo Prolog para cada uma destas interrogações. a)?- chefiado_por(tecnico, X), chefiado_por(x,y). b)?- chefiado_por(tecnico, X), cargo(x,ivone), cargo(y,z). c)?- cargo(supervisor, X); cargo(supervisor, X). d)?- cargo(j,p), (chefiado_por(j, supervisor_chefe); chefiado_por(j, supervisor)). e)?- chefiado_por(p, director), not(cargo(p, laura)). 34 35