Do ponto de vista denotacional, atribuir semântica à sintaxe de uma linguagem é definir uma função de mapeamento cujo domínio são as estruturas sintáticas e a imagem 8 <http://www.eclipse.org/>
3.3. Prolog e especificação de linguagens formais 113
são objetos matemáticos, representados concretamente em algum tipo de formalismo, com Cálculo Lambda. De certa forma, trata-se de um tipo de tradução de uma estrutura em outra:
The syntax comprises the abstract syntax representing the essence of the concepts of the language. The abstract syntax can be mapped to several concrete syntaxes (textual representation, graphical visualization, etc). These two components specify the different concepts of the language and how they are represented. The semantics of a formalism is specified by a unique semantic mapping function which maps each model element in the language onto an element in a semantic domain. For example, the meaning of a Causal Block Diagram is given by mapping it onto an Ordinary Differential Equation. For practical reasons, semantic mapping is usually applied to the abstract rather than to the concrete syntax of a model. Note that the semantic domain is a modelling language in its own right which needs to be properly modelled (and so on, recursively). In practice, the semantic mapping function maps abstract syntax onto abstract syntax (SYRIANI,2011, p. 14-15). (grifo final nosso)
Em Harel e Rumpe (2000, p. 10), há uma adequada visão geral sobre sintaxe e semântica de linguagens. Inclusive, dessa obra extrai-se uma apresentação sobre as funções de mapeamento, em que L refere-se aos conceitos sintáticos da linguagem e S ao domínio semântico:
Given a syntax L and a semantic domain S, the final step in defining a semantics is to relate the syntactic concepts to those of the semantic domain. Each syntactic creature is mapped to some semantic element. [. . . ] Often the mapping is explained informally, by examples and in plain English. But regardless of the degree of formality of its representation, the semantic mapping itself should be a function from L to S, i.e.,
M : L → S
Em Sebesta (2012, p. 142-147), um dos livros mais recentes sobre conceitos de linguagens de programação, encontra-se uma introdução à semântica denotacional, na qual o autor apresenta uma forma de traduzir sintaxe em objetos matemáticos, que representam o domínio semântico:
The mapping functions of a denotational semantics programming lan- guage specification, like all functions in mathematics, have a domain and a range. The domain is the collection of values that are legitimate parameters to the function; the range is the collection of objects to which the parameters are mapped. In denotational semantics, the domain is called the syntactic domain, because it is syntactic structures that are mapped. The range is called the semantic domain (SEBESTA,2012, p. 142).
A respeito da abordagem,Decker(1998) é um trabalho com um objetivo semelhante ao desta pesquisa, especialmente ao que se refere à construção de uma linguagem para
descrição de conceitos. Porém, o foco daquele autor é a criação de uma DSL cuja semântica é dada em termos de Frame-Logic e Linear Temporal Logic. O objetivo desta pesquisa é diferente, uma vez que deseja-se sustentar a abordagem de descrição no paradigma de Programação em Lógica. No entanto, a justificativa de seu trabalho é também válida para o caso desta pesquisa, bem como está alinhado com o escopo desta seção, ao menos no que tange à metáfora entre FOL e Máquina de Turing:
Logic based knowledge representation and specification has a long tradi- tion in AI [. . . ], so for knowledge acquisition and engineering tasks many representation formalisms are available. However, most of them do not support the elicitation and representation of domain specific knowledge. Using the syntax of First Order Predicate Logic (FOL) for knowledge representation tasks is comparable to using a Turing Machine for program- ming tasks: it is a sufficient formalism for studying theoretical properties, but does not support real life tasks. Of course a turing machine is powerful enough from a principal point of view, but not from a practical one: the encoding is often to expensive. The reason for this is, that the language (FOL) does not support thinking in domain terms. Instead, the domain terms must be translated to the terms of the representation language (e.g. relations). So to establish a communication between a knowledge engineer and a domain expert, the representation must always translated back to the domain terms. This, however is fortunately a matter of the syntax of the representation language. Therefore, similar to the development of high level programing languages, we propose to use the syntax of First Order Logic as a kind of low level language for building domain-specific declarative languages (DSDLs) (see [DSL97]9), such that higher level
representation languages can be compiled into this language.
A abordagem deDeckeré interessante porque, de forma simples e direta, propõe uma integração do poder expressivo de Frame-Logic (KIFER; LAUSEN, 1989), de Chronolog10 (ORGUN, 1996) e uma tradução para FOL. ATabela 3 contém um exemplo da tradução apresentada pelo autor no que toca expressões de Frame-Logic para FOL por meio da instaxe concreta de cláusulas de Horn. Trata-se de uma apresentação semi-formal e incompleta, mas que serve para exemplificar a abordagem do autor.
No que se refere à Prolog, sendo notável na definição de semânticas em linguagens de programação por meio de cláusulas de Horn, Gupta (1998)11,12, apresenta diversos resultados nessa área. Ele defende o uso de lógica de Horn, ou mesmo Constraint Logic, ao invés de λ-cálculo para expressar semântica denotacional. A justificativa se resume ao fato de, segundo o autor, a abordagem lógica ser mais clara, no sentido de mais simples de
9 idem.
10 Trata-se de uma linguagem baseada numa lógica temporal de tempo linear construída como um banco
de dados dedutivo.
11 Gopal Gupta mantém o sítio<http://www.cs.nmsu.edu/~gupta/sem.html>com uma lista de artigos
sobre cláusulas de Horn usadas para denotação de semântica em várias áreas de pesquisa.
12 Outros artigos do autor sobre uso de Prolog para semântica de linguagens de Gupta:Gupta e Pontelli
(1999),Gupta e Pontelli(2002). EmPontelli et al.(2002) encontra-se um estudo de caso da abordagem deGupta.
3.3. Prolog e especificação de linguagens formais 115
Tabela 3 – Esquema de tradução de Frame-Logic para cláusulas de Horn.
Object Oriented First Order
C::D ⇒ sub(C,D)
O:C ⇒ instance(O,C)
O[M->>V] ⇒ method(O,M,V)
C[M=>>D] ⇒ methodtype(C,M,D)
O:C[M->>V:D] ⇒ instance(O,C) ∧ method(O,M,V) ∧ instance(V,D) Fonte: Decker(1998)
ler, do que a abordagem comumente usada baseada em λ-cálculo além do fato de que, na abordagem lógica, a semântica é imediatamente executável:
Use of Horn Clause Logic to specify denotational semantics is based on the observation that a notation based on Horn Clauses (pure Prolog) and Constraints facilitates inference of program properties, program transfor- mations, etc., much more easily than the Lambda Calculus. Constraints allow one to model time, as well as automatically derive parallelizing compilers from language specifications. Language Syntax can also be very easily specified in Horn Logic.
Gupta (1998, p. 152) nomeia de filtro o sistema de tradução, ou a função de tradução, de uma especificação escrita em uma linguagem e traduzida para outra:
Logical denotations also provide a formal theory of porting or language filtering. Proting can involve migrating a software from one machine/- operation system to another (e. g. moving an application from a Sun Sparc running Solaris to a PC running Linux), or migrating a system written in one notation to another on the same machine (e. g. porting a database written in Oracle SQL to IBM DB2). It is the latter type of porting, that we are interested in. Essentially, this type of porting involves development of a semantic translation system to translate pro- grams written in a language £s to another language £t(such a system is called a filter). Specification of a filter can be seen as an exercise in semantics. Essentially, the meaning or semantics of the language £s can be given in terms of the constructs of the language £t.
No caso, o o autor apresenta um exemplo de tradução da linguagem Braille Nemeth Math (AMERICAN ASSOCIATION OF WORKERS FOR THE BLIND, 1987), uma notação em Braille, para LATEX. A tradução consiste na especificação de um filtro usando
a especificação em DCG da linguagem Nemeth Brasille e a semântica especificada como árvores sintáticas produzida em termos de LATEX. O resultado da especificação é totalmente
executável, uma vez que ambas, sintaxe e semântica, são apresentadas em Prolog padrão. No contexto de funções de tradução, Armstrong, Virding e Williams (1992) define o conceito de semantic embedding. Segundo o autor, trata-se dos casos em que a semântica
de uma determinada expressão é traduzida para Prolog e passa a significar o que quer que Prolog lhe dê significado. Desse modo, a semântica da linguagem subjacente, ou hospedeira (no caso, definidas para o próprio Prolog), se torna “accidentally embedded” na linguagem que está sendo definida. Esse tipo de semântica é especialmente útil, principalmente no que se refere à definição de linguagens internas, uma vez que permite compor constructos – ou padrões – semanticamente densos e sintaticamente simples que são traduzidos para a própria linguagem que servem de extensão.