You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7893 lines
290 KiB

2 months ago
  1. %* gmpl.tex *%
  2. %***********************************************************************
  3. % This code is part of GLPK (GNU Linear Programming Kit).
  4. %
  5. % Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
  6. % 2009, 2010, 2011, 2013, 2014, 2015 Andrew Makhorin, Department for
  7. % Applied Informatics, Moscow Aviation Institute, Moscow, Russia. All
  8. % rights reserved. E-mail: <mao@gnu.org>.
  9. %
  10. % GLPK is free software: you can redistribute it and/or modify it
  11. % under the terms of the GNU General Public License as published by
  12. % the Free Software Foundation, either version 3 of the License, or
  13. % (at your option) any later version.
  14. %
  15. % GLPK is distributed in the hope that it will be useful, but WITHOUT
  16. % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  17. % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  18. % License for more details.
  19. %
  20. % You should have received a copy of the GNU General Public License
  21. % along with GLPK. If not, see <http://www.gnu.org/licenses/>.
  22. %***********************************************************************
  23. \documentclass[11pt, brazil]{report}
  24. \usepackage[utf8]{inputenc}
  25. \usepackage[T1]{fontenc}
  26. \usepackage{amssymb}
  27. \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue,
  28. urlcolor=blue]{hyperref}
  29. \usepackage{indentfirst}
  30. \setlength{\textwidth}{6.5in}
  31. \setlength{\textheight}{8.5in}
  32. \setlength{\oddsidemargin}{0in}
  33. \setlength{\topmargin}{0in}
  34. \setlength{\headheight}{0in}
  35. \setlength{\headsep}{0in}
  36. \setlength{\footskip}{0.5in}
  37. \setlength{\parindent}{16pt}
  38. \setlength{\parskip}{5pt}
  39. \setlength{\topsep}{0pt}
  40. \setlength{\partopsep}{0pt}
  41. \setlength{\itemsep}{\parskip}
  42. \setlength{\parsep}{0pt}
  43. \setlength{\leftmargini}{\parindent}
  44. \renewcommand{\labelitemi}{---}
  45. \def\para#1{\noindent{\bf#1}}
  46. \renewcommand\contentsname{\sf\bfseries Conteúdo}
  47. \renewcommand\chaptername{\sf\bfseries Capítulo}
  48. \renewcommand\appendixname{\sf\bfseries Apêndice}
  49. % \renewcommand\contentsname{\sf\bfseries Contents}
  50. % \renewcommand\chaptername{\sf\bfseries Chapter}
  51. % \renewcommand\appendixname{\sf\bfseries Appendix}
  52. \begin{document}
  53. \thispagestyle{empty}
  54. \begin{center}
  55. \vspace*{1.5in}
  56. \begin{huge}
  57. \sf\bfseries Linguagem de Modelagem GNU MathProg
  58. \end{huge}
  59. \vspace{0.5in}
  60. \begin{LARGE}
  61. \sf Linguagem de Referência % Language Reference
  62. \end{LARGE}
  63. \vspace{0.5in}
  64. \begin{LARGE}
  65. \sf para o GLPK Versão 4.57
  66. \end{LARGE}
  67. \vspace{0.5in}
  68. \begin{Large}
  69. \sf (RASCUNHO, Fevereiro 2016)
  70. \end{Large}
  71. \end{center}
  72. \newpage
  73. \vspace*{1in}
  74. \vfill
  75. \noindent
  76. % The GLPK package is part of the GNU Project released under the aegis of GNU.
  77. O pacote GLPK é parte do Projeto GNU distribuído sob a égide do GNU.
  78. \noindent
  79. Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
  80. 2008, 2009, 2010, 2011, 2013, 2014, 2015, 2016 Andrew Makhorin, Department
  81. for Applied Informatics, Moscow Aviation Institute, Moscow, Russia.
  82. % All rights reserved.
  83. Todos os direitos reservados.
  84. \noindent
  85. Título original: Modeling Language GNU MathProg - Language Reference for GLPK Version 4.57
  86. \noindent
  87. Tradução: João Flávio de Freitas Almeida, Departamento de Engenharia de Produção, Universidade Federal de Minas Gerais,
  88. Minas Gerais, Brasil.
  89. \noindent
  90. Copyright \copyright{} 2015 João Flávio de Freitas Almeida, para esta tradução. Todos os direitos reservados.
  91. \noindent
  92. Free Software Foundation, Inc., Rua Franklin, 51, 5$^{o}$ andar, Boston,
  93. MA 02110-1301, USA.
  94. \noindent
  95. É permitido realizar e distribuir cópias textuais deste manual
  96. mantendo o aviso de copyright e preservando este aviso de permissão
  97. em todas as cópias.
  98. % Permission is granted to make and distribute verbatim copies of this
  99. % manual provided the copyright notice and this permission notice are
  100. % preserved on all copies.
  101. \noindent
  102. É concedida a permissão para copiar e distribuir versões modificadas deste manual sob
  103. as condições de cópias textuais, desde que o resultado completo derivado
  104. do trabalho resultante seja distribuído sob os termos de uma notificação
  105. de permissão idêntica a esta.
  106. % Permission is granted to copy and distribute modified versions of this
  107. % manual under the conditions for verbatim copying, provided also that
  108. % the entire resulting derived work is distributed under the terms of
  109. % a permission notice identical to this one.
  110. \noindent
  111. É concedida a permissão para copiar e distribuir traduções deste manual
  112. em outra linguagem, sob as condições acima para as versões modificadas.
  113. % Permission is granted to copy and distribute translations of this
  114. % manual into another language, under the above conditions for modified
  115. % versions.
  116. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  117. \newpage
  118. {\setlength{\parskip}{0pt}
  119. \tableofcontents
  120. }
  121. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  122. \chapter{Introdução}
  123. {\it GNU MathProg} é uma linguagem de modelagem projetada para descrever
  124. modelos lineares de programação matemática.
  125. \footnote{A linguagem GNU MathProg é um subconjunto da linguagem AMPL.
  126. A implementação do GLPK é \linebreak principalmente baseada no artigo:
  127. {\it Robert Fourer}, {\it David M. Gay}, and
  128. {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical
  129. Programming.'' {\it Management Science} 36 (1990), pp.~519-54.}
  130. % {\it GNU MathProg} is a modeling language intended for describing
  131. % linear mathematical programming models.\footnote{The GNU MathProg
  132. % language is a subset of the AMPL language. Its GLPK implementation is
  133. % mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and
  134. % {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical
  135. % Programming.'' {\it Management Science} 36 (1990), pp.~519-54.}
  136. A descrição de um modelo escrito na linguagem GNU MathProg consiste
  137. em um conjunto de sentenças e blocos de dados construído pelo
  138. usuário a partir dos elementos de linguagem descritos neste documento.
  139. % Model descriptions written in the GNU MathProg language consist of
  140. % a set of statements and data blocks constructed by the user from the
  141. % language elements described in this document.
  142. Em um processo denominado {\it tradução}, um programa denominado
  143. {\it tradutor do modelo} analisa a descrição do modelo e o traduz
  144. para uma estrutura de dados interna, que pode ser usado tanto para gerar
  145. instância de um problema de programação matemática ou obter diretamente
  146. a solução numérica do problema por meio de um programa chamado {\it solver}.
  147. % In a process called {\it translation}, a program called the {\it model
  148. % translator} analyzes the model description and translates it into
  149. % internal data structures, which may be then used either for generating
  150. % mathematical programming problem instance or directly by a program
  151. % called the {\it solver} to obtain numeric solution of the problem.
  152. \section{Problema de programação linear}
  153. \label{problem}
  154. Em MathProg o problema de programação linear (PL) é expresso da seguinte forma:
  155. % In MathProg the linear programming (LP) problem is stated as follows:
  156. \medskip
  157. \noindent\hspace{1in}minimizar (ou maximizar)
  158. $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$
  159. \noindent\hspace{1in}subjeito às restrições lineares
  160. $$
  161. \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l}
  162. L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\
  163. L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\
  164. \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
  165. L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\
  166. \end{array}\eqno(1.2)
  167. $$
  168. \noindent\hspace{1in}e os limites das variáveis
  169. $$
  170. \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l}
  171. l_1&\leq&x_1&\leq&u_1\\
  172. l_2&\leq&x_2&\leq&u_2\\
  173. \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\
  174. l_n&\leq&x_n&\leq&u_n\\
  175. \end{array}\eqno(1.3)
  176. $$
  177. % \newpage
  178. \noindent
  179. onde $x_1$, $x_2$, \dots, $x_n$ são variáveis; $z$ é a função objetivo
  180. ; $c_1$, $c_2$, \dots, $c_n$ são coeficientes da função objetivo; $c_0$
  181. é o termo constante da função objetivo; $a_{11}$,
  182. $a_{12}$, \dots, $a_{mn}$ são coeficientes das restrições; $L_1$, $L_2$,
  183. \dots, $L_m$ são limites inferiores das restrições; $U_1$, $U_2$, \dots, $U_m$
  184. são limites superiores das restrições; $l_1$, $l_2$, \dots, $l_n$ são limites
  185. inferiores das variáveis; $u_1$, $u_2$, \dots, $u_n$ são limites superiores das
  186. variáveis.
  187. Os limites das variáveis e das restrições podem ser tanto finitos quanto
  188. infinitos. Além disso, os limites inferiores podem ser igual aos limites
  189. superiores correspondentes. Logo, os seguintes tipos de variáveis e
  190. restrições são permitidos:
  191. % where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective
  192. % function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$
  193. % is the constant term (``shift'') of the objective function; $a_{11}$,
  194. % $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$,
  195. % \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$
  196. % are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower
  197. % bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of
  198. % variables.
  199. %
  200. % Bounds of variables and constraint bounds can be finite as well as
  201. % infinite. Besides, lower bounds can be equal to corresponding upper
  202. % bounds. Thus, the following types of variables and constraints are
  203. % allowed:
  204. \medskip
  205. {\def\arraystretch{1.4}
  206. \noindent\hspace{54pt}
  207. \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l}
  208. $-\infty$&$<$&$x$&$<$&$+\infty$&Variável livre (ilimitada)\\
  209. $l$&$\leq$&$x$&$<$&$+\infty$&Variável com limite inferior\\
  210. $-\infty$&$<$&$x$&$\leq$&$u$&Variável com limite superior\\
  211. $l$&$\leq$&$x$&$\leq$&$u$&Variável duplamente limitada\\
  212. $l$&$=$&$x$&=&$u$&Variável fixa\\
  213. \end{tabular}
  214. % \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l}
  215. % $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\
  216. % $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\
  217. % $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\
  218. % $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\
  219. % $l$&$=$&$x$&=&$u$&Fixed variable\\
  220. % \end{tabular}
  221. \noindent\hfil
  222. \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll}
  223. $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Forma linear livre (ilimitada)\\
  224. $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Restrição de desigualdade ``maior ou igual a''\\
  225. $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade ``menor ou igual a''\\
  226. $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade duplamente limitada\\
  227. $L$&$=$&$\sum a_jx_j$&=&$U$&Restrição de igualdade\\
  228. \end{tabular}
  229. % \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll}
  230. % $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear
  231. % form\\
  232. % $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater
  233. % than or equal to''\\
  234. % $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less
  235. % than or equal to''\\
  236. % $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality
  237. % constraint\\
  238. % $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\
  239. % \end{tabular}
  240. }
  241. \medskip
  242. Além de problemas puramente PL, MathProg também permite
  243. problemas de programação inteira mista (PIM), onde algumas ou
  244. todas as variáveis são restritas a serem inteiras ou binárias.
  245. % In addition to pure LP problems MathProg also allows mixed integer
  246. % linear programming (MIP) problems, where some or all variables are
  247. % restricted to be integer or binary.
  248. \section{Objetos do modelo}
  249. Em MathProg o modelo é descrito em termos de conjuntos, parâmetros,
  250. variáveis, restrições e objetivos, que se denominam {\it objetos
  251. do modelo}.
  252. O usuário introduz objetos particulares do modelo usando as sentenças
  253. da linguagem. Cada objeto do modelo possui um nome simbólico que o identifica
  254. de maneira única sendo projetado para propósitos de referenciação.
  255. % In MathProg the model is described in terms of sets, parameters,
  256. % variables, constraints, and objectives, which are called {\it model
  257. % objects}.
  258. %
  259. % The user introduces particular model objects using the language
  260. % statements. Each model object is provided with a symbolic name which
  261. % uniquely identifies the object and is intended for referencing
  262. % purposes.
  263. Objetos do modelo, incluindo conjuntos, podem ser matrizes multidimensionais
  264. construídos sobre conjuntos indexantes. Formalmente, uma matriz $n$-dimensional $A$
  265. é o mapeamento:
  266. % Model objects, including sets, can be multidimensional arrays built
  267. % over indexing sets. Formally, $n$-dimensional array $A$ is the mapping:
  268. $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$
  269. onde $\Delta\subseteq S_1\times\dots\times S_n$ é um subconjunto do
  270. produto Cartesiano de conjuntos indexantes, $\Xi$ é um conjunto dos
  271. membros da matriz. Em MathProg o conjunto $\Delta$ é chamado o {\it domínio do subíndice}. % REVISAR
  272. Seus membros são $n$-tuplas $(i_1,\dots,i_n)$, onde $i_1\in S_1$, \dots,
  273. $i_n\in S_n$.
  274. % where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the
  275. % Cartesian product of indexing sets, $\Xi$ is a set of array members.
  276. % In MathProg the set $\Delta$ is called the {\it subscript domain}. Its
  277. % members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots,
  278. % $i_n\in S_n$.
  279. Se $n=0$, o produto Cartesiano acima possui exatamente um membro (denominado
  280. 0-tupla), portanto, é conveniente pensar nos objetos escalares como sendo
  281. matrizes 0-dimensionais que \linebreak possuem apenas um membro.
  282. % If $n=0$, the Cartesian product above has exactly one member (namely,
  283. % 0-tuple), so it is convenient to think scalar objects as 0-dimensional
  284. % arrays having one member.
  285. % \newpage
  286. O tipo dos membros da matriz é determinado pelo tipo de objeto do modelo
  287. correspondente, como segue:
  288. % The type of array members is determined by the type of corresponding
  289. % model object as follows:
  290. \medskip
  291. \noindent\hfil
  292. \begin{tabular}{@{}ll@{}}
  293. Objeto do modelo&Membro da matriz\\
  294. \hline
  295. Conjunto&Conjunto plano elementar\\
  296. Parâmetro&Número ou símbolo\\
  297. Variável&Variável elementar\\
  298. Restrição&Restrição elementar\\
  299. Objetivo&Objetivo elementar\\
  300. \end{tabular}
  301. % \begin{tabular}{@{}ll@{}}
  302. % Model object&Array member\\
  303. % \hline
  304. % Set&Elemental plain set\\
  305. % Parameter&Number or symbol\\
  306. % Variable&Elemental variable\\
  307. % Constraint&Elemental constraint\\
  308. % Objective&Elemental objective\\
  309. % \end{tabular}
  310. \medskip
  311. Para referir a um membro particular de um objeto, este deve possuir
  312. {\it subíndices}. Por exemplo, se $a$ é um parâmetro 2-dimensional
  313. definido sobre $I\times J$, uma referência a seus membros particulares
  314. pode ser escrito como $a[i,j]$, onde $i\in I$ e $j\in J$. Entende-se
  315. que objetos escalares não necessitam de subíndices por serem 0-dimensionais.
  316. % In order to refer to a particular object member the object should be
  317. % provided with {\it subscripts}. For example, if $a$ is a 2-dimensional
  318. % parameter defined over $I\times J$, a reference to its particular
  319. % member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is
  320. % understood that scalar objects being 0-dimensional need no subscripts.
  321. \section{Estrutura da descrição do modelo}
  322. Às vezes é desejável escrever um modelo que, por diferentes motivos,
  323. tenha que requerer diferentes dados para resolver cada instância do problema
  324. usando o mesmo modelo.
  325. Por esta razão, em MathProg a descrição do modelo consiste em duas partes:
  326. a {\it seção de modelo} e a {\it seção de dados}.
  327. % It is sometimes desirable to write a model which, at various points,
  328. % may require different data for each problem instance to be solved using
  329. % that model. For this reason in MathProg the model description consists
  330. % of two parts: the {\it model section} and the {\it data section}.
  331. A seção de modelo é a principal parte da descrição do modelo, pois ela contém
  332. as declarações dos objetos do modelo. Ela também é comum a todos os problemas
  333. baseados no modelo correspondente.
  334. % The model section is a main part of the model description that contains
  335. % declarations of model objects and is common for all problems based on
  336. % the corresponding model.
  337. A seção de dados é uma parte opcional da descrição do modelo que
  338. contém dados específicos para uma instância particular do problema.
  339. % The data section is an optional part of the model description that
  340. % contains data specific for a particular problem instance.
  341. Dependendo do que seja mais conveniente, as seções de modelo e de dados
  342. podem ser dispostas em um arquivo único ou em dois arquivos separados.
  343. Esta última funcionalidade permite que se tenha um quantidade arbitrária
  344. de seções de dados diferentes a serem usadas com a mesma seção de modelo.
  345. % Depending on what is more convenient the model and data sections can be
  346. % placed either in one file or in two separate files. The latter feature
  347. % allows having arbitrary number of different data sections to be used
  348. % with the same model section.
  349. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  350. \chapter{Codificação da descrição do modelo}
  351. \label{coding}
  352. A descrição do modelo é codificada em um formato de arquivo plano de
  353. texto usando o conjunto de caracteres ASCII.
  354. Os caracteres válidos na descrição do modelo são os seguintes:
  355. % The model description is coded in a plain text format using ASCII
  356. % character set. Characters valid in the model description are the
  357. % following:
  358. \begin{itemize}
  359. \item Caracteres alfabéticos:\\
  360. \verb|A B C D E F G H I J K L M N O P Q R S T U V W X Y Z|\\
  361. \verb|a b c d e f g h i j k l m n o p q r s t u v w x y z _|
  362. \item caracteres numéricos:\\
  363. \verb|0 1 2 3 4 5 6 7 8 9|
  364. \item caracteres especiais:\\
  365. \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | } ~?
  366. \item caracteres de espaço em branco:\\
  367. \verb|SP HT CR NL VT FF|
  368. \end{itemize}
  369. Dentro de literais de cadeia e comentários quaisquer
  370. caracteres ASCII (exceto caracteres de controle) são válidos.
  371. % Within string literals and comments any ASCII characters (except
  372. % control characters) are valid.
  373. Caracteres de espaço-em-branco não são significativos. Eles podem ser
  374. usados livremente entre unidades léxicas para melhorar a legibilidade da
  375. descrição do modelo. Eles também são usados para separar unidades léxicas
  376. entre si, no caso de não existir outra forma de fazê-lo.
  377. % White-space characters are non-significant. They can be used freely
  378. % between lexical units to improve readability of the model description.
  379. % They are also used to separate lexical units from each other if there
  380. % is no other way to do that.
  381. Sintaticamente a descrição do modelo é uma sequência de unidades léxicas
  382. nas seguintes \linebreak categorias:
  383. % Syntactically model description is a sequence of lexical units in the
  384. % following categories:
  385. \begin{itemize}
  386. \item nomes simbólicos;
  387. \item literais numéricos;
  388. \item literais de cadeia;
  389. \item palavras-chave;
  390. \item delimitadores;
  391. \item comentários.
  392. \end{itemize}
  393. % \begin{itemize}
  394. % \item symbolic names;
  395. % \item numeric literals;
  396. % \item string literals;
  397. % \item keywords;
  398. % \item delimiters;
  399. % \item comments.
  400. % \end{itemize}
  401. As unidades léxicas da linguagem são discutidas abaixo.
  402. % \newpage
  403. \section{Nomes simbólicos}
  404. Um {\it nome simbólico} consiste de caracteres alfabéticos e numéricos,
  405. em que o primeiro deste deve ser alfabético. Todos os nomes simbólicos
  406. devem ser distintos (sensibilidade às maiúsculas: case-sensitive).
  407. % A {\it symbolic name} consists of alphabetic and numeric characters,
  408. % the first of which should be alphabetic. All symbolic names are
  409. % distinct (case sensitive).
  410. \para{Exemplos}
  411. \begin{verbatim}
  412. alfa123
  413. Este_eh_um_nome
  414. _P123_abc_321
  415. \end{verbatim}
  416. Nomes simbólicos são usados para identificar objetos do modelo
  417. (conjuntos, parâmetros, \linebreak variáveis, restrições, objetivos)
  418. e os índices.
  419. % Symbolic names are used to identify model objects (sets, parameters,
  420. % variables, constraints, objectives) and dummy indices.
  421. Todos os nomes simbólicos (exceto os nomes dos índices) devem ser únicos,
  422. i.e., a descrição do modelo não pode ter objetos com nomes idênticos.
  423. Nomes simbólicos de índices devem ser únicos dentro do escopo em que são válidos.
  424. % All symbolic names (except names of dummy indices) should be unique,
  425. % i.e. the model description should have no objects with identical names.
  426. % Symbolic names of dummy indices should be unique within the scope,
  427. % where they are valid.
  428. \section{Literais numéricos}
  429. Um {\it literal numérico} possui a forma {\it xx}{\tt E}{\it syy}, onde
  430. {\it xx} é um número com ponto decimal opcional, {\it s} é o sinal
  431. {\tt+} ou {\tt-}, {\it yy} é um expoente decimal. A letra {\tt E} é
  432. insensível à maiúsculas (case-insensitive) e pode ser codificada como {\tt e}.
  433. % A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where
  434. % {\it xx} is a number with optional decimal point, {\it s} is the sign
  435. % {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is
  436. % case insensitive and can be coded as {\tt e}.
  437. \para{Exemplos}
  438. \begin{verbatim}
  439. 123
  440. 3.14159
  441. 56.E+5
  442. .78
  443. 123.456e-7
  444. \end{verbatim}
  445. Literais numéricos são usados para representar quantidades numéricas. Eles
  446. possuem significado fixo óbvio.
  447. % Numeric literals are used to represent numeric quantities. They have
  448. % obvious fixed meaning.
  449. \section{Literais de cadeia}
  450. Uma {\it literal de cadeia} é uma sequência arbitrária de caracteres cercada
  451. por aspas tanto simples como duplas. Ambas formas são equivalentes.
  452. % A {\it string literal} is a sequence of arbitrary characters enclosed
  453. % either in single quotes or in double quotes. Both these forms are
  454. % equivalent.
  455. Se uma aspa simples é parte de uma literal de cadeia cercada por
  456. aspas simples, ela deve ser codificada duas vezes. De forma análoga,
  457. se uma aspa dupla é parte de um literal de cadeia cercada por aspas duplas,
  458. ela deve ser codificada duas vezes.
  459. % If a single quote is part of a string literal enclosed in single
  460. % quotes, it should be coded twice. Analogously, if a double quote is
  461. % part of a string literal enclosed in double quotes, it should be coded
  462. % twice.
  463. \para{Exemplos}
  464. \begin{verbatim}
  465. 'Esta eh uma string'
  466. "Esta eh outra string"
  467. 'Copo d''agua'
  468. """Beleza"" disse o capitao."
  469. \end{verbatim}
  470. Literais de cadeia são usadas para representar quantidades simbólicas.
  471. % String literals are used to represent symbolic quantities.
  472. \section{Palavras-chave}
  473. Uma {\it palavra-chave} é uma sequência de caracteres alfabéticos e
  474. possivelmente alguns caracteres especiais.
  475. % A {\it keyword} is a sequence of alphabetic characters and possibly
  476. % some special characters.
  477. Todas as palavras-chave caem em algumas das duas categorias:
  478. {\it palavras-chave reservadas}, que não podem ser usadas como nomes simbólicos,
  479. e {\it palavras-chave não-reservadas}, que são reconhecidas pelo contexto,
  480. portanto, podem ser usadas como nomes simbólicos.
  481. As palavras-chave reservadas são as seguintes:
  482. % All keywords fall into two categories: {\it reserved keywords}, which
  483. % cannot be used as symbolic names, and {\it non-reserved keywords},
  484. % which are recognized by context and therefore can be used as symbolic
  485. % names.
  486. %
  487. % The reserved keywords are the following:
  488. \noindent\hfil
  489. \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}}
  490. {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\
  491. {\tt by}&{\tt if}&{\tt not}&{\tt within}\\
  492. {\tt cross}&{\tt in}&{\tt or}\\
  493. {\tt diff}&{\tt inter}&{\tt symdiff}\\
  494. {\tt div}&{\tt less}&{\tt then}\\
  495. \end{tabular}
  496. Palavras-chave não-reservadas são descritas nas seções posteriores.
  497. Todas as palavras-chave possuem um significado fixo, a ser
  498. explicado nas discussões das \linebreak construções sintáticas correspondentes,
  499. onde as palavras-chave são usadas.
  500. % Non-reserved keywords are described in following sections.
  501. %
  502. % All the keywords have fixed meaning, which will be explained on
  503. % discussion of corresponding syntactic constructions, where the keywords
  504. % are used.
  505. \section{Delimitadores}
  506. Um {\it delimitador} é tanto um caractere especial único quanto uma sequência
  507. de dois caracteres especiais, como segue:
  508. % A {\it delimiter} is either a single special character or a sequence of
  509. % two special characters as follows:
  510. \noindent\hfil
  511. \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}
  512. p{.3in}p{.3in}@{}}
  513. {\tt+}&{\tt**}&{\tt<=}&{\tt>}&{\tt\&\&}&{\tt:}&{\tt|}&{\tt[}&
  514. {\tt>>}\\
  515. {\tt-}&{\tt\textasciicircum}&{\tt=}&{\tt<>}&{\tt||}&{\tt;}&
  516. {\tt\char126}&{\tt]}&{\tt<-}\\
  517. {\tt*}&{\tt\&}&{\tt==}&{\tt!=}&{\tt.}&{\tt:=}&{\tt(}&{\tt\{}\\
  518. {\tt/}&{\tt<}&{\tt>=}&{\tt!}&{\tt,}&{\tt..}&{\tt)}&{\tt\}}\\
  519. \end{tabular}
  520. Se um delimitador consiste de dois caracteres, não deve haver espaços
  521. entre os eles.
  522. Todos os delimitadores possuem um significado fixo, a ser
  523. explicado nas discussões das \linebreak construções sintáticas correspondentes,
  524. onde os delimitadores são usados.
  525. % If the delimiter consists of two characters, there should be no spaces
  526. % between the characters.
  527. %
  528. % All the delimiters have fixed meaning, which will be explained on
  529. % discussion corresponding syntactic constructions, where the delimiters
  530. % are used.
  531. \section{Comentários}
  532. Com propósitos de documentação, a descrição do modelo pode conter
  533. {\it comentários}, que podem ter duas formas diferentes. A primeira forma é
  534. um {\it comentário de linha-única}, que começa com o caractere {\tt\#}
  535. e se estende até o final da linha. A segunda forma é uma {\it sequência de
  536. comentários}, que é uma sequência de quaisquer caracteres cercados por
  537. {\tt/*} e {\tt*/}.
  538. % For documenting purposes the model description can be provided with
  539. % {\it comments}, which may have two different forms. The first form is
  540. % a {\it single-line comment}, which begins with the character {\tt\#}
  541. % and extends until end of line. The second form is a {\it comment
  542. % sequence}, which is a sequence of any characters enclosed within
  543. % {\tt/*} and {\tt*/}.
  544. \para{Exemplos}
  545. \begin{verbatim}
  546. param n := 10; # Este é um comentario
  547. /* Este é outro comentário */
  548. \end{verbatim}
  549. Comentários e caracteres de espaço-em-branco são ignorados pelo tradutor
  550. do modelo e podem aparecer em qualquer local da descrição do modelo.
  551. % Comments are ignored by the model translator and can appear anywhere in
  552. % the model description, where white-space characters are allowed.
  553. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  554. \newpage
  555. \chapter{Expressões}
  556. Uma {\it expressão} é uma regra para calcular um valor. Na descrição
  557. de um modelo, expressões são usadas como constituintes de certas sentenças.
  558. No geral, expressões são constituídas de operandos e operadores.
  559. Dependendo do tipo de valor resultante, todas expressões se enquadram nas
  560. seguintes categorias:
  561. % An {\it expression} is a rule for computing a value. In model
  562. % description expressions are used as constituents of certain statements.
  563. %
  564. % In general case expressions consist of operands and operators.
  565. %
  566. % Depending on the type of the resultant value all expressions fall into
  567. % the following categories:
  568. \vspace*{-8pt}
  569. \begin{itemize}
  570. \item expressões numéricas;
  571. \item expressões simbólicas;
  572. \item expressões indexantes;
  573. \item expressões de conjuntos;
  574. \item expressões lógicas;
  575. \item expressões lineares.
  576. \end{itemize}
  577. % \begin{itemize}
  578. % \item numeric expressions;
  579. % \item symbolic expressions;
  580. % \item indexing expressions;
  581. % \item set expressions;
  582. % \item logical expressions;
  583. % \item linear expressions.
  584. % \end{itemize}
  585. \vspace*{-8pt}
  586. \section{Expressões numéricas}
  587. Uma {\it expressão numérica} é uma regra para calcular um valor numérico individual
  588. representado como um número de ponto-flutuante.
  589. A expressão numérica primária pode ser um literal numérico, um índice,
  590. um parâmetro não-indexado, um parâmetro indexado, uma função interna de
  591. referência, uma expressão numérica iterada, uma expressão numérica condicional
  592. ou outra expressão cercada por parênteses.
  593. % A {\it numeric expression} is a rule for computing a single numeric
  594. % value represented as a floating-point number.
  595. %
  596. % The primary numeric expression may be a numeric literal, dummy index,
  597. % unsubscripted parameter, subscripted parameter, built-in function
  598. % reference, iterated numeric expression, conditional numeric expression,
  599. % or another numeric expression enclosed in parentheses.
  600. \para{Exemplos}
  601. \noindent
  602. \begin{tabular}{@{}ll@{}}
  603. \verb|1.23 |&(literal numérico)\\
  604. \verb|j|&(índice)\\
  605. \verb|time|&(parâmetro não-indexado)\\
  606. \verb|a['May 2003',j+1]|&(parâmetro indexado)\\
  607. \verb|abs(b[i,j])|&(função de referência)\\
  608. \end{tabular}
  609. % \begin{tabular}{@{}ll@{}}
  610. % \verb|1.23 |&(numeric literal)\\
  611. % \verb|j|&(dummy index)\\
  612. % \verb|time|&(unsubscripted parameter)\\
  613. % \verb|a['May 2003',j+1]|&(subscripted parameter)\\
  614. % \verb|abs(b[i,j])|&(function reference)\\
  615. % \end{tabular}
  616. \newpage
  617. \noindent
  618. \begin{tabular}{@{}ll@{}}
  619. \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(expressão iterada)\\
  620. \verb|if i in I then 2 * p else q[i+1]|&(expressão condicional)\\
  621. \verb|(b[i,j] + .5 * c)|&(expressão entre parênteses)\\
  622. \end{tabular}
  623. % \begin{tabular}{@{}ll@{}}
  624. % \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\
  625. % \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\
  626. % \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\
  627. % \end{tabular}
  628. Expressões numéricas mais genéricas, contendo duas ou mais
  629. expressões numéricas primárias, podem ser construídas usando
  630. determinados operadores aritméticos.
  631. % More general numeric expressions containing two or more primary numeric
  632. % expressions may be constructed by using certain arithmetic operators.
  633. \para{Exemplos}
  634. \begin{verbatim}
  635. j+1
  636. 2 * a[i-1,j+1] - b[i,j]
  637. sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k]
  638. (if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5)
  639. \end{verbatim}
  640. \subsection{Literais numéricos}
  641. Se a expressão numérica primária é um literal numérico,
  642. o valor resultante é óbvio.
  643. % If the primary numeric expression is a numeric literal, the resultant
  644. % value is obvious.
  645. \subsection{Índices}
  646. Se a expressão numérica primária é um índice,
  647. o valor resultante é o valor corrente atribuído àquele índice.
  648. % If the primary numeric expression is a dummy index, the resultant value
  649. % is current value assigned to that dummy index.
  650. \subsection{Parâmetros não-indexados}
  651. Se a expressão numérica primária é um parâmetro não-indexado
  652. (que deve ser 0-dimensional), o valor resultante é o valor
  653. do parâmetro.
  654. % If the primary numeric expression is an unsubscripted parameter (which
  655. % should be 0-dimen\-sional), the resultant value is the value of that
  656. % parameter.
  657. \subsection{Parâmetros indexados}
  658. A expressão numérica primária, que se refere ao parâmetro indexado,
  659. possui a seguinte forma sintática:
  660. % The primary numeric expression, which refers to a subscripted
  661. % parameter, has the following syntactic form:
  662. $$
  663. \mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}
  664. $$
  665. onde {\it nome} é o nome simbólico do parâmetro e $i_1$, $i_2$,
  666. \dots, $i_n$ são subíndices.
  667. Cada subíndice deve ser uma expressão numérica ou simbólica. O número
  668. de subíndices na lista de subíndices deve ser o mesmo da dimensão
  669. do parâmetro com o qual a lista de subíndices está associada.
  670. Os valores reais das expressões de subíndice são usadas para identificar
  671. um membro particular do parâmetro que determina o valor resultante
  672. da expressão primária.
  673. % where {\it name} is the symbolic name of the parameter, $i_1$, $i_2$,
  674. % \dots, $i_n$ are subscripts.
  675. %
  676. % Each subscript should be a numeric or symbolic expression. The number
  677. % of subscripts in the subscript list should be the same as the dimension
  678. % of the parameter with which the subscript list is associated.
  679. %
  680. % Actual values of subscript expressions are used to identify
  681. % a particular member of the parameter that determines the resultant
  682. % value of the primary expression.
  683. \newpage
  684. \subsection{Funções de referência}
  685. Em MathProg existem as seguintes funções internas, que podem ser
  686. usadas como expressões numéricas:
  687. % In MathProg there exist the following built-in functions which may be
  688. % used in numeric expressions:
  689. \begin{tabular}{@{}p{112pt}p{328pt}@{}}
  690. {\tt abs(}$x${\tt)}&$|x|$, valor absoluto de $x$\\
  691. {\tt atan(}$x${\tt)}&$\arctan x$, valor principal do arco tangente de
  692. $x$ (em radianos)\\
  693. {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, valor principal do
  694. arco tangente de $y/x$ (em radianos). Neste caso, os sinais de ambos
  695. argumentos $y$ e $x$ são usados para determinar o quadrante do valor
  696. resultante\\
  697. {\tt card(}$X${\tt)}&$|X|$, cardinalidade (o número de elementos) do
  698. conjunto $X$\\
  699. {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, menor inteiro não menor que
  700. $x$ (``teto de $x$'')\\
  701. {\tt cos(}$x${\tt)}&$\cos x$, cosseno de $x$ (em radianos)\\
  702. {\tt exp(}$x${\tt)}&$e^x$, exponencial de $x$ na base-$e$\\
  703. {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, maior inteiro não maior
  704. que $x$ (``piso de $x$'')\\
  705. {\tt gmtime()}&o número de segundos decorridos deste 00:00:00 de~01~de~Jan de 1970,
  706. Tempo Universal Coordenado (detalhes na Seção \ref{gmtime},
  707. página \pageref{gmtime})\\
  708. {\tt length(}$s${\tt)}&$|s|$, comprimento da cadeia de caracteres $s$\\
  709. {\tt log(}$x${\tt)}&$\log x$, logaritmo natural de $x$\\
  710. {\tt log10(}$x${\tt)}&$\log_{10}x$, logaritmo comum (decimal) de $x$\\
  711. {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o maior
  712. dos valores $x_1$, $x_2$, \dots, $x_n$\\
  713. {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o menor
  714. dos valores $x_1$, $x_2$, \dots, $x_n$\\
  715. {\tt round(}$x${\tt)}&arrendondamento de $x$ ao inteiro mais próximo\\
  716. {\tt round(}$x${\tt,} $n${\tt)}&arrendondamento de $x$ a $n$ dígitos decimais\\
  717. {\tt sin(}$x${\tt)}&$\sin x$, seno de $x$ (em radianos)\\
  718. {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, raiz quadrada não-negativa de $x$\\
  719. {\tt str2time(}$s${\tt,} $f${\tt)}&conversão de uma cadeia de caracteres $s$ ao
  720. tempo calendário (detalhes na Seção \ref{str2time}, página
  721. \pageref{str2time})\\
  722. {\tt trunc(}$x${\tt)}&truncado de $x$ ao inteiro mais próximo\\
  723. {\tt trunc(}$x${\tt,} $n${\tt)}&truncado de $x$ a $n$ dígitos decimais\\
  724. {\tt Irand224()}&gera inteiro pseudo-aleatório uniformemente distribuído
  725. em $[0,2^{24})$\\
  726. {\tt Uniform01()}&gera número pseudo-aleatório uniformemente distribuído
  727. em $[0,1)$\\
  728. {\tt Uniform(}$a${\tt,} $b${\tt)}&gera número pseudo-aleatório uniformemente
  729. distribuído em $[a,b)$\\
  730. {\tt Normal01()}&gera variável Gaussiana pseudo-aleatória com
  731. $\mu=0$ e $\sigma=1$\\
  732. {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&gera variável Gaussiana pseudo-aleatória
  733. com $\mu$ e $\sigma$ dados\\
  734. \end{tabular}
  735. % \begin{tabular}{@{}p{112pt}p{328pt}@{}}
  736. % {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\
  737. % {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of
  738. % $x$ (in radians)\\
  739. % {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the
  740. % arc tangent of $y/x$ (in radians). In this case the signs of both
  741. % arguments $y$ and $x$ are used to determine the quadrant of the
  742. % resultant value\\
  743. % {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of
  744. % set $X$\\
  745. % {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than
  746. % $x$ (``ceiling of $x$'')\\
  747. % {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\
  748. % {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\
  749. % {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater
  750. % than $x$ (``floor of $x$'')\\
  751. % {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970,
  752. % Coordinated Universal Time (for details see Section \ref{gmtime},
  753. % page \pageref{gmtime})\\
  754. % {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\
  755. % {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\
  756. % {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\
  757. % {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest
  758. % of values $x_1$, $x_2$, \dots, $x_n$\\
  759. % {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest
  760. % of values $x_1$, $x_2$, \dots, $x_n$\\
  761. % {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\
  762. % {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal
  763. % digits\\
  764. % {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\
  765. % {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\
  766. % {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to
  767. % calendar time (for details see Section \ref{str2time}, page
  768. % \pageref{str2time})\\
  769. % {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\
  770. % {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional
  771. % decimal digits\\
  772. % {\tt Irand224()}&generating pseudo-random integer uniformly distributed
  773. % in $[0,2^{24})$\\
  774. % {\tt Uniform01()}&generating pseudo-random number uniformly distributed
  775. % in $[0,1)$\\
  776. % {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number
  777. % uniformly distributed in $[a,b)$\\
  778. % {\tt Normal01()}&generating Gaussian pseudo-random variate with
  779. % $\mu=0$ and $\sigma=1$\\
  780. % {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian
  781. % pseudo-random variate with given $\mu$ and $\sigma$\\
  782. % \end{tabular}
  783. Os argumentos de todas as funções internas, exceto {\tt card}, {\tt length},
  784. e {\tt str2time}, devem ser \linebreak expressões numéricas. O argumento de
  785. {\tt card} deve ser uma expressão de conjunto. O argumento de {\tt length} e
  786. ambos argumentos de {\tt str2time} devem ser expressões simbólicas.
  787. O valor resultante da expressão numérica, que é uma função de referência,
  788. é o resultado da aplicação da função ao(s) seu(s) argumento(s).
  789. Note que cada função geradora de números pseudo-aleatórios possui um argumento
  790. latente (i.e., algum estado interno), que é alterado sempre que função é aplicada.
  791. Assim, se a função é aplicada repetidamente mesmos aos argumentos idênticos,
  792. devido ao efeito secundário, sempre se produzirão valores resultantes diferentes.
  793. % Arguments of all built-in functions, except {\tt card}, {\tt length},
  794. % and {\tt str2time}, should be numeric expressions. The argument of
  795. % {\tt card} should be a set expression. The argument of {\tt length} and
  796. % both arguments of {\tt str2time} should be symbolic expressions.
  797. %
  798. % The resultant value of the numeric expression, which is a function
  799. % reference, is the result of applying the function to its argument(s).
  800. %
  801. % Note that each pseudo-random generator function has a latent argument
  802. % (i.e. some internal state), which is changed whenever the function has
  803. % been applied. Thus, if the function is applied repeatedly even to
  804. % identical arguments, due to the side effect different resultant values
  805. % are always produced.
  806. \newpage
  807. \subsection{Expressões iteradas}
  808. \label{itexpr}
  809. Uma {\it expressão numérica iterada} é uma expressão numérica primária,
  810. que possui a seguinte forma sintática:
  811. $$\mbox{\it operador-iterado expressão-indexada integrando}$$
  812. onde o {\it operador-iterado} é o nome simbólico do operador de iteração
  813. a ser executado (veja abaixo), {\it expressão-indexada} é uma
  814. expressão indexada que introduz índices e controla a iteração e
  815. {\it integrando} é uma expressão numérica que participa da operação.
  816. \noindent
  817. Em MathProg existem quatro operadores iterados, que podem ser usados
  818. em expressões numéricas:
  819. % An {\it iterated numeric expression} is a primary numeric expression,
  820. % which has the following syntactic form:
  821. % $$\mbox{\it iterated-operator indexing-expression integrand}$$
  822. % where {\it iterated-operator} is the symbolic name of the iterated
  823. % operator to be performed (see below), {\it indexing-expression} is an
  824. % indexing expression which introduces dummy indices and controls
  825. % iterating, {\it integrand} is a numeric expression that participates in
  826. % the operation.
  827. %
  828. % In MathProg there exist four iterated operators, which may be used in
  829. % numeric expressions:
  830. {\def\arraystretch{2}
  831. \noindent\hfil
  832. \begin{tabular}{@{}lll@{}}
  833. {\tt sum}&somatório&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta}
  834. f(i_1,\dots,i_n)$\\
  835. {\tt prod}&produtório&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta}
  836. f(i_1,\dots,i_n)$\\
  837. {\tt min}&mínimo&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta}
  838. f(i_1,\dots,i_n)$\\
  839. {\tt max}&máximo&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta}
  840. f(i_1,\dots,i_n)$\\
  841. \end{tabular}
  842. }
  843. % {\def\arraystretch{2}
  844. % \noindent\hfil
  845. % \begin{tabular}{@{}lll@{}}
  846. % {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta}
  847. % f(i_1,\dots,i_n)$\\
  848. % {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta}
  849. % f(i_1,\dots,i_n)$\\
  850. % {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta}
  851. % f(i_1,\dots,i_n)$\\
  852. % {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta}
  853. % f(i_1,\dots,i_n)$\\
  854. % \end{tabular}
  855. % }
  856. \noindent onde $i_1$, \dots, $i_n$ são índices introduzidos nas
  857. expressões indexadas, $\Delta$ é o domínio, um conjunto de $n$-tuplas
  858. especificado pela expressão indexada que define valores particulares
  859. atribuído aos índices ao executar a operação iterada e
  860. $f(i_1,\dots,i_n)$ é o integrando, uma expressão numérica cujo valor
  861. resultante depende dos índices.
  862. O valor resultante de uma expressão numérica iterada é o resultado da aplicação
  863. do operador iterado ao seu integrando por todas as $n$-tuplas
  864. contidas no domínio.
  865. % \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
  866. % the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
  867. % specified by the indexing expression which defines particular values
  868. % assigned to the dummy indices on performing the iterated operation,
  869. % $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose
  870. % resultant value depends on the dummy indices.
  871. %
  872. % The resultant value of an iterated numeric expression is the result of
  873. % applying of the iterated operator to its integrand over all $n$-tuples
  874. % contained in the domain.
  875. \subsection{Expressões condicionais}
  876. \label{ifthen}
  877. Uma {\it expressão numérica condicional} é uma expressão numérica primária
  878. que possui uma das seguintes formas sintáticas:
  879. % A {\it conditional numeric expression} is a primary numeric expression,
  880. % which has one of the following two syntactic forms:
  881. $$
  882. {\def\arraystretch{1.4}
  883. \begin{array}{l}
  884. \mbox{{\tt if} $b$ {\tt then} $x$ {\tt else} $y$}\\
  885. \mbox{{\tt if} $b$ {\tt then} $x$}\\
  886. \end{array}
  887. }
  888. $$
  889. onde $b$ é uma expressão lógica, enquanto que $x$ e $y$ são expressões numéricas.
  890. % where $b$ is an logical expression, $x$ and $y$ are numeric
  891. % expressions.
  892. O valor resultante da expressão condicional depende do valor da
  893. expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe
  894. o valor {\it verdadeiro}, o valor da expressão condicional é o valor
  895. da expressão que segue a palavra-chave {\tt then}.
  896. Caso contrário, se a expressão lógica recebe o valor {\it falso},
  897. o valor da expressão condicional é o valor da expressão que segue
  898. a palavra-chave {\it else}. Se ocorre a segunda forma sintática
  899. da expressão condicional, a reduzida, e a expressão lógica recebe o valor
  900. {\it falso}, então o valor resultante da expressão condicional é zero.
  901. % The resultant value of the conditional expression depends on the value
  902. % of the logical expression that follows the keyword {\tt if}. If it
  903. % takes on the value {\it true}, the value of the conditional expression
  904. % is the value of the expression that follows the keyword {\tt then}.
  905. % Otherwise, if the logical expression takes on the value {\it false},
  906. % the value of the conditional expression is the value of the expression
  907. % that follows the keyword {\it else}. If the second, reduced form of the
  908. % conditional expression is used and the logical expression takes on the
  909. % value {\it false}, the resultant value of the conditional expression is
  910. % zero.
  911. \newpage
  912. \subsection{Expressões parentizadas}
  913. Qualquer expressão numérica pode ser cercada por parênteses, o que as
  914. torna sintaticamente uma expressão numérica primária.
  915. Parênteses podem ser usados em expressões numéricas, como em álgebra, para
  916. especificar a ordem desejada na qual as operações devem ser realizadas.
  917. Quando se usam parênteses, a expressão entre parênteses é avaliada
  918. antes e seu o valor resultante é usado.
  919. O valor resultante de uma expressão parentizada é o mesmo
  920. valor de uma expressão cercada entre parênteses.
  921. % Any numeric expression may be enclosed in parentheses that
  922. % syntactically makes it a primary numeric expression.
  923. %
  924. % Parentheses may be used in numeric expressions, as in algebra, to
  925. % specify the desired order in which operations are to be performed.
  926. % Where parentheses are used, the expression within the parentheses is
  927. % evaluated before the resultant value is used.
  928. %
  929. % The resultant value of the parenthesized expression is the same as the
  930. % value of the expression enclosed within parentheses.
  931. \subsection{Operadores aritméticos}
  932. Em MathProg exitem os seguintes operadores aritméticos, que podem ser
  933. usados em expressões numéricas:
  934. % In MathProg there exist the following arithmetic operators, which may
  935. % be used in numeric expressions:
  936. \begin{tabular}{@{}ll@{}}
  937. {\tt +} $x$&mais unário\\
  938. {\tt -} $x$&menos unário\\
  939. $x$ {\tt +} $y$&adição\\
  940. $x$ {\tt -} $y$&subtração\\
  941. $x$ {\tt less} $y$&diferença positiva (se $x<y$ então 0 senão $x-y$)\\
  942. $x$ {\tt *} $y$&multiplicação\\
  943. $x$ {\tt /} $y$&divisão\\
  944. $x$ {\tt div} $y$&quociente da divisão exata\\
  945. $x$ {\tt mod} $y$&resto da divisão exata\\
  946. $x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponenciação (elevação a uma potência)\\
  947. \end{tabular}
  948. % \begin{tabular}{@{}ll@{}}
  949. % {\tt +} $x$&unary plus\\
  950. % {\tt -} $x$&unary minus\\
  951. % $x$ {\tt +} $y$&addition\\
  952. % $x$ {\tt -} $y$&subtraction\\
  953. % $x$ {\tt less} $y$&positive difference (if $x<y$ then 0 else $x-y$)\\
  954. % $x$ {\tt *} $y$&multiplication\\
  955. % $x$ {\tt /} $y$&division\\
  956. % $x$ {\tt div} $y$&quotient of exact division\\
  957. % $x$ {\tt mod} $y$&remainder of exact division\\
  958. % $x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponentiation (raising
  959. % to power)\\
  960. % \end{tabular}
  961. \noindent onde $x$ e $y$ são expressões numéricas.
  962. Se a expressão inclui mais de um operador aritmético, todos
  963. operadores são executados da esquerda para a direita de acordo
  964. com a hierarquia das operações (veja abaixo) com a única exceção de
  965. que os operadores de exponenciação são executados da direita para a esquerda.
  966. O valor resultante da expressão, que contém operadores aritméticos,
  967. é o resultado da aplicação dos operadores aos seus operandos.
  968. % \noindent where $x$ and $y$ are numeric expressions.
  969. %
  970. % If the expression includes more than one arithmetic operator, all
  971. % operators are performed from left to right according to the hierarchy
  972. % of operations (see below) with the only exception that the
  973. % exponentiaion operators are performed from right to left.
  974. %
  975. % The resultant value of the expression, which contains arithmetic
  976. % operators, is the result of applying the operators to their operands.
  977. \subsection{Hierarquia das operações}
  978. \label{hierarchy}
  979. A lista seguinte apresenta a hierarquia das operações
  980. em expressões numéricas:
  981. % The following list shows the hierarchy of operations in numeric
  982. % expressions:
  983. \noindent\hfil
  984. \begin{tabular}{@{}ll@{}}
  985. Operação&Hierarquia\\
  986. \hline
  987. Avaliação das funções ({\tt abs}, {\tt ceil}, etc.)&
  988. 1{\textsuperscript{\b{a}}}\\
  989. Exponenciação ({\tt**}, {\tt\textasciicircum})&
  990. 2{\textsuperscript{\b{a}}}\\
  991. Mais e menos unário ({\tt+}, {\tt-})&
  992. 3{\textsuperscript{\b{a}}}\\
  993. Multiplicação e divisão ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&
  994. 4{\textsuperscript{\b{a}}}\\
  995. Operações iteradas ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&
  996. 5{\textsuperscript{\b{a}}}\\
  997. Adição e subtração ({\tt+}, {\tt-}, {\tt less})&
  998. 6{\textsuperscript{\b{a}}}\\
  999. Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
  1000. 7{\textsuperscript{\b{a}}}\\
  1001. \end{tabular}
  1002. % \noindent\hfil
  1003. % \begin{tabular}{@{}ll@{}}
  1004. % Operation&Hierarchy\\
  1005. % \hline
  1006. % Evaluation of functions ({\tt abs}, {\tt ceil}, etc.)&1st\\
  1007. % Exponentiation ({\tt**}, {\tt\textasciicircum})&2nd\\
  1008. % Unary plus and minus ({\tt+}, {\tt-})&3rd\\
  1009. % Multiplication and division ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&4th\\
  1010. % Iterated operations ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&5th\\
  1011. % Addition and subtraction ({\tt+}, {\tt-}, {\tt less})&6th\\
  1012. % Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
  1013. % 7th\\
  1014. % \end{tabular}
  1015. \newpage
  1016. Esta hierarquia é usada para determinar qual de duas operações consecutivas
  1017. deve ser executada primeiro. Se o primeiro operador possui hierarquia
  1018. maior ou igual ao segundo, a primeira operação é executada. Caso contrário,
  1019. a segunda operação é comparada à terceira e assim sucessivamente.
  1020. Quando se alcança o fim da expressão, todas as operações remanescentes
  1021. são executadas na ordem inversa.
  1022. % This hierarchy is used to determine which of two consecutive operations
  1023. % is performed first. If the first operator is higher than or equal to
  1024. % the second, the first operation is performed. If it is not, the second
  1025. % operator is compared to the third, etc. When the end of the expression
  1026. % is reached, all of the remaining operations are performed in the
  1027. % reverse order.
  1028. \section{Expressões simbólicas}
  1029. Uma {\it expressão simbólica} é uma regra para calcular um valor simbólico individual
  1030. representado como uma cadeia de caracteres.
  1031. A expressão simbólica primária pode ser uma cadeia literal, um índice,
  1032. um parâmetro não-indexado, um parâmetro indexado, uma função interna de referência,
  1033. uma expressão simbólica condicional ou outra expressão simbólica cercada
  1034. entre parênteses.
  1035. Também é permitido usar uma expressão numérica como a expressão simbólica primária,
  1036. neste caso o valor resultante da expressão numérica é automaticamente convertido
  1037. em um tipo simbólico.
  1038. % A {\it symbolic expression} is a rule for computing a single symbolic
  1039. % value represented as a character string.
  1040. %
  1041. % The primary symbolic expression may be a string literal, dummy index,
  1042. % unsubscripted parameter, subscripted parameter, built-in function
  1043. % reference, conditional symbolic expression, or another symbolic
  1044. % expression enclosed in parentheses.
  1045. %
  1046. % It is also allowed to use a numeric expression as the primary symbolic
  1047. % expression, in which case the resultant value of the numeric expression
  1048. % is automatically converted to the symbolic type.
  1049. \para{Exemplos}
  1050. \noindent
  1051. \begin{tabular}{@{}ll@{}}
  1052. \verb|'Maio de 2003'|&(literal de cadeia)\\
  1053. \verb|j|&(índice)\\
  1054. \verb|p|&(parâmetro não-indexado)\\
  1055. \verb|s['abc',j+1]|&(parâmetro indexado)\\
  1056. \verb|substr(name[i],k+1,3)|&(função de referência)\\
  1057. \verb|if i in I then s[i,j] & "..." else t[i+1]|& (expressão condicional) \\
  1058. \verb|((10 * b[i,j]) & '.bis')|&(expressão parentizada)\\
  1059. \end{tabular}
  1060. % \noindent
  1061. % \begin{tabular}{@{}ll@{}}
  1062. % \verb|'May 2003'|&(string literal)\\
  1063. % \verb|j|&(dummy index)\\
  1064. % \verb|p|&(unsubscripted parameter)\\
  1065. % \verb|s['abc',j+1]|&(subscripted parameter)\\
  1066. % \verb|substr(name[i],k+1,3)|&(function reference)\\
  1067. % \verb|if i in I then s[i,j] & "..." else t[i+1]|
  1068. % & (conditional expression) \\
  1069. % \verb|((10 * b[i,j]) & '.bis')|&(parenthesized expression)\\
  1070. % \end{tabular}
  1071. Expressões simbólicas mais genéricas contendo duas ou mais expressões
  1072. simbólicas primárias podem ser construídas usando o operador de
  1073. concatenação.
  1074. % More general symbolic expressions containing two or more primary
  1075. % symbolic expressions may be constructed by using the concatenation
  1076. % operator.
  1077. \para{Exemplos}
  1078. \begin{verbatim}
  1079. 'abc[' & i & ',' & j & ']'
  1080. "de " & cidade[i] " para " & cidade[j]
  1081. \end{verbatim}
  1082. % \begin{verbatim}
  1083. % 'abc[' & i & ',' & j & ']'
  1084. % "from " & city[i] " to " & city[j]
  1085. % \end{verbatim}
  1086. Os princípios da avaliação de expressões simbólicas são completamente
  1087. análogos àqueles dados para expressões numéricas (veja acima).
  1088. % The principles of evaluation of symbolic expressions are completely
  1089. % analogous to the ones given for numeric expressions (see above).
  1090. \subsection{Funções de referência}
  1091. Em MathProg existem as seguintes funções internas que podem ser usadas em
  1092. expressões \linebreak simbólicas:
  1093. % In MathProg there exist the following built-in functions which may be
  1094. % used in symbolic expressions:
  1095. \begin{tabular}{@{}p{112pt}p{328pt}@{}}
  1096. {\tt substr(}$s${\tt,} $x${\tt)}&substring de $s$ iniciado na
  1097. posição $x$\\
  1098. {\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring de $s$ iniciado
  1099. na posição $x$ com tamanho $y$\\
  1100. {\tt time2str(}$t${\tt,} $f${\tt)}&converte o tempo de calendário para
  1101. uma cadeia de caracteres \linebreak (detalhes na Seção \ref{time2str}, página
  1102. \pageref{time2str})\\
  1103. \end{tabular}
  1104. % \begin{tabular}{@{}p{112pt}p{328pt}@{}}
  1105. % {\tt substr(}$s${\tt,} $x${\tt)}&substring of $s$ starting from
  1106. % position $x$\\
  1107. % {\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring of $s$ starting
  1108. % from position $x$ and having length $y$\\
  1109. % {\tt time2str(}$t${\tt,} $f${\tt)}&converting calendar time to
  1110. % character string (for details see Section \ref{time2str}, page
  1111. % \pageref{time2str})\\
  1112. % \end{tabular}
  1113. O primeiro argumento de {\tt substr} deve ser uma expressão simbólica
  1114. enquanto que o segundo e o terceiro (opcional) argumentos devem ser
  1115. expressões numéricas.
  1116. O primeiro argumento de {\tt time2str} deve ser uma expressão numérica,
  1117. e seu segundo argumento deve ser uma expressão simbólica.
  1118. O valor resultante da expressão simbólica, que é uma função de referência,
  1119. é o resultado de aplicar a função aos seus argumentos.
  1120. % The first argument of {\tt substr} should be a symbolic expression
  1121. % while its second and optional third arguments should be numeric
  1122. % expressions.
  1123. %
  1124. % The first argument of {\tt time2str} should be a numeric expression,
  1125. % and its second argument should be a symbolic expression.
  1126. %
  1127. % The resultant value of the symbolic expression, which is a function
  1128. % reference, is the result of applying the function to its arguments.
  1129. \subsection{Operadores simbólicos}
  1130. Atualmente, em MathProg exite um único operador simbólico:
  1131. $$\mbox{\tt s \& t}$$
  1132. onde $s$ e $t$ são expressões simbólicas. Este operador implica na
  1133. concatenação dos seus dois operandos simbólicos, que são cadeias
  1134. de caracteres.
  1135. % Currently in MathProg there exists the only symbolic operator:
  1136. % $$\mbox{\tt s \& t}$$
  1137. % where $s$ and $t$ are symbolic expressions. This operator means
  1138. % concatenation of its two symbolic operands, which are character
  1139. % strings.
  1140. \subsection{Hierarquia de operações}
  1141. A lista seguinte mostra a hierarquia das operações em expressões
  1142. simbólicas:
  1143. % The following list shows the hierarchy of operations in symbolic
  1144. % expressions:
  1145. \noindent\hfil
  1146. \begin{tabular}{@{}ll@{}}
  1147. Operação&Hierarquia\\
  1148. \hline
  1149. Avaliação de operações numéricas&
  1150. 1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
  1151. Concatenação ({\tt\&})&8{\textsuperscript{\b{a}}}\\
  1152. Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
  1153. 9{\textsuperscript{\b{a}}}\\
  1154. \end{tabular}
  1155. % \noindent\hfil
  1156. % \begin{tabular}{@{}ll@{}}
  1157. % Operation&Hierarchy\\
  1158. % \hline
  1159. % Evaluation of numeric operations&1st-7th\\
  1160. % Concatenation ({\tt\&})&8th\\
  1161. % Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
  1162. % 9th\\
  1163. % \end{tabular}
  1164. Esta hierarquia possui o mesmo significado como explicado acima para
  1165. expressões numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
  1166. % This hierarchy has the same meaning as was explained above for numeric
  1167. % expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
  1168. \section{Expressões de indexação e índices}
  1169. \label{indexing}
  1170. Uma {\it expressão indexante} é uma construção auxiliar que especifica um
  1171. conjunto plano de $n$-tuplas e introduz índices. Possui duas formas
  1172. sintáticas:
  1173. % An {\it indexing expression} is an auxiliary construction, which
  1174. % specifies a plain set of $n$-tuples and introduces dummy indices. It
  1175. % has two syntactic forms:
  1176. $$
  1177. {\def\arraystretch{1.4}
  1178. \begin{array}{l}
  1179. \mbox{{\tt\{} {\it entrada}$_1${\tt,} {\it entrada}$_2${\tt,} \dots{\tt,}
  1180. {\it entrada}$_m$ {\tt\}}}\\
  1181. \mbox{{\tt\{} {\it entrada}$_1${\tt,} {\it entrada}$_2${\tt,} \dots{\tt,}
  1182. {\it entrada}$_m$ {\tt:} {\it predicado} {\tt\}}}\\
  1183. \end{array}
  1184. }
  1185. $$
  1186. % $$
  1187. % {\def\arraystretch{1.4}
  1188. % \begin{array}{l}
  1189. % \mbox{{\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
  1190. % {\it entry}$_m$ {\tt\}}}\\
  1191. % \mbox{{\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
  1192. % {\it entry}$_m$ {\tt:} {\it predicate} {\tt\}}}\\
  1193. % \end{array}
  1194. % }
  1195. % $$
  1196. onde {\it entrada}{$_1$}, {\it entrada}{$_2$}, \dots, {\it entrada}{$_m$}
  1197. são entradas indexantes, {\it predicado} é uma expressão lógica que especifica
  1198. um predicado opcional (condição lógica).
  1199. % where {\it entry}{$_1$}, {\it entry}{$_2$}, \dots, {\it entry}{$_m$}
  1200. % are indexing entries, {\it predicate} is a logical expression that
  1201. % specifies an optional predicate (logical condition).
  1202. Cada {\it entrada indexante} na expressão indexante possui uma das três
  1203. formas seguintes:
  1204. % Each {\it indexing entry} in the indexing expression has one of the
  1205. % following three forms:
  1206. $$
  1207. {\def\arraystretch{1.4}
  1208. \begin{array}{l}
  1209. \mbox{$i$ {\tt in} $S$}\\
  1210. \mbox{{\tt(}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}$i_n${\tt)} {\tt in}
  1211. $S$}\\
  1212. \mbox{$S$}\\
  1213. \end{array}
  1214. }
  1215. $$
  1216. onde $i_1$, $i_2$, \dots, $i_n$ são índices e $S$ é uma expressão de conjunto
  1217. (discutido na próxima seção) que especifica o conjunto básico.
  1218. % where $i_1$, $i_2$, \dots, $i_n$ are indices, $S$ is a set expression
  1219. % (discussed in the next section) that specifies the basic set.
  1220. \newpage
  1221. O número de índices na entrada indexante deve coincidir com a
  1222. dimensão do conjunto básico $S$, i.e., se $S$ consiste de 1-tuplas,
  1223. deve-se usar a primeira forma. Se $S$ consiste de $n$-tuplas, onde
  1224. $n>1$, a segunda forma deve ser usada.
  1225. % The number of indices in the indexing entry should be the same as the
  1226. % dimension of the basic set $S$, i.e. if $S$ consists of 1-tuples, the
  1227. % first form should be used, and if $S$ consists of $n$-tuples, where
  1228. % $n>1$, the second form should be used.
  1229. Se a primeira forma da entrada indexante é usada, o índice $i$ pode ser
  1230. apenas um índice (veja mais adiante). Se a segunda forma é utilizada, os índices
  1231. $i_1$, $i_2$, \dots, $i_n$ podem ser tanto índices como alguma expressão numérica
  1232. ou simbólica, em que pelo menos um dos índices deve ser um índice.
  1233. Na terceira, a forma reduzida da entrada indexante possui o mesmo efeito
  1234. se houver $i$ (se $S$ é 1-dimensional) ou
  1235. $i_1$, $i_2$, \dots, $i_n$ (se $S$ é $n$-dimensional) onde todos são especificados
  1236. como índices.
  1237. % If the first form of the indexing entry is used, the index $i$ can be
  1238. % a dummy index only (see below). If the second form is used, the indices
  1239. % $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric
  1240. % or symbolic expressions, where at least one index should be a dummy
  1241. % index. The third, reduced form of the indexing entry has the same
  1242. % effect as if there were $i$ (if $S$ is 1-dimensional) or
  1243. % $i_1$, $i_2$, \dots, $i_n$ (if $S$ is $n$-dimensional) all specified as
  1244. % dummy indices.
  1245. Um {\it índice} é um objeto auxiliar do modelo, que atua como uma
  1246. variável individual. Os valores atribuídos aos índices são componentes
  1247. das $n$-tuplas dos conjuntos básicos, i.e., algumas quantidades
  1248. numéricas e simbólicas.
  1249. % A {\it dummy index} is an auxiliary model object, which acts like an
  1250. % individual variable. Values assigned to dummy indices are components of
  1251. % $n$-tuples from basic sets, i.e. some numeric and symbolic quantities.
  1252. Com propósitos de referência, índices podem ter nomes simbólicos.
  1253. No entanto, diferentemente de outros objetos de modelo (conjuntos,
  1254. parâmetros, etc.) índices não precisam ser \linebreak explicitamente declarados.
  1255. Cada nome simbólico {\it não-declarado} usado na posição indexante de
  1256. uma entrada indexante é reconhecida como o nome simbólico do índice
  1257. correspondente.
  1258. % For referencing purposes dummy indices can be provided with symbolic
  1259. % names. However, unlike other model objects (sets, parameters, etc.)
  1260. % dummy indices need not be explicitly declared. Each {\it undeclared}
  1261. % symbolic name being used in the indexing position of an indexing entry
  1262. % is recognized as the symbolic name of corresponding dummy index.
  1263. Os nomes simbólicos dos índices são válidos somente dentro do escopo
  1264. da expressão indexante, onde o índice foi inserido. Além do escopo,
  1265. os índices são completamente inacessíveis, de modo que os mesmos
  1266. nomes simbólicos podem ser usados para outros propósitos, em particular,
  1267. para representar índices em outras expressões indexantes.
  1268. % Symbolic names of dummy indices are valid only within the scope of the
  1269. % indexing expression, where the dummy indices were introduced. Beyond
  1270. % the scope the dummy indices are completely inaccessible, so the same
  1271. % symbolic names may be used for other purposes, in particular, to
  1272. % represent dummy indices in other indexing expressions.
  1273. O escopo da expressão indexante, em que declarações implícitas de índices
  1274. são válidas, depende do contexto em que a expressão indexante é usada:
  1275. % The scope of indexing expression, where implicit declarations of dummy
  1276. % indices are valid, depends on the context, in which the indexing
  1277. % expression is used:
  1278. \vspace*{-8pt}
  1279. \begin{itemize}
  1280. \item Se a expressão indexante é usada em um operador-iterado, seu
  1281. escopo se estende até o final do integrando.
  1282. \item Se a expressão indexante é usada como uma expressão de conjunto
  1283. primária, seu escopo de estende até o final desta expressão indexante.
  1284. \item Se a expressão indexante é usada para definir o domínio do subíndice
  1285. na declaração de alguns objetos de modelo, seu escopo se estende até o
  1286. final da declaração correspondente.
  1287. \end{itemize}
  1288. % \begin{itemize}
  1289. % \item If the indexing expression is used in iterated operator, its
  1290. % scope extends until the end of the integrand.
  1291. % \item If the indexing expression is used as a primary set expression,
  1292. % its scope extends until the end of that indexing expression.
  1293. % \item If the indexing expression is used to define the subscript domain
  1294. % in declarations of some model objects, its scope extends until the end
  1295. % of the corresponding statement.
  1296. % \end{itemize}
  1297. \vspace*{-8pt}
  1298. O mecanismo de indexação implementado para indexar expressões é melhor
  1299. explicado por alguns exemplos discutidos abaixo.
  1300. Sejam três conjuntos:
  1301. % The indexing mechanism implemented by means of indexing expressions is
  1302. % best explained by some examples discussed below.
  1303. %
  1304. % Let there be given three sets:
  1305. $$
  1306. {\def\arraystretch{1.4}
  1307. \begin{array}{l}
  1308. A=\{4,7,9\},\\
  1309. B=\{(1,Jan),(1,Fev),(2,Mar),(2,Abr),(3,Mai),(3,Jun)\},\\
  1310. C=\{a,b,c\},\\
  1311. \end{array}
  1312. }
  1313. $$
  1314. % $$
  1315. % {\def\arraystretch{1.4}
  1316. % \begin{array}{l}
  1317. % A=\{4,7,9\},\\
  1318. % B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\},\\
  1319. % C=\{a,b,c\},\\
  1320. % \end{array}
  1321. % }
  1322. % $$
  1323. onde $A$ e $C$ consistem de 1-tuplas (singletos), $B$ consiste de
  1324. 2-tuplas (dobletes). Considere a seguinte expressão indexante:
  1325. $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$
  1326. onde {\tt i}, {\tt j}, {\tt k}, e {\tt l} são índices.
  1327. % where $A$ and $C$ consist of 1-tuples (singlets), $B$ consists of
  1328. % 2-tuples (doublets). Consider the following indexing expression:
  1329. % $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$
  1330. % where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy indices.
  1331. \newpage
  1332. Embora MathProg não seja uma linguagem procedural, para qualquer
  1333. expressão indexante uma descrição algorítmica equivalente pode ser dada.
  1334. Em particular, a descrição algorítmica da expressão indexante acima
  1335. poderia ser vista como segue:
  1336. % Although MathProg is not a procedural language, for any indexing
  1337. % expression an equivalent algorithmic description can be given. In
  1338. % particular, the algorithmic description of the indexing expression
  1339. % above could look like follows:
  1340. \noindent\hfil
  1341. \begin{tabular}{@{}l@{}}
  1342. {\bf para todo} $i\in A$ {\bf faça}\\
  1343. \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\
  1344. \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
  1345. \hspace{48pt}{\it ação};\\
  1346. \end{tabular}
  1347. % \noindent\hfil
  1348. % \begin{tabular}{@{}l@{}}
  1349. % {\bf for all} $i\in A$ {\bf do}\\
  1350. % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
  1351. % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
  1352. % \hspace{48pt}{\it action};\\
  1353. % \end{tabular}
  1354. \noindent onde os índices $i$, $j$, $k$, $l$ são consecutivamente
  1355. atribuídos aos componentes correspondentes das $n$-tuplas dos conjuntos
  1356. básicos $A$, $B$, $C$, e {\it ação} é alguma ação que dependa do contexto
  1357. no qual a expressão indexante é usada. Por exemplo, se a ação fosse
  1358. imprimir os valores atuais dos índices, a impressão seria vista como segue:
  1359. % \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively
  1360. % assigned corresponding components of $n$-tuples from the basic sets $A$,
  1361. % $B$, $C$, and {\it action} is some action that depends on the context,
  1362. % where the indexing expression is used. For example, if the action were
  1363. % printing current values of dummy indices, the printout would look like
  1364. % follows:
  1365. \noindent\hfil
  1366. \begin{tabular}{@{}llll@{}}
  1367. $i=4$&$j=1$&$k=Jan$&$l=a$\\
  1368. $i=4$&$j=1$&$k=Jan$&$l=b$\\
  1369. $i=4$&$j=1$&$k=Jan$&$l=c$\\
  1370. $i=4$&$j=1$&$k=Fev$&$l=a$\\
  1371. $i=4$&$j=1$&$k=Fev$&$l=b$\\
  1372. \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
  1373. $i=9$&$j=3$&$k=Jun$&$l=b$\\
  1374. $i=9$&$j=3$&$k=Jun$&$l=c$\\
  1375. \end{tabular}
  1376. % \noindent\hfil
  1377. % \begin{tabular}{@{}llll@{}}
  1378. % $i=4$&$j=1$&$k=Jan$&$l=a$\\
  1379. % $i=4$&$j=1$&$k=Jan$&$l=b$\\
  1380. % $i=4$&$j=1$&$k=Jan$&$l=c$\\
  1381. % $i=4$&$j=1$&$k=Feb$&$l=a$\\
  1382. % $i=4$&$j=1$&$k=Feb$&$l=b$\\
  1383. % \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
  1384. % $i=9$&$j=3$&$k=Jun$&$l=b$\\
  1385. % $i=9$&$j=3$&$k=Jun$&$l=c$\\
  1386. % \end{tabular}
  1387. Seja o exemplo da expressão indexante usado na seguinte
  1388. operação iterada:
  1389. $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$
  1390. onde {\tt p} é uma parâmetro numérico 4-dimensional ou alguma
  1391. expressão numérica cujo valor resultante dependa de
  1392. {\tt i}, {\tt j}, {\tt k} e {\tt l}. Neste caso, a ação é o somatório,
  1393. de forma que o valor resultante da expressão numérica primária é:
  1394. $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$
  1395. % Let the example indexing expression be used in the following iterated
  1396. % operation:
  1397. % $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$
  1398. % where {\tt p} is a 4-dimensional numeric parameter or some numeric
  1399. % expression whose resultant value depends on {\tt i}, {\tt j}, {\tt k},
  1400. % and {\tt l}. In this case the action is summation, so the resultant
  1401. % value of the primary numeric expression is:
  1402. % $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$
  1403. Agora seja a expressão indexante do exemplo usada como uma expressão
  1404. de conjunto primária. Neste caso, a ação é reunir todas as 4-tuplas
  1405. (quádruplas) da forma $(i,j,k,l)$ em um conjunto, de forma que o
  1406. valor resultante de tal operação é simplesmente o produto
  1407. Cartesiano dos conjuntos básicos:
  1408. $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$
  1409. Note que neste caso, a mesma expressão indexante pode ser escrita
  1410. na forma reduzida:
  1411. $$\mbox{{\tt\{A, B, C\}}}$$
  1412. pois os índices $i$, $j$, $k$ e $l$ não são referenciados, portanto,
  1413. seus nomes simbólicos não precisam ser especificados.
  1414. % Now let the example indexing expression be used as a primary set
  1415. % expression. In this case the action is gathering all 4-tuples
  1416. % (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant
  1417. % value of such operation is simply the Cartesian product of the basic
  1418. % sets:
  1419. % $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$
  1420. % Note that in this case the same indexing expression might be written in
  1421. % the reduced form:
  1422. % $$\mbox{{\tt\{A, B, C\}}}$$
  1423. % because the dummy indices $i$, $j$, $k$, and $l$ are not referenced and
  1424. % therefore their symbolic names need not be specified.
  1425. \newpage
  1426. Finalmente, seja a expressão indexante do exemplo usada como o domínio do
  1427. subíndice na declaração de um objeto de modelo 4-dimensional, por exemplo,
  1428. um parâmetro numérico:
  1429. % Finally, let the example indexing expression be used as the subscript
  1430. % domain in the declaration of a 4-dimensional model object, say,
  1431. % a numeric parameter:
  1432. $$\mbox{{\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}}$$
  1433. \noindent Neste caso, a ação é gerar os membros do parâmetro,
  1434. onde cada membro possui a forma $p[i,j,k,l]$.
  1435. % \noindent In this case the action is generating the parameter members,
  1436. % where each member has the form $p[i,j,k,l]$.
  1437. Como mencionado anteriormente, alguns índices da segunda forma das entradas
  1438. indexantes podem ser expressões numéricas ou simbólicas, não apenas índices.
  1439. Neste caso, os valores resultantes destas expressões desempenham o papel
  1440. de algumas condições lógicas para selecionar apenas aquelas $n$-tuplas
  1441. do produto Cartesiano dos conjuntos básicos que satisfaçam estas
  1442. condições.
  1443. % As was said above, some indices in the second form of indexing entries
  1444. % may be numeric or symbolic expressions, not only dummy indices. In this
  1445. % case resultant values of such expressions play role of some logical
  1446. % conditions to select only that $n$-tuples from the Cartesian product of
  1447. % basic sets that satisfy these conditions.
  1448. Considere, por exemplo, a seguinte expressão indexante:
  1449. $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$
  1450. onde {\tt i}, {\tt k} e {\tt l} são índices, e {\tt i-1} é uma
  1451. expressão numérica. A descrição algorítmica desta expressão
  1452. indexante é a seguinte:
  1453. % Consider, for example, the following indexing expression:
  1454. % $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$
  1455. % where {\tt i}, {\tt k}, {\tt l} are dummy indices, and {\tt i-1} is
  1456. % a numeric expression. The algorithmic decsription of this indexing
  1457. % expression is the following:
  1458. \noindent\hfil
  1459. \begin{tabular}{@{}l@{}}
  1460. {\bf para todo} $i\in A$ {\bf faça}\\
  1461. \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf e} $j=i-1$ {\bf faça}\\
  1462. \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
  1463. \hspace{48pt}{\it ação};\\
  1464. \end{tabular}
  1465. % \noindent\hfil
  1466. % \begin{tabular}{@{}l@{}}
  1467. % {\bf for all} $i\in A$ {\bf do}\\
  1468. % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\
  1469. % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
  1470. % \hspace{48pt}{\it action};\\
  1471. % \end{tabular}
  1472. \noindent Assim, se esta expressão indexante fosse usada como uma expressão de conjunto
  1473. primária, o conjunto resultante seira o seguinte:
  1474. $$\{(4,Mai,a),(4,Mai,b),(4,Mai,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$
  1475. Deve-se notar que neste caso o conjunto resultante consiste em 3-tuplas,
  1476. e não de 4-tuplas, porque na expressão indexante não há índice que
  1477. corresponda ao primeiro componente das 2-tuplas do conjunto $B$.
  1478. % \noindent Thus, if this indexing expression were used as a primary set
  1479. % expression, the resultant set would be the following:
  1480. % $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$
  1481. % Should note that in this case the resultant set consists of 3-tuples,
  1482. % not of 4-tuples, because in the indexing expression there is no dummy
  1483. % index that corresponds to the first component of 2-tuples from the set
  1484. % $B$.
  1485. A regra geral é: o número de componentes de $n$-tuplas definido por
  1486. uma expressão indexante é o mesmo do número de índices naquela expressão,
  1487. onde a correspondência entre índices e componentes nas $n$-tuplas no
  1488. conjunto resultante é posicional, i.e., o primeiro índice corresponde
  1489. ao primeiro componente, o segundo índice corresponde ao segundo
  1490. componente, etc.
  1491. % The general rule is: the number of components of $n$-tuples defined by
  1492. % an indexing expression is the same as the number of dummy indices in
  1493. % that expression, where the correspondence between dummy indices and
  1494. % components on $n$-tuples in the resultant set is positional, i.e. the
  1495. % first dummy index corresponds to the first component, the second dummy
  1496. % index corresponds to the second component, etc.
  1497. Em alguns casos é necessário selecionar um subconjunto do produto
  1498. Cartesiano de alguns \linebreak conjuntos. Isto pode ser alcançado mediante o
  1499. emprego de um predicado lógico opcional, que é especificado na
  1500. expressão indexante.
  1501. % In some cases it is needed to select a subset from the Cartesian
  1502. % product of some sets. This may be attained by using an optional logical
  1503. % predicate, which is specified in the indexing expression.
  1504. Considere, por exemplo, a seguinte expressão indexante:
  1505. $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$
  1506. onde a expressão lógica após os dois pontos é um predicado. A
  1507. descrição algorítmica desta expressão indexante é a seguinte:
  1508. % Consider, for example, the following indexing expression:
  1509. % $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$
  1510. % where the logical expression following the colon is a predicate. The
  1511. % algorithmic description of this indexing expression is the following:
  1512. \noindent\hfil
  1513. \begin{tabular}{@{}l@{}}
  1514. {\bf para todo} $i\in A$ {\bf faça}\\
  1515. \hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\
  1516. \hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
  1517. \hspace{48pt}{\bf se} $i\leq 5$ {\bf e} $k\neq`Mar'$ {\bf então}\\
  1518. \hspace{64pt}{\it ação};\\
  1519. \end{tabular}
  1520. % \noindent\hfil
  1521. % \begin{tabular}{@{}l@{}}
  1522. % {\bf for all} $i\in A$ {\bf do}\\
  1523. % \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
  1524. % \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
  1525. % \hspace{48pt}{\bf if} $i\leq 5$ {\bf and} $k\neq`Mar'$ {\bf then}\\
  1526. % \hspace{64pt}{\it action};\\
  1527. % \end{tabular}
  1528. \noindent Assim, se a expressão indexante fosse usada como uma
  1529. expressão de conjunto primária, o conjunto resultante seria o seguinte:
  1530. $$\{(4,1,Jan,a),(4,1,Fev,a),(4,2,Abr,a),\dots,(4,3,Jun,c)\}.$$
  1531. Se o predicado não é especificado na expressão indexante assume-se um,
  1532. que recebe o valor {\it verdadeiro}.
  1533. % \noindent Thus, if this indexing expression were used as a primary set
  1534. % expression, the resultant set would be the following:
  1535. % $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$
  1536. %
  1537. % If no predicate is specified in the indexing expression, one, which
  1538. % takes on the value {\it true}, is assumed.
  1539. \section{Expressões de conjunto}
  1540. Uma {\it expressão de conjunto} é uma regra para calcular um conjunto
  1541. elementar, i.e., uma coleção de $n$-tuplas, onde os componentes das
  1542. $n$-tuplas são quantidades numéricas e simbólicas.
  1543. % A {\it set expression} is a rule for computing an elemental set, i.e.
  1544. % a collection of $n$-tuples, where components of $n$-tuples are numeric
  1545. % and symbolic quantities.
  1546. A expressão de conjunto primária pode ser um conjunto de literais, um conjunto
  1547. não-indexado, um conjunto indexado, um conjunto ``aritmético'', uma expressão
  1548. indexante, uma expressão de \linebreak conjunto iterada, uma expressão de conjunto
  1549. condicional ou outra expressão cercada por \linebreak parênteses.
  1550. \para{Exemplos}
  1551. % The primary set expression may be a literal set, unsubscripted set,
  1552. % subscripted set, ``arithmetic'' set, indexing expression, iterated set
  1553. % expression, conditional set expression, or another set expression
  1554. % enclosed in parentheses.
  1555. %
  1556. % \para{Examples}
  1557. \noindent
  1558. \begin{tabular}{@{}ll@{}}
  1559. \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(conjunto de literais)\\
  1560. \verb|I| &(conjunto não-indexado)\\
  1561. \verb|S[i-1,j+1]| &(conjunto indexado)\\
  1562. \verb|1..t-1 by 2| &(conjunto ``aritmético'')\\
  1563. \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(expressão indexante)\\
  1564. \verb|setof{i in I, j in J}(i+1,j-1)| &(expressão de conjunto iterado)\\
  1565. \verb|if i < j then S[i,j] else F diff S[i,j]| &(expressão de conjunto
  1566. condicional)\\
  1567. \verb|(1..10 union 21..30)| &(expressão de conjunto parentizado)\\
  1568. \end{tabular}
  1569. % \noindent
  1570. % \begin{tabular}{@{}ll@{}}
  1571. % \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(literal set)\\
  1572. % \verb|I| &(unsubscripted set)\\
  1573. % \verb|S[i-1,j+1]| &(subscripted set)\\
  1574. % \verb|1..t-1 by 2| &(``arithmetic'' set)\\
  1575. % \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(indexing expression)\\
  1576. % \verb|setof{i in I, j in J}(i+1,j-1)| &(iterated set expression)\\
  1577. % \verb|if i < j then S[i,j] else F diff S[i,j]| &(conditional set
  1578. % expression)\\
  1579. % \verb|(1..10 union 21..30)| &(parenthesized set expression)\\
  1580. % \end{tabular}
  1581. Expressões de conjuntos mais genéricas contendo duas ou mais expressões
  1582. de conjunto primárias podem ser construídas usando operadores
  1583. específicos de conjunto .
  1584. \para{Exemplos}
  1585. % More general set expressions containing two or more primary set
  1586. % expressions may be constructed by using certain set operators.
  1587. %
  1588. % \para{Examples}
  1589. \begin{verbatim}
  1590. (A union B) inter (I cross J)
  1591. 1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'})
  1592. \end{verbatim}
  1593. \subsection{Conjuntos de literais}
  1594. Um {\it conjunto de literais} é uma expressão de conjunto primária
  1595. que possui as duas formas \linebreak sintáticas seguintes:
  1596. % A {\it literal set} is a primary set expression, which has the
  1597. % following two syntactic forms:
  1598. $$
  1599. {\def\arraystretch{1.4}
  1600. \begin{array}{l}
  1601. \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\
  1602. \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),}
  1603. {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,}
  1604. {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\
  1605. \end{array}
  1606. }
  1607. $$
  1608. % $$
  1609. % {\def\arraystretch{1.4}
  1610. % \begin{array}{l}
  1611. % \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\
  1612. % \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),}
  1613. % {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,}
  1614. % {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\
  1615. % \end{array}
  1616. % }
  1617. % $$
  1618. onde $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ são expressões
  1619. numéricas ou simbólicas.
  1620. Se a primeira forma é adotada, o conjunto resultante consiste
  1621. de 1-tuplas (singletos) enumerados entre as chaves.
  1622. É permitido especificar um conjunto vazio como {\tt\{\ \}},
  1623. que não possui 1-tuplas. Se a segunda forma é adotada,
  1624. o conjunto resultante consiste de $n$-tuplas enumeradas entre as chaves,
  1625. onde uma $n$-tupla particular consiste nos componentes correspondentes
  1626. enumerados entre parênteses. Todas as $n$-tuplas devem ter o mesmo
  1627. número de componentes.
  1628. % where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are numeric or
  1629. % symbolic expressions.
  1630. %
  1631. % If the first form is used, the resultant set consists of 1-tuples
  1632. % (singlets) enumerated within the curly braces. It is allowed to specify
  1633. % an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form
  1634. % is used, the resultant set consists of $n$-tuples enumerated within the
  1635. % curly braces, where a particular $n$-tuple consists of corresponding
  1636. % components enumerated within the parentheses. All $n$-tuples should
  1637. % have the same number of components.
  1638. \subsection{Conjuntos não-indexados}
  1639. Se a expressão de conjunto primária é um conjunto não-indexado
  1640. (que deve ser 0-dimensional), o conjunto resultante é um conjunto
  1641. elementar associado com o objeto conjunto correspondente.
  1642. % If the primary set expression is an unsubscripted set (which should be
  1643. % 0-dimen\-sional), the resultant set is an elemental set associated with
  1644. % the corresponding set object.
  1645. \subsection{Conjuntos indexados}
  1646. A expressão de conjunto primária, que se refere a um conjunto indexado,
  1647. tem a seguinte forma sintática:
  1648. $$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
  1649. $i_n${\tt]}}$$
  1650. onde {\it nome} é o nome simbólico do objeto conjunto e $i_1$, $i_2$,
  1651. \dots, $i_n$ são subíndices.
  1652. % The primary set expression, which refers to a subscripted set, has the
  1653. % following syntactic form:
  1654. % $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
  1655. % $i_n${\tt]}}$$
  1656. % where {\it name} is the symbolic name of the set object, $i_1$, $i_2$,
  1657. % \dots, $i_n$ are subscripts.
  1658. Cada subíndice deve ser uma expressão numérica ou simbólica. O número de
  1659. subíndices nas lista de subíndices deve ser o mesmo da dimensão do objeto
  1660. conjunto com o qual as lista de subíndice está associada.
  1661. Os valores correntes das expressões de subíndices são usados para identificar
  1662. um membro \linebreak particular do objeto conjunto que determina o conjunto resultante.
  1663. % Each subscript should be a numeric or symbolic expression. The number
  1664. % of subscripts in the subscript list should be the same as the dimension
  1665. % of the set object with which the subscript list is associated.
  1666. %
  1667. % Actual values of subscript expressions are used to identify a
  1668. % particular member of the set object that determines the resultant set.
  1669. \subsection{Conjuntos ``aritméticos''}
  1670. A expressão de conjunto primária que constitui um conjunto ``aritmético'',
  1671. possui as duas formas sintáticas seguintes:
  1672. % The primary set expression, which is an ``arithmetic'' set, has the
  1673. % following two syntactic forms:
  1674. $$
  1675. {\def\arraystretch{1.4}
  1676. \begin{array}{l}
  1677. \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\
  1678. \mbox{$t_0$ {\tt..} $t_1$}\\
  1679. \end{array}
  1680. }
  1681. $$
  1682. onde $t_0$, $t_1$, e $\delta t$ são expressões numéricas (o valor de
  1683. $\delta t$ não deve ser zero). A segunda forma é equivalente a primeira
  1684. forma, onde $\delta t=1$.
  1685. Se $\delta t>0$, o conjunto resultante é determinado como segue:
  1686. $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$
  1687. Caso contrário, se $\delta t<0$, o conjunto resultante é determinado como segue:
  1688. $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$
  1689. % $$
  1690. % {\def\arraystretch{1.4}
  1691. % \begin{array}{l}
  1692. % \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\
  1693. % \mbox{$t_0$ {\tt..} $t_1$}\\
  1694. % \end{array}
  1695. % }
  1696. % $$
  1697. % where $t_0$, $t_1$, and $\delta t$ are numeric expressions (the value
  1698. % of $\delta t$ should not be zero). The second form is equivalent to the
  1699. % first form, where $\delta t=1$.
  1700. %
  1701. % If $\delta t>0$, the resultant set is determined as follows:
  1702. % $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$
  1703. % Otherwise, if $\delta t<0$, the resultant set is determined as follows:
  1704. % $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$
  1705. \subsection{Expressões indexantes}
  1706. Se a expressão primária é uma expressão indexante, o conjunto resultante
  1707. é determinado como descrito anteriormente, na Seção \ref{indexing}, página
  1708. \pageref{indexing}.
  1709. % If the primary set expression is an indexing expression, the resultant
  1710. % set is determined as described above in Section \ref{indexing}, page
  1711. % \pageref{indexing}.
  1712. \newpage
  1713. \subsection{Expressões iteradas}
  1714. Uma {\it expressão de conjunto iterada} é uma expressão de conjunto
  1715. primária, que possui a seguinte forma sintática:
  1716. $$\mbox{{\tt setof} {\it expressão-indexante} {\it integrando}}$$
  1717. onde {\it expressão-indexante} é uma expressão indexante, que
  1718. introduz índices e controla a iteração, {\it integrando} é
  1719. tanto uma expressão numérica ou simbólica individual, como uma
  1720. lista de expressões numéricas ou simbólicas separadas por vírgula
  1721. e cercadas entre parênteses.
  1722. % An {\it iterated set expression} is a primary set expression, which has
  1723. % the following syntactic form:
  1724. % $$\mbox{{\tt setof} {\it indexing-expression} {\it integrand}}$$
  1725. % where {\it indexing-expression} is an indexing expression, which
  1726. % introduces dummy indices and controls iterating, {\it integrand} is
  1727. % either a single numeric or symbolic expression or a list of numeric and
  1728. % symbolic expressions separated by commae and enclosed in parentheses.
  1729. Se o integrando é uma expressão numérica ou simbólica individual, o
  1730. conjunto resultante consiste de 1-tuplas, sendo determinado como segue:
  1731. $$\{x:(i_1,\dots,i_n)\in\Delta\},$$
  1732. \noindent onde $x$ é um valor do integrando, $i_1$, \dots, $i_n$
  1733. são índices introduzidos na expressão indexante, $\Delta$ é
  1734. o domínio, um conjunto de $n$-tuplas especificado pela expressão
  1735. indexante que define valores particulares atribuídos aos índices ao
  1736. realizar a operação de iteração.
  1737. % If the integrand is a single numeric or symbolic expression, the
  1738. % resultant set consists of 1-tuples and is determined as follows:
  1739. % $$\{x:(i_1,\dots,i_n)\in\Delta\},$$
  1740. % \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$
  1741. % are dummy indices introduced in the indexing expression, $\Delta$ is
  1742. % the domain, a set of $n$-tuples specified by the indexing expression,
  1743. % which defines particular values assigned to the dummy indices on
  1744. % performing the iterated operation.
  1745. Se o integrando é uma lista contendo $m$ expressões numéricas e simbólicas,
  1746. o conjunto resultante consiste de $m$-tuplas, sendo determinado
  1747. como segue:
  1748. $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$
  1749. onde $x_1$, \dots, $x_m$ são valores das expressões na lista
  1750. de integrandos, $i_1$, \dots, $i_n$ e $\Delta$ possuem o mesmo significado
  1751. anterior.
  1752. % If the integrand is a list containing $m$ numeric and symbolic
  1753. % expressions, the resultant set consists of $m$-tuples and is determined
  1754. % as follows:
  1755. % $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$
  1756. % where $x_1$, \dots, $x_m$ are values of the expressions in the
  1757. % integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning
  1758. % as above.
  1759. \subsection{Expressões condicionais}
  1760. Uma {\it expressão de conjunto condicional} é uma expressão de conjunto
  1761. primária que possui a seguinte forma sintática:
  1762. $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$
  1763. onde $b$ é uma expressão lógica, $X$ e $Y$ são expressões de conjunto,
  1764. que devem definir conjuntos da mesma dimensão.
  1765. % A {\it conditional set expression} is a primary set expression that has
  1766. % the following syntactic form:
  1767. % $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$
  1768. % where $b$ is an logical expression, $X$ and $Y$ are set expressions,
  1769. % which should define sets of the same dimension.
  1770. O valor resultante da expressão condicional depende do valor da
  1771. expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe
  1772. o valor {\it verdadeiro}, o conjunto resultante é o valor da expressão
  1773. que segue a palavra-chave {\tt then}. Caso contrário, se a
  1774. expressão lógica recebe o valor {\it falso}, o conjunto resultante é
  1775. o valor da expressão que segue a palavra-chave {\tt else}.
  1776. % The resultant value of the conditional expression depends on the value
  1777. % of the logical expression that follows the keyword {\tt if}. If it
  1778. % takes on the value {\it true}, the resultant set is the value of the
  1779. % expression that follows the keyword {\tt then}. Otherwise, if the
  1780. % logical expression takes on the value {\it false}, the resultant set is
  1781. % the value of the expression that follows the keyword {\tt else}.
  1782. \subsection{Expressões parentizadas}
  1783. Qualquer expressão de conjunto pode ser cercada entre parênteses, o que as tornam
  1784. \linebreak sintaticamente uma expressão de conjunto primária.
  1785. Parênteses podem ser usados em expressões de conjunto, como em álgebra, para
  1786. especificar a ordem desejada nas quais as operações devem ser executadas.
  1787. Quando se usam parênteses, a expressão entre parênteses é avaliada
  1788. antes que o valor resultante seja usado.
  1789. O valor resultante de uma expressão parentizada é idêntico ao valor da expressão
  1790. cercada entre parênteses.
  1791. % Any set expression may be enclosed in parentheses that syntactically
  1792. % makes it a primary set expression.
  1793. %
  1794. % Parentheses may be used in set expressions, as in algebra, to specify
  1795. % the desired order in which operations are to be performed. Where
  1796. % parentheses are used, the expression within the parentheses is
  1797. % evaluated before the resultant value is used.
  1798. %
  1799. % The resultant value of the parenthesized expression is the same as the
  1800. % value of the expression enclosed within parentheses.
  1801. \newpage
  1802. \subsection{Operadores de conjunto}
  1803. Em MathProg existem os seguintes operadores de conjunto, que podem ser
  1804. usados em expressões de conjunto:
  1805. % In MathProg there exist the following set operators, which may be used
  1806. % in set expressions:
  1807. \begin{tabular}{@{}ll@{}}
  1808. $X$ {\tt union} $Y$&união $X\cup Y$\\
  1809. $X$ {\tt diff} $Y$&diferença $X\backslash Y$\\
  1810. $X$ {\tt symdiff} $Y$&diferença simétrica
  1811. $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\
  1812. $X$ {\tt inter} $Y$&interseção $X\cap Y$\\
  1813. $X$ {\tt cross} $Y$&produto Cartesiano (cruzado) $X\times Y$\\
  1814. \end{tabular}
  1815. % \begin{tabular}{@{}ll@{}}
  1816. % $X$ {\tt union} $Y$&union $X\cup Y$\\
  1817. % $X$ {\tt diff} $Y$&difference $X\backslash Y$\\
  1818. % $X$ {\tt symdiff} $Y$&symmetric difference
  1819. % $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\
  1820. % $X$ {\tt inter} $Y$&intersection $X\cap Y$\\
  1821. % $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\
  1822. % \end{tabular}
  1823. \noindent onde $X$ e Y são expressões de conjunto, que devem definir conjuntos
  1824. de dimensões idênticas (exceto o produto Cartesiano).
  1825. Se a expressão inclui mais de um operador de conjunto, todos operadores
  1826. são executados da esquerda para a direita de acordo com a hierarquia das
  1827. operações (veja adiante).
  1828. O valor resultante da expressão, que contém operadores de conjunto, é
  1829. o resultado da aplicação dos operadores aos seus operandos.
  1830. A dimensão do conjunto resultante, i.e., a dimensão das $n$-tuplas,
  1831. dos quais consistem o conjunto resultante, é a mesma da dimensão dos
  1832. operandos, exceto o produto Cartesiano, onde a dimensão do conjunto
  1833. resultante é a soma das dimensões dos seus operandos.
  1834. % \noindent where $X$ and Y are set expressions, which should define sets
  1835. % of identical dimension (except the Cartesian product).
  1836. %
  1837. % If the expression includes more than one set operator, all operators
  1838. % are performed from left to right according to the hierarchy of
  1839. % operations (see below).
  1840. %
  1841. % The resultant value of the expression, which contains set operators, is
  1842. % the result of applying the operators to their operands.
  1843. %
  1844. % The dimension of the resultant set, i.e. the dimension of $n$-tuples,
  1845. % of which the resultant set consists of, is the same as the dimension of
  1846. % the operands, except the Cartesian product, where the dimension of the
  1847. % resultant set is the sum of the dimensions of its operands.
  1848. \subsection{Hierarquia das operações}
  1849. A lista seguinte mostra a hierarquia das operações em expressões de conjunto:
  1850. % The following list shows the hierarchy of operations in set
  1851. % expressions:
  1852. \noindent\hfil
  1853. \begin{tabular}{@{}ll@{}}
  1854. Operação&Hierarquia\\
  1855. \hline
  1856. Avaliação de operações numéricas&
  1857. 1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
  1858. Avaliação de operações simbólicas&
  1859. 8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\
  1860. Avaliação de conjuntos iterados ou ``aritméticos'' ({\tt setof}, {\tt..})&
  1861. 10{\textsuperscript{\b{a}}}\\
  1862. Produto Cartesiano ({\tt cross})&
  1863. 11{\textsuperscript{\b{a}}}\\
  1864. Interseção ({\tt inter})&
  1865. 12{\textsuperscript{\b{a}}}\\
  1866. União e diferença ({\tt union}, {\tt diff}, {\tt symdiff})&
  1867. 13{\textsuperscript{\b{a}}}\\
  1868. Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
  1869. 14{\textsuperscript{\b{a}}}\\
  1870. \end{tabular}
  1871. % \noindent\hfil
  1872. % \begin{tabular}{@{}ll@{}}
  1873. % Operation&Hierarchy\\
  1874. % \hline
  1875. % Evaluation of numeric operations&1st-7th\\
  1876. % Evaluation of symbolic operations&8th-9th\\
  1877. % Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})&
  1878. % 10th\\
  1879. % Cartesian product ({\tt cross})&11th\\
  1880. % Intersection ({\tt inter})&12th\\
  1881. % Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\
  1882. % Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
  1883. % 14th\\
  1884. % \end{tabular}
  1885. Esta hierarquia possui o mesmo significado como explicado anteriormente
  1886. para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
  1887. % This hierarchy has the same meaning as was explained above for numeric
  1888. % expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
  1889. \newpage
  1890. \section{Expressões lógicas}
  1891. Uma {\it expressão lógica} é uma regra para calcular um valor lógico
  1892. individual, que pode ser {\it verdadeiro} ou {\it falso}.
  1893. A expressão lógica primária pode ser uma expressão numérica,
  1894. uma expressão relacional, uma expressão lógica iterada ou
  1895. outra expressão lógica cercada entre parênteses.
  1896. \para{Exemplos}
  1897. % A {\it logical expression} is a rule for computing a single logical
  1898. % value, which can be either {\it true} or {\it false}.
  1899. %
  1900. % The primary logical expression may be a numeric expression, relational
  1901. % expression, iterated logical expression, or another logical expression
  1902. % enclosed in parentheses.
  1903. %
  1904. % \para{Examples}
  1905. \noindent
  1906. \begin{tabular}{@{}ll@{}}
  1907. \verb|i+1| &(expressão numérica)\\
  1908. \verb|a[i,j] < 1.5| &(expressão relacional)\\
  1909. \verb|s[i+1,j-1] <> 'Mar' & year | &(expressão relacional)\\
  1910. \verb|(i+1,'Jan') not in I cross J| &(expressão relacional)\\
  1911. \verb|S union T within A[i] inter B[j]| &(expressão relacional)\\
  1912. \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(expressão lógica iterada)\\
  1913. \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(expressão lógica parentizada)\\
  1914. \end{tabular}
  1915. % \noindent
  1916. % \begin{tabular}{@{}ll@{}}
  1917. % \verb|i+1| &(numeric expression)\\
  1918. % \verb|a[i,j] < 1.5| &(relational expression)\\
  1919. % \verb|s[i+1,j-1] <> 'Mar' & year | &(relational expression)\\
  1920. % \verb|(i+1,'Jan') not in I cross J| &(relational expression)\\
  1921. % \verb|S union T within A[i] inter B[j]| &(relational expression)\\
  1922. % \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(iterated logical
  1923. % expression)\\
  1924. % \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(parenthesized logical
  1925. % expression)\\
  1926. % \end{tabular}
  1927. Expressões lógicas mais genéricas, contendo duas ou mais
  1928. expressões lógicas primárias, podem ser construídas usando
  1929. determinados operadores lógicos.
  1930. \para{Exemplos}
  1931. \begin{verbatim}
  1932. not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S
  1933. (i,j) in S or (i,j) not in T diff U
  1934. \end{verbatim}
  1935. % More general logical expressions containing two or more primary logical
  1936. % expressions may be constructed by using certain logical operators.
  1937. %
  1938. % \para{Examples}
  1939. %
  1940. % \begin{verbatim}
  1941. % not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S
  1942. % (i,j) in S or (i,j) not in T diff U
  1943. % \end{verbatim}
  1944. \vspace*{-8pt}
  1945. \subsection{Expressões numéricas}
  1946. O valor resultante da expressão lógica primária, que é uma
  1947. expressão numérica, é {\it verdadeiro}, se o valor resultante da
  1948. expressão numérica é diferente de zero. Caso contrário o valor resultante
  1949. da expressão lógica é {\it falso}.
  1950. % The resultant value of the primary logical expression, which is a
  1951. % numeric expression, is {\it true}, if the resultant value of the
  1952. % numeric expression is non-zero. Otherwise the resultant value of the
  1953. % logical expression is {\it false}.
  1954. \vspace*{-8pt}
  1955. \subsection{Operadores relacionais}
  1956. Em MathProg existem os seguintes operadores relacionais, que podem
  1957. ser usados em expressões lógicas:
  1958. % In MathProg there exist the following relational operators, which may
  1959. % be used in logical expressions:
  1960. \begin{tabular}{@{}ll@{}}
  1961. $x$ {\tt<} $y$&verifica se $x<y$\\
  1962. $x$ {\tt<=} $y$&verifica se $x\leq y$\\
  1963. $x$ {\tt=} $y$, $x$ {\tt==} $y$&verifica se $x=y$\\
  1964. $x$ {\tt>=} $y$&verifica se $x\geq y$\\
  1965. $x$ {\tt>} $y$&verifica se $x>y$\\
  1966. $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&verifica se $x\neq y$\\
  1967. $x$ {\tt in} $Y$&verifica se $x\in Y$\\
  1968. {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&verifica se
  1969. $(x_1,\dots,x_n)\in Y$\\
  1970. $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&verifica se $x\not\in Y$\\
  1971. {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$,
  1972. {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&verifica se
  1973. $(x_1,\dots,x_n)\not\in Y$\\
  1974. $X$ {\tt within} $Y$&verifica se $X\subseteq Y$\\
  1975. $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&verifica se
  1976. $X\not\subseteq Y$\\
  1977. \end{tabular}
  1978. % \begin{tabular}{@{}ll@{}}
  1979. % $x$ {\tt<} $y$&test on $x<y$\\
  1980. % $x$ {\tt<=} $y$&test on $x\leq y$\\
  1981. % $x$ {\tt=} $y$, $x$ {\tt==} $y$&test on $x=y$\\
  1982. % $x$ {\tt>=} $y$&test on $x\geq y$\\
  1983. % $x$ {\tt>} $y$&test on $x>y$\\
  1984. % $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\
  1985. % $x$ {\tt in} $Y$&test on $x\in Y$\\
  1986. % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on
  1987. % $(x_1,\dots,x_n)\in Y$\\
  1988. % $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\
  1989. % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$,
  1990. % {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on
  1991. % $(x_1,\dots,x_n)\not\in Y$\\
  1992. % $X$ {\tt within} $Y$&test on $X\subseteq Y$\\
  1993. % $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on
  1994. % $X\not\subseteq Y$\\
  1995. % \end{tabular}
  1996. \noindent onde $x$, $x_1$, \dots, $x_n$, $y$ são expressões numéricas ou
  1997. simbólicas, $X$ e $Y$ são expressões de conjunto.
  1998. % \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic
  1999. % expressions, $X$ and $Y$ are set expression.
  2000. \newpage
  2001. 1. Nas operações {\tt in}, {\tt not in} e {\tt !in} o número
  2002. de componentes nos primeiros operandos deve ser igual a
  2003. dimensão do segundo operando.
  2004. 2. Nas operações {\tt within}, {\tt not within} e {\tt !within}
  2005. ambos operandos devem ter a mesma dimensão.
  2006. Todos operadores relacionais listados acima têm seus significados
  2007. matemáticos convencionais. O valor resultante é {\it verdadeiro}, se
  2008. a relação correspondente é satisfeita para seus operandos, caso contrário
  2009. é {\it falso}. (Note que valores simbólicos são ordenados de forma
  2010. lexicográfica e qualquer valor numérico precede qualquer valor simbólico.)
  2011. % 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the
  2012. % number of components in the first operands should be the same as the
  2013. % dimension of the second operand.
  2014. %
  2015. % 2. In the operations {\tt within}, {\tt not within}, and {\tt !within}
  2016. % both operands should have identical dimension.
  2017. %
  2018. % All the relational operators listed above have their conventional
  2019. % mathematical meaning. The resultant value is {\it true}, if
  2020. % corresponding relation is satisfied for its operands, otherwise
  2021. % {\it false}. (Note that symbolic values are ordered lexicographically,
  2022. % and any numeric value precedes any symbolic value.)
  2023. \subsection{Expressões iteradas}
  2024. Uma {\it expressão lógica iterada} é uma expressão lógica primária
  2025. com a seguinte forma sintática:
  2026. $$\mbox{{\it operador-iterado} {\it expressão-indexante}
  2027. {\it integrando}}$$
  2028. onde {\it operador-iterado} é o nome simbólico do operador iterado
  2029. a ser executado (veja adiante), {\it expressão-indexante} é uma
  2030. expressão indexante que introduz índices e controla a iteração, \linebreak
  2031. {\it integrando} é uma expressão numérica que participa da operação.
  2032. Em MathProg existem dois operadores iterados que podem ser usados
  2033. em expressões lógicas:
  2034. % An {\it iterated logical expression} is a primary logical expression,
  2035. % which has the following syntactic form:
  2036. % $$\mbox{{\it iterated-operator} {\it indexing-expression}
  2037. % {\it integrand}}$$
  2038. % where {\it iterated-operator} is the symbolic name of the iterated
  2039. % operator to be performed (see below), {\it indexing-expression} is an
  2040. % indexing expression which introduces dummy indices and controls
  2041. % iterating, {\it integrand} is a numeric expression that participates in
  2042. % the operation.
  2043. %
  2044. % In MathProg there exist two iterated operators, which may be used in
  2045. % logical expressions:
  2046. {\def\arraystretch{1.4}
  2047. \noindent\hfil
  2048. \begin{tabular}{@{}lll@{}}
  2049. {\tt forall}&quantificador-$\forall$&$\displaystyle
  2050. \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  2051. {\tt exists}&quantificador-$\exists$&$\displaystyle
  2052. \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  2053. \end{tabular}
  2054. }
  2055. % {\def\arraystretch{1.4}
  2056. % \noindent\hfil
  2057. % \begin{tabular}{@{}lll@{}}
  2058. % {\tt forall}&$\forall$-quantification&$\displaystyle
  2059. % \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  2060. % {\tt exists}&$\exists$-quantification&$\displaystyle
  2061. % \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
  2062. % \end{tabular}
  2063. % }
  2064. \noindent onde $i_1$, \dots, $i_n$ são índices introduzidos na
  2065. expressão indexante, $\Delta$ é o domínio, um conjunto de $n$-tuplas
  2066. especificado pela expressão indexante que define valores específicos
  2067. atribuídos aos índices ao executar a operação iterada, e
  2068. $f(i_1,\dots,i_n)$ é o integrando, uma expressão lógica cujo
  2069. valor resultante depende dos índices.
  2070. Para o quantificador $\forall$, o valor resultante da expressão
  2071. lógica iterada é {\it verdadeiro}, se o valor do integrando é
  2072. {\it verdadeiro} para todas as $n$-tuplas contidas no domínio,
  2073. caso contrário, é {\it falso}.
  2074. Para o quantificador $\exists$ o valor resultante da expressão
  2075. lógica iterada é {\it falso}, se o valor do integrando é
  2076. {\it falso} para todas as $n$-tuplas contidas no domínio,
  2077. caso contrário, é {\it verdadeiro}.
  2078. % \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
  2079. % the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
  2080. % specified by the indexing expression which defines particular values
  2081. % assigned to the dummy indices on performing the iterated operation,
  2082. % $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose
  2083. % resultant value depends on the dummy indices.
  2084. %
  2085. % For $\forall$-quantification the resultant value of the iterated
  2086. % logical expression is {\it true}, if the value of the integrand is
  2087. % {\it true} for all $n$-tuples contained in the domain, otherwise
  2088. % {\it false}.
  2089. %
  2090. % For $\exists$-quantification the resultant value of the iterated
  2091. % logical expression is {\it false}, if the value of the integrand is
  2092. % {\it false} for all $n$-tuples contained in the domain, otherwise
  2093. % {\it true}.
  2094. \subsection{Expressões parentizadas}
  2095. Qualquer expressão lógica pode ser cercada entre parênteses, o que a
  2096. converte sintaticamente em uma expressão lógica primária.
  2097. Parênteses podem ser usados em expressões lógicas, como em álgebra, para
  2098. especificar a ordem desejada na qual as operações devem ser executadas.
  2099. Quando se usam parênteses, a expressão entre parênteses é avaliada antes
  2100. que o valor resultante seja usado.
  2101. O valor resultante da expressão parentizada é idêntico ao valor da expressão
  2102. cercada entre parênteses.
  2103. % Any logical expression may be enclosed in parentheses that
  2104. % syntactically makes it a primary logical expression.
  2105. %
  2106. % Parentheses may be used in logical expressions, as in algebra, to
  2107. % specify the desired order in which operations are to be performed.
  2108. % Where parentheses are used, the expression within the parentheses is
  2109. % evaluated before the resultant value is used.
  2110. %
  2111. % The resultant value of the parenthesized expression is the same as the
  2112. % value of the expression enclosed within parentheses.
  2113. \newpage
  2114. \subsection{Operadores lógicos}
  2115. Em MathProg existem os seguintes operadores lógicos, que podem ser usados em
  2116. expressões lógicas:
  2117. % In MathProg there exist the following logical operators, which may be
  2118. % used in logical expressions:
  2119. \begin{tabular}{@{}ll@{}}
  2120. {\tt not} $x$, {\tt!}$x$&negação $\neg\ x$\\
  2121. $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunção (``e'' lógico)
  2122. $x\;\&\;y$\\
  2123. $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunção (``ou'' lógico)
  2124. $x\vee y$\\
  2125. \end{tabular}
  2126. % \begin{tabular}{@{}ll@{}}
  2127. % {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\
  2128. % $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'')
  2129. % $x\;\&\;y$\\
  2130. % $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'')
  2131. % $x\vee y$\\
  2132. % \end{tabular}
  2133. \noindent onde $x$ e $y$ são expressões lógicas.
  2134. Se a expressão inclui mais de um operador lógico, todos operadores
  2135. são executados da esquerda para a direita de acordo com a hierarquia
  2136. das operações (veja adiante). O valor resultante da \linebreak expressão
  2137. que contém operadores lógicos é o resultado da aplicação dos
  2138. operadores aos seus \linebreak operandos.
  2139. % \noindent where $x$ and $y$ are logical expressions.
  2140. %
  2141. % If the expression includes more than one logical operator, all
  2142. % operators are performed from left to right according to the hierarchy
  2143. % of the operations (see below). The resultant value of the expression,
  2144. % which contains logical operators, is the result of applying the
  2145. % operators to their operands.
  2146. \subsection{Hierarquia das operações}
  2147. A lista seguinte mostra a hierarquia das operações em expressões
  2148. lógicas:
  2149. % The following list shows the hierarchy of operations in logical
  2150. % expressions:
  2151. \noindent\hfil
  2152. \begin{tabular}{@{}ll@{}}
  2153. Operation&Hierarchy\\
  2154. \hline
  2155. Avaliação de operações numéricas&
  2156. 1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
  2157. Avaliação de operações simbólicas&
  2158. 8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\
  2159. Avaliação de operações de conjunto&
  2160. 10{\textsuperscript{\b{a}}}-14{\textsuperscript{\b{a}}}\\
  2161. Operações relacionais ({\tt<}, {\tt<=}, etc.)&
  2162. 15{\textsuperscript{\b{a}}}\\
  2163. negação ({\tt not}, {\tt!})&
  2164. 16{\textsuperscript{\b{a}}}\\
  2165. Conjunção({\tt and}, {\tt\&\&})&
  2166. 17{\textsuperscript{\b{a}}}\\
  2167. Quantificação-$\forall$ e -$\exists$ ({\tt forall}, {\tt exists})&
  2168. 18{\textsuperscript{\b{a}}}\\
  2169. Disjunção ({\tt or}, {\tt||})&
  2170. 19{\textsuperscript{\b{a}}}\\
  2171. \end{tabular}
  2172. % \noindent\hfil
  2173. % \begin{tabular}{@{}ll@{}}
  2174. % Operation&Hierarchy\\
  2175. % \hline
  2176. % Evaluation of numeric operations&1st-7th\\
  2177. % Evaluation of symbolic operations&8th-9th\\
  2178. % Evaluation of set operations&10th-14th\\
  2179. % Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\
  2180. % Negation ({\tt not}, {\tt!})&16th\\
  2181. % Conjunction ({\tt and}, {\tt\&\&})&17th\\
  2182. % $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})&
  2183. % 18th\\
  2184. % Disjunction ({\tt or}, {\tt||})&19th\\
  2185. % \end{tabular}
  2186. Esta hierarquia possui o mesmo significado como explicado anteriormente
  2187. para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
  2188. % This hierarchy has the same meaning as was explained above for numeric
  2189. % expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
  2190. \newpage
  2191. \section{Expressões lineares}
  2192. Uma {\it expressão linear} é uma regra para calcular a chamada
  2193. {\it forma linear} ou simplesmente {\it fórmula}, que é uma função linear (ou
  2194. afim) de variáveis elementares.
  2195. A expressão linear primária pode ser uma variável não-indexada, uma
  2196. variável indexada, uma expressão linear iterada, uma expressão linear condicional
  2197. ou outra expressão linear cercada entre parênteses.
  2198. Também e permitido usar uma expressão numérica como a expressão linear
  2199. primária, neste caso, o valor resultante da expressão numérica
  2200. é automaticamente convertido para uma fórmula que inclui o
  2201. termo constante apenas.
  2202. \para{Exemplos}
  2203. % A {\it linear expression} is a rule for computing so called
  2204. % a {\it linear form} or simply a {\it formula}, which is a linear (or
  2205. % affine) function of elemental variables.
  2206. %
  2207. % The primary linear expression may be an unsubscripted variable,
  2208. % subscripted variable, iterated linear expression, conditional linear
  2209. % expression, or another linear expression enclosed in parentheses.
  2210. %
  2211. % It is also allowed to use a numeric expression as the primary linear
  2212. % expression, in which case the resultant value of the numeric expression
  2213. % is automatically converted to a formula that includes the constant term
  2214. % only.
  2215. %
  2216. % \para{Examples}
  2217. \noindent
  2218. \begin{tabular}{@{}ll@{}}
  2219. \verb|z| &(variável não-indexada)\\
  2220. \verb|x[i,j]| &(variável indexada)\\
  2221. \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| &
  2222. (expressão linear iterada)\\
  2223. \verb|if i in I then x[i,j] else 1.5 * z + 3.25| &
  2224. (expressão linear condicional)\\
  2225. \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| &
  2226. (expressão linear parentizada)\\
  2227. \end{tabular}
  2228. % \noindent
  2229. % \begin{tabular}{@{}ll@{}}
  2230. % \verb|z| &(unsubscripted variable)\\
  2231. % \verb|x[i,j]| &(subscripted variable)\\
  2232. % \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| &
  2233. % (iterated linear expression)\\
  2234. % \verb|if i in I then x[i,j] else 1.5 * z + 3.25| &
  2235. % (conditional linear expression)\\
  2236. % \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| &
  2237. % (parenthesized linear expression)\\
  2238. % \end{tabular}
  2239. Expressões lineares mais genéricas, contendo duas ou mais
  2240. expressões lineares primárias, podem ser construídas usando
  2241. determinados operadores aritméticos.
  2242. \para{Exemplos}
  2243. % More general linear expressions containing two or more primary linear
  2244. % expressions may be constructed by using certain arithmetic operators.
  2245. %
  2246. % \para{Examples}
  2247. \begin{verbatim}
  2248. 2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z
  2249. (- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t])
  2250. \end{verbatim}
  2251. \vspace*{-5pt}
  2252. \subsection{Variáveis não-indexadas}
  2253. Se a expressão linear primária é uma variável não-indexada (que deve
  2254. se 0-dimensional), a fórmula resultante formula é aquela variável
  2255. não-indexada.
  2256. % If the primary linear expression is an unsubscripted variable (which
  2257. % should be 0-dimensional), the resultant formula is that unsubscripted
  2258. % variable.
  2259. \vspace*{-5pt}
  2260. \subsection{Variáveis indexadas}
  2261. A expressão linear primária que se refere a uma variável indexada possui
  2262. a seguinte forma sintática:
  2263. $$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
  2264. $i_n${\tt]}}$$
  2265. onde {\it nome} é o nome simbólico da variável do modelo, $i_1$,
  2266. $i_2$, \dots, $i_n$ são subíndices.
  2267. Cada subíndice deve ser uma expressão numérica ou simbólica. O número
  2268. de subíndices na lista de subíndices deve ser igual ao da dimensão da
  2269. variável do modelo com a qual está associada a lista de subíndices.
  2270. Os valores correntes das expressões dos subíndices são usados para identificar
  2271. um membro \linebreak particular da variável do modelo que determina a fórmula resultante,
  2272. que é uma variável elementar associada com o membro correspondente.
  2273. % The primary linear expression, which refers to a subscripted variable,
  2274. % has the following syntactic form:
  2275. % $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
  2276. % $i_n${\tt]}}$$
  2277. % where {\it name} is the symbolic name of the model variable, $i_1$,
  2278. % $i_2$, \dots, $i_n$ are subscripts.
  2279. %
  2280. % Each subscript should be a numeric or symbolic expression. The number
  2281. % of subscripts in the subscript list should be the same as the dimension
  2282. % of the model variable with which the subscript list is associated.
  2283. %
  2284. % Actual values of the subscript expressions are used to identify a
  2285. % particular member of the model variable that determines the resultant
  2286. % formula, which is an elemental variable associated with corresponding
  2287. % member.
  2288. \vspace*{-5pt}
  2289. \subsection{Expressões iteradas}
  2290. Uma {\it expressão linear iterada} é uma expressão linear primária,
  2291. que tem a seguinte forma sintática:
  2292. $$\mbox{{\tt sum} {\it expressão-indexante} {\it integrando}}$$
  2293. onde {\it expressão-indexante} é uma expressão indexante, que
  2294. introduz índices e controla iterações, {\it integrando} é
  2295. uma expressão linear que participa da operação.
  2296. A expressão linear iterada é avaliada exatamente da mesma forma que a
  2297. expressão numérica iterada (ver Subseção \ref{itexpr}, página
  2298. \pageref{itexpr}), exceto que o integrando participante do
  2299. somatório é uma fórmula e não um valor numérico.
  2300. % An {\it iterated linear expression} is a primary linear expression,
  2301. % which has the following syntactic form:
  2302. % $$\mbox{{\tt sum} {\it indexing-expression} {\it integrand}}$$
  2303. % where {\it indexing-expression} is an indexing expression, which
  2304. % introduces dummy indices and controls iterating, {\it integrand} is
  2305. % a linear expression that participates in the operation.
  2306. %
  2307. % The iterated linear expression is evaluated exactly in the same way as
  2308. % the iterated numeric expression (see Subection \ref{itexpr}, page
  2309. % \pageref{itexpr}) with exception that the integrand participated in the
  2310. % summation is a formula, not a numeric value.
  2311. \vspace*{-5pt}
  2312. \subsection{Expressões condicionais}
  2313. Uma {\it expressão linear condicional} é uma expressão linear primária,
  2314. que possui uma das duas formas sintáticas seguintes:
  2315. $$
  2316. {\def\arraystretch{1.4}
  2317. \begin{array}{l}
  2318. \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\
  2319. \mbox{{\tt if} $b$ {\tt then} $f$}\\
  2320. \end{array}
  2321. }
  2322. $$
  2323. onde $b$ é uma expressão lógica, $f$ e $g$ são expressões lineares.
  2324. % A {\it conditional linear expression} is a primary linear expression,
  2325. % which has one of the following two syntactic forms:
  2326. % $$
  2327. % {\def\arraystretch{1.4}
  2328. % \begin{array}{l}
  2329. % \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\
  2330. % \mbox{{\tt if} $b$ {\tt then} $f$}\\
  2331. % \end{array}
  2332. % }
  2333. % $$
  2334. % where $b$ is an logical expression, $f$ and $g$ are linear expressions.
  2335. % \newpage
  2336. A expressão linear condicional é avaliada exatamente da mesma forma
  2337. que a expressão \linebreak condicional numérica (ver Subseção \ref{ifthen},
  2338. página \pageref{ifthen}), exceto que os operandos que participam da operação
  2339. são fórmulas e não valores numéricos.
  2340. % The conditional linear expression is evaluated exactly in the same way
  2341. % as the conditional numeric expression (see Subsection \ref{ifthen},
  2342. % page \pageref{ifthen}) with exception that operands participated in the
  2343. % operation are formulae, not numeric values.
  2344. \subsection{Expressões parentizadas}
  2345. Qualquer expressão linear pode ser cercada entre parênteses, o que a
  2346. converte sintaticamente em uma expressão linear primária.
  2347. Parênteses podem ser usados em expressões lineares, como em álgebra, para
  2348. especificar a ordem desejada na qual as operações devem ser executadas.
  2349. Quando se usam parênteses, a expressão entre parênteses é avaliada antes
  2350. que a fórmula resultante seja usada.
  2351. O valor resultante da expressão parentizada é idêntico ao valor da
  2352. expressão cercada entre parênteses.
  2353. % Any linear expression may be enclosed in parentheses that syntactically
  2354. % makes it a primary linear expression.
  2355. %
  2356. % Parentheses may be used in linear expressions, as in algebra, to
  2357. % specify the desired order in which operations are to be performed.
  2358. % Where parentheses are used, the expression within the parentheses is
  2359. % evaluated before the resultant formula is used.
  2360. %
  2361. % The resultant value of the parenthesized expression is the same as the
  2362. % value of the expression enclosed within parentheses.
  2363. \subsection{Operadores aritméticos}
  2364. Em MathProg existem os seguintes operadores aritméticos, que podem ser
  2365. usados em expressões lineares:
  2366. % In MathProg there exists the following arithmetic operators, which may
  2367. % be used in linear expressions:
  2368. \begin{tabular}{@{}ll@{}}
  2369. {\tt+} $f$&mais unário\\
  2370. {\tt-} $f$&menos unário\\
  2371. $f$ {\tt+} $g$&adição\\
  2372. $f$ {\tt-} $g$&subtração\\
  2373. $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplicação\\
  2374. $f$ {\tt/} $x$&divisão
  2375. \end{tabular}
  2376. % \begin{tabular}{@{}ll@{}}
  2377. % {\tt+} $f$&unary plus\\
  2378. % {\tt-} $f$&unary minus\\
  2379. % $f$ {\tt+} $g$&addition\\
  2380. % $f$ {\tt-} $g$&subtraction\\
  2381. % $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\
  2382. % $f$ {\tt/} $x$&division
  2383. % \end{tabular}
  2384. \noindent onde $f$ e $g$ são expressões lineares, $x$ é uma expressão
  2385. numérica (mais precisamente, uma expressão linear contendo apenas o termo
  2386. constante).
  2387. Se a expressão inclui mais de um operador aritmético, todos
  2388. operadores são executados da esquerda para a direita de acordo com a hierarquia
  2389. das operações (veja adiante). O valor resultante da expressão, que
  2390. contém operadores aritméticos, é o resultado de aplicar os operadores aos
  2391. seus operandos.
  2392. % \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric
  2393. % expression (more precisely, a linear expression containing only the
  2394. % constant term).
  2395. %
  2396. % If the expression includes more than one arithmetic operator, all
  2397. % operators are performed from left to right according to the hierarchy
  2398. % of operations (see below). The resultant value of the expression, which
  2399. % contains arithmetic operators, is the result of applying the operators
  2400. % to their operands.
  2401. \subsection{Hierarquia das operações}
  2402. A hierarquia de operações aritméticas usada em expressões lineares é a mesma
  2403. para expressões numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
  2404. % The hierarchy of arithmetic operations used in linear expressions is
  2405. % the same as for numeric expressions (see Subsection \ref{hierarchy},
  2406. % page \pageref{hierarchy}).
  2407. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2408. \chapter{Sentenças}
  2409. {\it Sentenças} são unidades básicas da descrição do modelo. Em MathProg
  2410. todas as sentenças são divididas em duas categorias: sentenças de declaração
  2411. e sentenças funcionais.
  2412. {\it Sentenças de declaração} (sentença {\it set}, sentença {\it parameter},
  2413. sentença {\it variable}, sentença \linebreak {\it constraint}, sentença {\it objective}) são
  2414. usados para declarar objetos de certo tipo do modelo e definir certas propriedades
  2415. de tais objetos.
  2416. {\it Sentenças funcionais} (sentença {\it solve}, sentença {\it check},
  2417. sentença {\it display}, sentença {\it printf}, sentença {\it loop}, sentença
  2418. {\it table}) são projetadas para executar ações específicas.
  2419. Note que sentenças de declaração podem seguir em qualquer ordem arbitrária,
  2420. o que não afeta o resultado da tradução. Entretanto, qualquer objeto de modelo
  2421. deve ser declarado antes de ser referenciado por outras sentenças.
  2422. % {\it Statements} are basic units of the model description. In MathProg
  2423. % all statements are divided into two categories: declaration statements
  2424. % and functional statements.
  2425. %
  2426. % {\it Declaration statements} (set statement, parameter statement,
  2427. % variable statement, constraint statement, objective statement) are used
  2428. % to declare model objects of certain kinds and define certain properties
  2429. % of such objects.
  2430. %
  2431. % {\it Functional statements} (solve statement, check statement, display
  2432. % statement, printf statement, loop statement, table statement) are
  2433. % intended for performing some specific actions.
  2434. %
  2435. % Note that declaration statements may follow in arbitrary order, which
  2436. % does not affect the result of translation. However, any model object
  2437. % should be declared before it is referenced in other statements.
  2438. \section{Sentença set}
  2439. \noindent
  2440. \framebox[468pt][l]{
  2441. \parbox[c][24pt]{468pt}{
  2442. \hspace{6pt} {\tt set} {\it nome} {\it alias} {\it domínio} {\tt,}
  2443. {\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;}
  2444. }}
  2445. % \noindent
  2446. % \framebox[468pt][l]{
  2447. % \parbox[c][24pt]{468pt}{
  2448. % \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,}
  2449. % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  2450. % }}
  2451. \medskip
  2452. \noindent
  2453. {\it nome} é um nome simbólico do conjunto;
  2454. \noindent
  2455. {\it alias} é um literal de cadeia opcional que especifica um pseudônimo
  2456. para o conjunto;
  2457. \noindent
  2458. {\it domínio} é uma expressão indexante opcional que especifica o domínio
  2459. do subíndice do conjunto;
  2460. \noindent
  2461. {\it atributo}, \dots, {\it atributo} são atributos opcionais do conjunto
  2462. (as vírgulas que precedem os atributos podem ser omitidas.)
  2463. \para{Atributos opcionais}
  2464. % \noindent
  2465. % {\it name} is a symbolic name of the set;
  2466. %
  2467. % \noindent
  2468. % {\it alias} is an optional string literal, which specifies an alias of
  2469. % the set;
  2470. %
  2471. % \noindent
  2472. % {\it domain} is an optional indexing expression, which specifies
  2473. % a subscript domain of the set;
  2474. %
  2475. % \noindent
  2476. % {\it attrib}, \dots, {\it attrib} are optional attributes of the set.
  2477. % (Commae preceding attributes may be omitted.)
  2478. %
  2479. % \para{Optional attributes}
  2480. \vspace*{-8pt}
  2481. \begin{description}
  2482. \item[{\tt dimen} $n$]\hspace*{0pt}\\
  2483. especifica a dimensão de $n$-tuplas das quais o conjunto é consistido;
  2484. \item[{\tt within} {\it expressão}]\hspace*{0pt}\\
  2485. especifica um superconjunto que restringe ao conjunto ou a todos seus
  2486. membros (conjuntos elementares) a estarem incluídos naquele superconjunto;
  2487. \item[{\tt:=} {\it expressão}]\hspace*{0pt}\\
  2488. especifica um conjunto elementar atribuído ao conjunto ou aos seus membros;
  2489. \item[{\tt default} {\it expressão}]\hspace*{0pt}\\
  2490. especifica um conjunto elementar atribuído ao conjunto ou aos seus membros
  2491. sempre que não há dados apropriados disponíveis na seção de dados.
  2492. \end{description}
  2493. % \begin{description}
  2494. % \item[{\tt dimen} $n$]\hspace*{0pt}\\
  2495. % specifies the dimension of $n$-tuples which the set consists of;
  2496. % \item[{\tt within} {\it expression}]\hspace*{0pt}\\
  2497. % specifies a superset which restricts the set or all its members
  2498. % (elemental sets) to be within that superset;
  2499. % \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
  2500. % specifies an elemental set assigned to the set or its members;
  2501. % \item[{\tt default} {\it expression}]\hspace*{0pt}\\
  2502. % specifies an elemental set assigned to the set or its members whenever
  2503. % no appropriate data are available in the data section.
  2504. % \end{description}
  2505. \vspace*{-8pt}
  2506. \para{Exemplos}
  2507. % \para{Examples}
  2508. \begin{verbatim}
  2509. set nos;
  2510. set arcos within nos cross nos;
  2511. set passo{s in 1..maxiter} dimen 2 := if s = 1 then arcos else passo[s-1]
  2512. union setof{k in nos, (i,k) in passo[s-1], (k,j) in passo[s-1]}(i,j);
  2513. set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E,
  2514. default {('abc',123), (321,'cba')};
  2515. \end{verbatim}
  2516. % \begin{verbatim}
  2517. % set nodes;
  2518. % set arcs within nodes cross nodes;
  2519. % set step{s in 1..maxiter} dimen 2 := if s = 1 then arcs else step[s-1]
  2520. % union setof{k in nodes, (i,k) in step[s-1], (k,j) in step[s-1]}(i,j);
  2521. % set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E,
  2522. % default {('abc',123), (321,'cba')};
  2523. % \end{verbatim}
  2524. A sentença set declara um conjunto. Se o domínio do subíndice não é
  2525. especificado, o conjunto é um conjunto simples, caso contrário será
  2526. uma matriz de conjuntos elementares.
  2527. O atributo {\tt dimen} especifica a dimensão de $n$-tuplas da qual é
  2528. consistida o conjunto (se o conjunto é simples) ou seus membros
  2529. (se o conjunto é uma matriz de conjuntos elementares),
  2530. em que $n$ deve ser um inteiro de 1 a 20. Pode-se especificar
  2531. no máximo um atributo {\tt dimen}. Se o atributo {\tt dimen} não é
  2532. especificado, a dimensão das $n$-tuplas é implicitamente determinada
  2533. por outros atributos (por exemplo, se há uma expressão que segue
  2534. {\tt:=} ou a palavra-chave {\tt default}, usa-se a dimensão das $n$-tuplas
  2535. do conjunto elementar correspondente).
  2536. Se nenhuma informação de dimensão é fornecida, assume-se
  2537. {\tt dimen 1}.
  2538. O atributo {\tt within} especifica uma expressão de conjunto cujo
  2539. valor resultante é um superconjunto usado para restringir o conjunto
  2540. (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
  2541. de conjuntos elementares) a estar incluído naquele superconjunto.
  2542. Um número arbitrário de atributos {\tt within} podem ser especificados
  2543. na mesma sentença set.
  2544. O atributo de atribuição ({\tt:=}) especifica uma expressão de conjunto
  2545. usada para avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto
  2546. (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
  2547. de conjuntos elementares). Se o atributo de atribuição é especificado,
  2548. o conjunto é {\it calculável}, portanto, não há a necessidade de fornecer
  2549. dados na seção de dados. Se o atributo de atribuição não é especificado,
  2550. deve-se fornecer os dados na seção de dados. Pode-se especificar no
  2551. máximo um atributo de atribuição ou {\tt default} para o mesmo conjunto.
  2552. O atributo {\tt default} especifica uma expressão de conjunto usado para
  2553. avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto
  2554. (se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
  2555. de conjuntos elementares) sempre que não houver dados apropriados
  2556. disponíveis na seção de dados. Se não se especifica nem o atributo de
  2557. atribuição nem o atributo {\tt default}, a falta de dados causará um erro.
  2558. % The set statement declares a set. If the subscript domain is not
  2559. % specified, the set is a simple set, otherwise it is an array of
  2560. % elemental sets.
  2561. %
  2562. % The {\tt dimen} attribute specifies the dimension of $n$-tuples, which
  2563. % the set (if it is a simple set) or its members (if the set is an array
  2564. % of elemental sets) consist of, where $n$ should be an unsigned integer
  2565. % from 1 to 20. At most one {\tt dimen} attribute can be specified. If
  2566. % the {\tt dimen} attribute is not specified, the dimension of $n$-tuples
  2567. % is implicitly determined by other attributes (for example, if there is
  2568. % a set expression that follows {\tt:=} or the keyword {\tt default}, the
  2569. % dimension of $n$-tuples of corresponding elemental set is used).
  2570. % If no dimension information is available, {\tt dimen 1} is assumed.
  2571. %
  2572. % The {\tt within} attribute specifies a set expression whose resultant
  2573. % value is a superset used to restrict the set (if it is a simple set) or
  2574. % its members (if the set is an array of elemental sets) to be within
  2575. % that superset. Arbitrary number of {\tt within} attributes may be
  2576. % specified in the same set statement.
  2577. %
  2578. % The assign ({\tt:=}) attribute specifies a set expression used to
  2579. % evaluate elemental set(s) assigned to the set (if it is a simple set)
  2580. % or its members (if the set is an array of elemental sets). If the
  2581. % assign attribute is specified, the set is {\it computable} and
  2582. % therefore needs no data to be provided in the data section. If the
  2583. % assign attribute is not specified, the set should be provided with data
  2584. % in the data section. At most one assign or default attribute can be
  2585. % specified for the same set.
  2586. %
  2587. % The {\tt default} attribute specifies a set expression used to evaluate
  2588. % elemental set(s) assigned to the set (if it is a simple set) or its
  2589. % members (if the set is an array of elemental sets) whenever
  2590. % no appropriate data are available in the data section. If neither
  2591. % assign nor default attribute is specified, missing data will cause an
  2592. % error.
  2593. \newpage
  2594. \section{Sentença parameter}
  2595. \noindent
  2596. \framebox[468pt][l]{
  2597. \parbox[c][24pt]{468pt}{
  2598. \hspace{6pt} {\tt param} {\it nome} {\it alias} {\it domínio} {\tt,}
  2599. {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  2600. }}
  2601. % \noindent
  2602. % \framebox[468pt][l]{
  2603. % \parbox[c][24pt]{468pt}{
  2604. % \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,}
  2605. % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  2606. % }}
  2607. \medskip
  2608. \noindent
  2609. {\it nome} é um nome simbólico do parâmetro;
  2610. \noindent
  2611. {\it alias} é um literal de cadeia opcional que especifica um pseudônimo
  2612. para o parâmetro;
  2613. \noindent
  2614. {\it domínio} é uma expressão indexante opcional que especifica o domínio
  2615. do subíndice do parâmetro;
  2616. \noindent
  2617. {\it atributo}, \dots, {\it atributo} são atributos opcionais do parâmetro
  2618. (as vírgulas que precedem os atributos podem ser omitidas.)
  2619. \para{Atributos opcionais}
  2620. % \noindent
  2621. % {\it name} is a symbolic name of the parameter;
  2622. %
  2623. % \noindent
  2624. % {\it alias} is an optional string literal, which specifies an alias of
  2625. % the parameter;
  2626. %
  2627. % \noindent
  2628. % {\it domain} is an optional indexing expression, which specifies
  2629. % a subscript domain of the parameter;
  2630. %
  2631. % \noindent
  2632. % {\it attrib}, \dots, {\it attrib} are optional attributes of the
  2633. % parameter. (Commae preceding attributes may be omitted.)
  2634. %
  2635. % \para{Optional attributes}
  2636. \vspace*{-8pt}
  2637. \begin{description}
  2638. \item[{\tt integer}]\hspace*{0pt}\\
  2639. especifica que o parâmetro é inteiro;
  2640. \item[{\tt binary}]\hspace*{0pt}\\
  2641. especifica que o parâmetro é binário;
  2642. \item[{\tt symbolic}]\hspace*{0pt}\\
  2643. especifica que o parâmetro é simbólico;
  2644. \item[{\it expressão de relação}]\hspace*{0pt}\\
  2645. (onde {\it relação} é algum de: {\tt<}, {\tt<=}, {\tt=}, {\tt==},
  2646. {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\
  2647. especifica uma condição que restringe o parâmetro ou seus membros a
  2648. satisfazer aquela condição;
  2649. \item[{\tt in} {\it expressão}]\hspace*{0pt}\\
  2650. especifica um superconjunto que restringe o parâmetro ou seus membros
  2651. a estarem inseridos naquele superconjunto;
  2652. \item[{\tt:=} {\it expressão}]\hspace*{0pt}\\
  2653. especifica um valor atribuído ao parâmetro ou a seus membros;
  2654. \item[{\tt default} {\it expressão}]\hspace*{0pt}\\
  2655. especifica um valor atribuído ao parâmetro ou aos seus membros sempre
  2656. que não houverem dados disponíveis na seção de dados.
  2657. \end{description}
  2658. % \begin{description}
  2659. % \item[{\tt integer}]\hspace*{0pt}\\
  2660. % specifies that the parameter is integer;
  2661. % \item[{\tt binary}]\hspace*{0pt}\\
  2662. % specifies that the parameter is binary;
  2663. % \item[{\tt symbolic}]\hspace*{0pt}\\
  2664. % specifies that the parameter is symbolic;
  2665. % \item[{\it relation expression}]\hspace*{0pt}\\
  2666. % (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==},
  2667. % {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\
  2668. % specifies a condition that restricts the parameter or its members to
  2669. % satisfy that condition;
  2670. % \item[{\tt in} {\it expression}]\hspace*{0pt}\\
  2671. % specifies a superset that restricts the parameter or its members to be
  2672. % in that superset;
  2673. % \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
  2674. % specifies a value assigned to the parameter or its members;
  2675. % \item[{\tt default} {\it expression}]\hspace*{0pt}\\
  2676. % specifies a value assigned to the parameter or its members whenever
  2677. % no appropriate data are available in the data section.
  2678. % \end{description}
  2679. \vspace*{-8pt}
  2680. \para{Exemplos}
  2681. % \para{Examples}
  2682. \begin{verbatim}
  2683. param unidades{insumo, produto} >= 0;
  2684. param lucro{produto, 1..T+1};
  2685. param N := 20 integer >= 0 <= 100;
  2686. param combinacao 'n escolhe k' {n in 0..N, k in 0..n} :=
  2687. if k = 0 or k = n then 1 else combinacao[n-1,k-1] + combinacao[n-1,k];
  2688. param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j],
  2689. in C[i,j], default 0.5 * (i + j);
  2690. param mes symbolic default 'Mai' in {'Mar', 'Abr', 'Mai'};
  2691. \end{verbatim}
  2692. % \begin{verbatim}
  2693. % param units{raw, prd} >= 0;
  2694. % param profit{prd, 1..T+1};
  2695. % param N := 20 integer >= 0 <= 100;
  2696. % param comb 'n choose k' {n in 0..N, k in 0..n} :=
  2697. % if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k];
  2698. % param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j],
  2699. % in C[i,j], default 0.5 * (i + j);
  2700. % param month symbolic default 'May' in {'Mar', 'Apr', 'May'};
  2701. % \end{verbatim}
  2702. A sentença parameter declara um parâmetro. Se o domínio de subíndice não
  2703. é especificado, o parâmetro é simples (escalar), caso contrário,
  2704. é uma matriz $n$-dimensional.
  2705. Os atributos de tipo {\tt integer}, {\tt binary} e {\tt symbolic}
  2706. qualificam os tipos de valores que podem ser atribuídos ao parâmetro, conforme
  2707. demonstrado:
  2708. % The parameter statement declares a parameter. If a subscript domain is
  2709. % not specified, the parameter is a simple (scalar) parameter, otherwise
  2710. % it is a $n$-dimensional array.
  2711. %
  2712. % The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic}
  2713. % qualify the type of values that can be assigned to the parameter as
  2714. % shown below:
  2715. \noindent\hfil
  2716. \begin{tabular}{@{}ll@{}}
  2717. Tipo de atributo&Valores atribuídos\\
  2718. \hline
  2719. (não especificado)&Qualquer valor numérico\\
  2720. {\tt integer}&Apenas valores numéricos inteiros\\
  2721. {\tt binary}&Tanto 0 quanto 1\\
  2722. {\tt symbolic}&Qualquer valor numérico e simbólico\\
  2723. \end{tabular}
  2724. % \noindent\hfil
  2725. % \begin{tabular}{@{}ll@{}}
  2726. % Type attribute&Assigned values\\
  2727. % \hline
  2728. % (not specified)&Any numeric values\\
  2729. % {\tt integer}&Only integer numeric values\\
  2730. % {\tt binary}&Either 0 or 1\\
  2731. % {\tt symbolic}&Any numeric and symbolic values\\
  2732. % \end{tabular}
  2733. O atributo {\tt symbolic} não pode ser especificado juntamente com outros tipos
  2734. de atributos. Uma vez especificado, ele deve preceder todos os outros atributos.
  2735. O atributo de condição especifica uma condição opcional que restringe
  2736. os valores atribuídos ao parâmetro para satisfazer aquela condição.
  2737. Este atributo tem as seguintes formas sintáticas:
  2738. % The {\tt symbolic} attribute cannot be specified along with other type
  2739. % attributes. Being specified it should precede all other attributes.
  2740. %
  2741. % The condition attribute specifies an optional condition that restricts
  2742. % values assigned to the parameter to satisfy that condition. This
  2743. % attribute has the following syntactic forms:
  2744. \begin{tabular}{@{}ll@{}}
  2745. {\tt<} $v$&verifica se $x<v$\\
  2746. {\tt<=} $v$&verifica se $x\leq v$\\
  2747. {\tt=} $v$, {\tt==} $v$&verifica se $x=v$\\
  2748. {\tt>=} $v$&verifica se $x\geq v$\\
  2749. {\tt>} $v$&verifica se $x\geq v$\\
  2750. {\tt<>} $v$, {\tt!=} $v$&verifica se $x\neq v$\\
  2751. \end{tabular}
  2752. % \begin{tabular}{@{}ll@{}}
  2753. % {\tt<} $v$&check for $x<v$\\
  2754. % {\tt<=} $v$&check for $x\leq v$\\
  2755. % {\tt=} $v$, {\tt==} $v$&check for $x=v$\\
  2756. % {\tt>=} $v$&check for $x\geq v$\\
  2757. % {\tt>} $v$&check for $x\geq v$\\
  2758. % {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\
  2759. % \end{tabular}
  2760. \noindent onde $x$ é um valor atribuído ao parâmetro, $v$ é o
  2761. valor resultante de uma expressão numérica ou simbólica especificado
  2762. no atributo de condição. Um número arbitrário de atributos de condição
  2763. pode ser especificado para o mesmo parâmetro. Se, durante a avaliação do
  2764. modelo, um valor atribuído ao parâmetro viola pelo menos uma das
  2765. condições especificadas, ocorrerá um erro. (Note que valores simbólicos
  2766. são ordenados de forma lexicográfica e qualquer valor numérico precede
  2767. qualquer valor simbólico.)
  2768. O atributo {\tt in} é similar ao atributo de condição e especifica
  2769. uma expressão de conjunto cujo valor resultante é um superconjunto usado
  2770. para restringir valores numéricos ou simbólicos atribuídos ao parâmetro
  2771. a estarem incluídos naquele superconjunto. Pode-se especificar um número
  2772. arbitrário de atributos {\tt in} para o mesmo parâmetro. Se, durante a avaliação do
  2773. modelo, o valor atribuído ao parâmetro não pertence a pelo menos um dos
  2774. superconjuntos especificados, ocorrerá um erro.
  2775. O atributo de atribuição ({\tt:=}) especifica uma expressão numérica
  2776. ou simbólica usada para \linebreak computar um valor atribuído ao parâmetro
  2777. (se é um parâmetro simples) ou seus membros (se o parâmetro é uma matriz).
  2778. Se o atributo de atribuição é especificado,
  2779. o parâmetro é {\it calculável}, \linebreak portanto, não há a necessidade de fornecer
  2780. dados na seção de dados. Se o atributo de atribuição não é especificado,
  2781. deve-se fornecer os dados para o parâmetro na seção de dados. Pode-se especificar no
  2782. máximo um atributo de atribuição ou {\tt default} para o mesmo parâmetro.
  2783. O atributo {\tt default} especifica uma expressão numérica ou simbólica
  2784. usada para computar um valor atribuído ao parâmetro ou seus membros
  2785. sempre que não houver dados apropriados disponíveis na seção de dados.
  2786. Se não se especifica nem o atributo de atribuição nem o atributo
  2787. {\tt default}, a falta de dados causará um erro.
  2788. % \noindent where $x$ is a value assigned to the parameter, $v$ is the
  2789. % resultant value of a numeric or symbolic expression specified in the
  2790. % condition attribute. Arbitrary number of condition attributes can be
  2791. % specified for the same parameter. If a value being assigned to the
  2792. % parameter during model evaluation violates at least one of specified
  2793. % conditions, an error is raised. (Note that symbolic values are ordered
  2794. % lexicographically, and any numeric value precedes any symbolic value.)
  2795. %
  2796. % The {\tt in} attribute is similar to the condition attribute and
  2797. % specifies a set expression whose resultant value is a superset used to
  2798. % restrict numeric or symbolic values assigned to the parameter to be in
  2799. % that superset. Arbitrary number of the {\tt in} attributes can be
  2800. % specified for the same parameter. If a value being assigned to the
  2801. % parameter during model evaluation is not in at least one of specified
  2802. % supersets, an error is raised.
  2803. %
  2804. % The assign ({\tt:=}) attribute specifies a numeric or symbolic
  2805. % expression used to compute a value assigned to the parameter (if it is
  2806. % a simple parameter) or its member (if the parameter is an array). If
  2807. % the assign attribute is specified, the parameter is {\it computable}
  2808. % and therefore needs no data to be provided in the data section. If the
  2809. % assign attribute is not specified, the parameter should be provided
  2810. % with data in the data section. At most one assign or {\tt default}
  2811. % attribute can be specified for the same parameter.
  2812. %
  2813. % The {\tt default} attribute specifies a numeric or symbolic expression
  2814. % used to compute a value assigned to the parameter or its member
  2815. % whenever no appropriate data are available in the data section. If
  2816. % neither assign nor {\tt default} attribute is specified, missing data
  2817. % will cause an error.
  2818. \newpage
  2819. \section{Sentença variable}
  2820. \noindent
  2821. \framebox[468pt][l]{
  2822. \parbox[c][24pt]{468pt}{
  2823. \hspace{6pt} {\tt var} {\it nome} {\it alias} {\it domínio} {\tt,}
  2824. {\it atrib} {\tt,} \dots {\tt,} {\it atrib} {\tt;}
  2825. }}
  2826. \medskip
  2827. \noindent
  2828. {\it nome} é um nome simbólico da variável;
  2829. \noindent
  2830. {\it alias} é um literal de cadeia opcional que especifica um pseudônimo
  2831. para a variável;
  2832. \noindent
  2833. {\it domínio} é uma expressão indexante opcional que especifica o domínio
  2834. do subíndice da variável;
  2835. \noindent
  2836. {\it atrib}, \dots, {\it atrib} são atributos opcionais da variável
  2837. (as vírgulas que precedem os atributos podem ser omitidas.)
  2838. \para{Atributos opcionais}
  2839. \vspace*{-8pt}
  2840. \begin{description}
  2841. \item[{\tt integer}]\hspace*{0pt}\\
  2842. restringe a variável a ser inteira;
  2843. \item[{\tt binary}]\hspace*{0pt}\\
  2844. restringe a variável a ser binária;
  2845. \item[{\tt>=} {\it expressão}]\hspace*{0pt}\\
  2846. especifica um limite inferior para a variável;
  2847. \item[{\tt<=} {\it expressão}]\hspace*{0pt}\\
  2848. especifica um limite superior para a variável;
  2849. \item[{\tt=} {\it expressão}]\hspace*{0pt}\\
  2850. especifica um valor fixo para a variável;
  2851. \end{description}
  2852. % \noindent
  2853. % \framebox[468pt][l]{
  2854. % \parbox[c][24pt]{468pt}{
  2855. % \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,}
  2856. % {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
  2857. % }}
  2858. %
  2859. % \medskip
  2860. %
  2861. % \noindent
  2862. % {\it name} is a symbolic name of the variable;
  2863. %
  2864. % \noindent
  2865. % {\it alias} is an optional string literal, which specifies an alias of
  2866. % the variable;
  2867. %
  2868. % \noindent
  2869. % {\it domain} is an optional indexing expression, which specifies
  2870. % a subscript domain of the variable;
  2871. %
  2872. % \noindent
  2873. % {\it attrib}, \dots, {\it attrib} are optional attributes of the
  2874. % variable. (Commae preceding attributes may be omitted.)
  2875. %
  2876. % \para{Optional attributes}
  2877. %
  2878. % \vspace*{-8pt}
  2879. %
  2880. % \begin{description}
  2881. % \item[{\tt integer}]\hspace*{0pt}\\
  2882. % restricts the variable to be integer;
  2883. % \item[{\tt binary}]\hspace*{0pt}\\
  2884. % restricts the variable to be binary;
  2885. % \item[{\tt>=} {\it expression}]\hspace*{0pt}\\
  2886. % specifies an lower bound of the variable;
  2887. % \item[{\tt<=} {\it expression}]\hspace*{0pt}\\
  2888. % specifies an upper bound of the variable;
  2889. % \item[{\tt=} {\it expression}]\hspace*{0pt}\\
  2890. % specifies a fixed value of the variable;
  2891. % \end{description}
  2892. \vspace*{-8pt}
  2893. \para{Exemplos}
  2894. % \para{Examples}
  2895. \begin{verbatim}
  2896. var x >= 0;
  2897. var y{I,J};
  2898. var produzir{p in prod}, integer, >= comprometido[p], <= mercado[p];
  2899. var armazenar{insumo, 1..T+1} >= 0;
  2900. var z{i in I, j in J} >= i+j;
  2901. \end{verbatim}
  2902. % \begin{verbatim}
  2903. % var x >= 0;
  2904. % var y{I,J};
  2905. % var make{p in prd}, integer, >= commit[p], <= market[p];
  2906. % var store{raw, 1..T+1} >= 0;
  2907. % var z{i in I, j in J} >= i+j;
  2908. % \end{verbatim}
  2909. A sentença variable declara uma variável. Se não se especifica o
  2910. domínio do subíndice, a variável e uma variável simples (escalar),
  2911. caso contrário é uma matriz $n$-dimensional de variáveis elementares.
  2912. As variáveis elementares associadas com a variável do modelo
  2913. (se é uma variável simples) ou seus membros (se é uma matriz) corresponde
  2914. às variáveis na formulação do problema PL/PIM (ver Seção \ref{problem},
  2915. página \pageref{problem}). Note que somente variáveis elementares
  2916. realmente referenciadas em algumas restrições e/ou objetivos serão
  2917. incluídas na instância do problema PL/PIM a ser gerado.
  2918. Os atributos de tipo {\tt integer} e {\tt binary} restringem a variável
  2919. a ser inteira ou binária, \linebreak respectivamente. Se nenhum atributo de tipo
  2920. é especificado, a variável é contínua. Se todas as variáveis no modelo
  2921. são contínuas, o problema correspondente é da classe PL. Se há pelo
  2922. menos uma variável inteira ou binária, o problema é da classe PIM.
  2923. \newpage
  2924. O atributo de limite inferior ({\tt>=}) especifica uma expressão numérica
  2925. para calcular um limite inferior da variável. No máximo um limite inferior
  2926. pode ser especificado. Por padrão, todas as variáveis (exceto as binárias)
  2927. não tem limite inferior, assim, se há a necessidade de uma variável ser
  2928. não-negativa, seu limite inferior zero deve ser explicitamente especificado.
  2929. O atributo de limite superior ({\tt<=}) especifica uma expressão numérica
  2930. para calcular um limite superior da variável. No máximo um limite superior
  2931. pode ser especificado.
  2932. O atributo de valor fixo ({\tt=}) especifica uma expressão numérica para
  2933. calcular um valor no qual a variável é fixada. Este atributo não pode
  2934. ser especificado junto com os atributos de limite.
  2935. % The variable statement declares a variable. If a subscript domain is
  2936. % not specified, the variable is a simple (scalar) variable, otherwise it
  2937. % is a $n$-dimensional array of elemental variables.
  2938. %
  2939. % Elemental variable(s) associated with the model variable (if it is a
  2940. % simple variable) or its members (if it is an array) correspond to the
  2941. % variables in the LP/MIP problem formulation (see Section \ref{problem},
  2942. % page \pageref{problem}). Note that only elemental variables actually
  2943. % referenced in some constraints and/or objectives are included in the
  2944. % LP/MIP problem instance to be generated.
  2945. %
  2946. % The type attributes {\tt integer} and {\tt binary} restrict the
  2947. % variable to be integer or binary, respectively. If no type attribute is
  2948. % specified, the variable is continuous. If all variables in the model
  2949. % are continuous, the corresponding problem is of LP class. If there is
  2950. % at least one integer or binary variable, the problem is of MIP class.
  2951. %
  2952. % The lower bound ({\tt>=}) attribute specifies a numeric expression for
  2953. % computing an lower bound of the variable. At most one lower bound can
  2954. % be specified. By default all variables (except binary ones) have no
  2955. % lower bound, so if a variable is required to be non-negative, its zero
  2956. % lower bound should be explicitly specified.
  2957. %
  2958. % The upper bound ({\tt<=}) attribute specifies a numeric expression for
  2959. % computing an upper bound of the variable. At most one upper bound
  2960. % attribute can be specified.
  2961. %
  2962. % The fixed value ({\tt=}) attribute specifies a numeric expression for
  2963. % computing a value, at which the variable is fixed. This attribute
  2964. % cannot be specified along with the bound attributes.
  2965. \section{Sentença constraint}
  2966. \noindent
  2967. \framebox[468pt][l]{
  2968. \parbox[c][106pt]{468pt}{
  2969. \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
  2970. {\it expressão} {\tt,} {\tt=} {\it expressão} {\tt;}
  2971. \medskip
  2972. \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
  2973. {\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt;}
  2974. \medskip
  2975. \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
  2976. {\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt;}
  2977. \medskip
  2978. \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
  2979. {\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt,} {\tt<=}
  2980. {\it expressão} {\tt;}
  2981. \medskip
  2982. \hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
  2983. {\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt,} {\tt>=}
  2984. {\it expressão} {\tt;}
  2985. }}
  2986. \medskip
  2987. \noindent
  2988. {\it nome} é um nome simbólico da restrição;
  2989. \noindent
  2990. {\it alias} é um literal de cadeia opcional que especifica um pseudônimo
  2991. da restrição;
  2992. \noindent
  2993. {\it domínio} é uma expressão indexante opcional, que especifica
  2994. o domínio do subíndice da restrição;
  2995. \noindent
  2996. {\it expressão} é uma expressão linear usada para calcular um componente
  2997. da restrição (as vírgulas que precedem os atributos podem ser omitidas).
  2998. \noindent
  2999. (A palavra-chave {\tt s.t.} pode ser escrita como {\tt subject to}, como
  3000. {\tt subj to} ou pode ser omitido por completo).
  3001. % \noindent
  3002. % \framebox[468pt][l]{
  3003. % \parbox[c][106pt]{468pt}{
  3004. % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  3005. % {\it expression} {\tt,} {\tt=} {\it expression} {\tt;}
  3006. %
  3007. % \medskip
  3008. %
  3009. % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  3010. % {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;}
  3011. %
  3012. % \medskip
  3013. %
  3014. % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  3015. % {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;}
  3016. %
  3017. % \medskip
  3018. %
  3019. % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  3020. % {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=}
  3021. % {\it expression} {\tt;}
  3022. %
  3023. % \medskip
  3024. %
  3025. % \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
  3026. % {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=}
  3027. % {\it expression} {\tt;}
  3028. % }}
  3029. %
  3030. % \medskip
  3031. %
  3032. % \noindent
  3033. % {\it name} is a symbolic name of the constraint;
  3034. %
  3035. % \noindent
  3036. % {\it alias} is an optional string literal, which specifies an alias of
  3037. % the constraint;
  3038. %
  3039. % \noindent
  3040. % {\it domain} is an optional indexing expression, which specifies
  3041. % a subscript domain of the constraint;
  3042. %
  3043. % \noindent
  3044. % {\it expression} is a linear expression used to compute a component of
  3045. % the constraint. (Commae following expressions may be omitted.)
  3046. %
  3047. % \noindent
  3048. % (The keyword {\tt s.t.} may be written as {\tt subject to} or as
  3049. % {\tt subj to}, or may be omitted at all.)
  3050. \para{Exemplos}
  3051. % \para{Examples}
  3052. \begin{verbatim}
  3053. s.t. r: x + y + z, >= 0, <= 1;
  3054. limite{t in 1..T}: sum{j in produto} produzir[j,t] <= max_prod;
  3055. subject to balanco{i in insumo, t in 1..T}:
  3056. estoque[i,t+1] = estoque[i,t] - sum{j in produto} unidades[i,j] * produzir[j,t];
  3057. subject to rlim 'limite tempo-regular' {t in tempo}:
  3058. sum{p in produto} pt[p] * rprod[p,t] <= 1.3 * dpp[t] * equipes[t];
  3059. \end{verbatim}
  3060. % \begin{verbatim}
  3061. % s.t. r: x + y + z, >= 0, <= 1;
  3062. % limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd;
  3063. % subject to balance{i in raw, t in 1..T}:
  3064. % store[i,t+1] = store[i,t] - sum{j in prd} units[i,j] * make[j,t];
  3065. % subject to rlim 'regular-time limit' {t in time}:
  3066. % sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t];
  3067. % \end{verbatim}
  3068. A sentença de restrição declara uma restrição. Se o domínio do subíndice
  3069. não é especificado, a restrição é uma restrição simples (escalar),
  3070. caso contrário, é uma matriz $n$-dimensional de restrições elementares.
  3071. Restrições elementares associadas com a restrição do modelo (se é
  3072. uma restrição simples) ou seus membros (se é uma matriz) correspondem
  3073. a restrições lineares na formulação do problema de PL/PIM (ver
  3074. Seção \ref{problem}, página \pageref{problem}).
  3075. Se a restrição possui a forma de igualdade ou desigualdade simples, i.e.,
  3076. inclui duas expressões, uma segue depois dos dois pontos e a outra
  3077. segue depois do sinal de relação {\tt=}, {\tt<=} ou {\tt>=}, \linebreak ambas
  3078. expressões na sentença podem ser expressões lineares. Se a restrição
  3079. possui a forma de uma \linebreak desigualdade dupla, i.e., inclui três expressões,
  3080. a expressão do meio pode ser uma expressão linear, enquanto a da
  3081. esquerda e a da direita podem ser apenas expressões numéricas.
  3082. Gerar o modelo é, a grosso modo, gerar suas restrições, que são sempre
  3083. avaliadas para todo domínio do subíndice. Avaliar as restrições,
  3084. por sua vez, leva a avaliação de outros objetos de modelo tais como
  3085. conjuntos, parâmetros e variáveis.
  3086. A construção de uma restrição linear incluída na instância do problema,
  3087. que corresponde a uma restrição elementar particular, é realizada
  3088. como segue.
  3089. % The constraint statement declares a constraint. If a subscript domain
  3090. % is not specified, the\linebreak constraint is a simple (scalar)
  3091. % constraint, otherwise it is a $n$-dimensional array of elemental
  3092. % constraints.
  3093. %
  3094. % Elemental constraint(s) associated with the model constraint (if it is
  3095. % a simple constraint) or its members (if it is an array) correspond to
  3096. % the linear constraints in the LP/MIP problem formulation (see
  3097. % Section \ref{problem}, page \pageref{problem}).
  3098. %
  3099. % If the constraint has the form of equality or single inequality, i.e.
  3100. % includes two expressions, one of which follows the colon and other
  3101. % follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions
  3102. % in the statement can be linear expressions. If the constraint has the
  3103. % form of double inequality,\linebreak i.e. includes three expressions,
  3104. % the middle expression can be a linear expression while the leftmost and
  3105. % rightmost ones can be only numeric expressions.
  3106. %
  3107. % Generating the model is, roughly speaking, generating its constraints,
  3108. % which are always evaluated for the entire subscript domain. Evaluation
  3109. % of the constraints leads, in turn, to evaluation of other model objects
  3110. % such as sets, parameters, and variables.
  3111. %
  3112. % Constructing an actual linear constraint included in the problem
  3113. % instance, which (constraint) corresponds to a particular elemental
  3114. % constraint, is performed as follows.
  3115. Se a restrição possui a forma de igualdade ou desigualdade simples,
  3116. a avaliação de ambas \linebreak expressões lineares resultam em duas formas lineares:
  3117. $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r}
  3118. f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\
  3119. g&=&b_1x_1&+&b_2x_2&+\dots+&b_nx_n&+&b_0,\\
  3120. \end{array}$$
  3121. onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$,
  3122. \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ são coeficientes numéricos;
  3123. $a_0$ e $b_0$ são termos constantes. Em seguida, todos os termos lineares
  3124. de $f$ e $g$ são levados ao lado esquerdo, enquanto que os termos constantes
  3125. são levados ao lado direito, resultando na restrição elementar
  3126. final na forma padrão:
  3127. $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{
  3128. \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$
  3129. Se a restrição possui a forma de desigualdade dupla, a avaliação da
  3130. expressão linear do meio resulta na seguinte forma linear:
  3131. $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  3132. e a avaliação das expressões numéricas da esquerda e da direita dão
  3133. dois valores numéricos $l$ e $u$, respectivamente. Logo,
  3134. o termo constante da forma linear é levado tanto à esquerda como
  3135. à direita para gerar a restrição elementar final na forma padrão:
  3136. $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$
  3137. % If the constraint has the form of equality or single inequality,
  3138. % evaluation of both linear expressions gives two resultant linear forms:
  3139. % $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r}
  3140. % f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\
  3141. % g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\
  3142. % \end{array}$$
  3143. % where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
  3144. % \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients;
  3145. % $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and
  3146. % $g$ are carried to the left-hand side, and the constant terms are
  3147. % carried to the right-hand side, that gives the final elemental
  3148. % constraint in the standard form:
  3149. % $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{
  3150. % \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$
  3151. %
  3152. % If the constraint has the form of double inequality, evaluation of the
  3153. % middle linear expression gives the resultant linear form:
  3154. % $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  3155. % and evaluation of the leftmost and rightmost numeric expressions gives
  3156. % two numeric values $l$ and $u$, respectively. Then the constant term of
  3157. % the linear form is carried to both left-hand and right-handsides that
  3158. % gives the final elemental constraint in the standard form:
  3159. % $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$
  3160. \section{Sentença objective}
  3161. \noindent
  3162. \framebox[468pt][l]{
  3163. \parbox[c][44pt]{468pt}{
  3164. \hspace{6pt} {\tt minimize} {\it nome} {\it alias} {\it domínio} {\tt:}
  3165. {\it expressão} {\tt;}
  3166. \medskip
  3167. \hspace{6pt} {\tt maximize} {\it nome} {\it alias} {\it domínio} {\tt:}
  3168. {\it expressão} {\tt;}
  3169. }}
  3170. \medskip
  3171. \noindent
  3172. {\it nome} é um nome simbólico do objetivo;
  3173. \noindent
  3174. {\it alias} é uma literal de cadeia opcional que especifica um
  3175. pseudônimo do objetivo;
  3176. \noindent
  3177. {\it domínio} é uma expressão indexante opcional que especifica
  3178. um domínio do subíndice do objetivo;
  3179. \noindent
  3180. {\it expressão} é uma expressão linear usada pra calcular a forma
  3181. linear do objetivo.
  3182. % \noindent
  3183. % \framebox[468pt][l]{
  3184. % \parbox[c][44pt]{468pt}{
  3185. % \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:}
  3186. % {\it expression} {\tt;}
  3187. %
  3188. % \medskip
  3189. %
  3190. % \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:}
  3191. % {\it expression} {\tt;}
  3192. % }}
  3193. %
  3194. % \medskip
  3195. %
  3196. % \noindent
  3197. % {\it name} is a symbolic name of the objective;
  3198. %
  3199. % \noindent
  3200. % {\it alias} is an optional string literal, which specifies an alias of
  3201. % the objective;
  3202. %
  3203. % \noindent
  3204. % {\it domain} is an optional indexing expression, which specifies
  3205. % a subscript domain of the objective;
  3206. %
  3207. % \noindent
  3208. % {\it expression} is a linear expression used to compute the linear form
  3209. % of the objective.
  3210. \newpage
  3211. \para{Exemplos}
  3212. % \para{Examples}
  3213. \begin{verbatim}
  3214. minimize obj: x + 1.5 * (y + z);
  3215. maximize lucro_total: sum{p in produto} lucro[p] * produzir[p];
  3216. \end{verbatim}
  3217. % \begin{verbatim}
  3218. % minimize obj: x + 1.5 * (y + z);
  3219. % maximize total_profit: sum{p in prd} profit[p] * make[p];
  3220. % \end{verbatim}
  3221. A sentença objective declara um objetivo. Se o domínio do subíndice
  3222. não é especificado, o objetivo é um objetivo simples (escalar). Caso contrário,
  3223. é uma matriz $n$-dimensional de objetivos elementares.
  3224. Objetivos elementares associados com o objetivo do modelo (se é um
  3225. objetivo simples) ou seus membros (se é uma matriz) correspondem
  3226. a restrições lineares genéricas na formulação do problema PL/PIM
  3227. (ver Seção \ref{problem}, página \pageref{problem}). No entanto,
  3228. diferentemente das restrições, estas formas lineares são livres
  3229. (ilimitadas).
  3230. A construção de uma forma linear incluída na instância do problema,
  3231. a qual corresponde a uma restrição elementar particular,
  3232. é realizada como segue. A expressão linear especificada da na
  3233. sentença objective é avaliada para resultar na seguinte forma linear:
  3234. $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  3235. onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$,
  3236. \dots, $a_n$ são coeficientes numéricos; $a_0$ é o termo constante. Logo,
  3237. a forma linear é usada para construir a restrição final elementar na
  3238. forma padrão:
  3239. $$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$
  3240. Como via de regra, a descrição do modelo contém apenas uma sentença objective
  3241. que define a função objetivo usada na instância do problema.
  3242. No entanto, é permitido declarar uma quantidade arbitrária de objetivos.
  3243. Neste caso, a função objetivo real será o primeiro objetivo
  3244. encontrado na descrição do modelo. Outros objetivos também estão
  3245. incluídos na instância do problema, mas eles não afetam a função
  3246. objetivo.
  3247. % The objective statement declares an objective. If a subscript domain is
  3248. % not specified, the objective is a simple (scalar) objective. Otherwise
  3249. % it is a $n$-dimensional array of elemental objectives.
  3250. %
  3251. % Elemental objective(s) associated with the model objective (if it is a
  3252. % simple objective) or its members (if it is an array) correspond to
  3253. % general linear constraints in the LP/MIP problem formulation (see
  3254. % Section \ref{problem}, page \pageref{problem}). However, unlike
  3255. % constraints the corresponding linear forms are free (unbounded).
  3256. %
  3257. % Constructing an actual linear constraint included in the problem
  3258. % instance, which (constraint) corresponds to a particular elemental
  3259. % constraint, is performed as follows. The linear expression specified in
  3260. % the objective statement is evaluated that, gives the resultant linear
  3261. % form:
  3262. % $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
  3263. % where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
  3264. % \dots, $a_n$ are numeric coefficients; $a_0$ is the constant term. Then
  3265. % the linear form is used to construct the final elemental constraint in
  3266. % the standard form:
  3267. % $$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$
  3268. %
  3269. % As a rule the model description contains only one objective statement
  3270. % that defines the objective function used in the problem instance.
  3271. % However, it is allowed to declare arbitrary number of objectives, in
  3272. % which case the actual objective function is the first objective
  3273. % encountered in the model description. Other objectives are also
  3274. % included in the problem instance, but they do not affect the objective
  3275. % function.
  3276. \section{Sentença solve}
  3277. \noindent
  3278. \framebox[468pt][l]{
  3279. \parbox[c][24pt]{468pt}{
  3280. \hspace{6pt} {\tt solve} {\tt;}
  3281. }}
  3282. \medskip
  3283. A sentença solve é opcional e pode ser usada apenas uma vez.
  3284. Se a sentença solve não é usada, ela é assumida ao final da seção de modelo.
  3285. A sentença solve provoca que o modelo seja resolvido, o que significa calcular
  3286. os valores numéricos de todas as variáveis do modelo. Isto permite usar
  3287. variáveis em sentenças abaixo da sentença solve como se fossem parâmetros
  3288. numéricos.
  3289. Note que a sentença variable, constraint e objective não podem ser usadas
  3290. abaixo da sentença solve, i.e., todos os principais componentes do modelo
  3291. devem ser declarados acima da sentença solve.
  3292. % The solve statement is optional and can be used only once. If no solve
  3293. % statement is used, one is assumed at the end of the model section.
  3294. %
  3295. % The solve statement causes the model to be solved, that means computing
  3296. % numeric values of all model variables. This allows using variables in
  3297. % statements below the solve statement in the same way as if they were
  3298. % numeric parameters.
  3299. %
  3300. % Note that the variable, constraint, and objective statements cannot be
  3301. % used below the solve statement, i.e. all principal components of the
  3302. % model should be declared above the solve statement.
  3303. \newpage
  3304. \section{Sentença check}
  3305. \noindent
  3306. \framebox[468pt][l]{
  3307. \parbox[c][24pt]{468pt}{
  3308. \hspace{6pt} {\tt check} {\it domínio} {\tt:} {\it expressão} {\tt;}
  3309. }}
  3310. \medskip
  3311. \noindent
  3312. {\it domínio} é uma expressão indexante opcional que especifica o
  3313. domínio do subíndice da sentença check;
  3314. \noindent
  3315. {\it expressão} é uma expressão lógica que especifica a condição
  3316. lógica a ser verificada (os dois pontos que precedem a {\it expressão}
  3317. podem ser omitidos).
  3318. \para{Exemplos}
  3319. \begin{verbatim}
  3320. check: x + y <= 1 and x >= 0 and y >= 0;
  3321. check sum{i in ORIG} suprimento[i] = sum{j in DEST} demanda[j];
  3322. check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
  3323. \end{verbatim}
  3324. A sentença check permite a verificação do valor resultante
  3325. de uma expressão lógica especificada na sentença. Se o valor
  3326. é {\it falso}, um erro é reportado.
  3327. Se o domínio do subíndice não é especificado, a verificação é realizada
  3328. apenas uma vez. \linebreak Especificar o domínio do subíndice
  3329. permite a execução de verificações múltiplas para cada $n$-tupla
  3330. no conjunto domínio. Neste último caso, a expressão lógica pode
  3331. incluir índices introduzidos na expressão indexante correspondente.
  3332. % \noindent
  3333. % \framebox[468pt][l]{
  3334. % \parbox[c][24pt]{468pt}{
  3335. % \hspace{6pt} {\tt check} {\it domain} {\tt:} {\it expression} {\tt;}
  3336. % }}
  3337. %
  3338. % \medskip
  3339. %
  3340. % \noindent
  3341. % {\it domain} is an optional indexing expression, which specifies
  3342. % a subscript domain of the check statement;
  3343. %
  3344. % \noindent
  3345. % {\it expression} is an logical expression which specifies the logical
  3346. % condition to be checked. (The colon preceding {\it expression} may be
  3347. % omitted.)
  3348. %
  3349. % \para{Examples}
  3350. %
  3351. % \begin{verbatim}
  3352. % check: x + y <= 1 and x >= 0 and y >= 0;
  3353. % check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j];
  3354. % check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
  3355. % \end{verbatim}
  3356. %
  3357. % The check statement allows checking the resultant value of an logical
  3358. % expression specified in the statement. If the value is {\it false}, an
  3359. % error is reported.
  3360. %
  3361. % If the subscript domain is not specified, the check is performed only
  3362. % once. Specifying the subscript domain allows performing multiple check
  3363. % for every $n$-tuple in the domain set. In the latter case the logical
  3364. % expression may include dummy indices introduced in corresponding
  3365. % indexing expression.
  3366. \section{Sentença display}
  3367. \noindent
  3368. \framebox[468pt][l]{
  3369. \parbox[c][24pt]{468pt}{
  3370. \hspace{6pt} {\tt display} {\it domínio} {\tt:} {\it item} {\tt,}
  3371. \dots {\tt,} {\it item} {\tt;}
  3372. }}
  3373. \medskip
  3374. \noindent
  3375. {\it domínio} é uma expressão indexante opcional que especifica
  3376. um domínio do subíndice da sentença display;
  3377. \noindent
  3378. {\it item}, \dots, {\it item} são itens a serem mostrados (os dois pontos
  3379. que precedem o primeiro item podem ser omitidos).
  3380. \para{Exemplos}
  3381. \begin{verbatim}
  3382. display: 'x =', x, 'y =', y, 'z =', z;
  3383. display sqrt(x ** 2 + y ** 2 + z ** 2);
  3384. display{i in I, j in J}: i, j, a[i,j], b[i,j];
  3385. \end{verbatim}
  3386. A sentença display avalia todos itens especificados na sentença
  3387. e escreve seus valores em saída padrão (terminal) em formato de
  3388. texto plano.
  3389. Se um domínio de subíndice não é especificado, os itens são avaliados e
  3390. mostrados apenas uma vez. Ao especificar o domínio do subíndice, itens
  3391. são avaliados e mostrados para cada $n$-tupla no conjunto do domínio. No
  3392. último caso, os itens podem incluir índices introduzidos na expressão
  3393. indexante correspondente.
  3394. Um item a ser mostrado pode ser um objeto de modelo (conjunto, parâmetro,
  3395. variável, restrição, objetivo) ou uma expressão.
  3396. Se um item é um objeto calculável (i.e., um conjunto ou parâmetro com
  3397. o atributo de atribuição), o objeto é avaliado por todo domínio
  3398. e em seguida, seu conteúdo (i.e., o conteúdo da matriz de objetos) é
  3399. mostrado. Caso contrário, se o item não é um objeto calculável, somente seu
  3400. seu conteúdo corrente (i.e., os membros realmente gerados durante a
  3401. avaliação do modelo) é mostrado.
  3402. Se o item é uma expressão, a expressão é avaliada e seu valor
  3403. resultante é mostrado.
  3404. % \noindent
  3405. % \framebox[468pt][l]{
  3406. % \parbox[c][24pt]{468pt}{
  3407. % \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,}
  3408. % \dots {\tt,} {\it item} {\tt;}
  3409. % }}
  3410. %
  3411. % \medskip
  3412. %
  3413. % \noindent
  3414. % {\it domain} is an optional indexing expression, which specifies
  3415. % a subscript domain of the display statement;
  3416. %
  3417. % \noindent
  3418. % {\it item}, \dots, {\it item} are items to be displayed. (The colon
  3419. % preceding the first item may be omitted.)
  3420. %
  3421. % \para{Examples}
  3422. %
  3423. % \begin{verbatim}
  3424. % display: 'x =', x, 'y =', y, 'z =', z;
  3425. % display sqrt(x ** 2 + y ** 2 + z ** 2);
  3426. % display{i in I, j in J}: i, j, a[i,j], b[i,j];
  3427. % \end{verbatim}
  3428. %
  3429. % The display statement evaluates all items specified in the statement
  3430. % and writes their values on the standard output (terminal) in plain text
  3431. % format.
  3432. %
  3433. % If a subscript domain is not specified, items are evaluated and then
  3434. % displayed only once. Specifying the subscript domain causes items to be
  3435. % evaluated and displayed for every $n$-tuple in the domain set. In the
  3436. % latter case items may include dummy indices introduced in corresponding
  3437. % indexing expression.
  3438. %
  3439. % An item to be displayed can be a model object (set, parameter,
  3440. % variable, constraint, objective) or an expression.
  3441. %
  3442. % If the item is a computable object (i.e. a set or parameter provided
  3443. % with the assign attribute), the object is evaluated over the entire
  3444. % domain and then its content (i.e. the content of the object array) is
  3445. % displayed. Otherwise, if the item is not a computable object, only its
  3446. % current content (i.e. members actually generated during the model
  3447. % evaluation) is displayed.
  3448. %
  3449. % If the item is an expression, the expression is evaluated and its
  3450. % resultant value is displayed.
  3451. \section{Sentença printf}
  3452. \noindent
  3453. \framebox[468pt][l]{
  3454. \parbox[c][64pt]{468pt}{
  3455. \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
  3456. {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt;}
  3457. \medskip
  3458. \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
  3459. {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>}
  3460. {\it nome-do-arquivo} {\tt;}
  3461. \medskip
  3462. \hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
  3463. {\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>>}
  3464. {\it nome-do-arquivo} {\tt;}
  3465. }}
  3466. \medskip
  3467. \noindent
  3468. {\it domínio} é uma expressão indexante opcional que especifica o domínio
  3469. do subíndice da sentença printf;
  3470. \noindent
  3471. {\it formato} é uma expressão simbólica cujo valor especifica uma cadeia de
  3472. controle de formato (os dois pontos que precedem a expressão de formato
  3473. podem ser omitidos).
  3474. \noindent
  3475. {\it expressão}, \dots, {\it expressão} são zero ou mais expressões
  3476. cujos valores devem ser formatados e impressos. Cada expressão deve
  3477. ser de tipo numérico, simbólico ou lógico.
  3478. \noindent
  3479. {\it nome-do-arquivo} é uma expressão simbólica cujo valor especifica um nome
  3480. de um arquivo de texto para onde a saída é redirecionada. O sinal {\tt>}
  3481. significa criar um novo aquivo vazio, enquanto o sinal {\tt>>} significa
  3482. acrescentar a saída a um arquivo existente. Se o nome do arquivo não é especificado,
  3483. a saída é escrita na saída padrão (terminal).
  3484. \para{Exemplos}
  3485. \begin{verbatim}
  3486. printf 'Ola, mundo!\n';
  3487. printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "resultado.txt";
  3488. printf{i in I, j in J}: "fluxo de %s para %s eh %d\n", i, j, x[i,j]
  3489. >> arquivo_resultado & ".txt";
  3490. printf{i in I} 'fluxo total de %s eh %g\n', i, sum{j in J} x[i,j];
  3491. printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
  3492. k, x[k];
  3493. \end{verbatim}
  3494. A sentença printf é similar a sentença display, no entanto, ela
  3495. permite formatar os dados a serem escritos.
  3496. Se um domínio do subíndice não é especificado, a sentença printf
  3497. é executada apenas uma vez. Especificar um domínio do subíndice gera
  3498. a execução da sentença printf para cada $n$-tupla no conjunto do domínio.
  3499. No último caso, o formato e a expressão podem incluir índices introduzidos
  3500. nas expressões indexantes correspondentes.
  3501. A cadeia de controle de formato é valor da expressão simbólica
  3502. {\it formato} especificada na sentença printf. Ela é composta de zero
  3503. ou mais diretivas, como segue: tanto caracteres ordinários (exceto {\tt\%}), que
  3504. são copiados sem modificação ao fluxo de saída, quanto especificações de conversão,
  3505. provocam a avaliação da expressão correspondente especificada na sentença
  3506. printf, do seu formato e da escrita do valor resultante no fluxo de saída.
  3507. As especificações de conversão que podem ser usadas na cadeia de controle
  3508. de formato são as seguintes: {\tt d}, {\tt i}, {\tt f}, {\tt F},
  3509. {\tt e}, {\tt E}, {\tt g}, {\tt G} e {\tt s}. Estas especificações
  3510. possuem a mesma sintaxe e semântica que na linguagem de programação C.
  3511. % \noindent
  3512. % \framebox[468pt][l]{
  3513. % \parbox[c][64pt]{468pt}{
  3514. % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  3515. % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;}
  3516. %
  3517. % \medskip
  3518. %
  3519. % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  3520. % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>}
  3521. % {\it filename} {\tt;}
  3522. %
  3523. % \medskip
  3524. %
  3525. % \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
  3526. % {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>}
  3527. % {\it filename} {\tt;}
  3528. % }}
  3529. %
  3530. % \medskip
  3531. %
  3532. % \noindent
  3533. % {\it domain} is an optional indexing expression, which specifies
  3534. % a subscript domain of the printf statement;
  3535. %
  3536. % \noindent
  3537. % {\it format} is a symbolic expression whose value specifies a format
  3538. % control string. (The colon preceding the format expression may be
  3539. % omitted.)
  3540. %
  3541. % \noindent
  3542. % {\it expression}, \dots, {\it expression} are zero or more expressions
  3543. % whose values have to be formatted and printed. Each expression should
  3544. % be of numeric, symbolic, or logical type.
  3545. %
  3546. % \noindent
  3547. % {\it filename} is a symbolic expression whose value specifies a name
  3548. % of a text file, to which the output is redirected. The flag {\tt>}
  3549. % means creating a new empty file while the flag {\tt>>} means appending
  3550. % the output to an existing file. If no file name is specified, the
  3551. % output is written on the standard output (terminal).
  3552. %
  3553. % \para{Examples}
  3554. %
  3555. % \begin{verbatim}
  3556. % printf 'Hello, world!\n';
  3557. % printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "result.txt";
  3558. % printf{i in I, j in J}: "flow from %s to %s is %d\n", i, j, x[i,j]
  3559. % >> result_file & ".txt";
  3560. % printf{i in I} 'total flow from %s is %g\n', i, sum{j in J} x[i,j];
  3561. % printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
  3562. % k, x[k];
  3563. % \end{verbatim}
  3564. %
  3565. % The printf statement is similar to the display statement, however, it
  3566. % allows formatting data to be written.
  3567. %
  3568. % If a subscript domain is not specified, the printf statement is
  3569. % executed only once. Specifying a subscript domain causes executing the
  3570. % printf statement for every $n$-tuple in the domain set. In the latter
  3571. % case the format and expression may include dummy indices introduced in
  3572. % corresponding indexing expression.
  3573. %
  3574. % The format control string is a value of the symbolic expression
  3575. % {\it format} specified in the printf statement. It is composed of zero
  3576. % or more directives as follows: ordinary characters (not {\tt\%}), which
  3577. % are copied unchanged to the output stream, and conversion
  3578. % specifications, each of which causes evaluating corresponding
  3579. % expression specified in the printf statement, formatting it, and
  3580. % writing its resultant value to the output stream.
  3581. %
  3582. % Conversion specifications that may be used in the format control string
  3583. % are the following:\linebreak {\tt d}, {\tt i}, {\tt f}, {\tt F},
  3584. % {\tt e}, {\tt E}, {\tt g}, {\tt G}, and {\tt s}. These specifications
  3585. % have the same syntax and semantics as in the C programming language.
  3586. \section{Sentença for}
  3587. \noindent
  3588. \framebox[468pt][l]{
  3589. \parbox[c][44pt]{468pt}{
  3590. \hspace{6pt} {\tt for} {\it domínio} {\tt:} {\it sentença} {\tt;}
  3591. \medskip
  3592. \hspace{6pt} {\tt for} {\it domínio} {\tt:} {\tt\{} {\it sentença}
  3593. \dots {\it sentença} {\tt\}} {\tt;}
  3594. }}
  3595. \medskip
  3596. \noindent
  3597. {\it domínio} é uma expressão indexante que especifica um
  3598. domínio do subíndice da sentença for. (Os dois pontos que seguem a
  3599. expressão indexante podem ser omitidos).
  3600. \noindent
  3601. {\it sentença} é uma sentença que deve ser executada sob o controle
  3602. da sentença for;
  3603. \noindent
  3604. {\it sentença}, \dots, {\it sentença} é uma sequência de sentenças
  3605. (cercada entre chaves) que deve ser executada sob o controle da
  3606. sentença for.
  3607. Apenas as sentenças seguintes podem ser usadas dentro da
  3608. sentença for: check, display, printf e outro for.
  3609. \para{Exemplos}
  3610. \begin{verbatim}
  3611. for {(i,j) in E: i != j}
  3612. { printf "fluxo de %s para %s eh %g\n", i, j, x[i,j];
  3613. check x[i,j] >= 0;
  3614. }
  3615. for {i in 1..n}
  3616. { for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
  3617. printf("\n");
  3618. }
  3619. for {1..72} printf("*");
  3620. \end{verbatim}
  3621. A sentença for faz com que a sentença, ou uma sequência de sentenças
  3622. especificadas como parte da sentença for, seja executada para cada
  3623. $n$-tupla no conjunto do domínio. Assim, sentenças dentro da sentença for
  3624. podem incluir índices introduzidos na expressão indexante correspondente.
  3625. % \noindent
  3626. % \framebox[468pt][l]{
  3627. % \parbox[c][44pt]{468pt}{
  3628. % \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;}
  3629. %
  3630. % \medskip
  3631. %
  3632. % \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement}
  3633. % \dots {\it statement} {\tt\}} {\tt;}
  3634. % }}
  3635. %
  3636. % \medskip
  3637. %
  3638. % \noindent
  3639. % {\it domain} is an indexing expression which specifies a subscript
  3640. % domain of the for statement. (The colon following the indexing
  3641. % expression may be omitted.)
  3642. %
  3643. % \noindent
  3644. % {\it statement} is a statement, which should be executed under control
  3645. % of the for statement;
  3646. %
  3647. % \noindent
  3648. % {\it statement}, \dots, {\it statement} is a sequence of statements
  3649. % (enclosed in curly braces), which should be executed under control of
  3650. % the for statement.
  3651. %
  3652. % Only the following statements can be used within the for statement:
  3653. % check, display, printf, and another for.
  3654. %
  3655. % \para{Examples}
  3656. %
  3657. % \begin{verbatim}
  3658. % for {(i,j) in E: i != j}
  3659. % { printf "flow from %s to %s is %g\n", i, j, x[i,j];
  3660. % check x[i,j] >= 0;
  3661. % }
  3662. % for {i in 1..n}
  3663. % { for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
  3664. % printf("\n");
  3665. % }
  3666. % for {1..72} printf("*");
  3667. % \end{verbatim}
  3668. %
  3669. % The for statement causes a statement or a sequence of statements
  3670. % specified as part of the for statement to be executed for every
  3671. % $n$-tuple in the domain set. Thus, statements within the for statement
  3672. % may include dummy indices introduced in corresponding indexing
  3673. % expression.
  3674. \newpage
  3675. \section{Sentença table}
  3676. \noindent
  3677. \framebox[468pt][l]{
  3678. \parbox[c][80pt]{468pt}{
  3679. \hspace{6pt} {\tt table} {\it nome} {\it alias} {\tt IN} {\it controlador}
  3680. {\it arg} \dots {\it arg} {\tt:}
  3681. \hspace{6pt} {\tt\ \ \ \ \ } {\it conjunto} {\tt<-} {\tt[} {\it cmp} {\tt,}
  3682. \dots {\tt,} {\it cmp} {\tt]} {\tt,} {\it par} {\tt\textasciitilde}
  3683. {\it cmp} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it cmp}
  3684. {\tt;}
  3685. \medskip
  3686. \hspace{6pt} {\tt table} {\it nome} {\it alias} {\it domínio} {\tt OUT}
  3687. {\it controlador} {\it arg} \dots {\it arg} {\tt:}
  3688. \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it cmp}
  3689. {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it cmp} {\tt;}
  3690. }}
  3691. \medskip
  3692. \noindent
  3693. {\it nome} é um nome simbólico da tabela;
  3694. \noindent
  3695. {\it alias} é um literal de cadeia opcional que especifica um pseudônimo
  3696. da tabela;
  3697. \noindent
  3698. {\it domínio} é uma expressão indexante que especifica o domínio do
  3699. subíndice da tabela (de saída);
  3700. \noindent
  3701. {\tt IN} significa ler dados de uma tabela de entrada;
  3702. \noindent
  3703. {\tt OUT} significa escrever dados em uma tabela de saída;
  3704. \noindent
  3705. {\it controlador} é uma expressão simbólica que especifica o controlador
  3706. usado para acessar a tabela (para mais detalhes, ver Apêndice \ref{drivers},
  3707. página \pageref{drivers});
  3708. \noindent
  3709. {\it arg} é uma expressão simbólica opcional, que é um argumento
  3710. passado ao controlador da tabela. Esta expressão simbólica não deveria
  3711. incluir índices especificados no domínio;
  3712. \noindent
  3713. {\it conjunto} é o nome de um conjunto simples opcional chamado
  3714. {\it conjunto de controle}. Pode ser omitido junto com o delimitador {\tt<-};
  3715. \noindent
  3716. {\it cmp} é um nome de campo. Entre colchetes, pelo menos um campo deve ser
  3717. especificado. O nome do campo, que segue o nome do parâmetro ou de uma
  3718. expressão, é opcional e pode ser omitido juntamente com o
  3719. delimitador~{\tt\textasciitilde}. Neste caso o nome do objeto de modelo
  3720. correspondente é usado como nome de campo;
  3721. \noindent
  3722. {\it par} é um nome simbólico de um parâmetro do modelo;
  3723. \noindent
  3724. {\it expr} é uma expressão numérica ou simbólica.
  3725. \para{Exemplos}
  3726. \begin{verbatim}
  3727. table dados IN "CSV" "dados.csv": S <- [DE,PARA], d~DISTANCIA,
  3728. c~CUSTO;
  3729. table resultado{(d,p) in S} OUT "CSV" "resultado.csv": d~DE, p~PARA,
  3730. x[d,p]~FLUXO;
  3731. \end{verbatim}
  3732. A sentença table permite a leitura de dados de uma tabela para objetos
  3733. de modelo como conjuntos e parâmetros (não-escalares) assim como escrever
  3734. dados do modelo para uma tabela.
  3735. % \noindent
  3736. % \framebox[468pt][l]{
  3737. % \parbox[c][80pt]{468pt}{
  3738. % \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver}
  3739. % {\it arg} \dots {\it arg} {\tt:}
  3740. %
  3741. % \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,}
  3742. % \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde}
  3743. % {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld}
  3744. % {\tt;}
  3745. %
  3746. % \medskip
  3747. %
  3748. % \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT}
  3749. % {\it driver} {\it arg} \dots {\it arg} {\tt:}
  3750. %
  3751. % \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld}
  3752. % {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;}
  3753. % }}
  3754. %
  3755. % \medskip
  3756. %
  3757. % \noindent
  3758. % {\it name} is a symbolic name of the table;
  3759. %
  3760. % \noindent
  3761. % {\it alias} is an optional string literal, which specifies an alias of
  3762. % the table;
  3763. %
  3764. % \noindent
  3765. % {\it domain} is an indexing expression, which specifies a subscript
  3766. % domain of the (output) table;
  3767. %
  3768. % \noindent
  3769. % {\tt IN} means reading data from the input table;
  3770. %
  3771. % \noindent
  3772. % {\tt OUT} means writing data to the output table;
  3773. %
  3774. % \noindent
  3775. % {\it driver} is a symbolic expression, which specifies the driver used
  3776. % to access the table (for details see Appendix \ref{drivers}, page
  3777. % \pageref{drivers});
  3778. %
  3779. % \noindent
  3780. % {\it arg} is an optional symbolic expression, which is an argument
  3781. % pass\-ed to the table driver. This symbolic expression should not
  3782. % include dummy indices specified in the domain;
  3783. %
  3784. % \noindent
  3785. % {\it set} is the name of an optional simple set called {\it control
  3786. % set}. It can be omitted along with the delimiter {\tt<-};
  3787. %
  3788. % \noindent
  3789. % {\it fld} is a field name. Within square brackets at least one field
  3790. % should be specified. The field name following a parameter name or
  3791. % expression is optional and can be omitted along with the
  3792. % delimiter~{\tt\textasciitilde}, in which case the name of corresponding
  3793. % model object is used as the field name;
  3794. %
  3795. % \noindent
  3796. % {\it par} is a symbolic name of a model parameter;
  3797. %
  3798. % \noindent
  3799. % {\it expr} is a numeric or symbolic expression.
  3800. %
  3801. % \para{Examples}
  3802. %
  3803. % \begin{verbatim}
  3804. % table data IN "CSV" "data.csv": S <- [FROM,TO], d~DISTANCE,
  3805. % c~COST;
  3806. % table result{(f,t) in S} OUT "CSV" "result.csv": f~FROM, t~TO,
  3807. % x[f,t]~FLOW;
  3808. % \end{verbatim}
  3809. %
  3810. % The table statement allows reading data from a table into model
  3811. % objects such as sets and (non-scalar) parameters as well as writing
  3812. % data from the model to a table.
  3813. \newpage
  3814. \subsection{Estrutura de tabelas}
  3815. Uma {\it tabela de dados} é um conjunto (desordenado) de {\it registros}, onde cada
  3816. registro consiste do mesmo número de {\it campos} e cada campo possui um único
  3817. nome simbólico denominado o {\it nome do campo}. Por exemplo:
  3818. \bigskip
  3819. \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c
  3820. @{\hspace*{9mm}}c}
  3821. Primeiro&Segundo&&Último\\
  3822. campo&campo&.\ \ .\ \ .&campo\\
  3823. $\downarrow$&$\downarrow$&&$\downarrow$\\
  3824. \end{tabular}
  3825. \begin{tabular}{ll@{}}
  3826. Cabeçalho da tabela&$\rightarrow$\\
  3827. Primeiro registro&$\rightarrow$\\
  3828. Segundo registro&$\rightarrow$\\
  3829. \\
  3830. \hfil .\ \ .\ \ .\\
  3831. \\
  3832. Último registro&$\rightarrow$\\
  3833. \end{tabular}
  3834. \begin{tabular}{|l|l|c|c|}
  3835. \hline
  3836. {\tt DE}&{\tt PARA}&{\tt DISTANCIA}&{\tt CUSTO}\\
  3837. \hline
  3838. {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\
  3839. {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\
  3840. {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\
  3841. {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\
  3842. {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\
  3843. {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\
  3844. \hline
  3845. \end{tabular}
  3846. % A {\it data table} is an (unordered) set of {\it records}, where each
  3847. % record consists of the same number of {\it fields}, and each field is
  3848. % provided with a unique symbolic name called the {\it field name}. For
  3849. % example:
  3850. %
  3851. % \bigskip
  3852. %
  3853. % \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c
  3854. % @{\hspace*{9mm}}c}
  3855. % First&Second&&Last\\
  3856. % field&field&.\ \ .\ \ .&field\\
  3857. % $\downarrow$&$\downarrow$&&$\downarrow$\\
  3858. % \end{tabular}
  3859. %
  3860. % \begin{tabular}{ll@{}}
  3861. % Table header&$\rightarrow$\\
  3862. % First record&$\rightarrow$\\
  3863. % Second record&$\rightarrow$\\
  3864. % \\
  3865. % \hfil .\ \ .\ \ .\\
  3866. % \\
  3867. % Last record&$\rightarrow$\\
  3868. % \end{tabular}
  3869. % \begin{tabular}{|l|l|c|c|}
  3870. % \hline
  3871. % {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\
  3872. % \hline
  3873. % {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\
  3874. % {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\
  3875. % {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\
  3876. % {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\
  3877. % {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\
  3878. % {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\
  3879. % \hline
  3880. % \end{tabular}
  3881. \subsection{Lendo dados de uma tabela de entrada}
  3882. A sentença tabela de entrada faz a leitura de dados
  3883. da tabela especificada, registro por registro.
  3884. Uma vez que o registro subsequente foi lido, valores numéricos ou simbólicos
  3885. dos campos, cujos nomes são cercados entre colchetes na sentença table,
  3886. são reunidos em um $n$-tuplo. Se o conjunto de controle é especificado
  3887. na sentença table, este $n$-tuplo é adicionado a ele. Além disso, um valor
  3888. numérico ou simbólico de cada campo associado com um parâmetro do modelo
  3889. é atribuído ao membro do parâmetro identificado por subíndices, que são
  3890. componentes da $n$-tupla que acabou de ser lida.
  3891. Por exemplo, a seguinte sentença de tabela de entrada:
  3892. \noindent\hfil
  3893. \verb|table dados IN "...": S <- [DE,PARA], d~DISTANCIA, c~CUSTO;|
  3894. \noindent
  3895. faz a leitura de valores de quatro campos chamados {\tt DE}, {\tt PARA},
  3896. {\tt DISTANCIA} e {\tt CUSTO} de cada registro da tabela especificada.
  3897. Os valores dos campos {\tt DE} e {\tt PARA} dão um par $(f,t)$, que é
  3898. adicionado ao conjunto de controle {\tt S}. O valor do campo {\tt DISTANCIA} é
  3899. atribuído ao membro do parâmetro ${\tt d}[f,t]$ enquanto que o valor do campo
  3900. {\tt CUSTO} é atribuído ao membro do parâmetro ${\tt c}[f,t]$.
  3901. Note que a tabela de entrada pode conter campos adicionais cujos nomes
  3902. não sejam especificados na sentença tabela, neste caso, os valores destes
  3903. campos serão ignorados na leitura da tabela.
  3904. % The input table statement causes reading data from the specified table
  3905. % record by record.
  3906. %
  3907. % Once a next record has been read, numeric or symbolic values of fields,
  3908. % whose names are enclosed in square brackets in the table statement, are
  3909. % gathered into $n$-tuple, and if the control set is specified in the
  3910. % table statement, this $n$-tuple is added to it. Besides, a numeric or
  3911. % symbolic value of each field associated with a model parameter is
  3912. % assigned to the parameter member identified by subscripts, which are
  3913. % components of the $n$-tuple just read.
  3914. %
  3915. % For example, the following input table statement:
  3916. %
  3917. % \noindent\hfil
  3918. % \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;|
  3919. %
  3920. % \noindent
  3921. % causes reading values of four fields named {\tt FROM}, {\tt TO},
  3922. % {\tt DISTANCE}, and {\tt COST} from each record of the specified table.
  3923. % Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is
  3924. % added to the control set {\tt S}. The value of field {\tt DISTANCE} is
  3925. % assigned to parameter member ${\tt d}[f,t]$, and the value of field
  3926. % {\tt COST} is assigned to parameter member ${\tt c}[f,t]$.
  3927. %
  3928. % Note that the input table may contain extra fields whose names are not
  3929. % specified in the table statement, in which case values of these fields
  3930. % on reading the table are ignored.
  3931. \subsection{Escrevendo dados em uma tabela de saída}
  3932. A sentença tabela de saída gera a escrita de dados na tabela especificada.
  3933. Note que alguns controladores (chamados CSV e xBASE) destroem a tabela de saída
  3934. antes de escrever os dados, i.e., deletam todos os registros existentes.
  3935. Cada $n$-tupla no domínio do conjunto especificado gera um registro escrito na
  3936. tabela de saída. Os valores dos campos são valores numéricos ou simbólicos
  3937. das expressões correspondentes especificadas na sentença table. Estas
  3938. expressões são avaliadas para cada $n$-tupla no conjunto do domínio,
  3939. portanto, podem incluir índices introduzidos na expressão indexante correspondente.
  3940. Por exemplo, a seguinte sentença da tabela de saída:
  3941. \noindent\hfil
  3942. \verb|table resultado{(f,t) in S} OUT "...": f~DE, t~PARA, x[f,t]~FLUXO;|
  3943. \noindent
  3944. gera a escrita de registros; um registro para cada par $(f,t)$ no conjunto
  3945. {\tt S} para a tabela de saída, onde cada registro consiste de três campos
  3946. chamados {\tt DE}, {\tt PARA} e {\tt FLUXO}. Os valores escritos nos campos
  3947. {\tt DE} e {\tt PARA} são os valores correntes dos índices {\tt f} e {\tt t}.
  3948. O valor escrito no campo {\tt FLUXO} é um valor do membro ${\tt x}[f,t]$
  3949. do correspondente parâmetro ou variável indexada.
  3950. % The output table statement causes writing data to the specified table.
  3951. % Note that some drivers (namely, CSV and xBASE) destroy the output table
  3952. % before writing data, i.e. delete all its existing records.
  3953. %
  3954. % Each $n$-tuple in the specified domain set generates one record written
  3955. % to the output table. Values of fields are numeric or symbolic values of
  3956. % corresponding expressions specified in the table statement. These
  3957. % expressions are evaluated for each $n$-tuple in the domain set and,
  3958. % thus, may include dummy indices introduced in the corresponding indexing
  3959. % expression.
  3960. %
  3961. % For example, the following output table statement:
  3962. %
  3963. % \noindent\hfil
  3964. % \verb|table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;|
  3965. %
  3966. % \noindent
  3967. % causes writing records, by one record for each pair $(f,t)$ in set
  3968. % {\tt S}, to the output table, where each record consists of three
  3969. % fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written
  3970. % to fields {\tt FROM} and {\tt TO} are current values of dummy indices
  3971. % {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is
  3972. % a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter
  3973. % or variable.
  3974. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3975. \chapter{Dados do modelo}
  3976. Os {\it dados do modelo} includem conjuntos elementares, que são ``valores'' dos
  3977. conjuntos do modelo, e valores numéricos e simbólicos dos parâmetros do modelo.
  3978. Em MathProg existem duas formas diferentes de fornecer valores aos conjuntos
  3979. e parâmetros do modelo. Uma forma é simplesmente prover os dados necessários
  3980. usando o atributo de atribuição. No entanto, em muitos casos é mais prático separar
  3981. o modelo próprio dos dados particulares necessários para o modelo. Para o último
  3982. caso, em MathProg há uma outra forma, em que a descrição do modelo é dividida
  3983. em duas partes: a seção de modelo e a seção de dados.
  3984. A {\it seção de modelo} é a principal parte da descrição do modelo. Ela contém
  3985. todas as declarações de todos objetos do modelo, sendo comum a todos problemas
  3986. baseados naquele modelo.
  3987. A {\it seção de dados} é uma parte opcional da descrição do modelo que contém
  3988. dados específicos para um problema particular.
  3989. Em MathProg seções de modelo e de dados podem ser localizadas tanto em um arquivo
  3990. de texto ou em dois arquivos de texto separados.
  3991. 1. Se ambas seções de modelo e de dados estão localizados em um arquivo,
  3992. o arquivo é composto como segue:
  3993. \bigskip
  3994. \noindent\hfil
  3995. \framebox{\begin{tabular}{l}
  3996. {\it sentença}{\tt;}\\
  3997. {\it sentença}{\tt;}\\
  3998. \hfil.\ \ .\ \ .\\
  3999. {\it sentença}{\tt;}\\
  4000. {\tt data;}\\
  4001. {\it bloco de dados}{\tt;}\\
  4002. {\it bloco de dados}{\tt;}\\
  4003. \hfil.\ \ .\ \ .\\
  4004. {\it bloco de dados}{\tt;}\\
  4005. {\tt end;}
  4006. \end{tabular}}
  4007. % {\it Model data} include elemental sets, which are ``values'' of model
  4008. % sets, and numeric and symbolic values of model parameters.
  4009. %
  4010. % In MathProg there are two different ways to saturate model sets and
  4011. % parameters with data. One way is simply providing necessary data using
  4012. % the assign attribute. However, in many cases it is more practical to
  4013. % separate the model itself and particular data needed for the model. For
  4014. % the latter reason in MathProg there is another way, when the model
  4015. % description is divided into two parts: model section and data section.
  4016. %
  4017. % A {\it model section} is a main part of the model description that
  4018. % contains declarations of all model objects and is common for all
  4019. % problems based on that model.
  4020. %
  4021. % A {\it data section} is an optional part of the model description that
  4022. % contains model data specific for a particular problem.
  4023. %
  4024. % In MathProg model and data sections can be placed either in one text
  4025. % file or in two separate text files.
  4026. %
  4027. % 1. If both model and data sections are placed in one file, the file is
  4028. % composed as follows:
  4029. %
  4030. % \bigskip
  4031. %
  4032. % \noindent\hfil
  4033. % \framebox{\begin{tabular}{l}
  4034. % {\it statement}{\tt;}\\
  4035. % {\it statement}{\tt;}\\
  4036. % \hfil.\ \ .\ \ .\\
  4037. % {\it statement}{\tt;}\\
  4038. % {\tt data;}\\
  4039. % {\it data block}{\tt;}\\
  4040. % {\it data block}{\tt;}\\
  4041. % \hfil.\ \ .\ \ .\\
  4042. % {\it data block}{\tt;}\\
  4043. % {\tt end;}
  4044. % \end{tabular}}
  4045. % 2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os
  4046. % arquivos são compostos como segue:
  4047. \newpage
  4048. 2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os
  4049. arquivos são compostos como segue:
  4050. \bigskip
  4051. \noindent\hfil
  4052. \begin{tabular}{@{}c@{}}
  4053. \framebox{\begin{tabular}{l}
  4054. {\it sentença}{\tt;}\\
  4055. {\it sentença}{\tt;}\\
  4056. \hfil.\ \ .\ \ .\\
  4057. {\it sentença}{\tt;}\\
  4058. {\tt end;}\\
  4059. \end{tabular}}\\
  4060. \\\\Arquivo de modelo\\
  4061. \end{tabular}
  4062. \hspace{32pt}
  4063. \begin{tabular}{@{}c@{}}
  4064. \framebox{\begin{tabular}{l}
  4065. {\tt data;}\\
  4066. {\it bloco de dados}{\tt;}\\
  4067. {\it bloco de dados}{\tt;}\\
  4068. \hfil.\ \ .\ \ .\\
  4069. {\it bloco de dados}{\tt;}\\
  4070. {\tt end;}\\
  4071. \end{tabular}}\\
  4072. \\Arquivo de dados\\
  4073. \end{tabular}
  4074. \bigskip
  4075. Nota: Se a seção de dados é posicionada em um arquivo separado, a palavra-chave
  4076. {\tt data} é opcional e pode ser omitida juntamente como o ponto e vírgula que a segue.
  4077. % \bigskip
  4078. %
  4079. % \noindent\hfil
  4080. % \begin{tabular}{@{}c@{}}
  4081. % \framebox{\begin{tabular}{l}
  4082. % {\it statement}{\tt;}\\
  4083. % {\it statement}{\tt;}\\
  4084. % \hfil.\ \ .\ \ .\\
  4085. % {\it statement}{\tt;}\\
  4086. % {\tt end;}\\
  4087. % \end{tabular}}\\
  4088. % \\\\Model file\\
  4089. % \end{tabular}
  4090. % \hspace{32pt}
  4091. % \begin{tabular}{@{}c@{}}
  4092. % \framebox{\begin{tabular}{l}
  4093. % {\tt data;}\\
  4094. % {\it data block}{\tt;}\\
  4095. % {\it data block}{\tt;}\\
  4096. % \hfil.\ \ .\ \ .\\
  4097. % {\it data block}{\tt;}\\
  4098. % {\tt end;}\\
  4099. % \end{tabular}}\\
  4100. % \\Data file\\
  4101. % \end{tabular}
  4102. %
  4103. % \bigskip
  4104. %
  4105. % Note: If the data section is placed in a separate file, the keyword
  4106. % {\tt data} is optional and may be omitted along with the semicolon that
  4107. % follows it.
  4108. \section{Programando a seção de dados}
  4109. A {\it seção de dados} é uma sequência de blocos de dados em vários formatos
  4110. e são discutidos nas seções seguintes. A ordem na qual os blocos de dados
  4111. seguem na seção de dados pode ser arbitrária, portanto, não precisa ser
  4112. necessariamente a mesma ordem que seguem os elementos correspondentes
  4113. da seção de modelo.
  4114. As regras para programar a seção de dados são comumente as mesmas que as regras
  4115. de \linebreak programar a descrição do modelo (ver Seção \ref{coding}, página
  4116. \pageref{coding}), i.e., blocos de dados são compostos com unidades léxicas
  4117. básicas, como nomes simbólicos, literais numéricos e de cadeia,
  4118. palavras-chave, \linebreak delimitadores e comentários. No entanto, por conveniência
  4119. e para melhorar legibilidade, há um desvio da regra comum: se um literal
  4120. de cadeia consiste unicamente de caracteres alfanuméricos (incluindo
  4121. o caractere sublinhado), os sinais {\tt+} e {\tt-} e/ou o ponto decimal,
  4122. ele pode ser programado sem aspas limitadoras (simples ou duplas).
  4123. Todo material numérico e simbólico provido na seção de dados é programado
  4124. na forma de números e símbolos, i.e., diferentemente da seção de modelo,
  4125. não são permitidas expressões na seção de dados. Apesar disso, os sinais
  4126. {\tt+} e {\tt-} podem preceder literais numéricos para permitir a programação
  4127. de quantidades numéricas com sinais. Neste caso não deve haver caractere de
  4128. espaço em branco entre o sinal e o literal numérico seguinte (se houver
  4129. pelo menos uma espaço em branco, o sinal e o literal numérico seguinte são
  4130. reconhecidos como duas unidades léxicas diferentes).
  4131. % The {\it data section} is a sequence of data blocks in various formats,
  4132. % which are discussed in following sections. The order, in which data
  4133. % blocks follow in the data section, may be arbitrary, not necessarily
  4134. % the same, in which corresponding model objects follow in the model
  4135. % section.
  4136. %
  4137. % The rules of coding the data section are commonly the same as the rules
  4138. % of coding the model description (see Section \ref{coding}, page
  4139. % \pageref{coding}), i.e. data blocks are composed from basic lexical
  4140. % units such as symbolic names, numeric and string literals, keywords,
  4141. % delimiters, and comments. However, for the sake of convenience and for
  4142. % improving readability there is one deviation from the common rule: if
  4143. % a string literal consists of only alphanumeric characters (including
  4144. % the underscore character), the signs {\tt+} and {\tt-}, and/or the
  4145. % decimal point, it may be coded without bordering by (single or double)
  4146. % quotes.
  4147. %
  4148. % All numeric and symbolic material provided in the data section is coded
  4149. % in the form of numbers and symbols, i.e. unlike the model section
  4150. % no expressions are allowed in the data section. Nevertheless, the signs
  4151. % {\tt+} and {\tt-} can precede numeric literals to allow coding signed
  4152. % numeric quantities, in which case there should be no white-space
  4153. % characters between the sign and following numeric literal (if there is
  4154. % at least one white-space, the sign and following numeric literal are
  4155. % recognized as two different lexical units).
  4156. \newpage
  4157. \section{Bloco de dados set}
  4158. \noindent
  4159. \framebox[468pt][l]{
  4160. \parbox[c][44pt]{468pt}{
  4161. \hspace{6pt} {\tt set} {\it nome} {\tt,} {\it registro} {\tt,} \dots
  4162. {\tt,} {\it registro} {\tt;}
  4163. \medskip
  4164. \hspace{6pt} {\tt set} {\it nome} {\tt[} {\it símbolo} {\tt,} \dots
  4165. {\tt,} {\it símbolo} {\tt]} {\tt,} {\it registro} {\tt,} \dots {\tt,}
  4166. {\it registro} {\tt;}
  4167. }}
  4168. \medskip
  4169. \noindent
  4170. {\it nome} é um nome simbólico do conjunto;
  4171. \noindent
  4172. {\it símbolo}, \dots, {\it símbolo} são subíndices que especificam
  4173. um membro particular do conjunto \linebreak(se o conjunto é uma matriz, i.e.,
  4174. um conjunto de conjuntos);
  4175. \noindent
  4176. {\it registro}, \dots, {\it registro} são registros.
  4177. \noindent
  4178. As vírgulas que precedem os registros podem ser omitidas.
  4179. \para{Registros}
  4180. \vspace*{-8pt}
  4181. \begin{description}
  4182. \item[{\tt :=}]\hspace*{0pt}\\
  4183. é um elemento de atribuição de registro não-significativo que pode ser usado
  4184. livremente para melhorar a legibilidade;
  4185. \item[{\tt(} {\it fatia} {\tt)}]\hspace*{0pt}\\
  4186. especifica uma fatia;
  4187. \item[{\it dados-simples}]\hspace*{0pt}\\
  4188. especifica os dados do conjunto em formato simples;
  4189. \item[{\tt:} {\it dados matriciais}]\hspace*{0pt}\\
  4190. especifica os dados do conjunto em formato de matriz;
  4191. \item[{\tt(tr)} {\tt:} {\it dados matriciais}]\hspace*{0pt}\\
  4192. especifica os dados do conjunto em formato de matriz transposta.
  4193. (Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos).
  4194. \end{description}
  4195. \vspace*{-8pt}
  4196. \para{Exemplos}
  4197. \begin{verbatim}
  4198. set mes := Jan Fev Mar Abr Mai Jun;
  4199. set mes "Jan", "Fev", "Mar", "Abr", "Mai", "Jun";
  4200. set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
  4201. set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4;
  4202. set A[3,'Mar'] : 1 2 3 4 :=
  4203. 1 - + - -
  4204. 2 - + + -
  4205. 3 + - - +
  4206. 4 - + - + ;
  4207. set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
  4208. set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
  4209. set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
  4210. set B := (1,*,*) : 1 2 3 :=
  4211. 1 + - -
  4212. 2 - + +
  4213. 3 - + -
  4214. (2,*,*) : 1 2 3 :=
  4215. 1 + - +
  4216. 2 - - -
  4217. 3 + - - ;
  4218. \end{verbatim}
  4219. \noindent(Nestes exemplos {\tt mes} é um conjunto simples de singletos,
  4220. {\tt A} é uma matriz 2-dimensional de duplas e {\tt B} é um conjunto
  4221. simples de triplas. Os blocos de dados para o mesmo conjunto são equivalentes
  4222. no sentido que especificam os mesmos dados em formatos distintos.)
  4223. O {\it bloco de dados do conjunto} é usado para especificar um conjunto elementar
  4224. completo que é atribuído a um conjunto (se é um conjunto simples) ou a um de
  4225. seus membros (se o conjunto é uma matriz de conjuntos).\footnote{Há uma outra forma
  4226. de especificar dados para um conjunto simples com dados para os parâmetros.
  4227. Esta questão é discutida na próxima seção.}
  4228. Blocos de dados podem ser especificados somente para conjuntos não-calculáveis,
  4229. i.e., para \linebreak conjuntos que possuem o atributo de atribuição ({\tt:=})
  4230. na sentença set correspondente.
  4231. Se o conjunto é um conjunto simples, somente seus nomes simbólicos devem ser
  4232. especificados no cabeçalho do bloco de dados. Caso contrário, se o conjunto
  4233. é uma matriz $n$-dimensional, seus nomes simbólicos devem ser fornecidos com
  4234. uma lista completa de subíndices separados por vírgulas e cercados em colchetes
  4235. para especificar um membro particular da matriz de conjuntos. O número de
  4236. subíndices deve ser igual ao da dimensão da matriz de conjuntos, onde
  4237. cada subíndice deve ser um número ou um símbolo.
  4238. Um conjunto elementar definido no bloco de dados é programado como uma sequência
  4239. de \linebreak registros descritos abaixo.\footnote{{\it Registro} é simplesmente
  4240. um termo técnico. Não significa que os mesmos possuem qualquer formato
  4241. especial.}
  4242. % \noindent
  4243. % \framebox[468pt][l]{
  4244. % \parbox[c][44pt]{468pt}{
  4245. % \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots
  4246. % {\tt,} {\it record} {\tt;}
  4247. %
  4248. % \medskip
  4249. %
  4250. % \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots
  4251. % {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,}
  4252. % {\it record} {\tt;}
  4253. % }}
  4254. %
  4255. % \medskip
  4256. %
  4257. % \noindent
  4258. % {\it name} is a symbolic name of the set;
  4259. %
  4260. % \noindent
  4261. % {\it symbol}, \dots, {\it symbol} are subscripts, which specify
  4262. % a particular member of the set (if the set is an array, i.e. a set of
  4263. % sets);
  4264. %
  4265. % \noindent
  4266. % {\it record}, \dots, {\it record} are data records.
  4267. %
  4268. % \noindent
  4269. % Commae preceding data records may be omitted.
  4270. %
  4271. % \para{Data records}
  4272. %
  4273. % \vspace*{-8pt}
  4274. %
  4275. % \begin{description}
  4276. % \item[{\tt :=}]\hspace*{0pt}\\
  4277. % is a non-significant data record, which may be used freely to improve
  4278. % readability;
  4279. % \item[{\tt(} {\it slice} {\tt)}]\hspace*{0pt}\\
  4280. % specifies a slice;
  4281. % \item[{\it simple-data}]\hspace*{0pt}\\
  4282. % specifies set data in the simple format;
  4283. % \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\
  4284. % specifies set data in the matrix format;
  4285. % \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\
  4286. % specifies set data in the transposed matrix format. (In this case the
  4287. % colon following the keyword {\tt(tr)} may be omitted.)
  4288. % \end{description}
  4289. %
  4290. % \vspace*{-8pt}
  4291. %
  4292. % \para{Examples}
  4293. %
  4294. % \begin{verbatim}
  4295. % set month := Jan Feb Mar Apr May Jun;
  4296. % set month "Jan", "Feb", "Mar", "Apr", "May", "Jun";
  4297. % set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
  4298. % set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4;
  4299. % set A[3,'Mar'] : 1 2 3 4 :=
  4300. % 1 - + - -
  4301. % 2 - + + -
  4302. % 3 + - - +
  4303. % 4 - + - + ;
  4304. % set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
  4305. % set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
  4306. % set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
  4307. % set B := (1,*,*) : 1 2 3 :=
  4308. % 1 + - -
  4309. % 2 - + +
  4310. % 3 - + -
  4311. % (2,*,*) : 1 2 3 :=
  4312. % 1 + - +
  4313. % 2 - - -
  4314. % 3 + - - ;
  4315. % \end{verbatim}
  4316. %
  4317. % \noindent(In these examples {\tt month} is a simple set of singlets,
  4318. % {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple
  4319. % set of triplets. Data blocks for the same set are equivalent in the
  4320. % sense that they specify the same data in different formats.)
  4321. %
  4322. % The {\it set data block} is used to specify a complete elemental set,
  4323. % which is assigned to a set (if it is a simple set) or one of its
  4324. % members (if the set is an array of sets).\footnote{There is another way
  4325. % to specify data for a simple set along with data for parameters. This
  4326. % feature is discussed in the next section.}
  4327. %
  4328. % Data blocks can be specified only for non-computable sets, i.e. for
  4329. % sets, which have no assign attribute ({\tt:=}) in the corresponding set
  4330. % statements.
  4331. %
  4332. % If the set is a simple set, only its symbolic name should be specified
  4333. % in the header of the data block. Otherwise, if the set is a
  4334. % $n$-dimensional array, its symbolic name should be provided with a
  4335. % complete list of subscripts separated by commae and enclosed in square
  4336. % brackets to specify a particular member of the set array. The number of
  4337. % subscripts should be the same as the dimension of the set array, where
  4338. % each subscript should be a number or symbol.
  4339. %
  4340. % An elemental set defined in the set data block is coded as a sequence
  4341. % of data records described below.\footnote{{\it Data record} is simply a
  4342. % technical term. It does not mean that data records have any special
  4343. % formatting.}
  4344. \subsection{Registro de atribuição de dados}
  4345. O {\it registro de atribuição de dados} ({\tt:=}) é um elemento não-significante.
  4346. Ele pode ser usado para melhorar a legibilidade de blocos de dados.
  4347. % The {\it assign data record} ({\tt:=}) is a non-signficant element.
  4348. % It may be used for improving readability of data blocks.
  4349. \subsection{Registro em fatia de dados}
  4350. O {\it registro em fatia de dados} é um registro de controle que especifica
  4351. uma {\it fatia} do conjunto elementar definido no bloco de dados. Ele possui
  4352. a seguinte forma sintática:
  4353. $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$
  4354. onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia.
  4355. Cada componente da fatia pode ser um número, símbolo ou asterisco
  4356. ({\tt*}). O número de \linebreak componentes na fatia deve ser o mesmo da
  4357. dimensão $n$-tuplas do conjunto elementar a ser definido. Por exemplo,
  4358. se o conjunto elementar contém 4-tuplas (quádruplas), a fatia deve ter
  4359. quatro \linebreak componentes. O número de asteriscos na fatia denomina a
  4360. {\it dimensão da fatia}.
  4361. O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional
  4362. (i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados,
  4363. todos registros subsequentes devem especificar tuplas de dimensão~$m$.
  4364. Sempre que uma $m$-tupla é encontrada, cada asterisco da fatia é substituído
  4365. pelos componentes correspondentes da $m$-tupla, o que resulta na
  4366. $n$-tupla, que é incluída no conjunto \linebreak elementar a ser definido.
  4367. Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e a dupla
  4368. $(3,b)$ é encontrada no registro subsequente, a 5-tupla resultante a ser incluída
  4369. no conjunto elementar é $(a,3,1,2,b)$.
  4370. Se a fatia não possui asteriscos, ela própria define uma $n$-tupla completa
  4371. que é incluída no conjunto elementar.
  4372. Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova
  4373. fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia
  4374. não é especificada no bloco de dados, assume-se uma cujos componentes são
  4375. asteriscos em todas as posições.
  4376. % The {\it slice data record} is a control record, which specifies a
  4377. % {\it slice} of the elemental set defined in the data block. It has the
  4378. % following syntactic form:
  4379. % $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$
  4380. % where $s_1$, $s_2$, \dots, $s_n$ are components of the slice.
  4381. %
  4382. % Each component of the slice can be a number or symbol or the asterisk
  4383. % ({\tt*}). The number of components in the slice should be the same as
  4384. % the dimension of $n$-tuples in the elemental set to be defined. For
  4385. % instance, if the elemental set contains 4-tuples (quadruplets), the
  4386. % slice should have four components. The number of asterisks in the slice
  4387. % is called the {\it slice dimension}.
  4388. %
  4389. % The effect of using slices is the following. If a $m$-dimensional slice
  4390. % (i.e. a slice having $m$ asterisks) is specified in the data block, all
  4391. % subsequent data records should specify tuples of the dimension~$m$.
  4392. % Whenever a $m$-tuple is encountered, each asterisk in the slice is
  4393. % replaced by corresponding components of the $m$-tuple that gives the
  4394. % resultant $n$-tuple, which is included in the elemental set to be
  4395. % defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and
  4396. % 2-tuple $(3,b)$ is encountered in a subsequent data record, the
  4397. % resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$.
  4398. %
  4399. % The slice having no asterisks itself defines a complete $n$-tuple,
  4400. % which is included in the elemental set.
  4401. %
  4402. % Being once specified the slice effects until either a new slice or the
  4403. % end of data block is encountered. Note that if no slice is specified in
  4404. % the data block, one, components of which are all asterisks, is assumed.
  4405. \subsection{Registro simples}
  4406. O {\it registro simples} define uma $n$-tupla em um formato simples
  4407. e possui a seguinte forma sintática:
  4408. $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$
  4409. onde $t_1$, $t_2$, \dots, $t_n$ são componentes da $n$-tupla. Cada
  4410. componente pode ser um número ou um símbolo. As vírgulas entre os componentes
  4411. são opcionais e podem ser omitidas.
  4412. % The {\it simple data record} defines one $n$-tuple in a simple format
  4413. % and has the following syntactic form:
  4414. % $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$
  4415. % where $t_1$, $t_2$, \dots, $t_n$ are components of the $n$-tuple. Each
  4416. % component can be a number or symbol. Commae between components are
  4417. % optional and may be omitted.
  4418. \subsection{Registro de matriz}
  4419. O {\it registro de matriz} define diversas 2-tuplas (duplas) em
  4420. um formato matricial e possui a seguinte forma sintática:
  4421. $$\begin{array}{cccccc}
  4422. \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4423. r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4424. r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4425. \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4426. r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4427. \end{array}$$
  4428. onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos
  4429. que correspondem a linhas da matriz; $c_1$, $c_2$, \dots, $c_n$ são
  4430. números e/ou símbolos que correspondem a colunas da matriz, $a_{11}$,
  4431. $a_{12}$, \dots, $a_{mn}$ são elementos da matriz, que podem ser tanto
  4432. {\tt+} como {\tt-}. (Neste registro, o delimitador {\tt:} que precede a
  4433. lista de colunas e o delimitador {\tt:=} que segue após a lista de colunas,
  4434. não podem ser omitidos.)
  4435. Cada elemento $a_{ij}$ do bloco de dados matricial (onde $1\leq i\leq m$,
  4436. $1\leq j\leq n$) correspondem a 2-tuplas $(r_i,c_j)$. Se $a_{ij}$ é o
  4437. sinal mais ({\tt+}), a 2-tupla correspondente (ou uma $n$-tupla maior, se uma
  4438. fatia é usada) é incluída no conjunto elementar. Caso contrário, se $a_{ij}$ é o
  4439. sinal menos ({\tt-}), aquela 2-tupla não é incluída no conjunto elementar.
  4440. Uma vez que o registro de matriz define 2-tuplas, tanto o conjunto elementar
  4441. quanto a fatia vigente devem ser 2-dimensional.
  4442. \newpage
  4443. \subsection{Registro de matriz transposta}
  4444. O {\it registro de matriz transposta} possui a seguinte forma sintática:
  4445. $$\begin{array}{cccccc}
  4446. \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4447. r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4448. r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4449. \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4450. r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4451. \end{array}$$
  4452. (Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é
  4453. opcional e pode ser omitido.)
  4454. Este registro é completamente análogo ao registro de matriz (ver
  4455. anteriormente) com a única exceção de que neste caso, cada elemento $a_{ij}$ da
  4456. matriz passa a corresponder a 2-tupla $(c_j,r_i)$ ao invés de $(r_i,c_j)$.
  4457. Uma vez especificado, o indicador {\tt(tr)} tem alcance em todos registros
  4458. subsequentes até que se encontre outra fatia ou o fim do bloco de dados.
  4459. % The {\it transposed matrix data record} has the following syntactic
  4460. % form:
  4461. % $$\begin{array}{cccccc}
  4462. % \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4463. % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4464. % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4465. % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4466. % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4467. % \end{array}$$
  4468. % (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
  4469. % optional and may be omitted.)
  4470. %
  4471. % This data record is completely analogous to the matrix data record (see
  4472. % above) with only exception that in this case each element $a_{ij}$ of
  4473. % the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$.
  4474. %
  4475. % Being once specified the {\tt(tr)} indicator affects all subsequent
  4476. % data records until either a slice or the end of data block is
  4477. % encountered.
  4478. \section{Bloco de dados de parâmetro}
  4479. \noindent
  4480. \framebox[468pt][l]{
  4481. \parbox[c][88pt]{468pt}{
  4482. \hspace{6pt} {\tt param} {\it nome} {\tt,} {\it registro} {\tt,} \dots
  4483. {\tt,} {\it registro} {\tt;}
  4484. \medskip
  4485. \hspace{6pt} {\tt param} {\it nome} {\tt default} {\it valor} {\tt,}
  4486. {\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;}
  4487. \medskip
  4488. \hspace{6pt} {\tt param} {\tt:} {\it dados-tabulação} {\tt;}
  4489. \medskip
  4490. \hspace{6pt} {\tt param} {\tt default} {\it valor} {\tt:}
  4491. {\it dados-tabulação} {\tt;}
  4492. }}
  4493. \medskip
  4494. \noindent
  4495. {\it nome} é um nome simbólico do parâmetro;
  4496. \noindent
  4497. {\it valor} é um valor opcional padrão do parâmetro;
  4498. \noindent
  4499. {\it registro}, \dots, {\it registro} são registros;
  4500. \noindent
  4501. {\it dados-tabulação} especifica os dados do parâmetro em formato tabulação.
  4502. \noindent
  4503. As vírgulas que precedem os registros podem ser omitidas.
  4504. \para{Registros}
  4505. \vspace*{-8pt}
  4506. \begin{description}
  4507. \item[{\tt :=}]\hspace*{0pt}\\
  4508. é um elemento de atribuição de registro não-significativo que pode ser usado
  4509. livremente para melhorar a legibilidade;
  4510. \item[{\tt[} {\it fatia} {\tt]}]\hspace*{0pt}\\
  4511. especifica uma fatia;
  4512. \item[{\it dados-planos}]\hspace*{0pt}\\
  4513. especifica os dados do parâmetro em formato simples;
  4514. \item[{\tt:} {\it dados-tabulares}]\hspace*{0pt}\\
  4515. especifica dados do parâmetro em formato tabular;
  4516. \item[{\tt(tr)} {\tt:} {\it dados-tabulares}]\hspace*{0pt}\\
  4517. especifica dados do parâmetro no formato tabular transposto.
  4518. (Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos).
  4519. \end{description}
  4520. \vspace*{-8pt}
  4521. \para{Exemplos}
  4522. \begin{verbatim}
  4523. param T := 4;
  4524. param mes := 1 Jan 2 Fev 3 Mar 4 Abr 5 Mai;
  4525. param mes := [1] 'Jan', [2] 'Fev', [3] 'Mar', [4] 'Abr', [5] 'Mai';
  4526. param estoque_inicial := ferro 7.32 niquel 35.8;
  4527. param estoque_inicial [*] ferro 7.32, niquel 35.8;
  4528. param custo [ferro] .025 [niquel] .03;
  4529. param valor := ferro -.1, niquel .02;
  4530. param : estoque_inicial custo valor :=
  4531. ferro 7.32 .025 -.1
  4532. niquel 35.8 .03 .02 ;
  4533. param : insumo : estoque_inicial custo valor :=
  4534. ferro 7.32 .025 -.1
  4535. niquel 35.8 .03 .02 ;
  4536. param demanda default 0 (tr)
  4537. : FRA DET LAN WIN STL FRE LAF :=
  4538. chapa 300 . 100 75 . 225 250
  4539. bobina 500 750 400 250 . 850 500
  4540. placa 100 . . 50 200 . 250 ;
  4541. param custo_transporte :=
  4542. [*,*,chapa]: FRA DET LAN WIN STL FRE LAF :=
  4543. GARY 30 10 8 10 11 71 6
  4544. CLEV 22 7 10 7 21 82 13
  4545. PITT 19 11 12 10 25 83 15
  4546. [*,*,bobina]: FRA DET LAN WIN STL FRE LAF :=
  4547. GARY 39 14 11 14 16 82 8
  4548. CLEV 27 9 12 9 26 95 17
  4549. PITT 24 14 17 13 28 99 20
  4550. [*,*,placa]: FRA DET LAN WIN STL FRE LAF :=
  4551. GARY 41 15 12 16 17 86 8
  4552. CLEV 29 9 13 9 28 99 18
  4553. PITT 26 14 17 13 31 104 20 ;
  4554. \end{verbatim}
  4555. O {\it bloco de dados do parâmetro} é usado para especificar dados
  4556. completos para um parâmetro (ou parâmetros, se os dados são especificados
  4557. no formato tabulação).
  4558. Os blocos de dados podem ser especificados apenas para parâmetros não-calculáveis, i.e.,
  4559. para parâmetros que não possuem o atributo de atribuição ({\tt:=}) nas
  4560. sentenças parameter correspondentes.
  4561. Os dados definidos no bloco de dados do parâmetro são programados como uma sequência
  4562. de registros descritos em seguida. Adicionalmente, o bloco de dados pode vir com
  4563. o atributo opcional {\tt default}, que especifica um valor numérico ou simbólico
  4564. padrão do parâmetro (ou parâmetros). Este valor padrão é atribuído ao parâmetro ou
  4565. a seus membros quando não se definem valores apropriados no bloco de dados do
  4566. parâmetro. O atributo {\tt default} não pode ser usado se ele já tiver sido
  4567. especificado na sentença parameter correspondente.
  4568. % \noindent
  4569. % \framebox[468pt][l]{
  4570. % \parbox[c][88pt]{468pt}{
  4571. % \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots
  4572. % {\tt,} {\it record} {\tt;}
  4573. %
  4574. % \medskip
  4575. %
  4576. % \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,}
  4577. % {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;}
  4578. %
  4579. % \medskip
  4580. %
  4581. % \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;}
  4582. %
  4583. % \medskip
  4584. %
  4585. % \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:}
  4586. % {\it tabbing-data} {\tt;}
  4587. % }}
  4588. %
  4589. % \medskip
  4590. %
  4591. % \noindent
  4592. % {\it name} is a symbolic name of the parameter;
  4593. %
  4594. % \noindent
  4595. % {\it value} is an optional default value of the parameter;
  4596. %
  4597. % \noindent
  4598. % {\it record}, \dots, {\it record} are data records;
  4599. %
  4600. % \noindent
  4601. % {\it tabbing-data} specifies parameter data in the tabbing format.
  4602. %
  4603. % \noindent
  4604. % Commae preceding data records may be omitted.
  4605. %
  4606. % \para{Data records}
  4607. %
  4608. % \vspace*{-8pt}
  4609. %
  4610. % \begin{description}
  4611. % \item[{\tt :=}]\hspace*{0pt}\\
  4612. % is a non-significant data record, which may be used freely to improve
  4613. % readability;
  4614. % \item[{\tt[} {\it slice} {\tt]}]\hspace*{0pt}\\
  4615. % specifies a slice;
  4616. % \item[{\it plain-data}]\hspace*{0pt}\\
  4617. % specifies parameter data in the plain format;
  4618. % \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\
  4619. % specifies parameter data in the tabular format;
  4620. % \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\
  4621. % specifies set data in the transposed tabular format. (In this case the
  4622. % colon following the keyword {\tt(tr)} may be omitted.)
  4623. % \end{description}
  4624. %
  4625. % \vspace*{-8pt}
  4626. %
  4627. % \para{Examples}
  4628. %
  4629. % \begin{verbatim}
  4630. % param T := 4;
  4631. % param month := 1 Jan 2 Feb 3 Mar 4 Apr 5 May;
  4632. % param month := [1] 'Jan', [2] 'Feb', [3] 'Mar', [4] 'Apr', [5] 'May';
  4633. % param init_stock := iron 7.32 nickel 35.8;
  4634. % param init_stock [*] iron 7.32, nickel 35.8;
  4635. % param cost [iron] .025 [nickel] .03;
  4636. % param value := iron -.1, nickel .02;
  4637. % param : init_stock cost value :=
  4638. % iron 7.32 .025 -.1
  4639. % nickel 35.8 .03 .02 ;
  4640. % param : raw : init stock cost value :=
  4641. % iron 7.32 .025 -.1
  4642. % nickel 35.8 .03 .02 ;
  4643. % param demand default 0 (tr)
  4644. % : FRA DET LAN WIN STL FRE LAF :=
  4645. % bands 300 . 100 75 . 225 250
  4646. % coils 500 750 400 250 . 850 500
  4647. % plate 100 . . 50 200 . 250 ;
  4648. % param trans_cost :=
  4649. % [*,*,bands]: FRA DET LAN WIN STL FRE LAF :=
  4650. % GARY 30 10 8 10 11 71 6
  4651. % CLEV 22 7 10 7 21 82 13
  4652. % PITT 19 11 12 10 25 83 15
  4653. % [*,*,coils]: FRA DET LAN WIN STL FRE LAF :=
  4654. % GARY 39 14 11 14 16 82 8
  4655. % CLEV 27 9 12 9 26 95 17
  4656. % PITT 24 14 17 13 28 99 20
  4657. % [*,*,plate]: FRA DET LAN WIN STL FRE LAF :=
  4658. % GARY 41 15 12 16 17 86 8
  4659. % CLEV 29 9 13 9 28 99 18
  4660. % PITT 26 14 17 13 31 104 20 ;
  4661. % \end{verbatim}
  4662. %
  4663. % The {\it parameter data block} is used to specify complete data for a
  4664. % parameter (or parameters, if data are specified in the tabbing format).
  4665. %
  4666. % Data blocks can be specified only for non-computable parameters, i.e.
  4667. % for parameters, which have no assign attribute ({\tt:=}) in the
  4668. % corresponding parameter statements.
  4669. %
  4670. % Data defined in the parameter data block are coded as a sequence of
  4671. % data records described below. Additionally the data block can be
  4672. % provided with the optional {\tt default} attribute, which specifies a
  4673. % default numeric or symbolic value of the parameter (parameters). This
  4674. % default value is assigned to the parameter or its members when
  4675. % no appropriate value is defined in the parameter data block. The
  4676. % {\tt default} attribute cannot be used, if it is already specified in
  4677. % the corresponding parameter statement.
  4678. \subsection{Registro de atribuição}
  4679. O {\it registro de atribuição} ({\tt:=}) é um elemento não-significativo.
  4680. Ele pode ser usado para melhorar a legibilidade dos blocos de dados;
  4681. % The {\it assign data record} ({\tt:=}) is a non-signficant element.
  4682. % It may be used for improving readability of data blocks.
  4683. \subsection{Registro em fatia}
  4684. O {\it registro em fatia} é um registro de controle que especifica uma
  4685. {\it fatia} da matriz do parâmetro. Ele tem a seguinte forma sintática:
  4686. $$\mbox{{\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]}}$$
  4687. onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia.
  4688. Cada componente da fatia pode ser um número, símbolo ou asterisco
  4689. ({\tt*}). O número de componentes na fatia deve ser o mesmo da
  4690. dimensão $n$-tuplas do parâmetro. Por exemplo,
  4691. se o parâmetro é uma matriz 4-dimensional, a fatia deve ter
  4692. quatro componentes. O número de \linebreak asteriscos na fatia denomina a
  4693. {\it dimensão da fatia}.
  4694. O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional
  4695. (i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados,
  4696. todos registros subsequentes devem especificar os subíndices do membros do
  4697. parâmetro, como se o parâmetro fosse $m$-dimensional, não $n$-dimensional.
  4698. Sempre que $m$ subíndices são encontrados, cada asterisco da fatia é substituído
  4699. pelos \linebreak componentes correspondentes que dão $n$ subíndices, que definem o
  4700. membro corrente do parâmetro.
  4701. Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e os subíndices 3 e
  4702. $b$ são encontradas no \linebreak registro subsequente, a lista completa de subíndices
  4703. usada para escolher o membro do parâmetro é $(a,3,1,2,b)$.
  4704. É permitido especificar uma fatia que não tenha asteriscos. Tal fatia, em si
  4705. própria, define uma lista completa de subíndice, em cujo caso o próximo
  4706. registro deve definir apenas um único valor do membro correspondentes do parâmetro.
  4707. Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova
  4708. fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia
  4709. não é especificada no bloco de dados, assume-se uma cujos componentes são
  4710. asteriscos em todas as posições.
  4711. \subsection{Registro plano}
  4712. O {\it registro plano} define uma lista de subíndice e um valor individual
  4713. no formato plano. Este registro possui a seguinte forma sintática:
  4714. $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$
  4715. onde $t_1$, $t_2$, \dots, $t_n$ são subíndices e $v$ é um valor.
  4716. Cada subíndice, assim como o valor, pode ser um número ou um símbolo. As
  4717. vírgulas que seguem os subíndices são opcionais e podem ser omitidas.
  4718. No caso de um parâmetro ou fatia 0-dimensional, o registro plano não possui
  4719. subíndice e consiste de um valor individual apenas.
  4720. % The {\it plain data record} defines a subscript list and a single value
  4721. % in the plain format. This record has the following syntactic form:
  4722. % $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$
  4723. % where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a value.
  4724. % Each subscript as well as the value can be a number or symbol. Commae
  4725. % following subscripts are optional and may be omitted.
  4726. %
  4727. % In case of 0-dimensional parameter or slice the plain data record has
  4728. % no subscripts and consists of a single value only.
  4729. \subsection{Registro tabular}
  4730. O {\it registro tabular} define diversos valores onde cada valor é provido
  4731. de dois subíndices. Este registro possui a seguinte forma sintática:
  4732. $$\begin{array}{cccccc}
  4733. \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4734. r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4735. r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4736. \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4737. r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4738. \end{array}$$
  4739. onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos
  4740. que correspondem a linhas da tabela; enquanto que $c_1$, $c_2$, \dots, $c_n$ são
  4741. são números e/ou símbolos que correspondem a colunas da tabela, $a_{11}$,
  4742. $a_{12}$, \dots, $a_{mn}$ são elementos da tabela. Cada elemento pode ser
  4743. um número, símbolo ou o ponto decimal ({\tt.}) individual. (neste registro,
  4744. o delimitador {\tt:} que precede a lista de colunas e o delimitador
  4745. {\tt:=} que segue após a lista de colunas, não podem ser omitidos).
  4746. Cada elemento $a_{ij}$ do bloco de dados tabulares ($1\leq i\leq m$,
  4747. $1\leq j\leq n$) define dois subíndices, onde o primeiro subíndice é
  4748. $r_i$ e o segundo é $c_j$. Estes subíndices são usados juntamente com
  4749. a fatia vigente para formar a lista completa de subíndices que identifica
  4750. um membro particular da matriz de parâmetros. Se $a_{ij}$
  4751. é um número ou um símbolo, este valor é atribuído ao membro do parâmetro.
  4752. No entanto, se $a_{ij}$ é um ponto decimal individual, o membro é atribuído
  4753. ao valor padrão especificado ou no bloco de dados do parâmetro
  4754. ou na sentença parameter, ou ainda, se nenhum valor padrão é especificado,
  4755. o membro permanece indefinido.
  4756. Uma vez que o registro tabular fornece dois subíndices para cada valor,
  4757. tanto o parâmetro quanto a fatia vigente em uso devem ser 2-dimensional.
  4758. % The {\it tabular data record} defines several values, where each value
  4759. % is provided with two subscripts. This record has the following
  4760. % syntactic form:
  4761. % $$\begin{array}{cccccc}
  4762. % \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4763. % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4764. % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4765. % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4766. % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4767. % \end{array}$$
  4768. % where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols
  4769. % corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are
  4770. % numbers and/or symbols corresponding to columns of the table, $a_{11}$,
  4771. % $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a
  4772. % number or symbol or the single decimal point ({\tt.}). (In this data
  4773. % record the delimiter {\tt:} preceding the column list and the delimiter
  4774. % {\tt:=} following the column list cannot be omitted.)
  4775. %
  4776. % Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$,
  4777. % $1\leq j\leq n$) defines two subscripts, where the first subscript is
  4778. % $r_i$, and the second one is $c_j$. These subscripts are used in
  4779. % conjunction with the current slice to form the complete subscript list
  4780. % that identifies a particular member of the parameter array. If $a_{ij}$
  4781. % is a number or symbol, this value is assigned to the parameter member.
  4782. % However, if $a_{ij}$ is the single decimal point, the member is
  4783. % assigned a default value specified either in the parameter data block
  4784. % or in the parameter statement, or, if no default value is specified,
  4785. % the member remains undefined.
  4786. %
  4787. % Since the tabular data record provides two subscripts for each value,
  4788. % either the parameter or the slice currently used should be
  4789. % 2-dimensional.
  4790. \subsection{Registro tabular transposto}
  4791. O {\it registro tabular transposto} possui a seguinte forma sintática:
  4792. $$\begin{array}{cccccc}
  4793. \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4794. r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4795. r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4796. \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4797. r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4798. \end{array}$$
  4799. (Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é
  4800. opcional e pode ser omitida.)
  4801. Este registro é completamente análogo ao registro tabular
  4802. (ver anteriormente) com a única exceção que o primeiro subíndice definido
  4803. pelo elemento $a_{ij}$ é $c_j$ enquanto que o segundo é $r_i$.
  4804. Uma vez especificado, o indicador {\tt(tr)} afeta todos registros subsequentes
  4805. até que se encontre outra fatia ou o fim do bloco de dados.
  4806. % The {\it transposed tabular data record} has the following syntactic
  4807. % form:
  4808. % $$\begin{array}{cccccc}
  4809. % \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
  4810. % r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
  4811. % r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
  4812. % \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
  4813. % r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
  4814. % \end{array}$$
  4815. % (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
  4816. % optional and may be omitted.)
  4817. %
  4818. % This data record is completely analogous to the tabular data record
  4819. % (see above) with only exception that the first subscript defined by
  4820. % element $a_{ij}$ is $c_j$ while the second one is $r_i$.
  4821. %
  4822. % Being once specified the {\tt(tr)} indicator affects all subsequent
  4823. % data records until either a slice or the end of data block is
  4824. % encountered.
  4825. % \newpage
  4826. \subsection{Formato de dados em tabulação}
  4827. O bloco de dados do parâmetro no {\it formato tabulação} possui a seguinte
  4828. forma sintática:
  4829. $$
  4830. \begin{array}{*{8}{l}}
  4831. \multicolumn{4}{l}
  4832. {{\tt param}\ {\tt default}\ valor\ {\tt :}\ s\ {\tt :}}&
  4833. p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\
  4834. r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|&
  4835. a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\
  4836. r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|&
  4837. a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\
  4838. \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\
  4839. r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|&
  4840. a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\
  4841. \end{array}
  4842. $$
  4843. 1. A palavra-chave {\tt default} pode ser omitida juntamente
  4844. com o valor que a segue.
  4845. 2. O nome simbólico $s$ pode ser omitido juntamente com
  4846. os dois pontos que o segue.
  4847. 3. Todas as vírgulas são opcionais e podem ser omitidas.
  4848. O bloco de dados no formato tabulação mostrado acima é exatamente
  4849. equivalente aos seguintes blocos de dados:
  4850. \verb|set| $s$\ \verb|:=|\ $
  4851. \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) |
  4852. \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) |
  4853. \dots
  4854. \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$
  4855. \verb|param| $p_1$\ \verb|default|\ $valor$\ \verb|:=|
  4856. $\verb| |
  4857. \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11}
  4858. \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21}
  4859. \verb| |\dots
  4860. \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1}
  4861. \verb|;|
  4862. $
  4863. \verb|param| $p_2$\ \verb|default|\ $valor$\ \verb|:=|
  4864. $\verb| |
  4865. \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12}
  4866. \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22}
  4867. \verb| |\dots
  4868. \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2}
  4869. \verb|;|
  4870. $
  4871. \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .
  4872. \verb|param| $p_r$\ \verb|default|\ $valor$\ \verb|:=|
  4873. $\verb| |
  4874. \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r}
  4875. \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r}
  4876. \verb| |\dots
  4877. \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr}
  4878. \verb|;|
  4879. $
  4880. % The parameter data block in the {\it tabbing format} has the following
  4881. % syntactic form:
  4882. % $$
  4883. % \begin{array}{*{8}{l}}
  4884. % \multicolumn{4}{l}
  4885. % {{\tt param}\ {\tt default}\ value\ {\tt :}\ s\ {\tt :}}&
  4886. % p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\
  4887. % r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|&
  4888. % a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\
  4889. % r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|&
  4890. % a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\
  4891. % \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\
  4892. % r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|&
  4893. % a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\
  4894. % \end{array}
  4895. % $$
  4896. %
  4897. % 1. The keyword {\tt default} may be omitted along with a value
  4898. % following it.
  4899. %
  4900. % 2. Symbolic name $s$ may be omitted along with the colon following it.
  4901. %
  4902. % 3. All commae are optional and may be omitted.
  4903. %
  4904. % The data block in the tabbing format shown above is exactly equivalent
  4905. % to the following data blocks:
  4906. %
  4907. % \verb|set| $s$\ \verb|:=|\ $
  4908. % \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) |
  4909. % \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) |
  4910. % \dots
  4911. % \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$
  4912. %
  4913. % \verb|param| $p_1$\ \verb|default|\ $value$\ \verb|:=|
  4914. %
  4915. % $\verb| |
  4916. % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11}
  4917. % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21}
  4918. % \verb| |\dots
  4919. % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1}
  4920. % \verb|;|
  4921. % $
  4922. %
  4923. % \verb|param| $p_2$\ \verb|default|\ $value$\ \verb|:=|
  4924. %
  4925. % $\verb| |
  4926. % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12}
  4927. % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22}
  4928. % \verb| |\dots
  4929. % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2}
  4930. % \verb|;|
  4931. % $
  4932. %
  4933. % \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .
  4934. %
  4935. % \verb|param| $p_r$\ \verb|default|\ $value$\ \verb|:=|
  4936. %
  4937. % $\verb| |
  4938. % \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r}
  4939. % \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r}
  4940. % \verb| |\dots
  4941. % \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr}
  4942. % \verb|;|
  4943. % $
  4944. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4945. \appendix
  4946. \chapter{Usando sufixos}
  4947. \vspace*{-12pt}
  4948. Sufixos podem ser usados para recuperar valores adicionais
  4949. associados com as variáveis, restrições e objetivos do modelo.
  4950. Um {\it sufixo} consiste de um ponto ({\tt.}) seguido por uma palavra-chave
  4951. não-reservada. Por exemplo, se {\tt x} é uma variável bi-dimensional,
  4952. {\tt x[i,j].lb} é um valor numérico igual ao limite inferior da variável
  4953. elementar {\tt x[i,j]}, que (cujo valor) pode ser usado em expressões
  4954. como um parâmetro numérico.
  4955. Para as variáveis do modelo, os sufixos possuem o seguinte significado:
  4956. \begin{tabular}{@{}ll@{}}
  4957. {\tt.lb}&limite inferior (lower bound)\\
  4958. {\tt.ub}&limite superior (upper bound)\\
  4959. {\tt.status}&status na solução:\\
  4960. &0 --- indefinida\\
  4961. &1 --- básica\\
  4962. &2 --- não-básica no limite inferior\\
  4963. &3 --- não-básica no limite superior\\
  4964. &4 --- variável não-básica livre (ilimitada)\\
  4965. &5 --- variável não-básica fixa\\
  4966. {\tt.val}&valor primal na solução\\
  4967. {\tt.dual}&valor dual (custo reduzido) na solução\\
  4968. \end{tabular}
  4969. Para as restrições e objetivos do modelo, os sufixos têm os seguintes significados:
  4970. \begin{tabular}{@{}ll@{}}
  4971. {\tt.lb}&limite inferior (lower bound) da forma linear\\
  4972. {\tt.ub}&limite superior (upper bound) da forma linear\\
  4973. {\tt.status}&status na solução:\\
  4974. &0 --- indefinida\\
  4975. &1 --- não-limitante\\
  4976. &2 --- limitante no limite inferior\\
  4977. &3 --- limitante no limite superior\\
  4978. &4 --- linha limitante livre (ilimitada)\\
  4979. &5 --- restrição de igualdade limitante\\
  4980. {\tt.val}&valor primal da forma linear na solução\\
  4981. {\tt.dual}&valor dual (custo reduzido) da forma linear na solução\\
  4982. \end{tabular}
  4983. Note que os sufixos {\tt.status}, {\tt.val} e {\tt.dual} podem ser usados
  4984. apenas abaixo da sentença solve.
  4985. % Suffixes can be used to retrieve additional values associated with
  4986. % model variables, constraints, and objectives.
  4987. %
  4988. % A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved
  4989. % keyword. For example, if {\tt x} is a two-dimensional variable,
  4990. % {\tt x[i,j].lb} is a numeric value equal to the lower bound of
  4991. % elemental variable {\tt x[i,j]}, which (value) can be used everywhere
  4992. % in expressions like a numeric parameter.
  4993. %
  4994. % For model variables suffixes have the following meaning:
  4995. %
  4996. % \begin{tabular}{@{}ll@{}}
  4997. % {\tt.lb}&lower bound\\
  4998. % {\tt.ub}&upper bound\\
  4999. % {\tt.status}&status in the solution:\\
  5000. % &0 --- undefined\\
  5001. % &1 --- basic\\
  5002. % &2 --- non-basic on lower bound\\
  5003. % &3 --- non-basic on upper bound\\
  5004. % &4 --- non-basic free (unbounded) variable\\
  5005. % &5 --- non-basic fixed variable\\
  5006. % {\tt.val}&primal value in the solution\\
  5007. % {\tt.dual}&dual value (reduced cost) in the solution\\
  5008. % \end{tabular}
  5009. %
  5010. % For model constraints and objectives suffixes have the following
  5011. % meaning:
  5012. %
  5013. % \begin{tabular}{@{}ll@{}}
  5014. % {\tt.lb}&lower bound of the linear form\\
  5015. % {\tt.ub}&upper bound of the linear form\\
  5016. % {\tt.status}&status in the solution:\\
  5017. % &0 --- undefined\\
  5018. % &1 --- non-active\\
  5019. % &2 --- active on lower bound\\
  5020. % &3 --- active on upper bound\\
  5021. % &4 --- active free (unbounded) row\\
  5022. % &5 --- active equality constraint\\
  5023. % {\tt.val}&primal value of the linear form in the solution\\
  5024. % {\tt.dual}&dual value (reduced cost) of the linear form in the
  5025. % solution\\
  5026. % \end{tabular}
  5027. %
  5028. % Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used
  5029. % only below the solve statement.
  5030. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5031. \chapter{Funções de data e hora}
  5032. \noindent\hfil
  5033. \begin{tabular}{c}
  5034. por Andrew Makhorin \verb|<mao@gnu.org>|\\
  5035. e Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
  5036. \end{tabular}
  5037. \section{Obtendo o tempo de calendário corrente}
  5038. \label{gmtime}
  5039. Para obter o tempo de calendário corrente em MathProg existe a função
  5040. {\tt gmtime}. Ela não possui argumentos e retorna o número de segundos
  5041. transcorridos desde 00:00:00 de 1{\textsuperscript{\b{o}}}
  5042. de Janeiro de 1970, pelo
  5043. Tempo Universal Coordenado (UTC). Por exemplo:
  5044. \begin{verbatim}
  5045. param utc := gmtime();
  5046. \end{verbatim}
  5047. MathProg não possui uma função para converter o tempo UTC retornado pela função
  5048. {\tt gmtime} para os tempos de calendário {\it local}. Assim, para
  5049. determinar o tempo de calendário local corrente, é preciso que adicione ao
  5050. tempo UTC retornado a diferença de horas, com respeito a UTC, expressa em
  5051. segundos. Por exemplo, a hora em Berlim durante o inverno é uma hora à frente
  5052. do UTC, que corresponde a uma diferença horária de +1~hora~= +3600~segundos,
  5053. assim, o tempo de calendário corrente no inverno em Berlim pode ser determinado
  5054. como segue:
  5055. \begin{verbatim}
  5056. param now := gmtime() + 3600;
  5057. \end{verbatim}
  5058. \noindent De forma análoga, o horário de verão em Chicago (Zona Horária Central-CDT)
  5059. é cinco horas atrás da UTC, de modo que o horário corrente do calendário local
  5060. pode ser determinado como segue:
  5061. \begin{verbatim}
  5062. param now := gmtime() - 5 * 3600;
  5063. \end{verbatim}
  5064. Note que o valor retornado por {\tt gmtime} é volátil, i.e., ao ser
  5065. chamada diversas vezes, esta função pode retornar diferentes valores.
  5066. % \noindent\hfil
  5067. % \begin{tabular}{c}
  5068. % by Andrew Makhorin \verb|<mao@gnu.org>|\\
  5069. % and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
  5070. % \end{tabular}
  5071. %
  5072. % \section{Obtaining current calendar time}
  5073. % \label{gmtime}
  5074. %
  5075. % To obtain the current calendar time in MathProg there exists the
  5076. % function {\tt gmtime}. It has no arguments and returns the number of
  5077. % seconds elapsed since 00:00:00 on January 1, 1970, Coordinated
  5078. % Universal Time (UTC). For example:
  5079. %
  5080. % \begin{verbatim}
  5081. % param utc := gmtime();
  5082. % \end{verbatim}
  5083. %
  5084. % MathProg has no function to convert UTC time returned by the function
  5085. % {\tt gmtime} to {\it local} calendar times. Thus, if you need to
  5086. % determine the current local calendar time, you have to add to the UTC
  5087. % time returned the time offset from UTC expressed in seconds. For
  5088. % example, the time in Berlin during the winter is one hour ahead of UTC
  5089. % that corresponds to the time offset +1~hour~= +3600~secs, so the
  5090. % current winter calendar time in Berlin may be determined as follows:
  5091. %
  5092. % \begin{verbatim}
  5093. % param now := gmtime() + 3600;
  5094. % \end{verbatim}
  5095. %
  5096. % \noindent Similarly, the summer time in Chicago (Central Daylight Time)
  5097. % is five hours behind UTC, so the corresponding current local calendar
  5098. % time may be determined as follows:
  5099. %
  5100. % \begin{verbatim}
  5101. % param now := gmtime() - 5 * 3600;
  5102. % \end{verbatim}
  5103. %
  5104. % Note that the value returned by {\tt gmtime} is volatile, i.e. being
  5105. % called several times this function may return different values.
  5106. \section{Convertendo cadeia de caracteres ao tempo de calendário}
  5107. \label{str2time}
  5108. A função {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converte uma
  5109. cadeia de caractere (impressão da data e hora) \linebreak especificada pelo seu
  5110. primeiro argumento {\it s}, que deve ser uma expressão simbólica,
  5111. para o tempo de calendário apropriado para cálculos aritméticos.
  5112. A conversão é controlada pela cadeia de formato especificado {\it f}
  5113. (o segundo argumento), que também deve ser uma expressão simbólica.
  5114. % The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a
  5115. % character string (timestamp) specified by its first argument {\it s},
  5116. % which should be a symbolic expression, to the calendar time suitable
  5117. % for arithmetic calculations. The conversion is controlled by the
  5118. % specified format string {\it f} (the second argument), which also
  5119. % should be a symbolic expression.
  5120. % \newpage
  5121. A conversão resultante retornada por {\tt str2time} possui o mesmo significado
  5122. dos valores retornados pela função {\tt gmtime} (ver Subseção
  5123. \ref{gmtime}, página \pageref{gmtime}). Note que {\tt str2time}
  5124. {\tt não corrige} o tempo de calendário retornado para zona horária local,
  5125. i.e., ao se aplicar a 00:00:00 de 1{\textsuperscript{\b{o}}}
  5126. de Janeiro de 1970, ela sempre retorna 0.
  5127. % The result of conversion returned by {\tt str2time} has the same
  5128. % meaning as values returned by the function {\tt gmtime} (see Subsection
  5129. % \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does
  5130. % {\tt not} correct the calendar time returned for the local timezone,
  5131. % i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0.
  5132. Por exemplo, as sentenças de modelo:
  5133. \begin{verbatim}
  5134. param s, symbolic, := "07/14/98 13:47";
  5135. param t := str2time(s, "%m/%d/%y %H:%M");
  5136. display t;
  5137. \end{verbatim}
  5138. \noindent produz a seguinte saída:
  5139. \begin{verbatim}
  5140. t = 900424020
  5141. \end{verbatim}
  5142. \noindent onde o tempo de calendário impresso corresponde a 13:47:00 em
  5143. 14 de Julho de 1998.
  5144. A cadeia de formato passada à função {\tt str2time} consiste de
  5145. especificadores de conversão e caracteres ordinários. Cada especificador de
  5146. conversão inicia com um caractere de porcentagem ({\tt\%}) seguido de
  5147. uma letra.
  5148. Os seguintes especificadores de conversão podem ser usados na cadeia de formato:
  5149. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5150. {\tt\%b}&O nome do mês abreviado (insensível a maiúsculas). Pelo menos as três
  5151. primeiras letras do mês devem aparecer na cadeia de entrada.\\
  5152. \end{tabular}
  5153. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5154. {\tt\%d}&O dia do mês como número decimal (de 1 até 31).
  5155. Se permite o zero como primeiro dígito, embora não seja necessário.\\
  5156. \end{tabular}
  5157. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5158. {\tt\%h}&O mesmo que {\tt\%b}.\\
  5159. \end{tabular}
  5160. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5161. {\tt\%H}&A hora como um número decimal, usando um relógio de 24-horas (de 0
  5162. a 23). Se permite o zero como primeiro dígito, embora não seja necessário.\\
  5163. \end{tabular}
  5164. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5165. {\tt\%m}&O mês como um número decimal (de 1 a 12).
  5166. Se permite o zero como primeiro dígito, embora não seja necessário.\\
  5167. \end{tabular}
  5168. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5169. {\tt\%M}&O minuto como um número decimal (de 0 a 59).
  5170. Se permite o zero como primeiro dígito, embora não seja necessário.\\
  5171. \end{tabular}
  5172. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5173. {\tt\%S}&O segundo como um número decimal (de 0 to 60).
  5174. Se permite o zero como primeiro dígito, embora não seja necessário.\\
  5175. \end{tabular}
  5176. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5177. {\tt\%y}&O ano sem o século, como um número decimal (de 0 to 99).
  5178. Se permite o zero como primeiro dígito, embora não seja necessário.
  5179. Valores de entrada de 0 a 68 são considerados dos anos 2000 a 2068
  5180. enquanto que os valores 69 até 99 como dos anos 1969 to 1999.\\
  5181. \end{tabular}
  5182. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5183. {\tt\%z}&A diferença horária do GMT no formato ISO 8601.\\
  5184. \end{tabular}
  5185. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5186. {\tt\%\%}&Um caractere {\tt\%} literal.\\
  5187. \end{tabular}
  5188. Todos os outros caracteres (ordinários) na cadeia de formato devem ter um
  5189. caractere \linebreak correspondente com a cadeia de entrada a ser convertida. Exceções
  5190. são espaços na cadeia de entrada, a qual pode coincidir com zero ou mais
  5191. caracteres de espaço na cadeia de formato.
  5192. % For example, the model statements:
  5193. %
  5194. % \begin{verbatim}
  5195. % param s, symbolic, := "07/14/98 13:47";
  5196. % param t := str2time(s, "%m/%d/%y %H:%M");
  5197. % display t;
  5198. % \end{verbatim}
  5199. %
  5200. % \noindent produce the following printout:
  5201. %
  5202. % \begin{verbatim}
  5203. % t = 900424020
  5204. % \end{verbatim}
  5205. %
  5206. % \noindent where the calendar time printed corresponds to 13:47:00 on
  5207. % July 14, 1998.
  5208. %
  5209. % The format string passed to the function {\tt str2time} consists of
  5210. % conversion specifiers and ordinary characters. Each conversion
  5211. % specifier begins with a percent ({\tt\%}) character followed by a
  5212. % letter.
  5213. %
  5214. % The following conversion specifiers may be used in the format string:
  5215. %
  5216. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5217. % {\tt\%b}&The abbreviated month name (case insensitive). At least three
  5218. % first letters of the month name should appear in the input string.\\
  5219. % \end{tabular}
  5220. %
  5221. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5222. % {\tt\%d}&The day of the month as a decimal number (range 1 to 31).
  5223. % Leading zero is permitted, but not required.\\
  5224. % \end{tabular}
  5225. %
  5226. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5227. % {\tt\%h}&The same as {\tt\%b}.\\
  5228. % \end{tabular}
  5229. %
  5230. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5231. % {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0
  5232. % to 23). Leading zero is permitted, but not required.\\
  5233. % \end{tabular}
  5234. %
  5235. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5236. % {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is
  5237. % permitted, but not required.\\
  5238. % \end{tabular}
  5239. %
  5240. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5241. % {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero
  5242. % is permitted, but not required.\\
  5243. % \end{tabular}
  5244. %
  5245. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5246. % {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero
  5247. % is permitted, but not required.\\
  5248. % \end{tabular}
  5249. %
  5250. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5251. % {\tt\%y}&The year without a century as a decimal number (range 0 to 99).
  5252. % Leading zero is permitted, but not required. Input values in the range
  5253. % 0 to 68 are considered as the years 2000 to 2068 while the values 69 to
  5254. % 99 as the years 1969 to 1999.\\
  5255. % \end{tabular}
  5256. %
  5257. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5258. % {\tt\%z}&The offset from GMT in ISO 8601 format.\\
  5259. % \end{tabular}
  5260. %
  5261. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5262. % {\tt\%\%}&A literal {\tt\%} character.\\
  5263. % \end{tabular}
  5264. %
  5265. % All other (ordinary) characters in the format string should have a
  5266. % matching character in the input string to be converted. Exceptions are
  5267. % spaces in the input string which can match zero or more space
  5268. % characters in the format string.
  5269. % \newpage
  5270. Se algum componente de data e/ou hora estão ausentes no formato e,
  5271. portanto, na cadeia de entrada, a função {\tt str2time} usa seus valores
  5272. padrão correspondendo a 00:00:00 de 1{\textsuperscript{\b{o}}}
  5273. de Janeiro de 1970, ou seja, o valor padrão para o ano é 1970, o valor
  5274. padrão para o mês é Janeiro, etc.
  5275. A função {\tt str2time} é aplicável a todos horários calendário desde
  5276. 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59
  5277. de 31 de Dezembro de 4000 do calendário Gregoriano.
  5278. % If some date and/or time component(s) are missing in the format and,
  5279. % therefore, in the input string, the function {\tt str2time} uses their
  5280. % default values corresponding to 00:00:00 on January 1, 1970, that is,
  5281. % the default value of the year is 1970, the default value of the month
  5282. % is January, etc.
  5283. %
  5284. % The function {\tt str2time} is applicable to all calendar times in the
  5285. % range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of
  5286. % the Gregorian calendar.
  5287. \section{Convertendo tempo de calendário a uma cadeia de caracteres}
  5288. \label{time2str}
  5289. A função {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converte o tempo
  5290. de calendário especificado pelo seu primeiro \linebreak argumento {\it t}, que
  5291. deve ser uma expressão numérica, para uma cadeia de caracteres
  5292. (valor \linebreak simbólico). A conversão é controlada pela cadeia de formato
  5293. {\it f} (o segundo argumento), que deve ser uma expressão numérica.
  5294. O tempo de calendário passado para {\tt time2str} possui o mesmo
  5295. significado dos valores retornados pela função {\tt gmtime} (ver Subseção
  5296. \ref{gmtime}, página \pageref{gmtime}). Note que {\tt time2str}
  5297. {\it não corrige} o tempo de calendário especificado para zona horária local,
  5298. i.e., o tempo de calendário 0 sempre corresponde a 00:00:00 de
  5299. 1{\textsuperscript{\b{o}}} de Janeiro de 1970.
  5300. Por exemplo, as sentenças de modelo:
  5301. \begin{verbatim}
  5302. param s, symbolic, := time2str(gmtime(), "%FT%TZ");
  5303. display s;
  5304. \end{verbatim}
  5305. \noindent pode produzir a seguinte impressão:
  5306. \begin{verbatim}
  5307. s = '2008-12-04T00:23:45Z'
  5308. \end{verbatim}
  5309. \noindent que é a impressão da data e hora no formato ISO.
  5310. A cadeia de formato passada para a função {\tt time2str} consiste de
  5311. especificadores de conversão e caracteres ordinários. Cada especificador
  5312. de conversão começa com um caractere de porcentagem ({\tt\%}) seguido
  5313. de uma letra.
  5314. Os seguintes especificadores de conversão podem ser usados na cadeia de formato:
  5315. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5316. {\tt\%a}&O nome do dia da semana abreviado(2 caracteres).\\
  5317. \end{tabular}
  5318. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5319. {\tt\%A}&O nome do dia da semana completo.\\
  5320. \end{tabular}
  5321. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5322. {\tt\%b}&O nome do dia do mês abreviado (3 caracteres).\\
  5323. \end{tabular}
  5324. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5325. {\tt\%B}&O nome do mês completo.\\
  5326. \end{tabular}
  5327. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5328. {\tt\%C}&O século do ano, ou seja, o maior inteiro não maior que o
  5329. ano dividido por~100.\\
  5330. \end{tabular}
  5331. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5332. {\tt\%d}&O dia do mês como um número decimal (de 01 até 31).\\
  5333. \end{tabular}
  5334. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5335. {\tt\%D}&A data usando o formato \verb|%m/%d/%y|.\\
  5336. \end{tabular}
  5337. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5338. {\tt\%e}&O dia do mês, como em \verb|%d|, mas preenchido com espaço
  5339. em branco ao invés de zero.\\
  5340. \end{tabular}
  5341. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5342. {\tt\%F}&A data usando o formato \verb|%Y-%m-%d|.\\
  5343. \end{tabular}
  5344. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5345. {\tt\%g}&O ano correspondente ao número de semana ISO, mas sem o século
  5346. (de 00 até~99). Este possui o mesmo formato e valor que \verb|%y|,
  5347. exceto que se o número de semana ISO (ver \verb|%V|) pertence
  5348. ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\
  5349. \end{tabular}
  5350. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5351. {\tt\%G}&O ano correspondente ao número de semana ISO.
  5352. Este possui o mesmo formato e valor que \verb|%Y|,
  5353. exceto que se o número de semana ISO (ver \verb|%V|) pertence
  5354. ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\
  5355. \end{tabular}
  5356. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5357. {\tt\%h}&O mesmo que \verb|%b|.\\
  5358. \end{tabular}
  5359. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5360. {\tt\%H}&A hora como um número decimal usando um relógio 24 horas (de 00 até 23).\\
  5361. \end{tabular}
  5362. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5363. {\tt\%I}&A hora como um número decimal usando um relógio 12 horas (de 01 até 12).\\
  5364. \end{tabular}
  5365. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5366. {\tt\%j}&O dia do ano como um número decimal (de 001 até 366).\\
  5367. \end{tabular}
  5368. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5369. {\tt\%k}&A hora como um número decimal usando um relógio 24 horas, como
  5370. \verb|%H|, mas preenchido com espaço em branco ao invés de zero.\\
  5371. \end{tabular}
  5372. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5373. {\tt\%l}&A hora como um número decimal usando um relógio 12 horas, como
  5374. \verb|%I|, mas preenchido com espaço em branco ao invés de zero.
  5375. \end{tabular}
  5376. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5377. {\tt\%m}&O mês como um número decimal (de 01 até 12).\\
  5378. \end{tabular}
  5379. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5380. {\tt\%M}&O minuto como um número decimal (de 00 até 59).\\
  5381. \end{tabular}
  5382. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5383. {\tt\%p}&Tanto {\tt AM} como {\tt PM}, de acordo com o valor da hora fornecido.
  5384. Meia-noite é tratada como {\tt AM} e meio-dia, como {\tt PM}.\\
  5385. \end{tabular}
  5386. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5387. {\tt\%P}&Tanto {\tt am} como {\tt pm}, de acordo com o valor da hora fornecido.
  5388. Meia-noite é tratada como {\tt am} e meio-dia, como {\tt pm}.\\
  5389. \end{tabular}
  5390. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5391. {\tt\%R}&A hora e minuto em números decimais usando o formato
  5392. \verb|%H:%M|.\\
  5393. \end{tabular}
  5394. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5395. {\tt\%S}&O segundo como um número decimal (de 00 até 59).\\
  5396. \end{tabular}
  5397. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5398. {\tt\%T}&A hora do dia em números decimais usando o formato
  5399. \verb|%H:%M:%S|.\\
  5400. \end{tabular}
  5401. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5402. {\tt\%u}&O dia da semana como número decimal (de 1 até 7) em que Segunda
  5403. é 1.\\
  5404. \end{tabular}
  5405. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5406. {\tt\%U}&O número da semana do ano corrente como um número decimal (de
  5407. 00 até 53) iniciando com o primeiro Domingo como o primeiro dia da
  5408. primeira semana. Os dias que precedem o primeiro Domingo do ano são
  5409. considerados parte da semana 00.
  5410. \end{tabular}
  5411. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5412. {\tt\%V}&O número da semana ISO como um número decimal (de 01 até 53).
  5413. Semanas ISO iniciam com Segunda e finalizam com Domingo.
  5414. A semana 01 de um ano é a primeira semana que possui a maioria de
  5415. seus dias naquele ano. Isto é equivalente à semana contendo 4 de
  5416. Janeiro. A semana 01 de um ano pode conter dias do ano anterior.
  5417. A semana anterior à semana 01 de um ano é a última semana
  5418. (52 ou 53) do ano anterior, mesmo se ela contém dias do novo ano.
  5419. Em outras palavras, se 1{\textsuperscript{\b{o}}} de Janeiro
  5420. é Segunda, Terça, Quarta ou Quinta, ele está na semana 01;
  5421. Se 1{\textsuperscript{\b{o}}} de Janeiro é Sexta,
  5422. Sábado ou Domingo, ele está na semana 52 ou 53 do ano anterior.\\
  5423. \end{tabular}
  5424. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5425. {\tt\%w}&O dia da semana como um número decimal (de 0 até 6) em que Domingo
  5426. é 0.\\
  5427. \end{tabular}
  5428. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5429. {\tt\%W}&O número da semana do ano corrente como um número decimal (de
  5430. 00 até 53), iniciando com a primeira Segunda como o primeiro dia da primeira
  5431. semana. Dias que precedem a primeira Segunda do ano são considerados parte
  5432. da semana 00.\\
  5433. \end{tabular}
  5434. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5435. {\tt\%y}&O ano sem o século como um número decimal (de 00 até
  5436. 99), ou seja, o ano \verb|mod|~100.\\
  5437. \end{tabular}
  5438. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5439. {\tt\%Y}&O ano como um número decimal, usando o calendário Gregoriano.\\
  5440. \end{tabular}
  5441. \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5442. {\tt\%\%}&Um caractere \verb|%| literal.\\
  5443. \end{tabular}
  5444. Todos os outros caracteres (ordinários) na cadeia de formato são simplesmente copiados
  5445. à cadeia resultante.
  5446. O primeiro argumento (tempo do calendário) passado para a função {\tt time2str}
  5447. deve estar entre $-62135596800$ até $+64092211199$, o que corresponde ao período
  5448. de 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59
  5449. de 31 de Dezembro de 4000 do calendário Gregoriano.
  5450. % The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the
  5451. % calendar time specified by its first argument {\it t}, which should be
  5452. % a numeric expression, to a character string (symbolic value). The
  5453. % conversion is controlled by the specified format string {\it f} (the
  5454. % second argument), which should be a symbolic expression.
  5455. %
  5456. % The calendar time passed to {\tt time2str} has the same meaning as
  5457. % values returned by the function {\tt gmtime} (see Subsection
  5458. % \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does
  5459. % {\it not} correct the specified calendar time for the local timezone,
  5460. % i.e. the calendar time 0 always corresponds to 00:00:00 on January 1,
  5461. % 1970.
  5462. %
  5463. % For example, the model statements:
  5464. %
  5465. % \begin{verbatim}
  5466. % param s, symbolic, := time2str(gmtime(), "%FT%TZ");
  5467. % display s;
  5468. % \end{verbatim}
  5469. %
  5470. % \noindent may produce the following printout:
  5471. %
  5472. % \begin{verbatim}
  5473. % s = '2008-12-04T00:23:45Z'
  5474. % \end{verbatim}
  5475. %
  5476. % \noindent which is a timestamp in the ISO format.
  5477. %
  5478. % The format string passed to the function {\tt time2str} consists of
  5479. % conversion specifiers and ordinary characters. Each conversion
  5480. % specifier begins with a percent ({\tt\%}) character followed by a
  5481. % letter.
  5482. %
  5483. % The following conversion specifiers may be used in the format string:
  5484. %
  5485. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5486. % {\tt\%a}&The abbreviated (2-character) weekday name.\\
  5487. % \end{tabular}
  5488. %
  5489. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5490. % {\tt\%A}&The full weekday name.\\
  5491. % \end{tabular}
  5492. %
  5493. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5494. % {\tt\%b}&The abbreviated (3-character) month name.\\
  5495. % \end{tabular}
  5496. %
  5497. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5498. % {\tt\%B}&The full month name.\\
  5499. % \end{tabular}
  5500. %
  5501. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5502. % {\tt\%C}&The century of the year, that is the greatest integer not
  5503. % greater than the year divided by~100.\\
  5504. % \end{tabular}
  5505. %
  5506. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5507. % {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\
  5508. % \end{tabular}
  5509. %
  5510. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5511. % {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\
  5512. % \end{tabular}
  5513. %
  5514. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5515. % {\tt\%e}&The day of the month like with \verb|%d|, but padded with
  5516. % blank rather than zero.\\
  5517. % \end{tabular}
  5518. %
  5519. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5520. % {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\
  5521. % \end{tabular}
  5522. %
  5523. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5524. % {\tt\%g}&The year corresponding to the ISO week number, but without the
  5525. % century (range 00 to~99). This has the same format and value as
  5526. % \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs
  5527. % to the previous or next year, that year is used instead.\\
  5528. % \end{tabular}
  5529. %
  5530. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5531. % {\tt\%G}&The year corresponding to the ISO week number. This has the
  5532. % same format and value as \verb|%Y|, except that if the ISO week number
  5533. % (see \verb|%V|) belongs to the previous or next year, that year is used
  5534. % instead.
  5535. % \end{tabular}
  5536. %
  5537. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5538. % {\tt\%h}&The same as \verb|%b|.\\
  5539. % \end{tabular}
  5540. %
  5541. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5542. % {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00
  5543. % to 23).\\
  5544. % \end{tabular}
  5545. %
  5546. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5547. % {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01
  5548. % to 12).\\
  5549. % \end{tabular}
  5550. %
  5551. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5552. % {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\
  5553. % \end{tabular}
  5554. %
  5555. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5556. % {\tt\%k}&The hour as a decimal number, using a 24-hour clock like
  5557. % \verb|%H|, but padded with blank rather than zero.\\
  5558. % \end{tabular}
  5559. %
  5560. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5561. % {\tt\%l}&The hour as a decimal number, using a 12-hour clock like
  5562. % \verb|%I|, but padded with blank rather than zero.
  5563. % \end{tabular}
  5564. %
  5565. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5566. % {\tt\%m}&The month as a decimal number (range 01 to 12).\\
  5567. % \end{tabular}
  5568. %
  5569. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5570. % {\tt\%M}&The minute as a decimal number (range 00 to 59).\\
  5571. % \end{tabular}
  5572. %
  5573. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5574. % {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value.
  5575. % Midnight is treated as {\tt AM} and noon as {\tt PM}.\\
  5576. % \end{tabular}
  5577. %
  5578. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5579. % {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value.
  5580. % Midnight is treated as {\tt am} and noon as {\tt pm}.\\
  5581. % \end{tabular}
  5582. %
  5583. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5584. % {\tt\%R}&The hour and minute in decimal numbers using the format
  5585. % \verb|%H:%M|.\\
  5586. % \end{tabular}
  5587. %
  5588. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5589. % {\tt\%S}&The second as a decimal number (range 00 to 59).\\
  5590. % \end{tabular}
  5591. %
  5592. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5593. % {\tt\%T}&The time of day in decimal numbers using the format
  5594. % \verb|%H:%M:%S|.\\
  5595. % \end{tabular}
  5596. %
  5597. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5598. % {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday
  5599. % being 1.\\
  5600. % \end{tabular}
  5601. %
  5602. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5603. % {\tt\%U}&The week number of the current year as a decimal number (range
  5604. % 00 to 53), starting with the first Sunday as the first day of the first
  5605. % week. Days preceding the first Sunday in the year are considered to be
  5606. % in week 00.
  5607. % \end{tabular}
  5608. %
  5609. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5610. % {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO
  5611. % weeks start with Monday and end with Sunday. Week 01 of a year is the
  5612. % first week which has the majority of its days in that year; this is
  5613. % equivalent to the week containing January 4. Week 01 of a year can
  5614. % contain days from the previous year. The week before week 01 of a year
  5615. % is the last week (52 or 53) of the previous year even if it contains
  5616. % days from the new year. In other word, if 1 January is Monday, Tuesday,
  5617. % Wednesday or Thursday, it is in week 01; if 1 January is Friday,
  5618. % Saturday or Sunday, it is in week 52 or 53 of the previous year.\\
  5619. % \end{tabular}
  5620. %
  5621. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5622. % {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday
  5623. % being 0.\\
  5624. % \end{tabular}
  5625. %
  5626. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5627. % {\tt\%W}&The week number of the current year as a decimal number (range
  5628. % 00 to 53), starting with the first Monday as the first day of the first
  5629. % week. Days preceding the first Monday in the year are considered to be
  5630. % in week 00.\\
  5631. % \end{tabular}
  5632. %
  5633. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5634. % {\tt\%y}&The year without a century as a decimal number (range 00 to
  5635. % 99), that is the year modulo~100.\\
  5636. % \end{tabular}
  5637. %
  5638. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5639. % {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\
  5640. % \end{tabular}
  5641. %
  5642. % \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
  5643. % {\tt\%\%}&A literal \verb|%| character.\\
  5644. % \end{tabular}
  5645. %
  5646. % All other (ordinary) characters in the format string are simply copied
  5647. % to the resultant string.
  5648. %
  5649. % The first argument (calendar time) passed to the function {\tt time2str}
  5650. % should be in the range from $-62135596800$ to $+64092211199$ that
  5651. % corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59
  5652. % on December 31, 4000 of the Gregorian calendar.
  5653. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5654. \chapter{Controladores de tabelas}
  5655. \label{drivers}
  5656. \noindent\hfil
  5657. \begin{tabular}{c}
  5658. por Andrew Makhorin \verb|<mao@gnu.org>|\\
  5659. e Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
  5660. \end{tabular}
  5661. \bigskip\bigskip
  5662. O {\it controlador de tabelas} é um módulo do programa que permite transmitir
  5663. dados entre objetos de um modelo MathProg e tabela de dados.
  5664. Atualmente, o pacote GLPK possui quatro controladores de tabelas:
  5665. \vspace*{-8pt}
  5666. \begin{itemize}
  5667. \item controlador interno de tabelas CSV;
  5668. \item controlador interno de tabelas xBASE;
  5669. \item controlador de tabelas ODBC;
  5670. \item controlador de tabelas MySQL.
  5671. \end{itemize}
  5672. % The {\it table driver} is a program module which provides transmitting
  5673. % data between MathProg model objects and data tables.
  5674. %
  5675. % Currently the GLPK package has four table drivers:
  5676. %
  5677. % \vspace*{-8pt}
  5678. %
  5679. % \begin{itemize}
  5680. % \item built-in CSV table driver;
  5681. % \item built-in xBASE table driver;
  5682. % \item ODBC table driver;
  5683. % \item MySQL table driver.
  5684. % \end{itemize}
  5685. \vspace*{-8pt}
  5686. \section{Controlador de tabelas CSV}
  5687. O controlador de tabelas CSV assume que a tabela de dados está representada
  5688. na forma de \linebreak arquivo de texto plano, em formato de arquivo CSV
  5689. (valores serparados por vígula: \linebreak comma-separated values) como descrito
  5690. abaixo.
  5691. Para escolher o controlador de tabelas CSV, seu nome na sentença table deve ser
  5692. especificado como \verb|"CSV"| e o único argumento deve especificar o nome do
  5693. arquivo de texto plano contendo a tabela. Por exemplo:
  5694. \begin{verbatim}
  5695. table dados IN "CSV" "dados.csv": ... ;
  5696. \end{verbatim}
  5697. O sufixo do nome do arquivo pode ser arbitrário, no entanto,
  5698. é recomendado usar o sufixo `\verb|.csv|'.
  5699. Ao ler tabelas de entrada o controlador de tabelas CSV fornece um campo
  5700. implícito chamado \verb|RECNO|, que contém o número do registro corrente.
  5701. Este campo pode ser especificado na sentença de entrada table, como
  5702. se realmente houvesse um campo chamado \verb|RECNO| no arquivo CSV. Por exemplo:
  5703. \begin{verbatim}
  5704. table lista IN "CSV" "lista.csv": num <- [RECNO], ... ;
  5705. \end{verbatim}
  5706. % The CSV table driver assumes that the data table is represented in the
  5707. % form of a plain text file in the CSV (comma-separated values) file
  5708. % format as described below.
  5709. %
  5710. % To choose the CSV table driver its name in the table statement should
  5711. % be specified as \verb|"CSV"|, and the only argument should specify the
  5712. % name of a plain text file containing the table. For example:
  5713. %
  5714. % \begin{verbatim}
  5715. % table data IN "CSV" "data.csv": ... ;
  5716. % \end{verbatim}
  5717. %
  5718. % The filename suffix may be arbitrary, however, it is recommended to use
  5719. % the suffix `\verb|.csv|'.
  5720. %
  5721. % On reading input tables the CSV table driver provides an implicit field
  5722. % named \verb|RECNO|, which contains the current record number. This
  5723. % field can be specified in the input table statement as if there were
  5724. % the actual field named \verb|RECNO| in the CSV file. For example:
  5725. %
  5726. % \begin{verbatim}
  5727. % table list IN "CSV" "list.csv": num <- [RECNO], ... ;
  5728. % \end{verbatim}
  5729. \newpage
  5730. \subsection*{Formato CSV\footnote{Este material é baseado no documento RFC
  5731. 4180.}}
  5732. O formato CSV (\textit{comma-separated values}) é um formato de arquivo de texto plano
  5733. definido como segue.
  5734. 1. Cada registro é localizado em uma linha separada, delimitada por uma quebra de linha. Por exemplo:
  5735. \begin{verbatim}
  5736. aaa,bbb,ccc\n
  5737. xxx,yyy,zzz\n
  5738. \end{verbatim}
  5739. \noindent
  5740. onde \verb|\n| significa o caractere de controle \verb|LF| ({\tt 0x0A}).
  5741. 2. O último registro no arquivo pode ou não ter a quebra de linha. Por exemplo:
  5742. \begin{verbatim}
  5743. aaa,bbb,ccc\n
  5744. xxx,yyy,zzz
  5745. \end{verbatim}
  5746. 3. Deve haver uma linha de cabeçalho na primeira linha do arquivo no
  5747. mesmo formato das linhas de registros normais. Este cabeçalho deve
  5748. conter nomes correspondendo aos campos no arquivo. O número de nomes
  5749. de campos na linha de cabeçalho deve ser o mesmo do número de campos
  5750. dos registros do arquivo. Por exemplo:
  5751. \begin{verbatim}
  5752. nome1,nome2,nome3\n
  5753. aaa,bbb,ccc\n
  5754. xxx,yyy,zzz\n
  5755. \end{verbatim}
  5756. 4. Dentro do cabeçalho e de cada registro, podem haver um ou mais campos
  5757. separados por vírgulas. Cada linha deve conter o mesmo número de campos
  5758. por todos arquivo. Espaços são considerados parte de um campo, portanto,
  5759. não são ignorados. O último campo do registro não deve ser seguido de
  5760. vírgula. Por exemplo:
  5761. \begin{verbatim}
  5762. aaa,bbb,ccc\n
  5763. \end{verbatim}
  5764. 5. Campos podem ou não estar cercados em aspas duplas. Por exemplo:
  5765. \begin{verbatim}
  5766. "aaa","bbb","ccc"\n
  5767. zzz,yyy,xxx\n
  5768. \end{verbatim}
  5769. 6. Se um campo é cercado de aspas duplas, cada aspa dupla que faça
  5770. parte do campo deve ser codificado duas vezes. Por exemplo:
  5771. \begin{verbatim}
  5772. "aaa","b""bb","ccc"\n
  5773. \end{verbatim}
  5774. \para{Exemplo}
  5775. \begin{verbatim}
  5776. DE,PARA,DISTANCIA,CUSTO
  5777. Seattle,New-York,2.5,0.12
  5778. Seattle,Chicago,1.7,0.08
  5779. Seattle,Topeka,1.8,0.09
  5780. San-Diego,New-York,2.5,0.15
  5781. San-Diego,Chicago,1.8,0.10
  5782. San-Diego,Topeka,1.4,0.07
  5783. \end{verbatim}
  5784. % The CSV (comma-separated values) format is a plain text file format
  5785. % defined as follows.
  5786. %
  5787. % 1. Each record is located on a separate line, delimited by a line
  5788. % break. For example:
  5789. %
  5790. % \begin{verbatim}
  5791. % aaa,bbb,ccc\n
  5792. % xxx,yyy,zzz\n
  5793. % \end{verbatim}
  5794. %
  5795. % \noindent
  5796. % where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}).
  5797. %
  5798. % 2. The last record in the file may or may not have an ending line
  5799. % break. For example:
  5800. %
  5801. % \begin{verbatim}
  5802. % aaa,bbb,ccc\n
  5803. % xxx,yyy,zzz
  5804. % \end{verbatim}
  5805. %
  5806. % 3. There should be a header line appearing as the first line of the
  5807. % file in the same format as normal record lines. This header should
  5808. % contain names corresponding to the fields in the file. The number of
  5809. % field names in the header line should be the same as the number of
  5810. % fields in the records of the file. For example:
  5811. %
  5812. % \begin{verbatim}
  5813. % name1,name2,name3\n
  5814. % aaa,bbb,ccc\n
  5815. % xxx,yyy,zzz\n
  5816. % \end{verbatim}
  5817. %
  5818. % 4. Within the header and each record there may be one or more fields
  5819. % separated by commas. Each line should contain the same number of fields
  5820. % throughout the file. Spaces are considered as part of a field and
  5821. % therefore not ignored. The last field in the record should not be
  5822. % followed by a comma. For example:
  5823. %
  5824. % \begin{verbatim}
  5825. % aaa,bbb,ccc\n
  5826. % \end{verbatim}
  5827. %
  5828. % 5. Fields may or may not be enclosed in double quotes. For example:
  5829. %
  5830. % \begin{verbatim}
  5831. % "aaa","bbb","ccc"\n
  5832. % zzz,yyy,xxx\n
  5833. % \end{verbatim}
  5834. %
  5835. % 6. If a field is enclosed in double quotes, each double quote which is
  5836. % part of the field should be coded twice. For example:
  5837. %
  5838. % \begin{verbatim}
  5839. % "aaa","b""bb","ccc"\n
  5840. % \end{verbatim}
  5841. %
  5842. % \para{Example}
  5843. %
  5844. % \begin{verbatim}
  5845. % FROM,TO,DISTANCE,COST
  5846. % Seattle,New-York,2.5,0.12
  5847. % Seattle,Chicago,1.7,0.08
  5848. % Seattle,Topeka,1.8,0.09
  5849. % San-Diego,New-York,2.5,0.15
  5850. % San-Diego,Chicago,1.8,0.10
  5851. % San-Diego,Topeka,1.4,0.07
  5852. % \end{verbatim}
  5853. \newpage
  5854. \section{Controlador de tabelas xBASE}
  5855. O controlador de tabelas xBASE assume que a tabela de dados é armazenada no
  5856. formato de arquivo .dbf.
  5857. Para escolher o controlador de tabela xBASE, seu nome na sentença table deve ser
  5858. especificado como \verb|"xBASE"| e o primeiro argumento deve especificar o nome
  5859. de um arquivo .dbf contendo a tabela. Para a tabela de saída deve haver um
  5860. segundo argumento definindo o formato da tabela na forma
  5861. \verb|"FF...F"|, onde \verb|F| é tanto {\tt C({\it n})},
  5862. que especifica um campo de caractere de tamanho $n$, ou
  5863. {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, que especifica um campo numérico
  5864. de tamanho $n$ e precisão $p$ (por padrão $p$ é 0).
  5865. Adiante está um simples exemplo que ilustra a criação e leitura de um arquivo .dbf:
  5866. \begin{verbatim}
  5867. table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
  5868. "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
  5869. "?" ~ FOO, "[" & i & "]" ~ C;
  5870. set S, dimen 4;
  5871. table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
  5872. display S;
  5873. end;
  5874. \end{verbatim}
  5875. % The xBASE table driver assumes that the data table is stored in the
  5876. % .dbf file format.
  5877. %
  5878. % To choose the xBASE table driver its name in the table statement should
  5879. % be specified as \verb|"xBASE"|, and the first argument should specify
  5880. % the name of a .dbf file containing the table. For the output table there
  5881. % should be the second argument defining the table format in the form
  5882. % \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})},
  5883. % which specifies a character field of length $n$, or
  5884. % {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field
  5885. % of length $n$ and precision $p$ (by default $p$ is 0).
  5886. %
  5887. % The following is a simple example which illustrates creating and
  5888. % reading a .dbf file:
  5889. %
  5890. % \begin{verbatim}
  5891. % table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
  5892. % "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
  5893. % "?" ~ FOO, "[" & i & "]" ~ C;
  5894. % set S, dimen 4;
  5895. % table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
  5896. % display S;
  5897. % end;
  5898. % \end{verbatim}
  5899. \section{Controlador de tabelas ODBC}
  5900. O controlador de tabelas ODBC permite conexões com bancos de dados SQL usando
  5901. uma \linebreak implementação da interface ODBC baseada na Call Level Interface
  5902. (CLI).\footnote{A norma software correspondente é definida na
  5903. ISO/IEC 9075-3:2003.}
  5904. \para{Debian GNU/Linux.}
  5905. No Debian GNU/Linux o controlador de tabelas ODBC usa o pacote iODBC,
  5906. \footnote{Ver {\tt<http://www.iodbc.org/>}.} que deve ser instalado antes
  5907. de montar o pacote GLPK. A instalação pode ser efetuada com o seguinte
  5908. comando:
  5909. \begin{verbatim}
  5910. sudo apt-get install libiodbc2-dev
  5911. \end{verbatim}
  5912. Note que, ao configurar o pacote GLPK, para habilitar o uso da biblioteca do iODBC
  5913. a opção `\verb|--enable-odbc|' deve ser passada para o script de configuração.
  5914. Para seu uso em todo sistema, as bases de dados individuais devem ser inseridas em
  5915. \verb|/etc/odbc.ini| e \verb|/etc/odbcinst.ini|. As conexões das bases de dados
  5916. a serem usadas por um único usuário são especificadas por arquivos do diretório
  5917. home (\verb|.odbc.ini| e \verb|.odbcinst.ini|).
  5918. \para{Microsoft Windows.}
  5919. No Microsoft Windows o controlador de tabelas ODBC usa a biblioteca Microsoft ODBC.
  5920. Para habilitar esta funcionalidade, o símbolo:
  5921. \begin{verbatim}
  5922. #define ODBC_DLNAME "odbc32.dll"
  5923. \end{verbatim}
  5924. \noindent
  5925. deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'.
  5926. Fontes de dados podem ser criados via Ferramentas Administrativas do
  5927. Painel de Controle.
  5928. Para escolher do controlador de tabelas ODBC, seu nome na sentença table deve
  5929. ser especificado como \verb|'ODBC'| ou \verb|'iODBC'|.
  5930. % \newpage
  5931. A lista de argumentos é especificada como segue.
  5932. O primeiro argumento é a cadeia de conexão passada para a biblioteca ODBC,
  5933. por exemplo:
  5934. \verb|'DSN=glpk;UID=user;PWD=password'|, ou
  5935. \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|.
  5936. Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte
  5937. consiste de um par {\it nome-do-campo} e {\it valor} separados pelo sinar
  5938. de igualdade. Os nomes de campo permitidos dependem da biblioteca ODBC.
  5939. Tipicamente os seguintes nomes-de-campo são permitidos:
  5940. \verb|DATABASE | base de dados;
  5941. \verb|DRIVER | controlador ODBC;
  5942. \verb|DSN | nome de uma fonte de dados;
  5943. \verb|FILEDSN | nome de um arquivo de fonte de dados;
  5944. \verb|PWD | senha de usuário;
  5945. \verb|SERVER | base de dados;
  5946. \verb|UID | nome de usuário.
  5947. O segundo argumento e todos os seguintes são considerados como
  5948. sentenças SQL.
  5949. As sentenças SQL podem ser estendidas sobre múltiplos argumentos. Se o
  5950. último caractere de um argumento é um ponto e vírgula, este indica
  5951. o fim de uma sentença SQL.
  5952. Os argumentos de uma sentença SQL são concatenados separados por espaço.
  5953. O eventual ponto e vírgula final será removido.
  5954. Todas as sentenças SQL, exceto a última, serão executadas diretamente.
  5955. Para tabela-IN, a última sentença SQL pode ser um comando SELECT que se inicia
  5956. com \verb|'SELECT '| em letras maiúsculas. Se a cadeia não se inicia com
  5957. \verb|'SELECT '|, se considera que é um nome de uma tabela e uma sentença
  5958. SELECT é automaticamente gerada.
  5959. Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de
  5960. interrogação. Se contém um ponto de interrogação, é considerado um gabarito
  5961. para a rotina de escrita. Caso contrário, a cadeia é considerada um
  5962. nome de tabela e um gabarito INSERT é automaticamente gerado.
  5963. A rotina de escrita usa um gabarito com o pontos de interrogação e
  5964. o substitui o primeiro ponto de interrogação pelo primeiro parâmetro
  5965. de saída, o segundo ponto de interrogação, pelo segundo parâmetro e
  5966. assim por diante. Em seguida, o comando SQL é emitido.
  5967. O que segue é um exemplo da sentença table de saída:
  5968. \begin{verbatim}
  5969. table ta { l in LOCAIS } OUT
  5970. 'ODBC'
  5971. 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  5972. 'DROP TABLE IF EXISTS resultado;'
  5973. 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  5974. 'INSERT INTO resultado 'VALUES ( 4, ?, ? )' :
  5975. l ~ LOC, quantidade[l] ~ QUAN;
  5976. \end{verbatim}
  5977. % \newpage
  5978. \noindent
  5979. Alternativamente pode se escrever como segue:
  5980. \begin{verbatim}
  5981. table ta { l in LOCAIS } OUT
  5982. 'ODBC'
  5983. 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  5984. 'DROP TABLE IF EXISTS resultado;'
  5985. 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  5986. 'resultado' :
  5987. l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;
  5988. \end{verbatim}
  5989. O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o
  5990. UPDATE, DELETE, etc. Por exemplo:
  5991. \begin{verbatim}
  5992. table ta { l in LOCAIS } OUT
  5993. 'ODBC'
  5994. 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  5995. 'UPDATE resultado SET DATA = ' & data & ' WHERE ID = 4;'
  5996. 'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  5997. quantidade[l], l;
  5998. \end{verbatim}
  5999. % The ODBC table driver allows connecting to SQL databases using an
  6000. % implementation of the ODBC interface based on the Call Level Interface
  6001. % (CLI).\footnote{The corresponding software standard is defined in
  6002. % ISO/IEC 9075-3:2003.}
  6003. %
  6004. % \para{Debian GNU/Linux.}
  6005. % Under Debian GNU/Linux the ODBC table driver uses the iODBC
  6006. % package,\footnote{See {\tt<http://www.iodbc.org/>}.} which should be
  6007. % installed before building the GLPK package. The installation can be
  6008. % effected with the following command:
  6009. %
  6010. % \begin{verbatim}
  6011. % sudo apt-get install libiodbc2-dev
  6012. % \end{verbatim}
  6013. %
  6014. % Note that on configuring the GLPK package to enable using the iODBC
  6015. % library the option `\verb|--enable-odbc|' should be passed to the
  6016. % configure script.
  6017. %
  6018. % The individual databases should be entered for systemwide usage in
  6019. % \verb|/etc/odbc.ini| and\linebreak \verb|/etc/odbcinst.ini|. Database
  6020. % connections to be used by a single user are specified by files in the
  6021. % home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|).
  6022. %
  6023. % \para{Microsoft Windows.}
  6024. % Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC
  6025. % library. To enable this feature the symbol:
  6026. %
  6027. % \begin{verbatim}
  6028. % #define ODBC_DLNAME "odbc32.dll"
  6029. % \end{verbatim}
  6030. %
  6031. % \noindent
  6032. % should be defined in the GLPK configuration file `\verb|config.h|'.
  6033. %
  6034. % Data sources can be created via the Administrative Tools from the
  6035. % Control Panel.
  6036. %
  6037. % To choose the ODBC table driver its name in the table statement should
  6038. % be specified as \verb|'ODBC'| or \verb|'iODBC'|.
  6039. %
  6040. % \newpage
  6041. %
  6042. % The argument list is specified as follows.
  6043. %
  6044. % The first argument is the connection string passed to the ODBC library,
  6045. % for example:
  6046. %
  6047. % \verb|'DSN=glpk;UID=user;PWD=password'|, or
  6048. %
  6049. % \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|.
  6050. %
  6051. % Different parts of the string are separated by semicolons. Each part
  6052. % consists of a pair {\it fieldname} and {\it value} separated by the
  6053. % equal sign. Allowable fieldnames depend on the ODBC library. Typically
  6054. % the following fieldnames are allowed:
  6055. %
  6056. % \verb|DATABASE | database;
  6057. %
  6058. % \verb|DRIVER | ODBC driver;
  6059. %
  6060. % \verb|DSN | name of a data source;
  6061. %
  6062. % \verb|FILEDSN | name of a file data source;
  6063. %
  6064. % \verb|PWD | user password;
  6065. %
  6066. % \verb|SERVER | database;
  6067. %
  6068. % \verb|UID | user name.
  6069. %
  6070. % The second argument and all following are considered to be SQL
  6071. % statements
  6072. %
  6073. % SQL statements may be spread over multiple arguments. If the last
  6074. % character of an argument is a semicolon this indicates the end of
  6075. % a SQL statement.
  6076. %
  6077. % The arguments of a SQL statement are concatenated separated by space.
  6078. % The eventual trailing semicolon will be removed.
  6079. %
  6080. % All but the last SQL statement will be executed directly.
  6081. %
  6082. % For IN-table the last SQL statement can be a SELECT command starting
  6083. % with the capitalized letters \verb|'SELECT '|. If the string does not
  6084. % start with \verb|'SELECT '| it is considered to be a table name and a
  6085. % SELECT statement is automatically generated.
  6086. %
  6087. % For OUT-table the last SQL statement can contain one or multiple
  6088. % question marks. If it contains a question mark it is considered a
  6089. % template for the write routine. Otherwise the string is considered a
  6090. % table name and an INSERT template is automatically generated.
  6091. %
  6092. % The writing routine uses the template with the question marks and
  6093. % replaces the first question mark by the first output parameter, the
  6094. % second question mark by the second output parameter and so forth. Then
  6095. % the SQL command is issued.
  6096. %
  6097. % The following is an example of the output table statement:
  6098. %
  6099. % \begin{verbatim}
  6100. % table ta { l in LOCATIONS } OUT
  6101. % 'ODBC'
  6102. % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6103. % 'DROP TABLE IF EXISTS result;'
  6104. % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6105. % 'INSERT INTO result 'VALUES ( 4, ?, ? )' :
  6106. % l ~ LOC, quantity[l] ~ QUAN;
  6107. % \end{verbatim}
  6108. %
  6109. % \newpage
  6110. %
  6111. % \noindent
  6112. % Alternatively it could be written as follows:
  6113. %
  6114. % \begin{verbatim}
  6115. % table ta { l in LOCATIONS } OUT
  6116. % 'ODBC'
  6117. % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6118. % 'DROP TABLE IF EXISTS result;'
  6119. % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6120. % 'result' :
  6121. % l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
  6122. % \end{verbatim}
  6123. %
  6124. % Using templates with `\verb|?|' supports not only INSERT, but also
  6125. % UPDATE, DELETE, etc. For example:
  6126. %
  6127. % \begin{verbatim}
  6128. % table ta { l in LOCATIONS } OUT
  6129. % 'ODBC'
  6130. % 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6131. % 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
  6132. % 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  6133. % quantity[l], l;
  6134. % \end{verbatim}
  6135. \section{Controlador de tabelas MySQL}
  6136. O controlador de tabelas MySQL permite a conexão a base de dados MySQL.
  6137. \para{Debian GNU/Linux.}
  6138. No Debian GNU/Linux o controlador de tabelas MySQL usa o pacote MySQL,
  6139. \footnote{Para fazer o download de arquivos de desenvolvimento, ver
  6140. {\tt<http://dev.mysql.com/downloads/mysql/>}.} que deve ser instalado
  6141. antes da criação do pacote GLPK. A instalação pode ser efetuada com
  6142. o seguinte comando:
  6143. \begin{verbatim}
  6144. sudo apt-get install libmysqlclient15-dev
  6145. \end{verbatim}
  6146. Note que ao configurar o pacote GLPK para habilitar o uso da biblioteca MySQL
  6147. a opção `\verb|--enable-mysql|' deve ser passada ao script de
  6148. configuração.
  6149. \para{Microsoft Windows.}
  6150. No Microsoft Windows o controlador de tabelas MySQL também usa
  6151. a biblioteca MySQL. Para habilitar esta funcionalidade o símbolo:
  6152. \begin{verbatim}
  6153. #define MYSQL_DLNAME "libmysql.dll"
  6154. \end{verbatim}
  6155. \noindent
  6156. deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'.
  6157. Para escolher o controlador de tabelas MySQL, seu nome na sentença table deve
  6158. ser especificada como \verb|'MySQL'|.
  6159. A lista de argumentos é especificada como segue.
  6160. O primeiro argumento especifica como conectar a base de dados no estilo DSN,
  6161. por exemplo:
  6162. \verb|'Database=glpk;UID=glpk;PWD=gnu'|.
  6163. Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte
  6164. consiste de um par {\it nome-do-campo} e {\it valor} separado pelo sinal
  6165. de igualdade. Os seguintes nomes de campo são permitidos:
  6166. % \newpage
  6167. \verb|Server | servidor rodando a base de dados (localhost por padrão);
  6168. \verb|Database | nome da base de dados;
  6169. \verb|UID | nome de usuário;
  6170. \verb|PWD | senha de usuário;
  6171. \verb|Port | porta usada pelo servidor (3306 por padrão).
  6172. O segundo argumento e todos os seguintes são considerados sentenças SQL.
  6173. Sentenças SQL podem se estender sobre múltiplos argumentos. Se o último
  6174. caractere de um argumento é um ponto e vírgula, isto indica o fim de uma
  6175. sentença SQL.
  6176. Os argumentos de uma sentença SQL são concatenados e separados por espaço.
  6177. O eventual ponto e vírgula final será removido.
  6178. Todas sentenças SQL, menos a última, serão executadas diretamente.
  6179. Para tabela-IN, a última sentença SQL pode ser um comando SELECT iniciado
  6180. com letras maiúsculas \verb|'SELECT '|. Se a cadeia não inicia com
  6181. \verb|'SELECT '| é considerado um nome de tabela e a sentença
  6182. SELECT é automaticamente gerada.
  6183. Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de
  6184. interrogação. Se contém um ponto de interrogação, é considerado um gabarito
  6185. para a rotina de escrita. Caso contrário, a cadeia é considerada um
  6186. nome de tabela e um gabarito INSERT é automaticamente gerado.
  6187. A rotina de escrita usa um gabarito com o pontos de interrogação e
  6188. o substitui o primeiro ponto de interrogação pelo primeiro parâmetro
  6189. de saída, o segundo ponto de interrogação, pelo segundo parâmetro e
  6190. assim por diante. Em seguida, o comando SQL é emitido.
  6191. O que segue é um exemplo da sentença table de saída:
  6192. \begin{verbatim}
  6193. table ta { l in LOCAIS } OUT
  6194. 'MySQL'
  6195. 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6196. 'DROP TABLE IF EXISTS resultado;'
  6197. 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6198. 'INSERT INTO resultado VALUES ( 4, ?, ? )' :
  6199. l ~ LOC, quantidade[l] ~ QUAN;
  6200. \end{verbatim}
  6201. \noindent
  6202. Alternativamente poderia ser escrito como segue:
  6203. \begin{verbatim}
  6204. table ta { l in LOCAIS } OUT
  6205. 'MySQL'
  6206. 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6207. 'DROP TABLE IF EXISTS resultado;'
  6208. 'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6209. 'resultado' :
  6210. l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;
  6211. \end{verbatim}
  6212. % \newpage
  6213. O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o
  6214. UPDATE, DELETE, etc. Por exemplo:
  6215. \begin{verbatim}
  6216. table ta { l in LOCAIS } OUT
  6217. 'MySQL'
  6218. 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6219. 'UPDATE resultado SET DATE = ' & date & ' WHERE ID = 4;'
  6220. 'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  6221. quantidade[l], l;
  6222. \end{verbatim}
  6223. % The MySQL table driver allows connecting to MySQL databases.
  6224. %
  6225. % \para{Debian GNU/Linux.}
  6226. % Under Debian GNU/Linux the MySQL table driver uses the MySQL
  6227. % package,\footnote{For download development files see
  6228. % {\tt<http://dev.mysql.com/downloads/mysql/>}.} which should be
  6229. % installed before building the GLPK package. The installation can be
  6230. % effected with the following command:
  6231. %
  6232. % \begin{verbatim}
  6233. % sudo apt-get install libmysqlclient15-dev
  6234. % \end{verbatim}
  6235. %
  6236. % Note that on configuring the GLPK package to enable using the MySQL
  6237. % library the option `\verb|--enable-mysql|' should be passed to the
  6238. % configure script.
  6239. %
  6240. % \para{Microsoft Windows.}
  6241. % Under Microsoft Windows the MySQL table driver also uses the MySQL
  6242. % library. To enable this feature the symbol:
  6243. %
  6244. % \begin{verbatim}
  6245. % #define MYSQL_DLNAME "libmysql.dll"
  6246. % \end{verbatim}
  6247. %
  6248. % \noindent
  6249. % should be defined in the GLPK configuration file `\verb|config.h|'.
  6250. %
  6251. % To choose the MySQL table driver its name in the table statement should
  6252. % be specified as \verb|'MySQL'|.
  6253. %
  6254. % The argument list is specified as follows.
  6255. %
  6256. % The first argument specifies how to connect the data base in the DSN
  6257. % style, for example:
  6258. %
  6259. % \verb|'Database=glpk;UID=glpk;PWD=gnu'|.
  6260. %
  6261. % Different parts of the string are separated by semicolons. Each part
  6262. % consists of a pair {\it fieldname} and {\it value} separated by the
  6263. % equal sign. The following fieldnames are allowed:
  6264. %
  6265. % \newpage
  6266. %
  6267. % \verb|Server | server running the database (defaulting to localhost);
  6268. %
  6269. % \verb|Database | name of the database;
  6270. %
  6271. % \verb|UID | user name;
  6272. %
  6273. % \verb|PWD | user password;
  6274. %
  6275. % \verb|Port | port used by the server (defaulting to 3306).
  6276. %
  6277. % The second argument and all following are considered to be SQL
  6278. % statements.
  6279. %
  6280. % SQL statements may be spread over multiple arguments. If the last
  6281. % character of an argument is a semicolon this indicates the end of
  6282. % a SQL statement.
  6283. %
  6284. % The arguments of a SQL statement are concatenated separated by space.
  6285. % The eventual trailing semicolon will be removed.
  6286. %
  6287. % All but the last SQL statement will be executed directly.
  6288. %
  6289. % For IN-table the last SQL statement can be a SELECT command starting
  6290. % with the capitalized letters \verb|'SELECT '|. If the string does not
  6291. % start with \verb|'SELECT '| it is considered to be a table name and a
  6292. % SELECT statement is automatically generated.
  6293. %
  6294. % For OUT-table the last SQL statement can contain one or multiple
  6295. % question marks. If it contains a question mark it is considered a
  6296. % template for the write routine. Otherwise the string is considered a
  6297. % table name and an INSERT template is automatically generated.
  6298. %
  6299. % The writing routine uses the template with the question marks and
  6300. % replaces the first question mark by the first output parameter, the
  6301. % second question mark by the second output parameter and so forth. Then
  6302. % the SQL command is issued.
  6303. %
  6304. % The following is an example of the output table statement:
  6305. %
  6306. % \begin{verbatim}
  6307. % table ta { l in LOCATIONS } OUT
  6308. % 'MySQL'
  6309. % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6310. % 'DROP TABLE IF EXISTS result;'
  6311. % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6312. % 'INSERT INTO result VALUES ( 4, ?, ? )' :
  6313. % l ~ LOC, quantity[l] ~ QUAN;
  6314. % \end{verbatim}
  6315. %
  6316. % \noindent
  6317. % Alternatively it could be written as follows:
  6318. %
  6319. % \begin{verbatim}
  6320. % table ta { l in LOCATIONS } OUT
  6321. % 'MySQL'
  6322. % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6323. % 'DROP TABLE IF EXISTS result;'
  6324. % 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
  6325. % 'result' :
  6326. % l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
  6327. % \end{verbatim}
  6328. %
  6329. % \newpage
  6330. %
  6331. % Using templates with `\verb|?|' supports not only INSERT, but also
  6332. % UPDATE, DELETE, etc. For example:
  6333. %
  6334. % \begin{verbatim}
  6335. % table ta { l in LOCATIONS } OUT
  6336. % 'MySQL'
  6337. % 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
  6338. % 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
  6339. % 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
  6340. % quantity[l], l;
  6341. % \end{verbatim}
  6342. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6343. % ##################### PAREI AQUI % #####################
  6344. \chapter{Resolvendo modelos com glpsol}
  6345. O pacote GLPK \footnote{{\tt http://www.gnu.org/software/glpk/}}
  6346. inclui o programa {\tt glpsol}, um solver de PL/PIM autônomo. Este
  6347. programa pode ser chamado por uma linha de comando ou pelo shell para
  6348. resolver modelos escritos na \linebreak linguagem de modelagem GNU MathProg.
  6349. Para comunicar ao solver que o arquivo de entrada contém uma descrição
  6350. do modelo, é necessário especificar a opção \verb|--model| na linha de
  6351. comando. Por exemplo:
  6352. \begin{verbatim}
  6353. glpsol --model foo.mod
  6354. \end{verbatim}
  6355. Às vezes é necessário usar a seção de dados posicionado em um arquivo
  6356. separado. Neste caso, deve-se usar o seguinte comando:
  6357. \begin{verbatim}
  6358. glpsol --model foo.mod --data foo.dat
  6359. \end{verbatim}
  6360. \noindent Note que ser o arquivo de modelo também contém a seção de dados,
  6361. aquela seção é ignorada.
  6362. Também é permitido especificar mais de um arquivo contendo a seção de dados,
  6363. por exemplo:
  6364. \begin{verbatim}
  6365. glpsol --model foo.mod --data foo1.dat --data foo2.dat
  6366. \end{verbatim}
  6367. Se a descrição do modelo contém alguma sentença display e/ou printf,
  6368. o resultado é enviado para o terminal por padrão. Se há a necessidade
  6369. de redirecionar a saída para um arquivo, deve-se usar o seguinte comando:
  6370. \begin{verbatim}
  6371. glpsol --model foo.mod --display foo.out
  6372. \end{verbatim}
  6373. Se há a necessidade de ver o problema que está sendo gerado pelo tradutor
  6374. de modelo, deve-ser usar a opção \verb|--wlp| como segue:
  6375. \begin{verbatim}
  6376. glpsol --model foo.mod --wlp foo.lp
  6377. \end{verbatim}
  6378. \noindent Neste caso, os dados do problema são escritos no arquivo
  6379. \verb|foo.lp| no formato CPLEX LP viável para análise visual.
  6380. Ás vezes, é necessário checar a descrição do modelo sem ter que resolver
  6381. a instância do problema gerado. Neste caso, deve-se especificar a opção
  6382. \verb|--check|, por exemplo:
  6383. \begin{verbatim}
  6384. glpsol --check --model foo.mod --wlp foo.lp
  6385. \end{verbatim}
  6386. \newpage
  6387. Se há a necessidade de escrever uma solução numérica obtida pelo solver
  6388. para um arquivo, deve-se usar o seguinte comando:
  6389. \begin{verbatim}
  6390. glpsol --model foo.mod --output foo.sol
  6391. \end{verbatim}
  6392. \noindent neste caso, a solução é escrita no arquivo \verb|foo.sol|
  6393. em formato de texto plano, viável para análise visual.
  6394. A lista completa de opções do \verb|glpsol| pode ser encontrada no manual
  6395. de referência do GLPK incluída na distribuição do GLPK.
  6396. % The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}}
  6397. % includes the program {\tt glpsol}, a stand-alone LP/MIP solver. This
  6398. % program can be launched from the command line or from the shell to
  6399. % solve models written in the GNU MathProg modeling language.
  6400. %
  6401. % To tell the solver that the input file contains a model description you
  6402. % need to specify the option \verb|--model| in the command line.
  6403. % For example:
  6404. %
  6405. % \begin{verbatim}
  6406. % glpsol --model foo.mod
  6407. % \end{verbatim}
  6408. %
  6409. % Sometimes it is necessary to use the data section placed in a separate
  6410. % file, in which case you may use the following command:
  6411. %
  6412. % \begin{verbatim}
  6413. % glpsol --model foo.mod --data foo.dat
  6414. % \end{verbatim}
  6415. %
  6416. % \noindent Note that if the model file also contains the data section,
  6417. % that section is ignored.
  6418. %
  6419. % It is also allowed to specify more than one file containing the data
  6420. % section, for example:
  6421. %
  6422. % \begin{verbatim}
  6423. % glpsol --model foo.mod --data foo1.dat --data foo2.dat
  6424. % \end{verbatim}
  6425. %
  6426. % If the model description contains some display and/or printf
  6427. % statements, by default the output is sent to the terminal. If you need
  6428. % to redirect the output to a file, you may use the following command:
  6429. %
  6430. % \begin{verbatim}
  6431. % glpsol --model foo.mod --display foo.out
  6432. % \end{verbatim}
  6433. %
  6434. % If you need to look at the problem, which has been generated by the
  6435. % model translator, you may use the option \verb|--wlp| as follows:
  6436. %
  6437. % \begin{verbatim}
  6438. % glpsol --model foo.mod --wlp foo.lp
  6439. % \end{verbatim}
  6440. %
  6441. % \noindent In this case the problem data is written to file
  6442. % \verb|foo.lp| in CPLEX LP format suitable for visual analysis.
  6443. %
  6444. % Sometimes it is needed merely to check the model description not
  6445. % solving the generated problem instance. In this case you may specify
  6446. % the option \verb|--check|, for example:
  6447. %
  6448. % \begin{verbatim}
  6449. % glpsol --check --model foo.mod --wlp foo.lp
  6450. % \end{verbatim}
  6451. %
  6452. % \newpage
  6453. %
  6454. % If you need to write a numeric solution obtained by the solver to
  6455. % a file, you may use the following command:
  6456. %
  6457. % \begin{verbatim}
  6458. % glpsol --model foo.mod --output foo.sol
  6459. % \end{verbatim}
  6460. %
  6461. % \noindent in which case the solution is written to file \verb|foo.sol|
  6462. % in a plain text format suitable for visual analysis.
  6463. %
  6464. % The complete list of the \verb|glpsol| options can be found in the
  6465. % GLPK reference manual included in the GLPK distribution.
  6466. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6467. \chapter{Exemplo de descrição de modelo}
  6468. \section{Descrição de modelo escrito em MathProg}
  6469. Este é um exemplo completo de descrição de modelo escrito na linguagem
  6470. de modelagem GNU MathProg.
  6471. \bigskip
  6472. \begin{verbatim}
  6473. # UM PROBLEMA DE TRANSPORTE
  6474. #
  6475. # Este problema encontra a logística de custo mínimo que atende das demandas
  6476. # de mercado e as ofertas das fábricas.
  6477. #
  6478. # Referência:
  6479. # Dantzig G B, "Linear Programming and Extensions."
  6480. # Princeton University Press, Princeton, New Jersey, 1963,
  6481. # Chapter 3-3.
  6482. set I;
  6483. /* fábricas de enlatados*/
  6484. set J;
  6485. /* mercados */
  6486. param a{i in I};
  6487. /* capacidade da fábrica i, em caixas */
  6488. param b{j in J};
  6489. /* demanda no mercado j, em caixas */
  6490. param d{i in I, j in J};
  6491. /* distância, em milhares de milhas */
  6492. param f;
  6493. /* frete, em dólares por caixa a cada mil milhas */
  6494. param c{i in I, j in J} := f * d[i,j] / 1000;
  6495. /* custo de transporte, em milhares de dólares por caixa */
  6496. var x{i in I, j in J} >= 0;
  6497. /* quantidade enviada, em caixas */
  6498. minimize custo: sum{i in I, j in J} c[i,j] * x[i,j];
  6499. /* custo total de transporte, em milhares de dólares */
  6500. s.t. suprimento{i in I}: sum{j in J} x[i,j] <= a[i];
  6501. /* observa o limite de suprimento na fábrica i */
  6502. s.t. demanda{j in J}: sum{i in I} x[i,j] >= b[j];
  6503. /* satisfaz a demanda do mercado j */
  6504. data;
  6505. set I := Seattle San-Diego;
  6506. set J := New-York Chicago Topeka;
  6507. param a := Seattle 350
  6508. San-Diego 600;
  6509. param b := New-York 325
  6510. Chicago 300
  6511. Topeka 275;
  6512. param d : New-York Chicago Topeka :=
  6513. Seattle 2.5 1.7 1.8
  6514. San-Diego 2.5 1.8 1.4 ;
  6515. param f := 90;
  6516. end;
  6517. \end{verbatim}
  6518. % Below here is a complete example of the model description written in
  6519. % the GNU MathProg modeling language.
  6520. %
  6521. % \bigskip
  6522. %
  6523. % \begin{verbatim}
  6524. % # A TRANSPORTATION PROBLEM
  6525. % #
  6526. % # This problem finds a least cost shipping schedule that meets
  6527. % # requirements at markets and supplies at factories.
  6528. % #
  6529. % # References:
  6530. % # Dantzig G B, "Linear Programming and Extensions."
  6531. % # Princeton University Press, Princeton, New Jersey, 1963,
  6532. % # Chapter 3-3.
  6533. %
  6534. % set I;
  6535. % /* canning plants */
  6536. %
  6537. % set J;
  6538. % /* markets */
  6539. %
  6540. % param a{i in I};
  6541. % /* capacity of plant i in cases */
  6542. %
  6543. % param b{j in J};
  6544. % /* demand at market j in cases */
  6545. %
  6546. % param d{i in I, j in J};
  6547. % /* distance in thousands of miles */
  6548. %
  6549. % param f;
  6550. % /* freight in dollars per case per thousand miles */
  6551. %
  6552. % param c{i in I, j in J} := f * d[i,j] / 1000;
  6553. % /* transport cost in thousands of dollars per case */
  6554. %
  6555. % var x{i in I, j in J} >= 0;
  6556. % /* shipment quantities in cases */
  6557. %
  6558. % minimize cost: sum{i in I, j in J} c[i,j] * x[i,j];
  6559. % /* total transportation costs in thousands of dollars */
  6560. %
  6561. % s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i];
  6562. % /* observe supply limit at plant i */
  6563. %
  6564. % s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j];
  6565. % /* satisfy demand at market j */
  6566. %
  6567. % data;
  6568. %
  6569. % set I := Seattle San-Diego;
  6570. %
  6571. % set J := New-York Chicago Topeka;
  6572. %
  6573. % param a := Seattle 350
  6574. % San-Diego 600;
  6575. %
  6576. % param b := New-York 325
  6577. % Chicago 300
  6578. % Topeka 275;
  6579. %
  6580. % param d : New-York Chicago Topeka :=
  6581. % Seattle 2.5 1.7 1.8
  6582. % San-Diego 2.5 1.8 1.4 ;
  6583. %
  6584. % param f := 90;
  6585. %
  6586. % end;
  6587. % \end{verbatim}
  6588. \newpage
  6589. \section{Instância gerada do problema de PL}
  6590. Este é o resultado da tradução do modelo de exemplo produzido
  6591. pelo solver \verb|glpsol| e escrito no formato CPLEX LP
  6592. com a opção \verb|--wlp|.
  6593. \medskip
  6594. \begin{verbatim}
  6595. \* Problem: transporte *\
  6596. Minimize
  6597. custo: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago)
  6598. + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York)
  6599. + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka)
  6600. Subject To
  6601. suprimento(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago)
  6602. + x(Seattle,Topeka) <= 350
  6603. suprimento(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago)
  6604. + x(San~Diego,Topeka) <= 600
  6605. demanda(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325
  6606. demanda(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300
  6607. demanda(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275
  6608. End
  6609. \end{verbatim}
  6610. \section{solução ótima do problema de PL}
  6611. Esta é a solução ótima da instância gerada do problema de PL
  6612. encontrada pelo solver \verb|glpsol| e escrita em formato de texto plano
  6613. com a opção\verb|--output|.
  6614. \medskip
  6615. \begin{footnotesize}
  6616. \begin{verbatim}
  6617. Problem: transporte
  6618. Rows: 6
  6619. Columns: 6
  6620. Non-zeros: 18
  6621. Status: OPTIMAL
  6622. Objective: custo = 153.675 (MINimum)
  6623. No. Row name St Activity Lower bound Upper bound Marginal
  6624. ------ ------------ -- ------------- ------------- ------------- -------------
  6625. 1 cust B 153.675
  6626. 2 suprimento[Seattle]
  6627. NU 350 350 < eps
  6628. 3 suprimento[San-Diego]
  6629. B 550 600
  6630. 4 demanda[New-York]
  6631. NL 325 325 0.225
  6632. 5 demanda[Chicago]
  6633. NL 300 300 0.153
  6634. 6 demanda[Topeka]
  6635. NL 275 275 0.126
  6636. No. Column name St Activity Lower bound Upper bound Marginal
  6637. ------ ------------ -- ------------- ------------- ------------- -------------
  6638. 1 x[Seattle,New-York]
  6639. B 50 0
  6640. 2 x[Seattle,Chicago]
  6641. B 300 0
  6642. 3 x[Seattle,Topeka]
  6643. NL 0 0 0.036
  6644. 4 x[San-Diego,New-York]
  6645. B 275 0
  6646. 5 x[San-Diego,Chicago]
  6647. NL 0 0 0.009
  6648. 6 x[San-Diego,Topeka]
  6649. B 275 0
  6650. End of output
  6651. \end{verbatim}
  6652. \end{footnotesize}
  6653. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6654. \newpage
  6655. \section*{Agradecimentos}
  6656. \addcontentsline{toc}{chapter}{Agradecimentos}
  6657. Os autores gostariam de agradecer as seguintes pessoas que gentilmente leram,
  6658. comentaram e corrigiram o rascunho deste documento:
  6659. \noindent Juan Carlos Borras \verb|<borras@cs.helsinki.fi>|
  6660. \noindent Harley Mackenzie \verb|<hjm@bigpond.com>|
  6661. \noindent Robbie Morrison \verb|<robbie@actrix.co.nz>|
  6662. \end{document}