SlideShare uma empresa Scribd logo
1 de 5
Baixar para ler offline
Centro Federal de Educação Tecnológica de Minas Gerais
CEFET MG
Common Lisp
Aplicação de busca – Exercício das Jarras
Adson Nogueira Alves
201023510057
Prof. Maicon
Janeiro 2015
Leopoldina -MG
Proposta:
Dispondo de uma fonte de agua e duas garrafas onde uma contém uma capacidade de 4
litros e a outra 3 litros. O objetivo é deixar o recipiente de 3 litros com 2 litros de agua.
Solução:
Utilizando o formalismo de espaço de estados, representamos o problema como
(<conteúdo em 4 litros><conteúdo em 3 litros>)
Dessa forma, o estado inicial é ( 0 0 ) e o estado final ( 0 2 ) em Lisp temos:
(defun estado-inicial () '(0 0)) ;; Definição da função inicial
(defun teste-fim (estado) (equal estado '(0 2 ))) ;; Definição da função de teste
;; comparando se o estado atual confere
;; com o final
Tanto o estado inicial, quanto o estado final estão sob a forma de procedimento. Sendo
que no estado inicial o procedimento apenas retorna a lista correspondente; já no estado
final é testado de o estado é igual ao estado final ou não.
Nesse ponto é introduzido duas variáveis globais para simbolizar a capacidade dos
recipientes - *a* e *b* , 4 e 3 litros respectivamente
(defvar *a* 4) ;; definindo variáveis globais jarra 1
(defvar *b* 3) ;; definindo variáveis globais jarra 2
Nesse momento é criado função que retorna um estado sucessor de um estado dado para
uma possível manipulação, que pode ser reconhecida através do nome de cada função.
Quando um operador não é aplicável, a função retorna a lista vazia, isto é , NIL .
(defun enche-a (estado) ;; Definição do estado enche a
(cond ((not (= (car estado) *a*)) ;; teste condicional
(list *a* (cadr estado)))))
(defun enche-b (estado) ;; Definição do estado enche b
(cond ((not (= (cadr estado) *b*)) ;; teste condicional
(list (car estado) *b*))))
(defun esvazia-a (estado) ;; Definição do estado esvazia a
(cond ((not (= (car estado) 0)) ;; teste condicional
(list 0 (cadr estado)))))
(defun esvazia-b (estado) ;; Definição do estado esvazia b
(cond ((not (= (cadr estado) 0)) ;; teste condicional
(list (car estado) 0))))
(defun joga-ab (estado) ;; Definição do estado joga a em b
(cond ;; teste condicional
((and (not (= (car estado) 0))
(not (= (cadr estado) *b*)))
(cond ;; teste condicional
((> (car estado) (- *b* (cadr estado)))
(list (- (car estado)(- *b* (cadr estado))) *b*))
(t (list 0 (+ (cadr estado) (car estado))))))))
(defun joga-ba (estado) ;; Definição do estado Joga b em a
(cond ;; teste condicional
((and (not (= (cadr estado) 0))
(not (= (car estado) *a*)))
(cond ;; teste condicional
((> (cadr estado)(- *a* (car estado)))
(list *a* (- (cadr estado)(- *a* (car estado)))))
(t (list (+ (car estado)(cadr estado)) 0))))))
Essa próxima função nada mais é que o procedimento de solução, que dado um estado
retorna uma lista contendo todos os seus possíveis sucessores.
(defun sucessores (estado)
(mapcan #'(lambda (op)
(let ((novo (apply op (list estado))))
(cond (novo (list novo)))))
'(enche-a enche-b esvazia-a esvazia-b
joga-ab joga-ba)))
No caso os nomes das funções que representam os operadores estão sendo utilizados
como dados passados como parâmetro para outra função, no caso, a função anônima
utilizada como segundo argumento da função “mapcan “ , e executados através da função
“ apply “ , nesse caso utilizando uma função especifica do Common Lisp, a função “ let”,
que permite a definição de variáveis locais.
Até esse ponto temos os sucessores de cada estado possível, porém precisamos que o
programa apresente o caminho de solução de forma “inteligente “, dessa forma é preciso
criar uma estrutura q pode ser expressa pela forma abaixo.
(defstruct (node (:print-function print-node))
(state nil)
(father nil)
(g 0)
(h 0))
Função “print-node “, será utilizada sempre que um nodo for impresso
(defun print-node (node &optional stream level )
(princ (node-state node) stream)
(cond ((node-father node)
(princ "<-" stream)
(princ (node-father node) stream))
(t (terpri))))
Existe basicamente duas estratégias “cegas” para a construção de uma arvore de busca:
busca em largura e busca em profundidade. O utilizado foi busca em largura. O Criterio
utilizado leva em conta dois valores numéricos associados ao nodo – g e h. No caso da
busca cega, o valor h, que contém a informação heurística especifica de cada problema,
não é utilizado, de maneira que o único parâmetro que pode ser utilizado é o valor de
profundidade do nodo – g.
(defun blind-search ()
(let ((node-i nil) ; Armazena o nodo a ser examinado
(closed nil) ; Contém a lista vazia
(open (list (make-node :state (estado-inicial)))))
O let permite a inicialização das variáveis locais “node-i” , “closed” e “open” .
A interação infinita “loop” pode ser interrompida caso todos os casos tenha sido
examinados sem que uma solução tenha sido encontrada, retornando o símbolo “fail” ou
quando encontra uma solução. No último caso é impresso o caminho associado à solução
e o símbolo “sucess”.
(loop
(cond
((null open)
(return 'fail)))
(setq node-i (select open))
(setq open (remove node-i open))
(setq closed (cons node-i closed))
(cond
((teste-fim (node-state node-i))
(princ node-i)
(terpri)
(return 'success))
(t (dolist (state-j (sucessores (node-state node-i)))
(let ((no (compare state-j open))
(nc (compare state-j closed)))
(cond
((not (or no nc))
(setq open
(includ (make-node :state state-j
:father node-i)
open)))))))))))
A função “compare” simplesmente procura em uma lista de nodos (“open ” ou “closed”)
a ocorrência de um nodo cujo estado associado corresponda ao seu primeiro argumento
(“state”).
(defun compare (state node-list)
(cond
((null node-list) nil)
((equal state (node-state (car node-list)))
(car node-list))
(t (compare state (cdr node-list)))))
A função “select” seleciona um nodo da lista “open” para ser examinado.
(defun select (node-list)
(car node-list))
A função “includ” como um novo nodo deve ser incluído na lista “open”, no caso como
realizamos uma busca em largura os novos nodos serão incluídos no fim da lista “open”.
(defun includ (node node-list)
(append node-list (list node)))

Mais conteúdo relacionado

Último

Como fazer um Feedback Eficaz - Comitê de Gestores
Como fazer um Feedback Eficaz - Comitê de GestoresComo fazer um Feedback Eficaz - Comitê de Gestores
Como fazer um Feedback Eficaz - Comitê de GestoresEu Prefiro o Paraíso.
 
Apresentação sobrea dengue educação.pptx
Apresentação sobrea dengue educação.pptxApresentação sobrea dengue educação.pptx
Apresentação sobrea dengue educação.pptxtaloAugusto8
 
O-P-mais-importante.pptx de Maria Jesus Sousa
O-P-mais-importante.pptx de Maria Jesus SousaO-P-mais-importante.pptx de Maria Jesus Sousa
O-P-mais-importante.pptx de Maria Jesus SousaTeresaCosta92
 
Depende De Nós! José Ernesto Ferraresso.ppsx
Depende De Nós! José Ernesto Ferraresso.ppsxDepende De Nós! José Ernesto Ferraresso.ppsx
Depende De Nós! José Ernesto Ferraresso.ppsxLuzia Gabriele
 
Verbos - transitivos e intransitivos.pdf
Verbos -  transitivos e intransitivos.pdfVerbos -  transitivos e intransitivos.pdf
Verbos - transitivos e intransitivos.pdfKarinaSouzaCorreiaAl
 
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptx
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptxQUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptx
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptxAntonioVieira539017
 
Cruzadinha da dengue - Mosquito Aedes aegypti
Cruzadinha da dengue - Mosquito Aedes aegyptiCruzadinha da dengue - Mosquito Aedes aegypti
Cruzadinha da dengue - Mosquito Aedes aegyptiMary Alvarenga
 
Trabalho DAC História 25 de Abril de 1974
Trabalho DAC História 25 de Abril de 1974Trabalho DAC História 25 de Abril de 1974
Trabalho DAC História 25 de Abril de 1974AnaRitaFreitas7
 
Caça palavras - BULLYING
Caça palavras  -  BULLYING  Caça palavras  -  BULLYING
Caça palavras - BULLYING Mary Alvarenga
 
Aula 6 - O Imperialismo e seu discurso civilizatório.pptx
Aula 6 - O Imperialismo e seu discurso civilizatório.pptxAula 6 - O Imperialismo e seu discurso civilizatório.pptx
Aula 6 - O Imperialismo e seu discurso civilizatório.pptxMarceloDosSantosSoar3
 
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...Colaborar Educacional
 
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)profesfrancleite
 
autismo conhecer.pptx, Conhecer para entender
autismo conhecer.pptx, Conhecer para entenderautismo conhecer.pptx, Conhecer para entender
autismo conhecer.pptx, Conhecer para entenderLucliaResende1
 
Ressonancia_magnetica_basica_slide_da_net.pptx
Ressonancia_magnetica_basica_slide_da_net.pptxRessonancia_magnetica_basica_slide_da_net.pptx
Ressonancia_magnetica_basica_slide_da_net.pptxPatriciaFarias81
 
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdf
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdfARTE BARROCA E ROCOCO BRASILEIRO-min.pdf
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdfItaloAtsoc
 
Peixeiras da Coruña. O Muro da Coruña. IES Monelos
Peixeiras da Coruña. O Muro da Coruña. IES MonelosPeixeiras da Coruña. O Muro da Coruña. IES Monelos
Peixeiras da Coruña. O Muro da Coruña. IES MonelosAgrela Elvixeo
 

Último (20)

Como fazer um Feedback Eficaz - Comitê de Gestores
Como fazer um Feedback Eficaz - Comitê de GestoresComo fazer um Feedback Eficaz - Comitê de Gestores
Como fazer um Feedback Eficaz - Comitê de Gestores
 
Apresentação sobrea dengue educação.pptx
Apresentação sobrea dengue educação.pptxApresentação sobrea dengue educação.pptx
Apresentação sobrea dengue educação.pptx
 
O-P-mais-importante.pptx de Maria Jesus Sousa
O-P-mais-importante.pptx de Maria Jesus SousaO-P-mais-importante.pptx de Maria Jesus Sousa
O-P-mais-importante.pptx de Maria Jesus Sousa
 
Depende De Nós! José Ernesto Ferraresso.ppsx
Depende De Nós! José Ernesto Ferraresso.ppsxDepende De Nós! José Ernesto Ferraresso.ppsx
Depende De Nós! José Ernesto Ferraresso.ppsx
 
Verbos - transitivos e intransitivos.pdf
Verbos -  transitivos e intransitivos.pdfVerbos -  transitivos e intransitivos.pdf
Verbos - transitivos e intransitivos.pdf
 
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptx
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptxQUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptx
QUIZ - GEOGRAFIA - 8º ANO - FASES DO CAPITALISMO.pptx
 
Abordagem 2. Análise temática (Severino, 2013)_PdfToPowerPoint.pdf
Abordagem 2. Análise temática (Severino, 2013)_PdfToPowerPoint.pdfAbordagem 2. Análise temática (Severino, 2013)_PdfToPowerPoint.pdf
Abordagem 2. Análise temática (Severino, 2013)_PdfToPowerPoint.pdf
 
Cruzadinha da dengue - Mosquito Aedes aegypti
Cruzadinha da dengue - Mosquito Aedes aegyptiCruzadinha da dengue - Mosquito Aedes aegypti
Cruzadinha da dengue - Mosquito Aedes aegypti
 
Trabalho DAC História 25 de Abril de 1974
Trabalho DAC História 25 de Abril de 1974Trabalho DAC História 25 de Abril de 1974
Trabalho DAC História 25 de Abril de 1974
 
Caça palavras - BULLYING
Caça palavras  -  BULLYING  Caça palavras  -  BULLYING
Caça palavras - BULLYING
 
Aula 6 - O Imperialismo e seu discurso civilizatório.pptx
Aula 6 - O Imperialismo e seu discurso civilizatório.pptxAula 6 - O Imperialismo e seu discurso civilizatório.pptx
Aula 6 - O Imperialismo e seu discurso civilizatório.pptx
 
Abordagens 4 (Problematização) e 5 (Síntese pessoal) do texto de Severino (20...
Abordagens 4 (Problematização) e 5 (Síntese pessoal) do texto de Severino (20...Abordagens 4 (Problematização) e 5 (Síntese pessoal) do texto de Severino (20...
Abordagens 4 (Problematização) e 5 (Síntese pessoal) do texto de Severino (20...
 
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...
Apresente de forma sucinta as atividades realizadas ao longo do semestre, con...
 
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)
AS REBELIÕES NA AMERICA IBERICA (Prof. Francisco Leite)
 
(42-ESTUDO - LUCAS) DISCIPULO DE JESUS
(42-ESTUDO - LUCAS)  DISCIPULO  DE JESUS(42-ESTUDO - LUCAS)  DISCIPULO  DE JESUS
(42-ESTUDO - LUCAS) DISCIPULO DE JESUS
 
autismo conhecer.pptx, Conhecer para entender
autismo conhecer.pptx, Conhecer para entenderautismo conhecer.pptx, Conhecer para entender
autismo conhecer.pptx, Conhecer para entender
 
Abordagem 3. Análise interpretativa (Severino, 2013)_PdfToPowerPoint.pdf
Abordagem 3. Análise interpretativa (Severino, 2013)_PdfToPowerPoint.pdfAbordagem 3. Análise interpretativa (Severino, 2013)_PdfToPowerPoint.pdf
Abordagem 3. Análise interpretativa (Severino, 2013)_PdfToPowerPoint.pdf
 
Ressonancia_magnetica_basica_slide_da_net.pptx
Ressonancia_magnetica_basica_slide_da_net.pptxRessonancia_magnetica_basica_slide_da_net.pptx
Ressonancia_magnetica_basica_slide_da_net.pptx
 
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdf
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdfARTE BARROCA E ROCOCO BRASILEIRO-min.pdf
ARTE BARROCA E ROCOCO BRASILEIRO-min.pdf
 
Peixeiras da Coruña. O Muro da Coruña. IES Monelos
Peixeiras da Coruña. O Muro da Coruña. IES MonelosPeixeiras da Coruña. O Muro da Coruña. IES Monelos
Peixeiras da Coruña. O Muro da Coruña. IES Monelos
 

Destaque

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Destaque (20)

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 

Relatorio

  • 1. Centro Federal de Educação Tecnológica de Minas Gerais CEFET MG Common Lisp Aplicação de busca – Exercício das Jarras Adson Nogueira Alves 201023510057 Prof. Maicon Janeiro 2015 Leopoldina -MG
  • 2. Proposta: Dispondo de uma fonte de agua e duas garrafas onde uma contém uma capacidade de 4 litros e a outra 3 litros. O objetivo é deixar o recipiente de 3 litros com 2 litros de agua. Solução: Utilizando o formalismo de espaço de estados, representamos o problema como (<conteúdo em 4 litros><conteúdo em 3 litros>) Dessa forma, o estado inicial é ( 0 0 ) e o estado final ( 0 2 ) em Lisp temos: (defun estado-inicial () '(0 0)) ;; Definição da função inicial (defun teste-fim (estado) (equal estado '(0 2 ))) ;; Definição da função de teste ;; comparando se o estado atual confere ;; com o final Tanto o estado inicial, quanto o estado final estão sob a forma de procedimento. Sendo que no estado inicial o procedimento apenas retorna a lista correspondente; já no estado final é testado de o estado é igual ao estado final ou não. Nesse ponto é introduzido duas variáveis globais para simbolizar a capacidade dos recipientes - *a* e *b* , 4 e 3 litros respectivamente (defvar *a* 4) ;; definindo variáveis globais jarra 1 (defvar *b* 3) ;; definindo variáveis globais jarra 2 Nesse momento é criado função que retorna um estado sucessor de um estado dado para uma possível manipulação, que pode ser reconhecida através do nome de cada função. Quando um operador não é aplicável, a função retorna a lista vazia, isto é , NIL . (defun enche-a (estado) ;; Definição do estado enche a (cond ((not (= (car estado) *a*)) ;; teste condicional (list *a* (cadr estado))))) (defun enche-b (estado) ;; Definição do estado enche b (cond ((not (= (cadr estado) *b*)) ;; teste condicional (list (car estado) *b*)))) (defun esvazia-a (estado) ;; Definição do estado esvazia a (cond ((not (= (car estado) 0)) ;; teste condicional (list 0 (cadr estado))))) (defun esvazia-b (estado) ;; Definição do estado esvazia b (cond ((not (= (cadr estado) 0)) ;; teste condicional (list (car estado) 0)))) (defun joga-ab (estado) ;; Definição do estado joga a em b (cond ;; teste condicional
  • 3. ((and (not (= (car estado) 0)) (not (= (cadr estado) *b*))) (cond ;; teste condicional ((> (car estado) (- *b* (cadr estado))) (list (- (car estado)(- *b* (cadr estado))) *b*)) (t (list 0 (+ (cadr estado) (car estado)))))))) (defun joga-ba (estado) ;; Definição do estado Joga b em a (cond ;; teste condicional ((and (not (= (cadr estado) 0)) (not (= (car estado) *a*))) (cond ;; teste condicional ((> (cadr estado)(- *a* (car estado))) (list *a* (- (cadr estado)(- *a* (car estado))))) (t (list (+ (car estado)(cadr estado)) 0)))))) Essa próxima função nada mais é que o procedimento de solução, que dado um estado retorna uma lista contendo todos os seus possíveis sucessores. (defun sucessores (estado) (mapcan #'(lambda (op) (let ((novo (apply op (list estado)))) (cond (novo (list novo))))) '(enche-a enche-b esvazia-a esvazia-b joga-ab joga-ba))) No caso os nomes das funções que representam os operadores estão sendo utilizados como dados passados como parâmetro para outra função, no caso, a função anônima utilizada como segundo argumento da função “mapcan “ , e executados através da função “ apply “ , nesse caso utilizando uma função especifica do Common Lisp, a função “ let”, que permite a definição de variáveis locais. Até esse ponto temos os sucessores de cada estado possível, porém precisamos que o programa apresente o caminho de solução de forma “inteligente “, dessa forma é preciso criar uma estrutura q pode ser expressa pela forma abaixo. (defstruct (node (:print-function print-node)) (state nil) (father nil) (g 0) (h 0)) Função “print-node “, será utilizada sempre que um nodo for impresso (defun print-node (node &optional stream level ) (princ (node-state node) stream) (cond ((node-father node) (princ "<-" stream) (princ (node-father node) stream))
  • 4. (t (terpri)))) Existe basicamente duas estratégias “cegas” para a construção de uma arvore de busca: busca em largura e busca em profundidade. O utilizado foi busca em largura. O Criterio utilizado leva em conta dois valores numéricos associados ao nodo – g e h. No caso da busca cega, o valor h, que contém a informação heurística especifica de cada problema, não é utilizado, de maneira que o único parâmetro que pode ser utilizado é o valor de profundidade do nodo – g. (defun blind-search () (let ((node-i nil) ; Armazena o nodo a ser examinado (closed nil) ; Contém a lista vazia (open (list (make-node :state (estado-inicial))))) O let permite a inicialização das variáveis locais “node-i” , “closed” e “open” . A interação infinita “loop” pode ser interrompida caso todos os casos tenha sido examinados sem que uma solução tenha sido encontrada, retornando o símbolo “fail” ou quando encontra uma solução. No último caso é impresso o caminho associado à solução e o símbolo “sucess”. (loop (cond ((null open) (return 'fail))) (setq node-i (select open)) (setq open (remove node-i open)) (setq closed (cons node-i closed)) (cond ((teste-fim (node-state node-i)) (princ node-i) (terpri) (return 'success)) (t (dolist (state-j (sucessores (node-state node-i))) (let ((no (compare state-j open)) (nc (compare state-j closed))) (cond ((not (or no nc)) (setq open (includ (make-node :state state-j :father node-i) open))))))))))) A função “compare” simplesmente procura em uma lista de nodos (“open ” ou “closed”) a ocorrência de um nodo cujo estado associado corresponda ao seu primeiro argumento (“state”). (defun compare (state node-list) (cond
  • 5. ((null node-list) nil) ((equal state (node-state (car node-list))) (car node-list)) (t (compare state (cdr node-list))))) A função “select” seleciona um nodo da lista “open” para ser examinado. (defun select (node-list) (car node-list)) A função “includ” como um novo nodo deve ser incluído na lista “open”, no caso como realizamos uma busca em largura os novos nodos serão incluídos no fim da lista “open”. (defun includ (node node-list) (append node-list (list node)))