<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Silveira Neto &#187; Prolog</title>
	<atom:link href="http://silveiraneto.net/tag/prolog/feed/" rel="self" type="application/rss+xml" />
	<link>http://silveiraneto.net</link>
	<description>the world is a pixel</description>
	<lastBuildDate>Sun, 08 Jan 2012 05:17:57 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Gerando permutações</title>
		<link>http://silveiraneto.net/2008/01/19/gerando-permutacoes/</link>
		<comments>http://silveiraneto.net/2008/01/19/gerando-permutacoes/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 14:53:15 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[ia]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[listas]]></category>
		<category><![CDATA[Prolog]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Wladimir]]></category>

		<guid isPermaLink="false">http://silveiraneto.net/2008/01/19/gerando-permutacoes/</guid>
		<description><![CDATA[Muitas vezes para resolver uma única instância de um problema é mais rápido ataca-lo com força bruta do que encontrar um algoritmo geral com uma boa ordem de complexidade. Permutações são de grande utilidade nesse tipo de abordagem. Permutações em Prolog: Esse é um código em Prolog que o Wladimir Araujo passou na cadeira de [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes para resolver uma única instância de um problema é mais rápido ataca-lo com força bruta do que encontrar um algoritmo geral com uma boa ordem de complexidade. Permutações são de grande utilidade nesse tipo de abordagem.</p>
<p><span style="font-weight: bold">Permutações em Prolog:</span></p>
<p>Esse é um código em Prolog que o <a href="http://lia.ufc.br/~wladimir/">Wladimir Araujo</a> passou na cadeira de <a href="/tag/inteligencia-aritficial/">IA</a>.</p>
<div class="wp_syntax">
<div class="code">
<pre class="prolog" style="font-family:monospace;">select(X, [X|Xs], Xs).
select(X, [Y|Ys], [Y|Zs]) :- select(X, Ys, Zs).
&nbsp;
permutar([], []).
permutar(Xs, [Z|Zs]) :-
    select(Z, Xs, Ys),
    permutar(Ys, Zs).</pre>
</div>
</div>
<p><span style="font-weight: bold">Permutações em Python:</span><br />
Esse é um código de um certo Michael Davies que eu tirei <a href="http://snippets.dzone.com/posts/show/753">daqui</a>. Ele gera uma lista com todas as permutações de uma lista. Muito bonitinho. :)</p>
<div class="wp_syntax">
<div class="code">
<pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> all_perms<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span>=<span style="color: #ff4500;">1</span>:
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">str</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> perm <span style="color: #ff7700;font-weight:bold;">in</span> all_perms<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>perm<span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">yield</span> perm<span style="color: black;">&#91;</span>:i<span style="color: black;">&#93;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#91;</span>0:<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + perm<span style="color: black;">&#91;</span>i:<span style="color: black;">&#93;</span></pre>
</div>
</div>
<p>Um exemplo de uso:</p>
<div class="wp_syntax">
<div class="code">
<pre class="python python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> all_perms<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'a'</span>,<span style="color: #483d8b;">'b'</span>,<span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> p
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'c'</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'c'</span>, <span style="color: #483d8b;">'a'</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'c'</span>, <span style="color: #483d8b;">'b'</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'c'</span>, <span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'b'</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'c'</span>, <span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'a'</span><span style="color: black;">&#93;</span></pre>
</div>
</div>
<p><strong>Outras implementações:</strong><br />
Em outras linguagens o código para gerar permutações geralmente é muito grande, então eu preferi deixar alguns links.</p>
<ul>
<li><a href="http://www.bearcave.com/random_hacks/permute.html">Permutações em C</a></li>
<li><a href="http://www.merriampark.com/perm.htm">Permutações em Java</a></li>
<li><a href="http://snippets.dzone.com/posts/show/3332">Permutações em Ruby</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://silveiraneto.net/2008/01/19/gerando-permutacoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Família Simpsons em Prolog</title>
		<link>http://silveiraneto.net/2008/01/14/familia-simpsons-em-prolog/</link>
		<comments>http://silveiraneto.net/2008/01/14/familia-simpsons-em-prolog/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 22:45:20 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[código-fonte]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Prolog]]></category>
		<category><![CDATA[simpsons]]></category>

		<guid isPermaLink="false">http://silveiraneto.net/2008/01/14/familia-simpsons-em-prolog/</guid>
		<description><![CDATA[% Fatos. homer. marge. bart. lisa. maggie. mona. jacqueline. patty. abraham. clancy. hugo. louise. herb. &#160; mulher(marge). mulher(maggie). mulher(lisa). mulher(mona). mulher(clancy). mulher(jacqueline). mulher(selma). mulher(patty). mulher(louise). &#160; homem(homer). homem(bart). homem(abraham). homem(clancy). homem(hugo). homem(herb). &#160; progenitor(homer,bart). progenitor(homer,lisa). progenitor(homer,maggie). progenitor(marge,bart). progenitor(marge,lisa). progenitor(marge,maggie). &#160; progenitor(abraham, homer). progenitor(mona, homer). &#160; progenitor(clancy, marge). progenitor(clancy, patty). progenitor(clancy, selma). progenitor(jacqueline, marge). progenitor(jacqueline, patty). [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://silveiraneto.net/wp-content/uploads/2008/01/os_simpsons_no_sofa.gif" alt="Os Simpsons no sofá" /></center></p>
<div class="wp_syntax">
<div class="code">
<pre class="prolog" style="font-family:monospace;">% Fatos.
homer.
marge.
bart.
lisa.
maggie.
mona.
jacqueline.
patty.
abraham.
clancy.
hugo.
louise.
herb.
&nbsp;
mulher(marge).
mulher(maggie).
mulher(lisa).
mulher(mona).
mulher(clancy).
mulher(jacqueline).
mulher(selma).
mulher(patty).
mulher(louise).
&nbsp;
homem(homer).
homem(bart).
homem(abraham).
homem(clancy).
homem(hugo).
homem(herb).
&nbsp;
progenitor(homer,bart).
progenitor(homer,lisa).
progenitor(homer,maggie).
progenitor(marge,bart).
progenitor(marge,lisa).
progenitor(marge,maggie).
&nbsp;
progenitor(abraham, homer).
progenitor(mona, homer).
&nbsp;
progenitor(clancy, marge).
progenitor(clancy, patty).
progenitor(clancy, selma).
progenitor(jacqueline, marge).
progenitor(jacqueline, patty).
progenitor(jacqueline, selma).
&nbsp;
progenitor(abraham, herb).
&nbsp;
progenitor(herb, hugo).
progenitor(louise, hugo).
&nbsp;
% Regras
pai(A,B) :- homem(A), progenitor(A,B).
mãe(A,B) :- mulher(A), progenitor(A,B).
&nbsp;
é_pai(A) :- pai(A,_).
é_mãe(A) :- mãe(A,_).
&nbsp;
filho(A,B):- homem(A), progenitor(B,A).
filha(A,B):- mulher(A), progenitor(B,A).
&nbsp;
irmaos(X,Y) :-
	progenitor(Z,X),
	progenitor(Z,Y),
	X\=Y.
&nbsp;
irmao_completos(A,B) :-
	pai(P,A), pai(P,B),
	mãe(M,A), mãe(M,B),
	A\=B.
&nbsp;
tio(T,A) :-
	homem(T),
	irmaos(T,X), progenitor(X,A).
&nbsp;
tia(T,A) :-
	mulher(T),
	irmaos(T,X), progenitor(X,A).
&nbsp;
primo(A,B) :-
	homem(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).
&nbsp;
prima(A,B) :-
	mulher(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).
&nbsp;
avô(A,B) :- pai(A,X), pai(X,B).
avó(A,B) :- pai(A,X), pai(X,B).</pre>
</div>
</div>
<p>Referências:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Simpsons_family">Simpsons Family</a></li>
<li><a href="http://kti.ms.mff.cuni.cz/~bartak/prolog/genealogy.html">Genealogy Database, Guide to Prolog Programming</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://silveiraneto.net/2008/01/14/familia-simpsons-em-prolog/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Exemplos de Prolog</title>
		<link>http://silveiraneto.net/2007/08/29/exemplos-de-prolog/</link>
		<comments>http://silveiraneto.net/2007/08/29/exemplos-de-prolog/#comments</comments>
		<pubDate>Thu, 30 Aug 2007 01:00:13 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Inteligência Aritficial]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Prolog]]></category>

		<guid isPermaLink="false">http://silveiraneto.net/2007/08/29/exemplos-de-prolog/</guid>
		<description><![CDATA[Prolog é uma linguagem de programação geralmente usada para inteligência artificial e linguística computacional. Faz um tempo que eu não uso Prolog então esse é meio um tutorial relâmpago para eu relembrar um pouco. São um apanhado de exemplos básicos e um guia de instalação e uso do swi-prolog no Ubuntu. Instalação e Uso No [...]]]></description>
			<content:encoded><![CDATA[<p>Prolog é uma linguagem de programação geralmente usada para inteligência artificial e linguística computacional.</p>
<p><center><img src="http://silveiraneto.net/wp-content/uploads/2007/08/grafo_arvore.gif" alt="Grafo em árvore" /></center>Faz um tempo que eu não uso Prolog então esse é meio um tutorial relâmpago para eu relembrar um pouco. São um apanhado de exemplos básicos e um guia de instalação e uso do swi-prolog no Ubuntu.</p>
<p><span id="more-151"></span></p>
<h3>Instalação e Uso</h3>
<p>No Ubuntu há duas implementações de prolog disponíveis, a gprolog e a swi-prolog. Eu vou ficar com o swi-prolog que é um interpretador de prolog. Para instala-lo:</p>
<blockquote><p>sudo apt-get install swi-prolog</p></blockquote>
<p>Isso vai instalar o binário <em>swipl</em> que é o interpretador de Prolog.</p>
<h3>Exemplo 1 &#8211; Fatorial</h3>
<p>Crie um arquivo chamado fatorial.pl com esse conteúdo:</p>
<pre lang="PL/SQL">
factorial(0,1). 

factorial(N,F) :-
   N&gt;0,
   N1 is N-1,
   factorial(N1,F1),
   F is N * F1.</pre>
<p>Estando na mesma pasta do arquivo, chame o interpretador swipl:</p>
<blockquote><p>$ swipl<br />
Welcome to SWI-Prolog (Multi-threaded, Version 5.6.14)<br />
Copyright (c) 1990-2006 University of Amsterdam.<br />
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,<br />
and you are welcome to redistribute it under certain conditions.<br />
Please visit http://www.swi-prolog.org for details.</p>
<p>For help, use ?- help(Topic). or ?- apropos(Word).</p>
<p>?- ['fatorial.pl'].<br />
% fatorial.pl compiled 0.00 sec, 760 bytes</p>
<p>Yes<br />
?-</p></blockquote>
<p>O comando ['arquivo.pl']. (com ponto) vai carregar e interpretar um arquivo chamado arquivo.pl. Algumas &#8220;perguntas&#8221; que podemos fazer ao programa:</p>
<blockquote><p>?- fatorial(0,1).<br />
Yes<br />
?- fatorial(10,What).<br />
What = 3628800<br />
Yes</p></blockquote>
<p>As perguntas feitas foram:</p>
<ul>
<li>Fatorial de 0 é 1?</li>
<li>Quanto é o fatorial de 10?</li>
</ul>
<h3>Exemplo 2 &#8211; Torres de Hanoi</h3>
<p>O famoso problema das <a href="http://pt.wikipedia.org/wiki/Torre_de_Hanoi">Torres de Hanoi</a>.  Num arquivo chamado hanoi.pl escreva:</p>
<pre lang="PL/SQL">
move(1,X,Y,_) :-
    write('Move top disk from '),
    write(X),
    write(' to '),
    write(Y),
    nl.
move(N,X,Y,Z) :-
    N&gt;1,
    M is N-1,
    move(M,X,Z,Y),
    move(1,X,Y,_),
    move(M,Z,Y,X).</pre>
<p>Carregando o programa com ['hanoi.pl']. dentro do swipl podemos fazer o teste:</p>
<blockquote><p> ?-  move(3,left,right,center).<br />
Move top disk from left to right<br />
Move top disk from left to center<br />
Move top disk from right to center<br />
Move top disk from left to right<br />
Move top disk from center to left<br />
Move top disk from center to right<br />
Move top disk from left to right</p>
<p>yes</p></blockquote>
<h3>Exemplo 3 &#8211; Grafo</h3>
<p>Suponha o seguinte grafo que será representado no código-fonte:</p>
<p><center><img src="http://silveiraneto.net/wp-content/uploads/2007/08/grafo.gif" alt="Um grafo de 5 vértices" /></center>Vamos representa-lo no código-fonte a seguir que também possui definições para caminhos e viagens.</p>
<pre lang="PL/SQL">
edge(1,2).
edge(1,4).
edge(1,3).
edge(2,3).
edge(2,5).
edge(3,4).
edge(3,5).
edge(4,5).

connected(X,Y) :- edge(X,Y) ; edge(Y,X).

path(A,B,Path) :-
       travel(A,B,[A],Q),
       reverse(Q,Path).

travel(A,B,P,[B|P]) :-
       connected(A,B).
travel(A,B,Visited,Path) :-
       connected(A,C),
       C \== B,
       \+member(C,Visited),
       travel(C,B,[C|Visited],Path).</pre>
<p>Vamos perguntar qual o caminho entre 1 e 5:</p>
<blockquote><p>?- path(1,5,W).<br />
W = [1, 2, 5]<br />
Yes</p></blockquote>
<p>De onde veio e para onde vai o caminho 1, 2, 5, 4.</p>
<blockquote><p>?- path(DE, PARA, [1,2,5,4]).<br />
DE = 1<br />
PARA = 4<br />
Yes</p></blockquote>
<p><strong>Referencias</strong></p>
<ul>
<li><a href="http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html">http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html</a></li>
<li><a href="http://en.wikipedia.org/wiki/Prolog">http://en.wikipedia.org/wiki/Prolog</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://silveiraneto.net/2007/08/29/exemplos-de-prolog/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

