<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ali="http://www.niso.org/schemas/ali/1.0">
  <front>
    <article-meta>
      <article-categories>
        <subj-group>
          <subject content-type="Tipo de contribuição">Artigo</subject>
        </subj-group>
      </article-categories>
      <title-group>
        <article-title>REPRESENTAÇAO SEMÂNTICA EM ANALISADORES GRAMATICAIS</article-title>
      </title-group>
      <contrib-group content-type="author">
        <contrib id="person-31a3681644cfc43d3dfcdfd8a0c3ce1b" contrib-type="person" equal-contrib="no" corresp="yes" deceased="no">
          <name>
            <surname>Pagani</surname>
            <given-names>Luiz Arthur</given-names>
          </name>
          <xref ref-type="aff" rid="affiliation-204ac3b57215eab5e0cda8350c4bd547" />
        </contrib>
      </contrib-group>
      <aff id="affiliation-204ac3b57215eab5e0cda8350c4bd547">
        <institution content-type="orgname">Universidade Federal do Paraná (UFPR)</institution>
      </aff>
      <pub-date date-type="pub" iso-8601-date="jan/jun 2011" />
      <volume>10</volume>
      <issue>1</issue>
      <fpage>61</fpage>
      <lpage>85</lpage>
      <page-range>61-85</page-range>
      <permissions id="permission">
        <license>
          <ali:license_ref>http://creativecommons.org/licenses/by/4.0/</ali:license_ref>
        </license>
      </permissions>
      <abstract>
        <p id="_paragraph-1">
          <italic id="italic-7957c2e3012ba690b47b4c80f4a60c22">Até hoje, muitos analisadores gramaticais constroem apenas uma análise sintática. Na tentativa de reverter esta situação, revisaremos algumas implementações que também incluem alguma representação semântica; e, depois da identiﬁcação de algumas inadequações destas implementações, proporemos uma alternativa que se pretende mais consistente com as teorias semânticas modernas, baseada no cálculo de predicados e na redução-β.</italic>
        </p>
      </abstract>
      <abstract abstract-type="executive-summary">
        <title>Abstract</title>
        <p id="_paragraph-2">
          <italic id="italic-1">Even nowadays, many parsers construct only a syntactic analysis. In an attempt to revert this situation we will revise some implementations that include a semantic interpretation; and after the identiﬁ</italic>
          <italic id="italic-2">cation of some drawback of those implementations we will propose an </italic>
          <italic id="italic-3">alternative that intend to be more consistent with modern semantic theories, based on predicate </italic>
          <italic id="italic-4">calculus and β</italic>
          <italic id="italic-5">-reduction.<italic id="italic-6"/></italic>
        </p>
      </abstract>
      <kwd-group>
        <kwd content-type="">
          <italic id="italic-3925e2895be3a12f0c3fcbe54484a81e">Parser</italic>
        </kwd>
        <kwd content-type="">
          <italic id="italic-bcbc7404808ee89901133ed47e8b27d3">Semantic interpretation</italic>
        </kwd>
        <kwd content-type="">
          <italic id="italic-e1e56105d7659fa23a663f8aab22ca63">Prolog</italic>
        </kwd>
        <kwd content-type="">
          <italic id="italic-db26fb885bebaa2fea90acda7fcb9a8d">β-reduction</italic>
        </kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body id="body">
    <sec id="heading-b3d5c6558db10188e7d0ad5e1b78307e">
      <title>Introdução</title>
      <p id="paragraph-1">Ainda hoje, analisadores gramaticais (parsers) são, na verdade, analisadores sintáticos, porque neles o resultado do processamento é apenas uma representação da estrutura sintática da expressão analisada (como em Dougherty 1994, Matthews 1998 e Othero &amp; Menuzzi 2005), apesar de não ser nova a preocupação de também construir uma interpretação semântica (como em Pereira &amp; Schieber 1987: 91–114 e Covington 1994: 196–256)<xref id="xref-62901f46240b96eb02202244bdc86915" ref-type="fn" rid="footnote-f22a3b724d6a1a76b204176a7d69ce04">1</xref>. Tampouco é nova a preocupação com a formalização da interpretação semântica, independentemente de sua implementação computacional, o que torna ainda menos compreensível essa ausência nos analisadores gramaticais, dado que o modelamento computacional oferece um bom “campo de provas” para teorias formalizadas.</p>
      <p id="paragraph-2">Portanto, o que se pretende com este trabalho é apresentar alguns analisadores, implementados em Prolog, que produzem uma representação semântica para cada expressão analisada. A partir desta apresentação, serão discutidas questões relativas tanto à representação semântica quanto à implementação computacional. Em relação à representação semântica, discutiremos a escolha de representar um nome próprio como <italic id="italic-e5902c8432536d3b9146da4785418b66">Pedro </italic>através de (pedro^S)^S (pela compatibilização com os quantiﬁcadores generalizados). Já sobre a implementação computacional, discutiremos o uso de variáveis do Prolog como variáveis da interpretação semântica e a maneira como a redução-β é deﬁnida — o que causa uma uniﬁcação de variáveis incomum do ponto de vista semântico durante o processamento (ainda que o resultado ﬁnal seja coerente).</p>
    </sec>
    <sec id="heading-352bf9cb7f2269dac7713aad5c971e54">
      <title>1. Analisadores gramaticais</title>
      <p id="heading-945645ae6f2b315d2a04553fbd1a9e9c">Como estamos interessados em uma questão muito especíﬁca da representação semântica, na qual a estrutura sintática não tem relevância (já que não estaremos discutindo nada sobre ambiguidade, nem mesmo a estrutural), vamos nos ater apenas à construção da representação semântica, desconsiderando a estrutura sintática. Observemos, então, o funcionamento de dois analisadores desse tipo: o de Pereira &amp; Shieber e o de Covington.</p>
      <sec id="heading-ad0ec3393170cd72c09cd6d440e5e440">
        <title>2.1. Pereira &amp; Shieber</title>
        <p id="paragraph-edcdbfe13d7c4d1947146997781a957d">Um dos analisadores mais antigos capaz de lidar com a interpretação é o de Pereira &amp; Shieber (1987: 102–103):</p>
        <p id="paragraph-7e5bc83d43b1ac36ce60b204b964992b">:- op (500, xfy, &amp;) .</p>
        <p id="paragraph-d0cb799d52a70b8a33f30588b8197086">:- op (510, xfy, =&gt;) .</p>
        <p id="paragraph-45cac6fa3d07bcdca155555015a7aa93">s (S) --&gt; np(VP^S), vp (VP) .</p>
        <p id="paragraph-3">np(NP) --&gt; det(N1^NP), n (N1) .</p>
        <p id="paragraph-4">np ((E^S)^S) --&gt; pn (E) .</p>
        <p id="paragraph-6">vp (X^S) --&gt; tv(X^IV), np (IV^S). vp(IV) --&gt; iv(IV) .</p>
        <p id="paragraph-8">det (LF) --&gt; [D], {det (D, LF)} .</p>
        <p id="paragraph-10">det (every, (X^S1)^(X^S2)^all (X,S1 =&gt; S2)) .</p>
        <p id="paragraph-23afcc3e254b61e73b2689244af107a1">det (a, (X^S1)^(X^S2)^exists (X, S1 &amp; S2)) .</p>
        <p id="paragraph-00e5fb3db2485d08e62103a2b0c4e331">n (LF) --&gt; [N], {n(N, LF)} .</p>
        <p id="paragraph-5d2d5bcb513ce3befdc2a065e2250031">n (program, X^program(X)) .</p>
        <p id="paragraph-97ee6717e393e7906b026a36f2716e46">n (student, X^student(X)) .</p>
        <p id="paragraph-5">pn (E) --&gt; [PN], {pn(PN, E)} .</p>
        <p id="paragraph-7">pn (terry, terry). pn(shrdlu, shrdlu) .</p>
        <p id="paragraph-9">tv (LF) --&gt; [TV], {tv(TV, LF)} .</p>
        <p id="paragraph-11">tv (wrote, X^Y^wrote(X, Y)) .</p>
        <p id="paragraph-890e0735ad3fcfd31d8dbe8fe988bd8e">iv(LF) --&gt; [IV], {iv(IV, LF)} .</p>
        <p id="paragraph-12">iv(halts, X^halts(X)) .</p>
        <p id="paragraph-74c7e9b7b63a2f3b9085c9673bd70a34">Este programa foi transcrito quase integralmente; retiramos dele apenas a alternativa de acrescentar no SN uma oração relativa. No resto, o programa tem a mesma estrutura do original; dele, três características merecem ser observadas.</p>
        <p id="paragraph-da0dd9250d0691b980f37292d4f5ccc8">A primeira delas, que também é a causa das outras duas, é que um determinante pode ser representado como (X^S1)^(X^S2)^all(X, S1 =&gt; S2) (o universal) e não como P^Q^all(X, P@X =&gt; Q@X); isso se deve à execução parcial da aplicação e da redução: ao invés de uma implicação entre duas aplicações (P@X e Q@X), ocorre uma implicação entre dois termos (S1 e S2) nos quais as aplicações e suas respectivas reduções acontecem à esquerda do operador- (X^S1 e X^S2). A explicação (Pereira &amp; Shieber 1987: 100) é a de que as fórmulas para os quantiﬁcadores generalizados precisam ser Q^all(X, program(X) =&gt; Q), sendo que “Q é a aplicação de R a X, de modo que se efetue reduz(R, X, Q)”. A uniﬁcação faz R=X^Q, e a fórmula pode ser reescrita como (X^Q)^all(X, program(X) =&gt; Q); portanto, a abstração de Y^program (Y) nos leva a (X^P)^(X^Q)^all(X, P =&gt; Q) como representação de <italic id="italic-de0135e7d92ae45ec032850c5da58cdb">every</italic>.</p>
        <p id="paragraph-a1a440c5c9ea2f5ea9a1e0946495ecbc">A segunda característica é a interpretação dos nomes próprios. Devido à execução parcial da redução e da aplicação, a representação do signiﬁcado do nome próprio Shrdlu acaba ﬁcando como (shrdlu^P)^P, ao invés da mais simples P^P@shrdlu (λP.(P shrdlu)). Como um verbo como halts recebe a representação semântica X^halts(X), a uniﬁcação para s(S) --&gt; np(VP^S), vp(VP) faz VP^S=(shrdly^P)^P e VP=X^halts(X); destas primeiras duas equivalências, decorre que:</p>
        <p id="paragraph-58bb05276dacbd9c3493eb5506ddd376">• (X^halts(X))^S=(shrdlu^P)^P,</p>
        <p id="paragraph-13aa57cbee07b4ba73b3677165650b2c">• X=shrdlu,</p>
        <p id="paragraph-0b171729e79ea0b95b523142131570bd">• P=halts(X) (e, portanto, P=halts(shrdlu)),</p>
        <p id="paragraph-1c41faf4ca05036d7b1d64990a7b00ac">• S=P e, ﬁnalmente,</p>
        <p id="paragraph-c3a9180caf15e8cecc6e6bab6ac00354">• S=halts(shrdlu) .</p>
        <p id="paragraph-f801411ee72c0eff5bcad2a3dcbd6aee">Pode parecer complicado, mas como reconhecem os próprios autores (Pereira &amp; Shieber 1987: 101):</p>
        <p id="paragraph-c9bc113b440f5421cb45224c6a37cfaa">a forma lógica de Shrdlu parece contra-intuitiva, porque não corresponde à codiﬁcação de nenhuma expressão-λ. A posição que deveria ser ocupada por uma variável é ocupada pela constante shrdlu.</p>
        <p id="paragraph-e9bd6a6b760464528448456dc69d9747">Isto porque</p>
        <p id="paragraph-a406e562226484fbb91d3bfa16ba8e87">a execução parcial da aplicação pode resultar em expressões bizarras, justamente por causa da execução parcial. Apenas uma parte da tarefa da redução-β é executada, o restante acaba sendo realizado durante o processamento, quando as variáveis envolvidas são instanciadas. Portanto, não devemos nos preocupar tanto com o fato de que a codiﬁcação das expressões-λ que estamos usando apresentem algumas propriedades que o cálculo abstratamente não apresente.</p>
        <p id="paragraph-02b9915a692e8d0923951f5a1a851277">(Efetivamente, o funcionamento do programa é o esperado; mas como veremos depois, há motivo para desconﬁarmos dessa codiﬁcação através de “expressões bizarras”.)</p>
        <p id="paragraph-6e8ba7c98bff71427c10c3c894f5c7f6">Finalmente, a terceira característica está relacionada aos verbos transitivos diretos: wrote é representado como X^Y^wrote(X, Y), ao invés de Y^X^wrote(X, Y), que seria o esperado para <italic id="italic-1812ce791017ec331d70c763b5a04cd3">λy.λx. wrote(x, y)</italic>. Aqui, a inversão na ordem das variáveis é afetada pela execução parcial e pela facilidade para a uniﬁcação da regra para o verbo transitivo direto: vp(X^S) --&gt; tv(X^IV), np(IV^S). Pela uniﬁcação, X^IV=X^Y^wrote(X,Y); supondo que o objeto direto seja <italic id="italic-d8762d9b01debde40c906b5fcf838378">Terry</italic>, também é preciso que IV^S=(terry^P)^P. Assim, IV=Y^wrote(X, Y)=terry^P, S=P; daí, então, Y=terry, P=wrote(X,Y) — consequentemente P=wrote(X, terry) — e S=wrote(X,terry). Portanto, o signiﬁcado do SV (X^S) é instanciado como X^wrote(X,terry).</p>
        <p id="paragraph-d17a108b47e38ad9b9b6b6f0a8ba3522">Apesar disto, o programa constrói as representações corretas (que os autores chamam de forma lógica (<italic id="italic-64c4d3b2d58477990d259d9a8b19b21c">logical form</italic>)). Em Pereira &amp; Shieber 1987: 103, são apresentados três exemplos:</p>
        <p id="paragraph-b62c3b6010d36fc3e18c671c568a61ca">?- s(LF,[terry,wrote,shrdlu],[]). LF=wrote(terry,shrdlu) ? ;</p>
        <p id="paragraph-afebb5f7898068791dd6f823a66c1c72">no</p>
        <p id="paragraph-4daad1851c1b530cafe13f5f8254329d">?- s(LF,[every,program,halts],[]). LF=all(A,program(A) =&gt; halts(A)) ? ; no</p>
        <p id="paragraph-051e766c0c9e6969d64e10d62ecb2c7d">?-</p>
        <p id="paragraph-f3691d172f42cbe331af62cfba663ab8">s(LF,[every,student,wrote,a,program],[]) .</p>
        <p id="paragraph-ff75ee0c3d0c26c03d025af77a2d6eac">LF=all(A,student(A) =&gt; exists(B, program(B) &amp;</p>
        <p id="paragraph-282ea1cf52a980830f24001275693543">wrote(A,B))) ? ;</p>
        <p id="paragraph-380fa5e9ce2c1726ac7af25881426fd2">no</p>
        <p id="paragraph-ac2edef7b99fa76119f54f588e2ef70d">Não é preciso muita perspicácia para perceber que este analisador não apresenta as duas interpretações de uma sentença ambígua como <italic id="italic-96de9aba2cc66f15b8aa5053bfd9e27a">every student wrote a program </italic>(uma na qual o quantiﬁcador universal tem escopo sobre o existencial — que é a que o programa apresenta — e outra na qual o existencial tem escopo sobre o universal); na sequência, os autores (Pereira e Shieber 1987: 104–114) explicam a construção de um analisador para esta ambiguidade de escopo, mas não podemos nos ocupar com isso agora, pois nos afastaria da questão discutida aqui. Vejamos então um outro analisador que constrói a representação semântica da expressão analisada.</p>
      </sec>
      <sec id="heading-b30a1b6e0e8bcab4b7fe3bc967ea632a">
        <title>1.2. Covington</title>
        <p id="paragraph-012d154f1be5e8fd4ab6f5b68e3fed47">Um segundo analisador gramatical que constrói uma representação semântica é o de Covington (1994: 207–210):</p>
        <fig id="figure-panel-fccb70a83a202fde628177679d1db4a2">
          <label>Figure 1</label>
          <caption>
            <p id="paragraph-c1f2c2c8e8cb941483a04de56e8b6c2f" />
          </caption>
          <graphic id="graphic-5d94a692e33a67dd418cd0d38d62bf56" mimetype="image" mime-subtype="png" xlink:href="2021-06-13 (2).png" />
        </fig>
        <p id="heading-ece0e72f568b8b88cbb5eb84532d5297">Ao contrário de Pereira &amp; Shieber, Covington não nos oferece uma listagem completa; assim, o programa acima é uma reconstrução a partir das explicações apresentadas pelo autor.</p>
        <p id="paragraph-0d3e728395f289e35dc689a76090e0b7">Mas se esta reconstituição está correta, o programa de Covington não é muito diferente do de Pereira &amp; Shieber. A primeira diferença mais evidente é a codiﬁcação do escopo dos quantiﬁcadores: enquanto estes representam explicitamente os conectivos (&amp;, para a quantiﬁcação existencial, e =&gt;, para a universal), aquele prefere deixar essa informação implícita; assim, <italic id="italic-34869adfdc777c69ccf4134455f808ab">a cat meowed </italic>e <italic id="italic-b4ac2da923f027171393810dcee3cbeb">every dog barked </italic>podem ser representadas, respectivamente, como some(A, cat(A), meow(A)) e all(A, dog(A), bark(A)). (A diferença entre elas vai aparecer nas deﬁnições dos predicados some/3 e all/3.) No entanto, essa não chega a ser uma diferença relevante para caracterizar uma estratégia distinta de lidar com a questão.</p>
        <p id="paragraph-75ab6b43bf8780cdc07c632971e0f533">Uma diferença mais substancial pode ser vista nos verbos transitivos diretos: no programa de Covington, o signiﬁcado de chased é Y^X^chase(X,Y) (com as variáveis na mesma ordem que λy.λx. chase(x, y)), ao contrário do que acontecia no programa de Pereira &amp; Shieber, em que wrote era representado como X^Y^wrote(X,Y). Ainda que também não caracterize nenhuma diferença de estratégia, a solução de Covington é mais coerente com o termo- correspondente. Para isso, no entanto, foi preciso “espalhar” mais a solução de Pereira &amp; Shieber: a regra para o verbo transitivo direto passa a ser:</p>
        <fig id="figure-panel-eb1cf357a577faa50dc596864268d6a2">
          <label>Figure 2</label>
          <caption>
            <p id="paragraph-4463cccf76fcd92c9fb640bbb804d588" />
          </caption>
          <graphic id="graphic-866b47d23bda8103ef43c049f3587972" mimetype="image" mime-subtype="png" xlink:href="Captura de tela 2021-06-01 185554_2.png" />
        </fig>
        <p id="paragraph-86750084e5dffe69d48455de25abe564">de forma que a representação do verbo transitivo é manipulada para acessar a variável adequada (ao invés dela ser invertida no léxico). Em relação à representação do nome próprio, aqui ele também sofre uma promoção de tipo quando passa pela regra de formação do sintagma nominal, exatamente como no anterior. E, também como antes, essa versão não capta ambiguidades de escopo. Mas, ao contrário dos autores anteriores, apesar de reconhecer a existência da ambiguidade de escopo, Covington não apresenta uma solução — ele apenas sugere, como exercício (Convington 1994: 214), que o leitor implemente um predicado raise_quantifier/2, que atuaria colocando o quantiﬁcador interno numa posição mais externa. De qualquer maneira, para construir a representação semântica de <italic id="italic-8084c1fd09dd1a98767768b762e26e2d">every dog chased a cat</italic>, este analisador também funciona adequadamente:</p>
        <p id="paragraph-6b88ef3d1ae24c42677ed5ea7c958f54">?- s (Sem, [every, dog, chased, a, cat],[ ]) .</p>
        <p id="paragraph-9bd7d7d9f38f90086328745379a89b0c">Sem=all (A, dog (A), some (B, cat (B), chase (A, B))) ? ;</p>
        <p id="paragraph-bcd0ca7f3311da8d041eb8b8bcd55e62">no</p>
        <p id="paragraph-cbfd87eb7ba419030926a9e19cfb0f15">(Outra diferença, que talvez nem merecesse ser observada, aparece na regra da sentença: para Covington, ela é s(Sem) --&gt; np((X^Scope)^Sem), vp(X^Scope), enquanto que, para Pereira &amp; Shieber, ela é s(S) --&gt; np(VP^S), vp(VP). Essas duas regras, porém, são equivalentes, como se pode constatar fazendo S=Sem e VP=X^Scope.)</p>
      </sec>
    </sec>
    <sec id="heading-fef65c75035d18b5ffe34f6827728ca5">
      <title>2. Analisador com histórico derivacional</title>
      <p id="heading-5b07b642d32c15509535bfea5ca09205">Segundo Pereira &amp; Shieber (1987: 95–96n):</p>
      <p id="paragraph-5af4aa0ea13602ea252a255928e88cb2">De um ponto de vista estritamente lógico, o uso de variáveis do Prolog para codiﬁcar variáveis da LPO [lógica de primeira ordem] é incorreto, conﬁgurando um caso de confusão entre variáveis do objeto (as da forma lógica) e variáveis da metalinguagem (as do Prolog — a metalinguagem usada aqui para descrever a relação entre as cadeias linguísticas e as formas lógicas). Seria possível evitar esta confusão entre variáveis do objeto e da metalinguagem através de uma descrição um pouco mais complexa. No entanto, quando este abuso de notação é adequadamente compreendido, é provável que ele não cause nenhum problema e ainda traga benefícios substanciais em relação à simplicidade do programa.</p>
      <p id="paragraph-7b46702c055962416710bb2269ba6123">Esta opinião faz parecer que a escolha não causa danos, apesar de não ser “logicamente correta”, e efetivamente esta solução tem sido adotada mesmo em analisadores mais recentes, como Blackburn &amp; Jos (2005: 73)<xref id="xref-41bfc44a127e844539aa7803e4ec0750" ref-type="fn" rid="footnote-8c984384c81535c02c65c731e946206e">2</xref>. O que se pretende mostrar nesta seção é que, implementando as variáveis da representação semântica através de variáveis do Prolog, a adaptação mais evidente para estes analisadores resulta na construção de uma derivação estrutural inadequada em relação às etapas de sua construção; depois disso, apresentaremos um analisador que executa a derivação respeitando o princípio da composicionalidade.</p>
      <sec id="heading-942965d4fbe5ad264915885fa143a2af">
        <title>2.1. Adaptando os analisadores para a derivação</title>
        <p id="heading-5f05f023f52665899a3d52af35266ef5">O programa abaixo é, basicamente, o analisador de Covnigton adaptado para apresentar seu histórico derivacional. Para um linguista, a apresentação da derivação ajuda a compreender as etapas da construção composicional do signiﬁcado da expressão.</p>
        <p id="paragraph-406f3d256843edbfbef62085887f0566">analisa(Expressão) :-</p>
        <p id="paragraph-8e5ddf8d06fa778c7a65e9d830783a73">categoria(Categoria),</p>
        <p id="paragraph-9a4515753ebf8b0429c5bd8212ff2574">( (Categoria = n; Categoria = v)</p>
        <p id="paragraph-9e053dbdbfd9f503ad63cc0211ca81da">-&gt; Regra =.. [Categoria, _, Sem]</p>
        <p id="paragraph-3d53e4e5a5f861e32f576a2d79b50f94">; Regra =.. [Categoria, Sem]</p>
        <p id="paragraph-e4a1b170359634c48b8e13bff3de5303">),</p>
        <p id="paragraph-a56a195bb07d003c195941da2827ed14">phrase(Regra, Expressão, []),</p>
        <p id="paragraph-23c44b465c6829e9039226b9249eb118">write(Categoria), write(‘:’), nl,</p>
        <p id="paragraph-a70ac4af50dc6fa82e42292b80952aff">apresenta(3, Sem).</p>
        <p id="paragraph-85eaa2b68cb3f351f644a182361fdac2">categoria(s).</p>
        <p id="paragraph-d4a53cc239aeeaecc60ade8d18b93612">categoria(sn).</p>
        <p id="paragraph-f4dea18a252b7d2fe94366da4c4e4680">categoria(sv).</p>
        <p id="paragraph-b88b6178f42a85c3d48af167ade544a4">categoria(det).</p>
        <p id="paragraph-c4c96b06e7a5a7ff58efee122dded149">categoria(n).</p>
        <p id="paragraph-7a5dca83db6c46a93fa2b3c1b238f1d7">categoria(v).</p>
        <p id="paragraph-e288dba29148f5f4c67c29118026e4c9">apresenta(N, [X, Y]) :-</p>
        <p id="paragraph-1eeb04f3058e62ff41f7b847dfa0a8f2">tab(N),</p>
        <p id="paragraph-87d754bf490074b945a02357d71695d1">write(X),</p>
        <p id="paragraph-dd7d316f4cb9c8057bbceae545642c43">nl, nl,</p>
        <p id="paragraph-511e4453bb3545d95c7a0acddac2db1f">M is N + 5,</p>
        <p id="paragraph-82dba5b733874e910b687a7f41aa350c">apresenta_lista(M, Y).</p>
        <p id="paragraph-3a85eb1cb28862e706a4791d57b0d7af">apresenta_lista(_, []). apresenta_lista(N, [X|Y]) :-</p>
        <p id="paragraph-dbcf2dec56c08ffdb01caa0c93b70bb3">apresenta(N, X),</p>
        <p id="paragraph-bb4e0eb7bb02c53e8314b1d036c129a9">apresenta_lista(N, Y).</p>
        <p id="paragraph-b68157ac6c0525f0e274d88289fa82ee">s([S, [SN_Comp, SV_Comp]]) --&gt;</p>
        <p id="paragraph-c61aa22808293dc587d024749f999261">sn(SN_Comp), sv(SV_Comp),</p>
        <p id="paragraph-6a8ec6b2994d2a3b35ee6d328c554c7d">{SN_Comp = [SN, _],</p>
        <p id="paragraph-4466f598a294095d193113ebdaaf2e7b">SV_Comp = [SV, _], SN = SV^S}.</p>
        <p id="paragraph-3c3d2bfcb224c8923a667cef2ba5afd3">sn([N_Promov, [N_Comp]]) --&gt;</p>
        <p id="paragraph-fac98cf51199b7a793cc6a5f693d4acc">n(próprio, N_Comp),</p>
        <p id="paragraph-307adaa9f4cd03c51097ddfd19892504">{N_Comp = [N,_], N_Promov = (N^P)^P}.</p>
        <p id="paragraph-b29eb11329c8a7f69a34803cdcbe0c2d">sn([SN, [Det_Comp, N_Comp]]) --&gt;</p>
        <p id="paragraph-4d84a9157ccff9ab87caec0f988eca85">det(Det_Comp), n(comum, N_Comp),</p>
        <p id="paragraph-cc569009ecffcd3ddf5e8669b7663cfd">{Det_Comp = [Det, _],</p>
        <p id="paragraph-fb858ebf34b66cf79bbb9994bf88d882">N_Comp = [N, _], Det = N^SN}.</p>
        <p id="paragraph-0dfbccbb6aea4544ce995348267aa51d">sv(V) --&gt; v(intransitivo, V).</p>
        <p id="paragraph-c4680bc042bf36b6c27ac3c772ace63a">sv([X^SV, [V_Comp, SN_Comp]]) --&gt;</p>
        <p id="paragraph-f2d4e5f76324c595b6506fdb0ebeb247">v(transitivo, V_Comp),</p>
        <p id="paragraph-7a4dc607ba1b988189d63a527c4d1f36">sn(SN_Comp),</p>
        <p id="paragraph-7662a72a6a2f3dd7adbdbd4d25f44ed3">{SN_Comp = [(Y^V)^SV|_],</p>
        <p id="paragraph-abc65ced32ee10d78fc1f5f0a639313a">V_Comp = [Y^X^V|_]}.</p>
        <p id="paragraph-d5a7676bae9460703fbfce0b5675299d">n(Tipo, [Denotação, []]) --&gt; [Expressão],</p>
        <p id="paragraph-1906eff20b805218be2f3150400a2a33">{n(Tipo, Expressão, Denotação)}.</p>
        <p id="paragraph-383483e457994faf3e19dd98f6c7a02c">n(comum, buraco, X^buraco(X)).</p>
        <p id="paragraph-647416dca23b981e251d2363f4d8f827">n(comum, menino, X^menino(X)).</p>
        <p id="paragraph-e4347acb10a4492f5fb07176290c1df7">n(próprio, pedro, pedro).</p>
        <p id="paragraph-9fb8cbdf72702270f1b28ea2e5b3c2e8">det([Denotação, []]) --&gt; [Expressão],</p>
        <p id="paragraph-fa6bfd0ab2772c0aef520787ab62a9b7">{det(Denotação, Expressão)}.</p>
        <p id="paragraph-7c0835e6efa05519343e2cbf36a8ae79">det((Arg^F1)^(Arg^Func2)^qualquer(Arg, Func1, Func2), todo).</p>
        <p id="paragraph-1f8676a02354bce7b121699e4f7f86fa">det((Arg^Func1)^(Arg^Func2)^algum(Arg, Func1, Func2), um).</p>
        <p id="paragraph-f270c29a86ea0c2facbc90b0eab48751">v(Tipo, [Denotação, []]) --&gt; [Expressão],</p>
        <p id="paragraph-63c398e18b9a332949f68ee1f9775f8f">{v(Tipo, Expressão, Denotação)}.</p>
        <p id="paragraph-33e42ca605e3465bdd0122f9fd672dbf">v(intransitivo, dormiu, X^dormir(X)).</p>
        <p id="paragraph-5d3cc920c8ba786967d523b894f0efe0">v(transitivo, saltou, Y^X^saltar(X, Y)).</p>
        <p id="paragraph-721480b48c9b3495ed836b6828761482">Os predicados analisa/1, categoria/1, apresenta/2 e apresenta_lista/2 apenas facilitam a inicialização e a apresentação da análise (formam uma interface), e por isso não serão comentados.</p>
        <p id="paragraph-f906f2fed973b27c84de7c4502bbdfc4">Esta versão consiste apenas na adaptação do argumento para a representação semântica, de forma que nele se documente sua derivação. Assim, a representação de <italic id="italic-efa027ec93feecdd6a5a65eb0c60899a">Pedro </italic>é [p,[]], indicando que ele denota o indivíduo p e sua derivação não depende de mais nada (a lista vazia); a representação de <italic id="italic-a5953bf6cffa35d30aff8694e9276136">dormiu </italic>ﬁca como [X^dormir(X),[]], também nos informando que a denotação X^dormir(X) não foi construída a partir de mais nada. Observando a regra de estruturação do sintagma nominal, para o mesmo <italic id="italic-603f4c0170374da9b74d8193cb12c8f8">Pedro</italic>, percebemos que ela construiria a representação [(p^P)^P,[p,[]]]; ela nos diz que a denotação agora é (p^P)^P, obtida a partir de [p,[]].</p>
        <p id="paragraph-391f511d3a8fb3418f8173182db27909">Isto pode ser facilmente constatado rodando as diretivas abaixo:</p>
        <p id="paragraph-cad14bdae4fc3937d5a2fdb9f6a6de1b">?- analisa([pedro]). sn:</p>
        <p id="paragraph-7c0939cfc4c2fc40bd0d35f043163db7">(pedro^A)^A pedro</p>
        <p id="paragraph-894ca8f483533b28ecb00189a693091e">yes ? ; n:</p>
        <p id="paragraph-29ec4bf64b9d84c4375d0cd5a9aae400">pedro yes ? ;</p>
        <p id="paragraph-6fd43da07112c0b23f854121b51ab09f">no</p>
        <p id="paragraph-b57fbac88ac4001fa61294aa01f9e773">?- analisa([dormiu]). sv:</p>
        <p id="paragraph-79ccf4648a7c5236b7f0fa5bafe5bcf1">A^dormir(A) yes ? ;</p>
        <p id="paragraph-fbb4ae96603178d1fe896829d0bf2356">v:</p>
        <p id="paragraph-1cba80acea8c915c4152cc361d76814e">A^dormir(A) yes ? ;</p>
        <p id="paragraph-4201beb0f88401c6885936530953578a">no</p>
        <p id="paragraph-721a58bf0638c567c2a66f4b83258b88">Da forma como a interface foi deﬁnida, o analisador gramatical encontra uma primeira representação para <italic id="italic-fcd9b86127960e01a82e65e34fa02e3c">Pedro </italic>e a apresenta de uma forma indentada: na primeira linha, ele nos informa que é um SN; na segunda, com um recuo, ele nos informa a sua denotação ((pedro^A)^A); e na terceira, com mais recuo, vemos a informação de que a denotação inicial (através da qual a outra foi composta) é pedro. Se, depois disso, solicitarmos que o interpretador busque uma solução alternativa, ele ainda vai nos informar que <italic id="italic-d6d6e47b8c37667ea832af30e03eabea">Pedro </italic>também é um N, denotando pedro. O mesmo ocorre com <italic id="italic-19c8ec1cf5dbc2b9b2e4e6d7a0770152">dormiu</italic>.</p>
        <p id="paragraph-b1f9f0931aec7fbf05dced997a166459">Mas se pedirmos para analisar <italic id="italic-62a2d8da57854f55c224028e39dbf1ef">Pedro dormiu</italic>, o resultado é bastante estranho:</p>
        <p id="paragraph-4130dd8db8085c84109ce7427ad65bcf">?- analisa([pedro,dormiu]).</p>
        <p id="paragraph-abe619a557629219cfe8148eb2a63329">s:</p>
        <p id="paragraph-a3c02b14d258c557b8c8c6a1d319e58f">dormir(pedro)</p>
        <p id="paragraph-4c9d157d07fd4f8ae2c1cf7b5f03285a">(pedro^dormir(pedro))^dormir(pedro)</p>
        <p id="paragraph-197ee0207d36f02b0e9825f8a04c5db2">pedro</p>
        <p id="paragraph-a8c52f0ada9e31ac5ddb4d5b85d1911f">pedro^dormir(pedro)</p>
        <p id="paragraph-301a95c4f85900d66f29d683a713a9e4">yes ? ;</p>
        <p id="paragraph-b228b0d3c7deb9d4bdb4f992755a2dc9">no</p>
        <p id="paragraph-d46211e316ff89319dd289560e79a2ab">Coerentemente, o analisador nos informa que a expressão é uma sentença (s), cujo signiﬁcado é dormir(pedro). Mas também diz que este signiﬁcado é obtido composicionalmente de (pedro^dormir( pedro))^dormir(pedro) e de pedro^dormir(pedro); estas representações corresponderiam a (λ<italic id="italic-f74b7b7c0bb606ab1d91830a22f304df">pedro</italic>.<italic id="italic-4271cf379b2dfcb31add0a303ea758d6">dormir</italic>(<italic id="italic-4a2c2712343d61be1b0de6eec744e9cd">pedro</italic>)).<italic id="italic-96ca7eefbb1f07c9291a355848034238">dormir</italic>(<italic id="italic-bb3b37b97782ec32c2dedacff8f91acf">pedro</italic>) e λ<italic id="italic-c5696f1ecd99d3bf31ac13ae963d6816">pedro</italic>.<italic id="italic-7">dormir</italic>(<italic id="italic-8">pedro)</italic>), respectivamente — que, como admitiram Pereira &amp; Shieber, não constituem termos-λ bem formados<xref id="xref-f71b2d04b11ad2a62aea1443f1c292e4" ref-type="fn" rid="footnote-54c034f8c8be050331d5db71d80986ae">3</xref>.</p>
      </sec>
      <sec id="heading-55a5a68eaf8855f8cfdeb49ca97bb39e">
        <title>2.2. Construindo uma derivação mais coerente</title>
        <p id="heading-5635893113d9f1762d2ec851bc4787c9">No programa a seguir, ﬁnalmente, implementa-se a sugestão de Pereira &amp; Shieber, empregando as variáveis do Prolog apenas para guiar a introdução das variáveis das representações; estas variáveis da metalinguagem da representação terão o formato x(N), para qualquer número inteiro N (as do Prolog, portanto, são variáveis da metalinguagem para a construção da representação; ambas são metavariáveis, mas de metalinguagens diferentes); além disso, como é exigido pelas teorias de prova, toda variável introduzida na análise não pode ter sido usada antes.</p>
        <p id="paragraph-66fa1c54fa73a8701579bf8748600225">:- op(500, yfx, @). :- op(550, xfx, /\). :- op(550, xfx, =&gt;). :- op(600, xfy, ^). analisa(Expressão) :- categoria(Categoria), ( (Categoria = n; Categoria = v) -&gt; Regra =.. [Categoria, _, Sem] ; Regra =.. [Categoria, 1, _, Sem] ), phrase(Regra, Expressão, []), nl, apresenta(0, Sem). </p>
        <p id="paragraph-4abca1237bc3fbd30176670f684a6a3c">categoria(s). categoria(sn). categoria(sv). categoria(det). categoria(n). categoria(v).</p>
        <p id="paragraph-d4c47db73c7fee4f0d23757a157f0480">apresenta(N, [X, []]) :- tab(N),</p>
        <p id="paragraph-92e4c615c40b0c1a595421f6ea38704d">write(X), nl,</p>
        <p id="paragraph-1f744eb2e166d9439a67c6d08a9ec0a1">!.</p>
        <p id="paragraph-8c6defaa3b066c791f4a1859f7b353f0">apresenta(N, [X|Y]) :- tab(N),</p>
        <p id="paragraph-e5a2abbf4d7dd147fa1f3b6f5a2da761">X \= [_|_],</p>
        <p id="paragraph-2561b5e3731386700dfa0719ac35ebbc">write(X), apresenta_aux(N, Y),</p>
        <p id="paragraph-f5b96fb7d4572c0e80934eef8a2c51c0">!.</p>
        <p id="paragraph-f9d0bc786fb01418cbd667a8a74be5f7">apresenta(N, X) :- apresenta_lista(N, X).</p>
        <p id="paragraph-14">apresenta_aux(_, []) :-</p>
        <p id="paragraph-15">!.</p>
        <p id="paragraph-16">apresenta_aux(N, [X|Y]) :- X \= [_|_],</p>
        <p id="paragraph-17">nl, tab(N),</p>
        <p id="paragraph-18">write(‘&lt;== ‘), write(X), apresenta_aux(N, Y).</p>
        <p id="paragraph-19">apresenta_aux(N, [X|Y]) :- nl,</p>
        <p id="paragraph-20">M is N + 7,</p>
        <p id="paragraph-21">apresenta(M, X), apresenta_lista(M, Y). apresenta_lista(_, []). apresenta_lista(N, [X|Y]) :-</p>
        <p id="paragraph-773a25f58289b7916bec3324cf708444">nl,</p>
        <p id="paragraph-99945570e5f148aa250c01aba0b5d952">apresenta(N, X), apresenta_lista(N, Y).</p>
        <p id="paragraph-904c02652f4c5b505adce37dc7f6262e">s(X1, X3, S) --&gt; sn(X1,X2,SN), sv(X2,X3,SV),</p>
        <p id="paragraph-48e2fa6c2b37079c3e29dbf647da85b1">{SN = [SN1|_], SV = [SV1|_],</p>
        <p id="paragraph-3ea2478a335483566883ae1e01c97064">reduz_lista([SN1@SV1, [SN, SV]], S)}.</p>
        <p id="paragraph-a43d12249be6c3b604a535be1018c47a">sn(X1, X2, [x(X1)^x(X1)@N1, N]) --&gt; n(p, N),</p>
        <p id="paragraph-dfcb44460895e5921558df9028f23ffc">{N = [N1|_], X2 is X1 + 1}.</p>
        <p id="paragraph-e1aefe0a0209abfc396274f0ee983dd5">sn(X1, X2, SN) --&gt; det(X1, X2, Det), n(c, N),</p>
        <p id="paragraph-308b657753f579054449ed1e165c8042">{Det = [Det1|_], N = [N1|_], reduz_lista([Det1@N1, [Det, N]], SN)}.</p>
        <p id="paragraph-fce79de86b33ec5d48f99b328d2ab686">sv(X, X, V) --&gt; v(i, V).</p>
        <p id="paragraph-01ba77ff7ba49624e71d870573c345ce">sv(X1, X4, SV) --&gt; v(t, V), sn(X1, X2, SN),</p>
        <p id="paragraph-4c27f961437071fad26321ac97ad7508">{V = [V1|_], SN = [SN1|_], X3 is X2 + 1, X4 is X3 + 1,</p>
        <p id="paragraph-bed0151e9d103986e7fb9d087b5c311e">reduz_lista([x(X2)^SN1@(x(X3)^V1@x(X3)@x(X2)), [V, SN]], SV)}.</p>
        <p id="paragraph-230e490b61735429d46293b5096602c1">det(X1,X4,[x(X1)^x(X2)^algum(x(X3),x(X1)@x(X3)</p>
        <p id="paragraph-abab8ae70b01d6713aa3668888b9954b">/\ x(X2)@x(X3)),[]]) --&gt; [um],</p>
        <p id="paragraph-8aed980afb13d94492e6df4b80870a17">{X2 is X1 + 1, X3 is X2 + 1, X4 is X3 + 1}.</p>
        <p id="paragraph-22">det(X1,X4,[x(X1)^x(X2)^qualquer(x(X3),x(X1)@</p>
        <p id="paragraph-23">x(X3) =&gt; x(X2)@x(X3)),[]]) --&gt; [todo],</p>
        <p id="paragraph-24">{X2 is X1 + 1, X3 is X2 + 1, X4 is X3 + 1}.</p>
        <p id="paragraph-26">n(c, [b, []]) --&gt; [buraco].</p>
        <p id="paragraph-27">n(c, [m, []]) --&gt; [menino].</p>
        <p id="paragraph-28">n(p, [p, []]) --&gt; [pedro].</p>
        <p id="paragraph-29">v(i, [d, []]) --&gt; [dormiu].</p>
        <p id="paragraph-30">v(t, [s, []]) --&gt; [saltou]. reduz_lista(Lista, Reduzido) :- Lista = [Termo|_], reduz_termo(Termo, Resultado),</p>
        <p id="paragraph-851d3b4a6cd6fa370668b35e0cb63901">reduz_lista([Resultado|Lista], Reduzido),</p>
        <p id="paragraph-10e7600164a9aa049cdc0ff994f1ceed">!.</p>
        <p id="paragraph-c516096c8bbe8bef1b2e7a1c091d7e8e">reduz_lista(Resultado, Resultado).</p>
        <p id="paragraph-5a82b44816b5db09bf1036d2b36eba01">reduz_termo(Termo1@Termo2, Termo1@Resultado) :- reduz_termo(Termo2, Resultado).</p>
        <p id="paragraph-2a768425f0ca5872d782aecf00a908f2">reduz_termo(Termo1@Termo2, Resultado@Termo2) :- reduz_termo(Termo1, Resultado).</p>
        <p id="paragraph-d3d91b64001d6a4554303a6c4cc96c39">reduz_termo((Var^Termo)@Arg, Resultado) :- substitui(Termo, Var, Arg, Resultado).</p>
        <p id="paragraph-4e80a028f64e146cbfa98fc8eee85970">reduz_termo(Var^Termo, Var^Resultado) :- reduz_termo(Termo, Resultado).</p>
        <p id="paragraph-8b7ede53e79cac9ec9d37856b9a5c3d1">reduz_termo(Termo1 /\ Termo2, Termo1 /\ Resultado) :- reduz_termo(Termo2, Resultado).</p>
        <p id="paragraph-ba2966a02c752347486aae2154ad3c0f">reduz_termo(Termo1 /\ Termo2, Resultado /\ Termo2) :- reduz_termo(Termo1, Resultado).</p>
        <p id="paragraph-d622c2b6518e12861919a01c9110c85b">reduz_termo(Termo1 =&gt; Termo2, Termo1 =&gt; Resultado) :- reduz_termo(Termo2, Resultado).</p>
        <p id="paragraph-4acfe7523c15bea666390ee68613bc65">reduz_termo(Termo1 =&gt; Termo2, Resultado =&gt; Termo2) :- reduz_termo(Termo1, Resultado).</p>
        <p id="paragraph-2b8b1f8dab27bbf454a949a5edcae171">reduz_termo(algum(Var, Termo), algum(Var, Resultado))</p>
        <p id="paragraph-3ec03919f35c3b7d033c5d6a2c43042d">:-</p>
        <p id="paragraph-bb9ea2a4f02eb8520e6aa3ab828626aa">reduz_termo(Termo, Resultado). reduz_termo(qualquer(Var, Termo), qualquer(Var, Resultado)) :-</p>
        <p id="paragraph-f7bdef134990be4ba2b5241a60eab5d0">reduz_termo(Termo, Resultado).</p>
        <p id="paragraph-639c09fe8d94ffdb825f81546f3e49c1">substitui(x(M), x(N), Termo2, Termo3) :- ( x(M) \= x(N)</p>
        <p id="paragraph-fec55bf97c54c61ea50e7e0d0136792d">-&gt; Termo3 = x(M)</p>
        <p id="paragraph-1d7bd4e64c141ce06b402735cb761dd2">; Termo3 = Termo2</p>
        <p id="paragraph-b7af30079a4f9620563708f8c3c9f85b">).</p>
        <p id="paragraph-5a80e1da094840a692e96bd52a55121a">substitui(Termo3, _, _, Termo3) :- atom(Termo3). substitui(Termo1a@Termo1b, Var, Termo2, Termo3a@Termo3b) :-</p>
        <p id="paragraph-e3ab22b90acb96367e9b3edaeb650474">substitui(Termo1a, Var, Termo2, Termo3a), substitui(Termo1b, Var, Termo2, Termo3b). substitui(Var1^Termo1, Var, Termo2, Termo3) :-</p>
        <p id="paragraph-361a2781c08b3058459b83d058e8ff19">( Var1 = Var</p>
        <p id="paragraph-08afe628ed4125a4156257d891d885cf">-&gt; Termo3 = Var1^Termo1</p>
        <p id="paragraph-3e33439a8e8a82a132c562d17c2b4eec">; substitui(Termo1, Var, Termo2, Resultado), Termo3 = Var1^Resultado</p>
        <p id="paragraph-13cfa85fe0a92500887513dc79a9372f">).</p>
        <p id="paragraph-202a3772b13a87ec5d8a350adc2cefc5">substitui(Termo1a /\ Termo1b, Var, Termo2, Termo3a</p>
        <p id="paragraph-96f2bad64a91c369e974fbadfda32356">/\ Termo3b) :-</p>
        <p id="paragraph-6f0f588682e5f9bd01d2fbb2462712db">substitui(Termo1a, Var, Termo2, Termo3a), substitui(Termo1b, Var, Termo2, Termo3b).</p>
        <p id="paragraph-a050f66a1ce2339ce059c5a3c2fada84">substitui(Termo1a =&gt; Termo1b, Var, Termo2, Termo3a</p>
        <p id="paragraph-e617e83b4073822b227508c24696dcf1">=&gt; Termo3b) :-</p>
        <p id="paragraph-b09dfee55e2b7b6d77fd51a236050943">substitui(Termo1a, Var, Termo2, Termo3a), substitui(Termo1b, Var, Termo2, Termo3b). substitui(algum(Var1, Termo1), Var, Termo2, Termo3) :-</p>
        <p id="paragraph-02c3c84c8725f4bb3a8ebcf44dbc5499">( Var1 = Var</p>
        <p id="paragraph-9f96df641728f23a981cb12fb4e38b73">-&gt; Termo3 = algum(Var1, Termo1)</p>
        <p id="paragraph-1321d10eddb0ccfb66858e0c4372ad9e">; substitui(Termo1, Var, Termo2, Resultado), Termo3 = algum(Var1, Resultado)</p>
        <p id="paragraph-985350ddac157d93507e4aaa06cf87bb">).</p>
        <p id="paragraph-8f60426a13008555102b95b661c07d4c">substitui(qualquer(Var1, Termo1), Var, Termo2, Termo3) :-</p>
        <p id="paragraph-8e6254985c1486cdcfc85974a9230df1">( Var1 = Var</p>
        <p id="paragraph-932715acf1262c93888864cd118a7c54">-&gt; Termo3 = qualquer(Var1, Termo1)</p>
        <p id="paragraph-fef64fbae5aa32951037e7352f10466b">; substitui(Termo1, Var, Termo2, Resultado), Termo3 = qualquer(Var1, Resultado)</p>
        <p id="paragraph-0449a7dc85b6f59f3f9e36eb27cca843">).</p>
        <p id="paragraph-e3b49fc8669531ff1ef189b3d1f3ff0a">Como antes, os predicados responsáveis pela interface não serão comentados.</p>
        <p id="paragraph-96bba466bc06e15ad488305968f969f7">Para os predicados gramaticais, a mudança é bem pequena: a deﬁnição dos itens lexicais é exatamente igual à anterior, apenas nas regras sintagmáticas é que se acrescenta um par de acumulador<xref id="xref-b116a684d1755d998b40be83b85135ca" ref-type="fn" rid="footnote-ce305e4417fb322ac206a49037c613ef">4</xref> no qual se executa o registro dos identiﬁcadores das variáveis usada na derivação (representadas no programa por X1, X2...). A notação para os predicados da representação semântica também mudou: como <italic id="italic-4347954ea49f8ffe4aed94cacc96d653">F</italic>(<italic id="italic-1a69af6d0c0a34adcd3c771866df5b89">a</italic>) é a aplicação da função <italic id="italic-84398f63fe548a669d704e00249991ae">F </italic>ao argumento <italic id="italic-020abfd83dd1caf6c5a18cb28a00e37d">a</italic>, emprega-se o mesmo símbolo @, escrevendo então F@a; assim, F(a1, a2) passa a ser F@a1@a2<xref id="xref-649dbbb92b74662de138360879ba948c" ref-type="fn" rid="footnote-f21a709415743a2eeae358505913ee5b">5</xref>.</p>
        <p id="paragraph-22bc564655a1ab806876536472bdfa59">Pode-se observar a introdução das variáveis da metalinguagem representacional na análise da expressão <italic id="italic-d33658018048ed370b9e467e75efc60b">Pedro</italic>, como abaixo.</p>
        <p id="paragraph-d01c725fb5f29c0db2433f96c9d92847">?- analisa([pedro]). x(1)^x(1)@p</p>
        <p id="paragraph-7ba295cf2f75beea2482ce85d233996b">p</p>
        <p id="paragraph-6c917fcbe7a749dd4734e17fd0f6f98b">yes ? ; p</p>
        <p id="paragraph-04b7c0b0853ac224d2f51cda419465cd">yes ? ;</p>
        <p id="paragraph-0317804efdc806fe9fd671944198171f">no</p>
        <p id="paragraph-d79035db60eea512efff7deb63c9e268">Quando ela é um SN (cuja análise é obtida com sn(1,X,Sem,[pedro],[])), o seu signiﬁcado é representado internamente como [x(1)^x(1)@p,[p,[]]]; já quando ela é um N (cuja análise inicia com n(1,X,Sem,[pedro],[])), o signiﬁcado é apenas [p,[]]. A interface mostra esses resultados através de apresentação indentada, também como antes.</p>
        <p id="paragraph-7db6df53cb0a87b0217a9980f29e788b">Como a representação semântica ﬁca numa lista, na qual se registra seus constituintes, de forma que o termo-λ mais simples que representa o signiﬁcado da expressão sempre ocupa a primeira posição, todas as combinações de signiﬁcados precisam acessar esse primeiro elemento da lista. As novas representações compostas contém o novo termo construído e todo o histórico da construção das suas partes. O signiﬁcado de <italic id="italic-8a1793677a305a00a349b2829b92a43f">Pedro dormiu</italic>, por exemplo, antes da redução-β, ﬁca como:</p>
        <p id="paragraph-b61a700d6308461bc8e09a3c0f002e7d">[(x(1)^x(1)@p)@d, [[x(1)^x(1)@p,</p>
        <p id="paragraph-0861d4ce9bc8155bb29456ec989bdd43">[p, []]], [d, []]]].</p>
        <p id="paragraph-991ffee8fc7ca59bc5f46825ecbdf014">Os termos reduzidos, por sua vez, são acrescentados no topo da lista. Para o mesmo exemplo <italic id="italic-005a8cf66afd345a89397d34ed82abc3">Pedro dormiu</italic>, o resultado da redução seria:</p>
        <p id="paragraph-b457f215a3841ba5535c6f09ccdd12c0">[d@p, (x(1)^x(1)@p)@d, [[x(1)^x(1)@p,</p>
        <p id="paragraph-c0ca5b1146059ae3361cefc4878331b2">[p, []]], [d, []]]].</p>
        <p id="paragraph-7655e2b0ffb85aff78f68c6ba828a01b"> Em relação às outras implementações, a principal diferença está na deﬁnição explícita e exaustiva da redução-β. O predicado reduz_ lista/2 separa o termo a ser reduzido (o primeiro da lista) e a redução é feita através do predicado reduz_termo/2 (caso não haja redução a ser feita, a segunda cláusula de reduz_lista/2 passa a própria lista adiante). A deﬁnição de reduz_termo/2 é uma clássica indução na complexidade do termo (ou seja, há uma instrução de redução para cada regra de formação dos termos); ela consiste basicamente na redução recursiva dos subtermos de um termo, a única diferença nesse padrão é a redução de (Var^Termo)@Arg — (λ<italic id="italic-64953aba174dbd5a99fab711426bd679">Var</italic>.<italic id="italic-75d5da361f6f494ac70fd25831e65635">Termo Arg</italic>) — em que se substitui a variável Var pelo termo Arg no termo Termo. A substituição é feita por substitui/4, que também é uma indução na complexidade do termo a ser substituído, de forma que o primeiro argumento é o termo que sofrerá a substituição, o segundo é a variável que será substituída, o terceiro é o termo que ocupará o lugar da variável e o quarto registra o resultado da operação.</p>
        <p id="paragraph-72d459236a58bd88577e95fed671c764">Como exemplo, podemos ver abaixo a análise de <italic id="italic-41e4a3eb3beeaf80050155adf8b4016a">todo menino saltou </italic><italic id="italic-d9655ae503fc5988b2c9c6e49176b714">um </italic><italic id="italic-88ee72165215f223e2ac4ed92bc8f9c1">buraco</italic><xref id="xref-3676507df3a0c803b7860c2b910e1212" ref-type="fn" rid="footnote-d4694f9121aafcefe1d17e9102bc46aa">6</xref>.</p>
        <p id="paragraph-dfa2abd9cf5942a6021790c6cd74aa9d">analisa([todo, menino, saltou, um, buraco]). qualquer(x(3),m@x(3)=&gt;algum(x(6),b@x(6)/\ s@x(6)@x(3))) &lt;== qualquer(x(3),m@x(3)=&gt;(x(7)^algum(x(6),b@x(6)/\ s@x(6)@x(7)))@x(3)) &lt;== (x(2)^qualquer(x(3),m@x(3)=&gt;x(2)@x(3)))@ (x(7)^algum(x(6),b@x(6)/\s@x(6)@x(7))) x(2)^qualquer(x(3),m@x(3)=&gt;x(2)@x(3)) &lt;== (x(1)^x(2)^qualquer(x(3),x(1)@x(3)=&gt;x(2)@x(3)))@m x(1)^x(2)^qualquer(x(3),x(1)@x(3)=&gt;x (2)@x(3)) m x(7)^algum(x(6),b@x(6)/\s@x(6)@x(7)) &lt;== x(7)^algum(x(6),b@x(6)/\(x(8)^s@x(8)@x(7))@x(6)) &lt;== x(7)^(x(5)^algum(x(6),b@x(6)/\x(5)@x(6)))@ (x(8)^s@x(8)@x(7)) s x(5)^algum(x(6),b@x(6)/\x(5)@x(6)) &lt;== (x(4)^x(5)^algum(x(6),x(4)@x(6)/\x(5)@x(6)))@b x(4)^x(5)^algum(x(6),x(4)@x(6)/\x(5)@x(6)) b yes ; no</p>
        <p id="paragraph-bddae167a715bf0be590ff979e894b9e">Nela, vê-se recorrentemente o termo mais simples que representa o signiﬁcadodaexpressãoe,logoabaixo,ostermosmaiscomplexosqueforam reduzidos até chegarem àquele primeiro (antecedidos por &lt;==). Depois, os subtermos da composição são apresentados na mesma indentação. Assim, observando os termos indentados mais à direita no exemplo, podemos ver o signiﬁcado de <italic id="italic-8fba04f5ccf2ddd5012e8b2f83579b72">um </italic>(x(4)^x(5)^algum(x(6),x(4)@x(6)/\ x(5)@x(6))) e de <italic id="italic-091e4e12195361f750b17849c6037000">buraco </italic>(b), que são combinados como (x(4)^x(5)^algum(x(6),x(4)@x(6)/\x(5)@x(6)))@b (logo acima um pouco mais para a esquerda), que depois é reduzido para x(5)^algum(x(6), b@x(6)/\x(5)@x(6)).</p>
        <p id="paragraph-9aafa4749e783a308ef49763d860e056">Ao contrário dos analisadores anteriores, todas as etapas de construção apresentam termos- coerentes com o que Pereira &amp; Shieber qualiﬁcaram como “apresentados abstratamente no cálculo”.</p>
      </sec>
    </sec>
    <sec id="heading-fbb01532ccee7417d0d2d5f39542af2c">
      <title>Conclusão</title>
      <p id="paragraph-46e117b6d39c5d9368105b175696ad5e">Com a apresentação de antigos analisadores que executam a interpretação semântica, e de sua adaptação para aplicativos que demonstrem sua composicionalidade, espera-se ter explicitado uma diferença essencial que distingue uma boa parte dos trabalhos em Linguística Computacional; a saber, a preocupação com o produto da análise ou com o seu processo. Nos analisadores de Pereira &amp; Shieber e de Covington, a identiﬁcação das variáveis da representação semântica e da sua construção só se justiﬁca pelo fato de que, neles, a análise se ocupava exclusivamente com o seu produto; ou seja, apenas com a construção da representação ﬁnal. No analisador proposto aqui, esta identiﬁcação não se sustenta, porque a preocupação é a de saber como esta interpretação é construída a partir da interpretação das subexpressões de uma expressão, de acordo com o princípio da composicionalidade.</p>
      <p id="paragraph-4ed278bf1728c19c5ef54ed1ede30367">No trajeto da sua elaboração, além da inadequação em relação à composicionalidade, mostrou-se também que a execução parcial da redução-β e da aplicação realmente criavam termos-λ “bizarros” e completamente equivocados para representar a interpretação semântica das subexpressões. Assim, o custo da suposta simplicidade implementacional é o sacrifício da sintaxe dos termos-λ, que precisou ser “torcida” para aceitar termos que não seriam bem-formados.</p>
      <p id="paragraph-0be6a478ffc161c6b780a0478826d7de">Para um linguista que se interessa não só pelo produto linguístico, mas principalmente pelo processo, esse tipo de defeito é crucial. Assim, ﬁca justiﬁcada a recusa dos “benefícios substanciais em relação à simplicidade do programa”.</p>
      <p id="paragraph-534858dfb6e738c79adcd12cfb000562">Convém lembrar ainda que a interpretação construída nos analisadores apresentados aqui é bastante ingênua, já que não lida com ambiguidades de escopo e de leituras distribuídas e coletivas, além de desprezar a semântica temporal, por exemplo. No entanto, acredita-se que o analisador proposto aqui possa ser facilmente adaptado para executar as análises apropriadas destes e de outros fenômenos semânticos, já que a implementação é mais coerente com as escolhas do cálculo de predicados e do cálculo-λ para construir a representação semântica, como é praxe na Semântica Formal. Sendo assim, a próxima etapa mais evidente para o desenvolvimento deste analisador seria a inclusão de procedimentos para produzir as interpretações ambíguas devidas à relação entre os escopos dos quantiﬁcadores, o que permitiria inclusive uma comparação com as implementações em Pereira &amp; Shieber (1987) e Blackburn &amp; Bos (2005); no entanto, qualquer fenômeno interpretativo descrito explicitamente através de operações bem deﬁnidas se adaptam facilmente ao analisador proposto.</p>
    </sec>
    <sec id="heading-548703a3c1e29f9cf6f08f3d98d3790c">
      <title>Referências</title>
      <p id="paragraph-59992e3fd90ea6302287d1d5809988f8">BLACKBURN, Patrick e Johan BOS. <bold id="bold-6690b1b65e00b8e38b3bf3ad01450c87">Representation</bold><bold id="bold-48c857cfe1a30cd17ac7f3a5b1da93aa"> </bold><bold id="bold-3">and</bold><bold id="bold-4"> </bold><bold id="bold-5">Inference</bold><bold id="bold-6"> </bold><bold id="bold-7">for Natural Language</bold>. CSLI, Stanford, 2005.</p>
      <p id="paragraph-6772829ff7367385f65e02344f840531">COVINGTON, Michael A. <bold id="bold-8">Natural Language Processing for Prolog </bold><bold id="bold-9">Programmers</bold>. Prentice Hall, Englewood Clifs, 1994.</p>
      <p id="paragraph-71474c137085980ddfc1769bad08e5b1">DOUGHERTY, Ray C. <bold id="bold-10">Natural Language Computing</bold>. Lawrence Erlbaum, Hillsdale, 1994.</p>
      <p id="paragraph-a079b5ab336184cb024613ba160e61e9">GAZDAR, Gerard and Chris MELLISH. <bold id="bold-11">Natural Language Processing in Prolog</bold>. Addison-Wesley, Wokingham, 1989.</p>
      <p id="paragraph-10bb4b25d38c728877a0c73b68ec8a4e">GIANNESINI, F.; H. KANOUI; R. PASERO e M. van CANEGHEM. <bold id="bold-12">Prolog</bold>. InterÉditions, Paris, 1985.</p>
      <p id="paragraph-85314d2a21af39fa1c0881bc9a350059">MATTHEWS, Clive. <bold id="bold-13">An Introduction to Natural Language Processing through Prolog</bold>. Longman, London, 1998.</p>
      <p id="paragraph-d2e7ab96a27c43fc5a80f11e2e6b37ec">O’KEEFE, Richard A. <bold id="bold-14">The Craft of Prolog</bold>. The MIT Press, Cambridge, 1990.</p>
      <p id="paragraph-a1d99aab870f9328f52b0b2ee18523c6">OTHERO, Gabriel A. and MENUZZI, Sérgio M. <bold id="bold-15">Linguística Computacional: </bold>Teoria &amp; Prática. Parábola Editorial, São Paulo, 2005.</p>
      <p id="paragraph-07f035582ef79c027186c2504ef75813">PEREIRA, Fernando C. N. and Stuart M. SHIEBER. <bold id="bold-16">Prolog and Natural-Language Analysis</bold>. CSLI, Stanford, 1987.</p>
      <p id="paragraph-10c1223d45ab593b04611940c966995a">VAN LE, Teun. <bold id="bold-17">Techniques of Prolog Programming</bold>. John Wiley &amp; Sons, New York, 1993.</p>
    </sec>
  </body>
  <back>
    <fn-group>
      <fn id="footnote-f22a3b724d6a1a76b204176a7d69ce04">
        <label>1</label>
        <p id="paragraph-9faa834d861798d2503979c18b014fae">Um dos pareceristas anônimos observa que esta preocupação com a interpretação semântica pode ser um pouco mais antiga do que eu sugeri, indicando dois livros: o de Giannesini, Kanoui, Pasero, &amp; Caneghem 1985, e o de Gazdar &amp; Mellish 1989. Devo confessar que não conhecia o primeiro deles, apesar de constar nas referências de Van Le 1993, do qual possuo um exemplar; procurando nos acervos das bibliotecas das universidades que frequentei, observo que não há cópias desse livro na Unicamp, na UEL e nem na UFPR – constatei que há dois exemplares na USP, mas ainda não tive acesso a nenhum deles. Quanto ao segundo, o esquecimento se justiﬁca enquanto ato falho: apesar de falarem de representação semântica, o tratamento visa muito mais à interação com banco de dados do que uma representação propriamente linguística. De qualquer maneira, registro aqui o meu agradecimento a esta observação do parecerista.</p>
      </fn>
      <fn id="footnote-8c984384c81535c02c65c731e946206e">
        <label>2</label>
        <p id="paragraph-d5fedf1a617705531ae90f7846859656">Infelizmente, não foi possível incluir uma avaliação do analisador proposto neste livro, apesar de estar inteiramente relacionado ao tema tratado aqui, por dois motivos: primeiro, porque não foi possível ter acesso a esta referência a tempo hábil e, segundo, porque estaríamos nos afastando da proposta inicial (o que também nos faria extrapolar o espaço disponível).</p>
      </fn>
      <fn id="footnote-54c034f8c8be050331d5db71d80986ae">
        <label>3</label>
        <p id="paragraph-76368be16538ace0f7a388b41225f233">A coisa ainda ﬁcaria mais complicada para <bold id="bold-1"><italic id="italic-a5b258b06cca3ccf459e1c64870e5e29">Pedro saltou um buraco </italic></bold>ou <bold id="bold-2"><italic id="italic-782a7063591d9d11bb3712efe5c23135">todo menino saltou um buraco</italic></bold>; mas como a complicação é essencialmente a mesma, nos contentamos com o exemplo mais simples apresentado acima.</p>
      </fn>
      <fn id="footnote-ce305e4417fb322ac206a49037c613ef">
        <label>4</label>
        <p id="paragraph-a3facb8a2e1102a9219cfa3e1d2c3d49">O par de acumulador é uma técnica de programação para implementar contadores, por exemplo. Na primeira variável do par, o predicado recebe o valor inicial; na segunda, registra-se o valor a ser passado para o próximo predicado. Para mais detalhes, ver [7, p. 22].</p>
      </fn>
      <fn id="footnote-f21a709415743a2eeae358505913ee5b">
        <label>5</label>
        <p id="paragraph-8a4b9141e66e01dccb1e391a86303104">Como o operador @ é deﬁnido com associatividade à esquerda (yfx), f@a1@a2 é equivalente a (f@a1)@a2.</p>
      </fn>
      <fn id="footnote-d4694f9121aafcefe1d17e9102bc46aa">
        <label>6</label>
        <p id="paragraph-ad62fd528455b71e2bb70cec07c9845b">Como esperado, sentenças mais simples, como <italic id="italic-ab3cbd3bdab14cc4d204f2f97c4a21ff">Pedro dormiu </italic>e <italic id="italic-f0e6d25a99e231860565dc2ce20f9621">todo menino dormiu</italic>, e expressões de outros tipos também são analisadas, exatamente como no exemplo da análise de <italic id="italic-f108f0b3768d8a49d6962c7678782a00">Pedro</italic>, acima.</p>
      </fn>
    </fn-group>
  </back>
</article>