Aula Prolog 02

30
Programação em Lógica Programação em Lógica Matemática Matemática Prolog Prolog – 02 – – 02 – Inteligência Inteligência Artificial Artificial Fábio M. Pereira Fábio M. Pereira Baseado em Baseado em

Transcript of Aula Prolog 02

Page 1: Aula Prolog 02

Programação em Lógica Programação em Lógica MatemáticaMatemática

PrologProlog– 02 –– 02 –

Inteligência ArtificialInteligência ArtificialFábio M. PereiraFábio M. Pereira

Baseado emBaseado emAmzi! inc. – www.amzi.comAmzi! inc. – www.amzi.com

Page 2: Aula Prolog 02

PrologProlog►FatosFatos►ExercícioExercício►Consultas SimplesConsultas Simples►BacktrackingBacktracking►ExercícioExercício

Page 3: Aula Prolog 02

FatosFatos► São a forma mais simples de predicadosSão a forma mais simples de predicados► São similares a registros em bancos de dadosSão similares a registros em bancos de dados

Podem ser consultados como em um banco de dadosPodem ser consultados como em um banco de dados► A sintaxe para um fato éA sintaxe para um fato é

pred(arg1, arg2, ... argN).pred(arg1, arg2, ... argN). predpred o nome do predicadoo nome do predicado arg1, ...arg1, ... os argumentosos argumentos NN a aridadea aridade .. o final sintático das cláusulas Prologo final sintático das cláusulas Prolog

► Um predicado de aridade zero é simplesmenteUm predicado de aridade zero é simplesmente pred.pred.

Page 4: Aula Prolog 02

Termos PrologTermos Prolog►Os argumentos podem ser qualquer Os argumentos podem ser qualquer termotermo

legal em Prologlegal em Prolog►Os termos básicos sãoOs termos básicos são

Integer – Um número positivo ou negativoInteger – Um número positivo ou negativo Átomo – Um texto constante iniciando com um Átomo – Um texto constante iniciando com um

caractere minúsculocaractere minúsculo Variável – Começa com um caractere maiúsculo ou Variável – Começa com um caractere maiúsculo ou

com underscore (_)com underscore (_) Estrutura – Termos complexos, cobertos mais Estrutura – Termos complexos, cobertos mais

adiante no cursoadiante no curso► Algumas implementações estendem esta lista Algumas implementações estendem esta lista

com outros tipos de dados, como ponto com outros tipos de dados, como ponto flutuante ou stringsflutuante ou strings

Page 5: Aula Prolog 02

Conjunto de Caracteres PrologConjunto de Caracteres Prolog►Letras maiúsculas, A-ZLetras maiúsculas, A-Z►Letras minúsculas, a-zLetras minúsculas, a-z►Dígitos, 0-9Dígitos, 0-9►Símbolos, + - * / \ ^ , ; ~ : . ? @ # $ & _Símbolos, + - * / \ ^ , ; ~ : . ? @ # $ & _

Page 6: Aula Prolog 02

Átomos (1)Átomos (1)► São normalmente formados por letras e São normalmente formados por letras e

dígitos com o primeiro caractere minúsculodígitos com o primeiro caractere minúsculo hellohello twoWordsTogethertwoWordsTogether x14x14

►O underscore (_) e não o hífen (-), pode ser O underscore (_) e não o hífen (-), pode ser usado como separador em nomes longosusado como separador em nomes longos um_nome_de_atomo_longoum_nome_de_atomo_longo z_23z_23

► Átomos não legaisÁtomos não legais não-use-hifensnão-use-hifens 123naousedigitosnoinicio123naousedigitosnoinicio _naoiniciecomunderscore_naoiniciecomunderscore NaoinicecomcapsNaoinicecomcaps

Page 7: Aula Prolog 02

Átomos (2)Átomos (2)► Utilize aspas simples para tornar qualquer Utilize aspas simples para tornar qualquer

combinação de caracteres um átomo legalcombinação de caracteres um átomo legal ‘‘estes-hifens-estao-ok’estes-hifens-estao-ok’ ‘‘UpperCase’UpperCase’ ‘‘embedded blanks’embedded blanks’

►Não utilize aspas duplas (“ ”)para formar Não utilize aspas duplas (“ ”)para formar átomosátomos Faz com que a lista de caracteres seja tratada Faz com que a lista de caracteres seja tratada

como uma lista de códigos ASCIIcomo uma lista de códigos ASCII► Átomos também podem ser formados a partir Átomos também podem ser formados a partir

de símbolosde símbolos -->--> ++++

Page 8: Aula Prolog 02

VariáveisVariáveis►São similares a átomos, mas se São similares a átomos, mas se

diferenciam por iniciar com um diferenciam por iniciar com um caractere maiúsculo ou underscore (_)caractere maiúsculo ou underscore (_) XX Input_ListInput_List _4th_argument_4th_argument Z56Z56

Page 9: Aula Prolog 02

Exemplos de FatosExemplos de Fatos►cliente/3 – em uma aplicação de negócioscliente/3 – em uma aplicação de negócios

cliente(‘John Jones’, conquista, bom_credito).cliente(‘John Jones’, conquista, bom_credito).cliente(‘Sally Smith’, salvador, bom_credito).cliente(‘Sally Smith’, salvador, bom_credito).

►window/5 – um sistema de janelas que usa window/5 – um sistema de janelas que usa fatos para armazenar dados sobre as várias fatos para armazenar dados sobre as várias janelas (nomes das janelas e coordenadas)janelas (nomes das janelas e coordenadas)window(main, 2, 2, 20, 72).window(main, 2, 2, 20, 72).window(errors, 15, 40, 20, 78).window(errors, 15, 40, 20, 78).

►doenca/2 – um sistema especialista de doenca/2 – um sistema especialista de diagnóstico médicodiagnóstico médicodoenca(peste, infecciosa).doenca(peste, infecciosa).

Page 10: Aula Prolog 02

Exercício (1)Exercício (1)►Banco de Dados GenealógicoBanco de Dados Genealógico

Crie um arquivo para a sua aplicaçãoCrie um arquivo para a sua aplicação Adicione alguns membros de sua famíliaAdicione alguns membros de sua família

►É importante que as informações estejam É importante que as informações estejam corretas, uma vez que iremos explorar os corretas, uma vez que iremos explorar os relacionamentos entre familiaresrelacionamentos entre familiares

►O seu próprio conhecimento servirá para O seu próprio conhecimento servirá para verificar a correção de seu programa Prologverificar a correção de seu programa Prolog

Inicie por armazenar o sexo dos indivíduosInicie por armazenar o sexo dos indivíduos

Page 11: Aula Prolog 02

Exercício (2)Exercício (2)►Banco de Dados GenealógicoBanco de Dados Genealógico

Use dois predicados separados – homem/1 Use dois predicados separados – homem/1 e mulher/1e mulher/1homem(denis).homem(denis).homem(miguel).homem(miguel).mulher(diana).mulher(diana).

Lembre-se que se quiser incluir caracteres Lembre-se que se quiser incluir caracteres maiúsculos ou espaços em branco, use maiúsculos ou espaços em branco, use aspas simplesaspas simpleshomem(‘Ghenghis Khan’).homem(‘Ghenghis Khan’).

Page 12: Aula Prolog 02

Consultas SimplesConsultas Simples►Consultas Prolog trabalham através de Consultas Prolog trabalham através de

casamento de padrõescasamento de padrões►O padrão de uma consulta é chamado O padrão de uma consulta é chamado objetivoobjetivo

►Se existe um fato que casa com o Se existe um fato que casa com o objetivo, então a consulta é bem objetivo, então a consulta é bem sucedida e Prolog responde sucedida e Prolog responde YesYes

►Caso não exista um fato, então a Caso não exista um fato, então a consulta falha e Prolog responde consulta falha e Prolog responde NoNo

►O casamento de padrões em Prolog é O casamento de padrões em Prolog é chamado de chamado de unificaçãounificação

Page 13: Aula Prolog 02

UnificaçãoUnificação►Caso o banco de dados contenha Caso o banco de dados contenha

apenas fatos, a unificação é bem apenas fatos, a unificação é bem sucedida casosucedida caso Os nomes dos predicados no objetivo e no Os nomes dos predicados no objetivo e no

banco de dados são os mesmosbanco de dados são os mesmos Os predicados possuem a mesma aridadeOs predicados possuem a mesma aridade Todos os argumentos são os mesmosTodos os argumentos são os mesmos

Page 14: Aula Prolog 02

Programa ExemploPrograma Exemplo% Salassala(cozinha).sala('escritório').sala('saguão').sala('sala de jantar').sala('porão').

% Localização dos objetoslocal(escrivaninha, 'escritório').local('maçã', cozinha).local(lanterna, escrivaninha).local('máquina de lavar', 'porão').local(cobertor, 'máquina de lavar').local('brócolis', cozinha).local(biscoito, cozinha).local(computador, 'escritório').

% Portas - Conexão entre salasporta('escritório', 'saguão').porta(cozinha, 'escritório').porta('saguão', 'sala de jantar').porta(cozinha, 'porão').porta('sala de jantar', cozinha).

% Alimentoscomestivel('maçã').comestivel(biscoito).gosto_ruim('brócolis').

% Situação da Lanternadesligado(lanterna).

% Localização do jogadoraqui(cozinha).

Page 15: Aula Prolog 02

ConsultasConsultas►Verificar se existe uma sala no jogoVerificar se existe uma sala no jogo

?- ?- sala(‘escritório’).sala(‘escritório’).YesYes Prolog responderá Prolog responderá YesYes caso um casamento caso um casamento

seja encontradoseja encontrado?- ?- sala(quarto).sala(quarto).NoNo Prolog responderá Prolog responderá NoNo caso nenhum caso nenhum

casamento seja encontradocasamento seja encontrado

Page 16: Aula Prolog 02

Uso de Variáveis (1)Uso de Variáveis (1)► Objetivos podem ser generalizados pelo uso de Objetivos podem ser generalizados pelo uso de

variáveis Prologvariáveis Prolog► Elas não se comportam como variáveis em Elas não se comportam como variáveis em

outras linguagens de programaçãooutras linguagens de programação As variáveis em Prolog substituem um ou mais As variáveis em Prolog substituem um ou mais

argumentos no objetivoargumentos no objetivo► Adicionam uma nova dimensão na unificação – Adicionam uma nova dimensão na unificação –

uma variável irá casar com sucesso com uma variável irá casar com sucesso com qualquer termoqualquer termo

► Após uma unificação bem sucedida, a variável Após uma unificação bem sucedida, a variável toma o valor do termo com o qual ela casatoma o valor do termo com o qual ela casa Isto é chamado de ligação (Isto é chamado de ligação (bindingbinding) de uma variável) de uma variável

Page 17: Aula Prolog 02

Uso de Variáveis (2)Uso de Variáveis (2)► Uma vez que exista mais de um valor que Uma vez que exista mais de um valor que

uma variável possa ser ligada que satisfaça o uma variável possa ser ligada que satisfaça o objetivo, Prolog fornece um meio de vermos objetivo, Prolog fornece um meio de vermos valores alternativosvalores alternativos Após uma resposta, devemos entrar com um Após uma resposta, devemos entrar com um

ponto e vírgula (;)ponto e vírgula (;)► ExemploExemplo

?- ?- sala(X).sala(X).X = cozinha ;X = cozinha ;X = escritório ;X = escritório ;X = saguão ;X = saguão ;X = ‘sala de jantar’ ;X = ‘sala de jantar’ ;X = porão ;X = porão ;NoNo

Não há mais respostas

Page 18: Aula Prolog 02

Outros Exemplos (1)Outros Exemplos (1)► Como encontrar todos os objetos na cozinhaComo encontrar todos os objetos na cozinha

?- ?- local(Objeto, cozinha).local(Objeto, cozinha).Objeto = maçã ;Objeto = maçã ;Objeto = brócolis ;Objeto = brócolis ;Objeto = biscoito ;Objeto = biscoito ;NoNo

► Podemos usar duas variáveis para ver tudo em todos Podemos usar duas variáveis para ver tudo em todos os lugaresos lugares?- ?- local(Objeto, Lugar).local(Objeto, Lugar).Objeto = escrivaninhaObjeto = escrivaninhaLugar = escritório ;Lugar = escritório ;

Objeto = maçãObjeto = maçãLugar = cozinha ;Lugar = cozinha ;......

Page 19: Aula Prolog 02

Outros Exemplos (2)Outros Exemplos (2)►Quais os clientes que vivem em Boston, Quais os clientes que vivem em Boston,

e quais suas situações de crédito?e quais suas situações de crédito??- ?- cliente(X, boston, Y).cliente(X, boston, Y).

►Qual é o título do capítulo 2?Qual é o título do capítulo 2??- ?- capitulo(2, Titulo).capitulo(2, Titulo).

►Quais as coordenadas da janela Quais as coordenadas da janela principal (main)?principal (main)??- ?- window(main, Row1, Col1, Row2, Col2).window(main, Row1, Col1, Row2, Col2).

Page 20: Aula Prolog 02

Como as Consultas Como as Consultas Funcionam?Funcionam?

►Quando Prolog tenta satisfazer um Quando Prolog tenta satisfazer um objetivo sobre um predicado, como em objetivo sobre um predicado, como em local/2, elelocal/2, ele Busca através das cláusulas que definem Busca através das cláusulas que definem

local/2local/2 Quando encontra um casamento para suas Quando encontra um casamento para suas

variáveis, ele marca a cláusula que foi variáveis, ele marca a cláusula que foi utilizada para satisfazer o objetivoutilizada para satisfazer o objetivo

Então, se o usuário pede por mais Então, se o usuário pede por mais respostas, ele retoma sua busca a partir da respostas, ele retoma sua busca a partir da cláusula marcadacláusula marcada

Page 21: Aula Prolog 02

ExemploExemplo► Consulta Consulta local(X, cozinha)local(X, cozinha)

PatternPattern Clause #1Clause #1local(X, cozinha)local(X, cozinha) local(escrivaninha, ‘escritório’)local(escrivaninha, ‘escritório’) Esta unificação falhaEsta unificação falha

►Os nomes dos predicados são os mesmos, o número de Os nomes dos predicados são os mesmos, o número de argumentos é o mesmo, mas o segundo argumento no argumentos é o mesmo, mas o segundo argumento no padrão, padrão, cozinhacozinha, é diferente do segundo argumento na , é diferente do segundo argumento na cláusula, cláusula, escritórioescritório

PatternPattern Clause #2Clause #2local(X, cozinha)local(X, cozinha) local(‘maçã’, cozinha)local(‘maçã’, cozinha) Esta unificação é bem sucedidaEsta unificação é bem sucedida

►Os nomes dos predicados, a aridade e os segundos Os nomes dos predicados, a aridade e os segundos argumentos são os mesmosargumentos são os mesmos

►Os primeiros argumentos podem ser os mesmos se X no Os primeiros argumentos podem ser os mesmos se X no padrão recebe o valor ‘padrão recebe o valor ‘maçãmaçã’’

Page 22: Aula Prolog 02

Objetivos PrologObjetivos Prolog► Possui quatro Possui quatro portasportas representando o fluxo de representando o fluxo de

controle através do objetivocontrole através do objetivo Call, Exit, Redo e FailCall, Exit, Redo e Fail

► Primeiro o objetivo é chamado (Primeiro o objetivo é chamado (CallCall))► Se bem sucedido, ele é deixado (Se bem sucedido, ele é deixado (ExitExit))► Se não, ele falha (Se não, ele falha (FailFail))► Se o objetivo é retomado, através de um Se o objetivo é retomado, através de um

ponto e vírgula (;), a porta ponto e vírgula (;), a porta RedoRedo é executada é executada

callinicia a busca por cláusulas que unificam com o objetivo

exitindica que o objetivo é satisfeito, marca a cláusula eliga as variáveis apropriadamente

redorecupera o objetivo, libera as variáveis e retoma abusca no local marcado

failindica que nenhuma outra cláusula casa com o objetivo

call exit

fail redoGoal

Page 23: Aula Prolog 02

Conferindo ...Conferindo ...► Para acompanhar a execução de um Para acompanhar a execução de um

programa em Prolog, utilize os seguintes programa em Prolog, utilize os seguintes comandoscomandos debug/0 – inicia o modo de debugdebug/0 – inicia o modo de debug

►O Prolog pára em pontos de O Prolog pára em pontos de tracetrace e e spyspy nodebug/0 – sai do modo de debugnodebug/0 – sai do modo de debug trace/0, trace/1, trace/2 – inclui um ponto de trace/0, trace/1, trace/2 – inclui um ponto de

rastreamentorastreamento notrace/0 – pára o notrace/0 – pára o tracertracer (rastreador) (rastreador) spy/1 – coloca um ponto de observação no spy/1 – coloca um ponto de observação no

predicadopredicado nospy/1 – remove o ponto de observaçãonospy/1 – remove o ponto de observação

Page 24: Aula Prolog 02

ExemploExemplo►Carregue o programa exemplo e entre Carregue o programa exemplo e entre

com os comandoscom os comandos?- ?- spy(local).spy(local).YesYes[debug] ?-[debug] ?- Acompanha a execução do predicado Acompanha a execução do predicado locallocal[debug] ?- [debug] ?- local(X, cozinha).local(X, cozinha). Call: (7) local(_G286, cozinha) ? Call: (7) local(_G286, cozinha) ? (Enter)(Enter)

Exit: (7) local(maçã, cozinha) ? Exit: (7) local(maçã, cozinha) ? (Enter)(Enter)X = maçã ;X = maçã ;......

Page 25: Aula Prolog 02

Variáveis x Fatos (1)Variáveis x Fatos (1)► Variáveis também podem ocorrer em fatos de Variáveis também podem ocorrer em fatos de

um banco de dados Prolog.um banco de dados Prolog.sleeps(X).sleeps(X). Indica que todos dormemIndica que todos dormem

► Podemos adicionar um fato diretamente no Podemos adicionar um fato diretamente no promptprompt?- ?- assert(sleeps(X)).assert(sleeps(X)).X = _G160X = _G160YesYes

► Consultas sobre este fato geram os seguintes Consultas sobre este fato geram os seguintes resultadosresultados?- ?- sleeps(jane).sleeps(jane).YesYes?- ?- sleeps(tom).sleeps(tom).YesYes

Page 26: Aula Prolog 02

Variáveis x Fatos (2)Variáveis x Fatos (2)►Note que Prolog não retorna a ligação de Note que Prolog não retorna a ligação de

variáveis ‘X = jane’ ou ‘X = tom’variáveis ‘X = jane’ ou ‘X = tom’ Apesar delas com certeza serem ligadas dessa Apesar delas com certeza serem ligadas dessa

maneira, somente são listadas variáveis mencionadas maneira, somente são listadas variáveis mencionadas na consulta, não aquelas usadas no programana consulta, não aquelas usadas no programa

► Prolog também pode ligar variáveis a variáveisProlog também pode ligar variáveis a variáveis?- ?- sleeps(Z).sleeps(Z).Z = _G160Z = _G160 Quando duas variáveis não ligadas casam, elas são Quando duas variáveis não ligadas casam, elas são

ligadas entre si, mas não a um valorligadas entre si, mas não a um valor Uso de uma variável interna comum ‘_G160’Uso de uma variável interna comum ‘_G160’ Desta maneira Prolog se lembra de que elas possuem Desta maneira Prolog se lembra de que elas possuem

o mesmo valoro mesmo valor

Page 27: Aula Prolog 02

Exercício (1)Exercício (1)► Considere o seguinte banco de dados PrologConsidere o seguinte banco de dados Prolog

easy(1).easy(1).easy(2).easy(2).easy(3).easy(3).

gizmo(a, 1).gizmo(a, 1).gizmo(b, 3).gizmo(b, 3).gizmo(a, 2).gizmo(a, 2).gizmo(d, 5).gizmo(d, 5).gizmo(c, 3).gizmo(c, 3).gizmo(a, 3).gizmo(a, 3).gizmo(c, 4).gizmo(c, 4).

►Qual o resultado das consultas?Qual o resultado das consultas?

?- easy(2).?- easy(X).

?- gizmo(a, X).?- gizmo(X, 3).?- gizmo(d, Y).?- gizmo(X, X).

Page 28: Aula Prolog 02

Exercício (2)Exercício (2)►Considere o banco de dadosConsidere o banco de dados

harder(a, 1).harder(a, 1).harder(c, X).harder(c, X).harder(b, 4).harder(b, 4).harder(d, 2).harder(d, 2).

►Qual a resposta para as consultasQual a resposta para as consultas?- harder(a, X).?- harder(a, X).?- harder(c, X).?- harder(c, X).?- harder(X, 1).?- harder(X, 1).?- harder(X, 4).?- harder(X, 4).

Page 29: Aula Prolog 02

Exercício (3)Exercício (3)►Banco de Dados GenealógicoBanco de Dados Genealógico

Faça algumas consultas queFaça algumas consultas que►Confirmem o relacionamento pai, como em Confirmem o relacionamento pai, como em

pais(dennis, diana)pais(dennis, diana)►Encontre alguns pais como em Encontre alguns pais como em pais(X, diana)pais(X, diana)►Encontre alguns filhos como em Encontre alguns filhos como em pais(dennis, X)pais(dennis, X)►Liste todas os pares pai-filho como em Liste todas os pares pai-filho como em pais(X, Y)pais(X, Y)

Se pais/2 parece estar funcionando Se pais/2 parece estar funcionando corretamente, adicione membros a sua família corretamente, adicione membros a sua família de modo a aumentar o banco de dadosde modo a aumentar o banco de dados►Lembre-se de incluir os predicados Lembre-se de incluir os predicados

correspondentes homem/1 ou mulher/1 para cada correspondentes homem/1 ou mulher/1 para cada indivíduo adicionadoindivíduo adicionado

Page 30: Aula Prolog 02

O que vem a seguir?O que vem a seguir?

►Consultas CompostasConsultas Compostas►RegrasRegras► ......