Aula Prolog 02
-
Upload
fabio-moura-pereira -
Category
Technology
-
view
403 -
download
4
Transcript of 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
PrologProlog►FatosFatos►ExercícioExercício►Consultas SimplesConsultas Simples►BacktrackingBacktracking►ExercícioExercício
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.
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
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, + - * / \ ^ , ; ~ : . ? @ # $ & _
Á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
Á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 -->--> ++++
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
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).
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
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’).
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
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
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).
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
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
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
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 ;......
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).
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
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çã’’
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
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
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çã ;......
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
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
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).
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).
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
O que vem a seguir?O que vem a seguir?
►Consultas CompostasConsultas Compostas►RegrasRegras► ......