<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="pt" lang="pt">
<head>
<title>Casamento de padrões</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Casamento_de_padrões"/>
<meta name="wx_page_id" content="54606"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Casamento de padrões" id="wxsec1"><h1 class="pagetitle" id="wx1">Casamento de padrões</h1>

<p id="wx2">Em <a href="/wpt/Ci%C3%AAncia_da_computa%C3%A7%C3%A3o" title="Ciência da computação" wx:linktype="known" wx:pagename="Ciência_da_computação" wx:page_id="2683" id="wx3">ciência da computação</a>, <b id="wx4">casamento de padrões</b> é o ato de verificação da presença de um padrão em um conjunto de dados. Em contraste ao <a href="/wpt/Reconhecimento_de_padr%C3%B5es" title="Reconhecimento de padrões" wx:linktype="known" wx:pagename="Reconhecimento_de_padrões" wx:page_id="919959" id="wx5">reconhecimento de padrões</a>, o padrão é rigidamente especificado, seja por uma <a href="/wpt/Cadeia_de_caracteres" title="Cadeia de caracteres" wx:linktype="known" wx:pagename="Cadeia_de_caracteres" wx:page_id="1024093" id="wx6">cadeia de caracteres</a> ou uma <a href="/wpt/%C3%81rvore_%28estrutura_de_dados%29" title="Árvore (estrutura de dados)" wx:linktype="known" wx:pagename="Árvore_(estrutura_de_dados)" wx:page_id="131101" id="wx7">árvore</a>. O casamento de padrões é usado para testar se o objeto de estudo possui a estrutura desejada, para então encontrar a estrutura relevante, encontrar os pontos de alinhamento e substituir a parte do casamento por outra estrutura. Padrões de sequência (como cadeias de texto) são geralmente escritos usando <a href="/wpt/Express%C3%A3o_regular" title="Expressão regular" wx:linktype="known" wx:pagename="Expressão_regular" wx:page_id="754" id="wx8">expressões regulares</a>.</p>

<p id="wx9">Padrões de árvores podem ser usados em <a href="/wpt/Linguagem_de_programa%C3%A7%C3%A3o" title="Linguagem de programação" wx:linktype="known" wx:pagename="Linguagem_de_programação" wx:page_id="13352" id="wx10">linguagens de programação</a> como uma ferramenta geral para processar dados baseado em sua estrutura. Algumas <a href="/wpt/Programa%C3%A7%C3%A3o_funcional" title="Programação funcional" wx:linktype="known" wx:pagename="Programação_funcional" wx:page_id="1464" id="wx11">linguagens de programação funcionais</a> como <a href="/wpt/Haskell_%28linguagem_de_programa%C3%A7%C3%A3o%29" title="Haskell (linguagem de programação)" wx:linktype="known" wx:pagename="Haskell_(linguagem_de_programação)" wx:page_id="9242" id="wx12">Haskell</a>, <a href="/wpt/ML_%28linguagem_de_programa%C3%A7%C3%A3o%29" title="ML (linguagem de programação)" wx:linktype="known" wx:pagename="ML_(linguagem_de_programação)" wx:page_id="537553" id="wx13">ML</a> e <a href="/wpt/Mathematica" title="Mathematica" wx:linktype="known" wx:pagename="Mathematica" wx:page_id="92647" id="wx14">Mathematica</a> possuem uma sintaxe especial para expressar padrões de árvore e uma construção na linguagem para execução condicional. Por questões de simplicidade e eficiência, tais padrões de árvore carecem algumas das funcionalidades disponíveis em expressões regulares.</p>

<div id="wx_toc"/>

<a id="Padr.C3.B5es_primitivos" name="Padr.C3.B5es_primitivos"/>
<wx:section level="2" title="Padrões primitivos" id="wxsec2"><h2 id="wx15">Padrões primitivos</h2>

<p id="wx16">O padrão mais simples em um casamento de padrões é um valor explícito (literal) ou uma <a href="/wpt/Vari%C3%A1vel_%28programa%C3%A7%C3%A3o%29" title="Variável (programação)" wx:linktype="known" wx:pagename="Variável_(programação)" wx:page_id="898517" id="wx17">variável</a>. Por exemplo, consirando uma simples definição de função em Haskell:</p>

<pre id="wx18">
f 0 = 1
</pre>

<p id="wx19">Aqui, o parâmetro <code id="wx20">0</code> da função <code id="wx21">f</code> é um padrão literal. Sempre que a função for invocada com o valor <code id="wx22">0</code> como argumento, o retorno será <code id="wx23">1</code>. com qualquer outro valor, o casamento (e a função) irá falhar. Pode-se continuar a definição estendendo para argumentos mais genéricos:</p>

<pre id="wx24">
f n = n * f (n-1)
</pre>

<p id="wx25">Aqui, o argumento <code id="wx26">n</code> é um padrão de variável, que irá casar com qualquer argumento na invocação da função, assumindo uma referência do valor. O padrão especial <code id="wx27">_</code> também é usado para casar padrões, mas ele não assume a referência do valor, simplesmente ignora.</p>

<a id="Padr.C3.B5es_de_.C3.A1rvore" name="Padr.C3.B5es_de_.C3.A1rvore"/>
</wx:section><wx:section level="2" title="Padrões de árvore" id="wxsec3"><h2 id="wx28">Padrões de árvore</h2>

<p id="wx29">Padrões mais complexos podem ser construídos a partir de primitivos, geralmente da mesma forma que os valores são construídos ao combinar outros valores. A diferença é que o padrão não é construído em um único valor, mas sim um grupo de valores. Um padrão de árvore descreve uma parte de uma árvore ao começar com um nó e especificando alguns galhos. Em Haskell, a seguinte linha define um <a href="/wpt/Tipo_de_dado" title="Tipo de dado" wx:linktype="known" wx:pagename="Tipo_de_dado" wx:page_id="129894" id="wx30">tipo de dado</a> algébrico <code id="wx31">Color</code> que possui um construtor <code id="wx32">ColorConstructor</code> que associa um inteiro e uma cadeia de caracteres.</p>

<pre id="wx33">
 data Color = ColorConstructor Integer String
</pre>

<p id="wx34">O construtor é um nó em uma árvore, o inteiro e a cadeia de caracteres são folhas em galhos. Quando quer-se escrever funções para fazer de <code id="wx35">Color</code> um tipo de dado abstrato, quer-se escrever funções para criar uma <a href="/wpt/Interface" title="Interface" wx:linktype="known" wx:pagename="Interface" wx:page_id="6949" id="wx36">interface</a> com o tipo de dado, para extrair alguma informação do tipo de dado; no caso, ou o valor inteiro ou a cadeia de caracteres. Logo, para uma função retornar o valor inteiro de <code id="wx37">Color</code>, o seguinte padrão de árvore é aplicado:</p>

<pre id="wx38">
integerPart (ColorConstructor theInteger _) = theInteger
</pre>

<p id="wx39">Ou para a cadeia de caracteres:</p>

<pre id="wx40">
stringPart (ColorConstructor _ theString) = theString
</pre>

<a id="Relacionamento_com_cadeias_de_caracteres" name="Relacionamento_com_cadeias_de_caracteres"/>
</wx:section><wx:section level="2" title="Relacionamento com cadeias de caracteres" id="wxsec4"><h2 id="wx41">Relacionamento com cadeias de caracteres</h2>

<p id="wx42">O uso mais comum de casamento de padrões envolve cadeias de caracteres. Em várias linguagens de programação, uma sintaxe particular de cadeias de caracteres é usada pra representar <a href="/wpt/Express%C3%B5es_regulares" title="Expressões regulares" wx:linktype="known" wx:pagename="Expressões_regulares" wx:page_id="15126" id="wx43">expressões regulares</a>, que são padrões para descrever cadeias de caracteres.</p>

<p id="wx44">Em linguagens funcionais de modo geral, cadeias de caracteres são representadas como <a href="/wpt/Lista" title="Lista" wx:linktype="known" wx:pagename="Lista" wx:page_id="38143" id="wx45">listas</a> de caracteres. De forma funcional, elas são definidas como uma lista vazia, ou um elemento anexado a uma lista existente. Em Haskell:</p>

<pre id="wx46">
[]      -- uma lista vazia
x:xs    -- um elemento x anexado em uma lista xs
</pre>

<p id="wx47">A estrutura de uma lista é então <code id="wx48">elemento:resto_da_lista</code>. No casamento de padrões é assegurado que certo pedaço de dado é igual a certo padrão. Por exemplo, na seuginte função:</p>

<pre id="wx49">
primeiro_elemento (elemento:lista) = elemento
</pre>

<p id="wx50">é assegurado que o primeiro elemento do argumento de <code id="wx51">primeiro_elemento</code> é chamado elemento, e que é isso que a função retorna. Sabe-se que é o primeiro elemento pois é assim que as listas são definidas (um elemento anexado a uma lista). Uma lista vazia não irá casar com o padrão, pois não possui primeiro elemento. Como não existe uso para o resto da lista, então pode-se omiti-lo do código, como em:</p>

<pre id="wx52">
primeiro_elemento (elemento:_) = elemento
</pre>

<a id="Ver_tamb.C3.A9m" name="Ver_tamb.C3.A9m"/>
</wx:section><wx:section level="2" title="Ver também" id="wxsec5"><h2 id="wx53"><wx:template id="wx_t1" pagename="Predefinição:Ver_também" page_id="62492"/>Ver também<wx:templateend start="wx_t1"/></h2>

<ul id="wx54">
<li id="wx55"><a href="/wpt/Reconhecimento_de_padr%C3%B5es" title="Reconhecimento de padrões" wx:linktype="known" wx:pagename="Reconhecimento_de_padrões" wx:page_id="919959" id="wx56">Reconhecimento de padrões</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wpt/index.php?title=Especial:Categories&amp;article=Casamento_de_padr%C3%B5es" title="Especial:Categories" wx:linktype="known" wx:pagename="Especial:Categories" id="wx57">Categorias de páginas</a>: <span dir="ltr" id="wx58"><a href="/wpt/Categoria:Linguagens_formais" title="Categoria:Linguagens formais" wx:linktype="known" wx:pagename="Categoria:Linguagens_formais" wx:page_id="472378" id="wx59">Linguagens formais</a></span></div>
<div id="wx_languagelinks">
Outras línguas: <a href="http://bn.wikipedia.org/wiki/%E0%A6%AC%E0%A6%BF%E0%A6%A8%E0%A7%8D%E0%A6%AF%E0%A6%BE%E0%A6%B8_%E0%A6%AE%E0%A6%BF%E0%A6%B2%E0%A6%95%E0%A6%B0%E0%A6%A3" class="external" wx:linktype="interwiki" wx:pagename="bn:বিন্যাস_মিলকরণ" id="wx60">বাংলা</a> | <a href="http://de.wikipedia.org/wiki/Pattern_Matching" class="external" wx:linktype="interwiki" wx:pagename="de:Pattern_Matching" id="wx61">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Pattern_matching" class="external" wx:linktype="interwiki" wx:pagename="en:Pattern_matching" id="wx62">English</a> | <a href="http://fr.wikipedia.org/wiki/Filtrage_par_motif" class="external" wx:linktype="interwiki" wx:pagename="fr:Filtrage_par_motif" id="wx63">Français</a> | <a href="http://ja.wikipedia.org/wiki/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81" class="external" wx:linktype="interwiki" wx:pagename="ja:パターンマッチ" id="wx64">日本語</a></div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name=""/></wx:templatearguments>
</html>
