Convert math context for rewriting chapter

This commit is contained in:
Jip J. Dekker 2021-03-11 12:09:47 +11:00
parent bc5d82ae2a
commit 7665f6beda
No known key found for this signature in database
GPG Key ID: 517DF4A00618C9C3

View File

@ -162,7 +162,7 @@ expressions have \mzninline{par} type.
A \nanozinc\ program, defined in \cref{fig:4-nzn-syntax}, is simply a list of
calls, where the result of each call is bound to either an identifier or the
constant true. The \syntax{$\sep$ <ident>*} will be used to track dependent
constant true. The \syntax{\(\sep\) <ident>*} will be used to track dependent
constraints (this will be explained in detail in \cref{sec:4-nanozinc}, for now
you can assume it is empty).
@ -170,7 +170,7 @@ you can assume it is empty).
\begin{grammar}
<nzn> ::= <nzn-def>*
<nzn-def> ::= <nzn-result> $\mapsto$ <nzn-bind> $\sep$ <ident>*
<nzn-def> ::= <nzn-result> \(\mapsto\) <nzn-bind> \(\sep\) <ident>*
<nzn-bind> ::= <ident> | <nzn-call>
@ -207,10 +207,10 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
\end{enumerate}
% \begin{algorithm}[H]
% \KwData{A \minizinc\ model $M = \langle{}V, C, F\rangle{}$, where $V$ is a set of declaration
% items, $C$ is a set of constraint items, and $F$ are the definitions for all
% functions used in $M$.}
% \KwResult{A list of \microzinc\ defintions $\mu$ and a \nanozinc\ program $n$.}
% \KwData{A \minizinc\ model \(M = \langle{}V, C, F\rangle{}\), where \(V\) is a set of declaration
% items, \(C\) is a set of constraint items, and \(F\) are the definitions for all
% functions used in \(M\).}
% \KwResult{A list of \microzinc\ defintions \(\mu\) and a \nanozinc\ program \(n\).}
% \While{not at end of this document}{
% read current\;
@ -226,10 +226,10 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
% \begin{algorithm}[H]
% \KwData{A \minizinc\ expression $e$ and $rn$ a function to rename identifiers}
% \KwResult{A \microzinc\ expression $e'$.}
% \KwData{A \minizinc\ expression \(e\) and \(rn\) a function to rename identifiers}
% \KwResult{A \microzinc\ expression \(e'\).}
% \Switch{$e$} {
% \Switch{\(e\)} {
% \Case{\textup{\texttt{if \(c\) then \(e_{1}\) else \(e_{2}\) endif}}}{
% \eIf{\(type(c) \in \textup{\texttt{var}}\)}{
% \(e' \longleftarrow \texttt{MicroExpr}(\texttt{slv\_if\_then\_else(\(c\), \(e_{1}\), \(e_{2}\))}, rn)\)
@ -243,7 +243,7 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
% \Case{\textup{(call)} \(n(e_{1}, ..., e_{n})\)}{
% }
% \lCase{\textup{(ident)} $id$} {\(e' \longleftarrow rn(id)\)}
% \lCase{\textup{(ident)} \(id\)} {\(e' \longleftarrow rn(id)\)}
% \lOther{\(e' \longleftarrow e\)}
% }
% \Return{\(e'\)}
@ -252,7 +252,7 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
\begin{example}
Consider the following \minizinc\ model, a simple unsatisfiable ``pigeonhole
problem'', trying to assign $n$ pigeons to $n-1$ holes:
problem'', trying to assign \(n\) pigeons to \(n-1\) holes:
\begin{mzn}
predicate all_different(array[int] of var int: x) =
@ -268,7 +268,7 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
The translation to \microzinc\ turns all expressions into function calls,
replaces the special generator syntax in the \mzninline{forall} with an array
comprehension, and creates the \mzninline{main} function. Note how the domain
$1..n-1$ of the \mzninline{pigeon} array is replaced by a \mzninline{set_in}
\(1..n-1\) of the \mzninline{pigeon} array is replaced by a \mzninline{set_in}
constraint for each element of the array.
\begin{mzn}
@ -291,8 +291,8 @@ The translation from \minizinc\ to \microzinc\ involves the following steps:
\end{mzn}
For a concrete instance of the model, we can then create a simple \nanozinc\
program that calls \mzninline{main}, for example for $n=10$:
\mzninline{true @$\mapsto$@ main(10) @$\sep$@ []}.
program that calls \mzninline{main}, for example for \(n=10\):
\nzninline{true @\(\mapsto\)@ main(10) @\(\sep\)@ []}.
\end{example}
\subsection{Partial Evaluation of \glsentrytext{nanozinc}}\label{sub:4-partial}
@ -365,18 +365,18 @@ result.
\begin{example}\label{ex:4-absnzn}
Consider the \minizinc\ fragment\\\mzninline{constraint abs(x) > y;}\\ where
\mzninline{x} and \mzninline{y} have domain $[-10, 10]$. After rewriting all
\mzninline{x} and \mzninline{y} have domain \([-10, 10]\). After rewriting all
definitions, the resulting \nanozinc\ program could look like this:
\begin{mzn}
x @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
y @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
z @$\mapsto$@ mkvar(-infinity,infinity) @$\sep$@ []
b0 @$\mapsto$@ int_abs(x, z) @$\sep$@ []
t @$\mapsto$@ z @$\sep$@ [b0]
b1 @$\mapsto$@ int_gt(t,y) @$\sep$@ []
true @$\mapsto$@ true @$\sep$@ [b1]
\end{mzn}
\begin{nzn}
x @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
y @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
z @\(\mapsto\)@ mkvar(-infinity,infinity) @\(\sep\)@ []
b0 @\(\mapsto\)@ int_abs(x, z) @\(\sep\)@ []
t @\(\mapsto\)@ z @\(\sep\)@ [b0]
b1 @\(\mapsto\)@ int_gt(t,y) @\(\sep\)@ []
true @\(\mapsto\)@ true @\(\sep\)@ [b1]
\end{nzn}
The variables \mzninline{x} and \mzninline{y} result in identifiers bound to
the special built-in \mzninline{mkvar}, which records the variable's domain in
@ -407,44 +407,44 @@ suitable alpha renaming.
\begin{figure*}
\centering
\begin{prooftree}
\AxiomC{$\ptinline{F($p_1, \ldots, p_k$) = E;} \in \Prog$ where the $p_i$
\AxiomC{\(\ptinline{F(\(p_1, \ldots, p_k\)) = E;} \in \Prog\) where the \(p_i\)
are fresh}
\noLine\
\UnaryInfC{\Sem{$a_i$}{\Prog, \Env_{i-1}} $\Rightarrow~ \tuple{v_i,
\UnaryInfC{\Sem{\(a_i\)}{\Prog, \Env_{i-1}} \(\Rightarrow~ \tuple{v_i,
\Env_i'}, \ \Env_0=\Env, \Env_i=\Env_i'\cup\{p_i\mapsto v_i\sep[]\}
\quad \forall
1 \leq
i \leq k$}
i \leq k\)}
\noLine\
\UnaryInfC{\Sem{E}{\Prog, \Env_k}
$\Rightarrow ~ \tuple{v, \Env'}$}
\(\Rightarrow ~ \tuple{v, \Env'}\)}
\RightLabel{(Call)}
\UnaryInfC{\Sem{F($a_1, \ldots, a_k$)}{\Prog, \Env} $\Rightarrow$
$\tuple{v, \Env'}$}
\UnaryInfC{\Sem{F(\(a_1, \ldots, a_k\))}{\Prog, \Env} \(\Rightarrow\)
\(\tuple{v, \Env'}\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{$\ptinline{F} \in$ Builtins}
\AxiomC{\(\ptinline{F} \in\) Builtins}
% \noLine
\AxiomC{\Sem{$a_i$}{\Prog, \Env} $\Rightarrow~ \tuple{v_i, \Env},
\AxiomC{\Sem{\(a_i\)}{\Prog, \Env} \(\Rightarrow~ \tuple{v_i, \Env},
\forall
1 \leq
i \leq k$}
% $\ldots$, \Sem{$a_k$}{\Prog, \Env} $\Rightarrow~\tuple{\Ctx_k,v_k}$}
i \leq k\)}
% \(\ldots\), \Sem{\(a_k\)}{\Prog, \Env} \(\Rightarrow~\tuple{\Ctx_k,v_k}\)}
\RightLabel{(CallBuiltin)}
\BinaryInfC{\Sem{F($a_1, \ldots, a_k$)}{\Prog, \Env} $\Rightarrow$
$\tuple{ \mathit{eval}(\ptinline{F}(v_1,\ldots, v_k)), \Env}$}
\BinaryInfC{\Sem{F(\(a_1, \ldots, a_k\))}{\Prog, \Env} \(\Rightarrow\)
\(\tuple{ \mathit{eval}(\ptinline{F}(v_1,\ldots, v_k)), \Env}\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{$\ptinline{F($p_1, \ldots, p_k$);} \in \Prog$}
\AxiomC{\(\ptinline{F(\(p_1, \ldots, p_k\));} \in \Prog\)}
% \noLine
\AxiomC{\Sem{$a_i$}{\Prog, \Env_{i-1}} $\Rightarrow~ \tuple{v_i, \Env_i},
\AxiomC{\Sem{\(a_i\)}{\Prog, \Env_{i-1}} \(\Rightarrow~ \tuple{v_i, \Env_i},
~\forall
1 \leq
i \leq k$}
% $\ldots$, \Sem{$a_k$}{\Prog, \Env} $\Rightarrow~\tuple{\Ctx_k,v_k}$}
i \leq k\)}
% \(\ldots\), \Sem{\(a_k\)}{\Prog, \Env} \(\Rightarrow~\tuple{\Ctx_k,v_k}\)}
\RightLabel{(CallPrimitive)}
\BinaryInfC{\Sem{F($a_1, \ldots, a_k$)}{\Prog, \Env_0} $\Rightarrow$
$\tuple{ x, \{ x \mapsto \ptinline{F}(v_1,\ldots, v_k) \sep [] \} \cup \Env_k}$}
\BinaryInfC{\Sem{F(\(a_1, \ldots, a_k\))}{\Prog, \Env_0} \(\Rightarrow\)
\(\tuple{ x, \{ x \mapsto \ptinline{F}(v_1,\ldots, v_k) \sep [] \} \cup \Env_k}\)}
\end{prooftree}
\caption{\label{fig:4-rewrite-to-nzn-calls} Rewriting rules for partial evaluation
of \microzinc\ calls to \nanozinc.}
@ -453,10 +453,10 @@ suitable alpha renaming.
The rules in \cref{fig:4-rewrite-to-nzn-calls} handle function calls.
The first rule (Call) evaluates a function call expression in the context of a
\microzinc\ program $\Prog$ and \nanozinc\ program $\Env$. The rule first
evaluates all actual parameter expressions $a_i$, creating new contexts where
the evaluation results are bound to the formal parameters $p_i$. It then
evaluates the function body $\ptinline{E}$ on this context, and returns the
\microzinc\ program \(\Prog\) and \nanozinc\ program \(\Env\). The rule first
evaluates all actual parameter expressions \(a_i\), creating new contexts where
the evaluation results are bound to the formal parameters \(p_i\). It then
evaluates the function body \(\ptinline{E}\) on this context, and returns the
result.
The (CallBuiltin) rule applies to ``built-in'' functions that can be evaluated
@ -467,61 +467,61 @@ parameter values.
The (CallPrimitive) rule applies to non-built-in functions that are defined
without a function body. These are considered primitives, and as such simply
need to be transferred into the \nanozinc\ program. The rule evaluates all
actual parameters, and creates a new variable $x$ to store the result, which is
actual parameters, and creates a new variable \(x\) to store the result, which is
simply the function applied to the evaluated parameters.
\begin{figure*}
\centering
\begin{prooftree}
\AxiomC{\Sem{$\mathbf{I}$}{\Prog, \Env} $\Rightarrow (\Ctx, \Env')$}
\AxiomC{\Sem{$E$}{\Prog, \Env'} $\Rightarrow \tuple{v, \Env''}$}
\AxiomC{$x$ fresh}
\AxiomC{\Sem{\(\mathbf{I}\)}{\Prog, \Env} \(\Rightarrow (\Ctx, \Env')\)}
\AxiomC{\Sem{\(E\)}{\Prog, \Env'} \(\Rightarrow \tuple{v, \Env''}\)}
\AxiomC{\(x\) fresh}
\RightLabel{(LetC)}
\TrinaryInfC{\Sem{let \{ $\mathbf{I}$ \} in $E$}{\Prog, \Env} $\Rightarrow
\tuple{x, \{ x \mapsto v \sep \Ctx \} \cup \Env''}$}
\TrinaryInfC{\Sem{let \{ \(\mathbf{I}\) \} in \(E\)}{\Prog, \Env} \(\Rightarrow
\tuple{x, \{ x \mapsto v \sep \Ctx \} \cup \Env''}\)}
\end{prooftree}
% \begin{prooftree}
% \AxiomC{\Sem{$E_1$}{\Prog, \Env} $\Rightarrow \Ctx_1, r_1$}
% \AxiomC{\Sem{$E_2$}{\Prog, \Env} $\Rightarrow \Ctx_2, r_2$}
% \AxiomC{\Sem{\(E_1\)}{\Prog, \Env} \(\Rightarrow \Ctx_1, r_1\)}
% \AxiomC{\Sem{\(E_2\)}{\Prog, \Env} \(\Rightarrow \Ctx_2, r_2\)}
% \RightLabel{(Rel)}
% \BinaryInfC{\Sem{$E_1 \bowtie E_2$}{\Prog, \Env} $\Rightarrow \Ctx_1 \wedge \Ctx_2 \wedge (r_1 \bowtie r_2)$}
% \BinaryInfC{\Sem{\(E_1 \bowtie E_2\)}{\Prog, \Env} \(\Rightarrow \Ctx_1 \wedge \Ctx_2 \wedge (r_1 \bowtie r_2)\)}
% \end{prooftree}
\begin{prooftree}
\AxiomC{}
\RightLabel{(Item0)}
\UnaryInfC{\Sem{$\epsilon$}{\Prog, \Env} $\Rightarrow
(\ptinline{true}, \Env$)}
\UnaryInfC{\Sem{\(\epsilon\)}{\Prog, \Env} \(\Rightarrow
(\ptinline{true}, \Env\))}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{$\mathbf{I}$}{\Prog, \Env\ \cup\ \{x \mapsto\ \texttt{mkvar()} \sep\ []\}} $\Rightarrow (\Ctx, \Env')$}
\AxiomC{\Sem{\(\mathbf{I}\)}{\Prog, \Env\ \cup\ \{x \mapsto\ \texttt{mkvar()} \sep\ []\}} \(\Rightarrow (\Ctx, \Env')\)}
\RightLabel{(ItemT)}
\UnaryInfC{\Sem{$t:x, \mathbf{I}$}{\Prog, \Env} $\Rightarrow
(\Ctx, \Env')$}
\UnaryInfC{\Sem{\(t:x, \mathbf{I}\)}{\Prog, \Env} \(\Rightarrow
(\Ctx, \Env')\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{$E$}{\Prog, \Env} $\Rightarrow \tuple{v, \Env'}$}
\AxiomC{\Sem{$\mathbf{I}$}{\Prog, \Env' \cup\ \{x \mapsto\ v \sep\ [] \}} $\Rightarrow (\Ctx, \Env'')$}
\AxiomC{\Sem{\(E\)}{\Prog, \Env} \(\Rightarrow \tuple{v, \Env'}\)}
\AxiomC{\Sem{\(\mathbf{I}\)}{\Prog, \Env' \cup\ \{x \mapsto\ v \sep\ [] \}} \(\Rightarrow (\Ctx, \Env'')\)}
\RightLabel{(ItemTE)}
\BinaryInfC{\Sem{$t:x = E, \mathbf{I}$}{\Prog, \Env} $\Rightarrow
(\Ctx, \Env'')$}
\BinaryInfC{\Sem{\(t:x = E, \mathbf{I}\)}{\Prog, \Env} \(\Rightarrow
(\Ctx, \Env'')\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{$C$}{\Prog, \Env} $\Rightarrow \tuple{v, \Env'}$}
\AxiomC{\Sem{$\mathbf{I}$}{\Prog, \Env'} $\Rightarrow (\Ctx, \Env'')$}
\AxiomC{\Sem{\(C\)}{\Prog, \Env} \(\Rightarrow \tuple{v, \Env'}\)}
\AxiomC{\Sem{\(\mathbf{I}\)}{\Prog, \Env'} \(\Rightarrow (\Ctx, \Env'')\)}
\RightLabel{(ItemC)}
\BinaryInfC{\Sem{$\mbox{constraint~} C, \mathbf{I}$}{\Prog, \Env} $\Rightarrow
(\{v\}\cup\Ctx, \Env'')$}
\BinaryInfC{\Sem{\(\mbox{constraint~} C, \mathbf{I}\)}{\Prog, \Env} \(\Rightarrow
(\{v\}\cup\Ctx, \Env'')\)}
\end{prooftree}
\caption{\label{fig:4-rewrite-to-nzn-let} Rewriting rules for partial evaluation
of \microzinc\ let expressions to \nanozinc.}
\end{figure*}
The rules in \cref{fig:4-rewrite-to-nzn-let} considers let expressions. The
(LetC) rule generates the constraints $\phi$ and \nanozinc\ program $\Env'$
defined by the let items \textbf{I}, then evaluates the body expression $E$ in
this new context. It finally binds the result $v$ to a fresh variable $x$,
collecting the constraints $\phi$ that arose from the let items: $x\mapsto
v\sep\phi$. The (ItemT) rule handles introduction of new variables by adding
(LetC) rule generates the constraints \(\phi\) and \nanozinc\ program \(\Env'\)
defined by the let items \textbf{I}, then evaluates the body expression \(E\) in
this new context. It finally binds the result \(v\) to a fresh variable \(x\),
collecting the constraints \(\phi\) that arose from the let items: \(x\mapsto
v\sep\phi\). The (ItemT) rule handles introduction of new variables by adding
them to the context. The (ItemTE) rule handles introduction of new variables
with a defining equation by evaluating them in the current context and adding a
definition to the context to evaluate the result of the items. The (Item0) rule
@ -531,56 +531,56 @@ is the base case for a list of let items.
\centering
\begin{prooftree}
\RightLabel{(IdC)}
\AxiomC{$x \in \langle ident \rangle$}
\AxiomC{$v \in \langle literal \rangle$}
\BinaryInfC{\Sem{$x$}{\Prog, \{x \mapsto\ v \sep\ []\} \cup\ \Env} $\Rightarrow \tuple{v, \{x \mapsto v \sep [] \} \cup \Env}$}
\AxiomC{\(x \in \langle ident \rangle\)}
\AxiomC{\(v \in \langle literal \rangle\)}
\BinaryInfC{\Sem{\(x\)}{\Prog, \{x \mapsto\ v \sep\ []\} \cup\ \Env} \(\Rightarrow \tuple{v, \{x \mapsto v \sep [] \} \cup \Env}\)}
\end{prooftree}
\begin{prooftree}
\RightLabel{(IdX)}
\AxiomC{$x \in \langle ident \rangle$}
\AxiomC{$v$}
\AxiomC{$\phi$ otherwise}
\TrinaryInfC{\Sem{$x$}{\Prog, \{x \mapsto\ v \sep\ \phi\ \} \cup\ \Env} $\Rightarrow \tuple{x, \{x \mapsto v \sep \phi \} \cup \Env}$}
\AxiomC{\(x \in \langle ident \rangle\)}
\AxiomC{\(v\)}
\AxiomC{\(\phi\) otherwise}
\TrinaryInfC{\Sem{\(x\)}{\Prog, \{x \mapsto\ v \sep\ \phi\ \} \cup\ \Env} \(\Rightarrow \tuple{x, \{x \mapsto v \sep \phi \} \cup \Env}\)}
\end{prooftree}
\begin{prooftree}
\RightLabel{(Const)}
\AxiomC{$c$ constant}
\UnaryInfC{\Sem{c}{\Prog, \Env} $\Rightarrow \tuple{c, \Env}$}
\AxiomC{\(c\) constant}
\UnaryInfC{\Sem{c}{\Prog, \Env} \(\Rightarrow \tuple{c, \Env}\)}
\end{prooftree}
\begin{prooftree}
\RightLabel{(If$_T$)}
\AxiomC{\Sem{$C$}{\Prog, \Env} $\Rightarrow$ $\tuple{\ptinline{true}, \_}$}
\UnaryInfC{\Sem{if $C$ then $E_t$ else $E_e$ endif}{\Prog, \Env} $\Rightarrow$ \Sem{$E_t$}{\Prog, \Env}}
\RightLabel{(If\(_T\))}
\AxiomC{\Sem{\(C\)}{\Prog, \Env} \(\Rightarrow\) \(\tuple{\ptinline{true}, \_}\)}
\UnaryInfC{\Sem{if \(C\) then \(E_t\) else \(E_e\) endif}{\Prog, \Env} \(\Rightarrow\) \Sem{\(E_t\)}{\Prog, \Env}}
\end{prooftree}
\begin{prooftree}
\RightLabel{(If$_F$)}
\AxiomC{\Sem{$C$}{\Prog, \Env} $\Rightarrow$ $\tuple{\ptinline{false}, \_}$}
\UnaryInfC{\Sem{if $C$ then $E_t$ else $E_e$ endif}{\Prog, \Env} $\Rightarrow$ \Sem{$E_e$}{\Prog, \Env}}
\RightLabel{(If\(_F\))}
\AxiomC{\Sem{\(C\)}{\Prog, \Env} \(\Rightarrow\) \(\tuple{\ptinline{false}, \_}\)}
\UnaryInfC{\Sem{if \(C\) then \(E_t\) else \(E_e\) endif}{\Prog, \Env} \(\Rightarrow\) \Sem{\(E_e\)}{\Prog, \Env}}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{G}{\Prog,\Env} $\Rightarrow \tuple{ \ptinline{true}, \_}$}
\AxiomC{\Sem{$E$}{\Prog, \Env} $\Rightarrow \tuple {v, \Env'}$}
\AxiomC{\Sem{G}{\Prog,\Env} \(\Rightarrow \tuple{ \ptinline{true}, \_}\)}
\AxiomC{\Sem{\(E\)}{\Prog, \Env} \(\Rightarrow \tuple {v, \Env'}\)}
\RightLabel{(WhereT)}
\BinaryInfC{\Sem{$[E ~|~ \mbox{where~} G]$}{\Prog, \Env} $\Rightarrow
\tuple{[v], \Env'}$}
\BinaryInfC{\Sem{\([E ~|~ \mbox{where~} G]\)}{\Prog, \Env} \(\Rightarrow
\tuple{[v], \Env'}\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{G}{\Prog,\Env} $\Rightarrow \tuple{ \ptinline{false}, \_}$}
\AxiomC{\Sem{G}{\Prog,\Env} \(\Rightarrow \tuple{ \ptinline{false}, \_}\)}
\RightLabel{(WhereF)}
\UnaryInfC{\Sem{$[E ~|~ \mbox{where~} G]$}{\Prog, \Env} $\Rightarrow
\tuple{[], \Env}$}
\UnaryInfC{\Sem{\([E ~|~ \mbox{where~} G]\)}{\Prog, \Env} \(\Rightarrow
\tuple{[], \Env}\)}
\end{prooftree}
\begin{prooftree}
\AxiomC{\Sem{$\mathit{PE}$}{\Prog,\Env} $\Rightarrow \tuple{S, \_}$}
\AxiomC{\Sem{\(\mathit{PE}\)}{\Prog,\Env} \(\Rightarrow \tuple{S, \_}\)}
\noLine\
\UnaryInfC{\Sem{$[E ~|~ \mathit{GE} \mbox{~where~} G]$}{\Prog, \Env\ \cup\ \{ x\mapsto\
\UnaryInfC{\Sem{\([E ~|~ \mathit{GE} \mbox{~where~} G]\)}{\Prog, \Env\ \cup\ \{ x\mapsto\
v \sep\ []\}}}
\noLine\
\UnaryInfC{\hspace{8em} $\Rightarrow \tuple{A_v, \Env \cup \{x \mapsto v \sep []\} \cup \Env_v}, \forall
v \in S $}
\UnaryInfC{\hspace{8em} \(\Rightarrow \tuple{A_v, \Env \cup \{x \mapsto v \sep []\} \cup \Env_v}, \forall
v \in S \)}
\RightLabel{(ListG)}
\UnaryInfC{\Sem{$[E~|~ x \mbox{~in~} \mathit{PE}, \mathit{GE} \mbox{~where~} G]$}{\Prog, \Env} $\Rightarrow
\tuple{\mbox{concat} [ A_v ~|~ v \in S ], \Env \cup \bigcup_{v \in S} \Env_v}$}
\UnaryInfC{\Sem{\([E~|~ x \mbox{~in~} \mathit{PE}, \mathit{GE} \mbox{~where~} G]\)}{\Prog, \Env} \(\Rightarrow
\tuple{\mbox{concat} [ A_v ~|~ v \in S ], \Env \cup \bigcup_{v \in S} \Env_v}\)}
\end{prooftree}
\caption{\label{fig:4-rewrite-to-nzn-other} Rewriting rules for partial evaluation
of other \microzinc\ expressions to \nanozinc.}
@ -592,14 +592,14 @@ the details here.
The (IdX) and (IdC) rules look up a variable in the environment and return its
bound value (for constants) or the variable itself. The (Const) rule simply
returns the constant. The (If$_T$) and (If$_F$) rules evaluate the if condition
returns the constant. The (If\(_T\)) and (If\(_F\)) rules evaluate the if condition
and then return the result of the then or else branch appropriately. The
(WhereT) rule evaluates the guard of a where comprehension and if true returns
the resulting expression in a list. The (WhereF) rule evaluates the guard and
when false returns an empty list. The (ListG) rule evaluates the iteration set
$PE$ to get its value $S$, which must be fixed. It then evaluates the expression
$E$ with all the different possible values $v \in S$ of the generator $x$,
collecting the additional \nanozinc\ definitions $\Env_v$. It returns the
\(PE\) to get its value \(S\), which must be fixed. It then evaluates the expression
\(E\) with all the different possible values \(v \in S\) of the generator \(x\),
collecting the additional \nanozinc\ definitions \(\Env_v\). It returns the
concatenation of the resulting lists with all the additional \nanozinc\ items.
\subsection{Prototype Implementation}
@ -652,7 +652,7 @@ constraint, we can pick any value for it. The model without the variable is
therefore equisatisfiable with the original model.
Consider now the case where a variable in \nanozinc\ is only used in its own
auxiliary definitions (the \mzninline{@$\sep\phi$@} part).
auxiliary definitions (the \mzninline{@\(\sep\phi\)@} part).
\begin{example}\label{ex:4-absreif}
The following is a slight variation on the \minizinc\ fragment in
@ -672,16 +672,16 @@ auxiliary definitions (the \mzninline{@$\sep\phi$@} part).
constraint for the disjunction, which uses the variable \mzninline{b1} that
was introduced for \mzninline{abs(x) > y}:
\begin{mzn}
c @$\mapsto$@ true @$\sep$@ []
x @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
y @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
b0 @$\mapsto$@ int_abs(x, z) @$\sep$@ []
b1 @$\mapsto$@ int_gt(t,y) @$\sep$@ []
z @$\mapsto$@ mkvar(-infinity,infinity) @$\sep$@ []
t @$\mapsto$@ z @$\sep$@ [b0]
b2 @$\mapsto$@ bool_or(b1,c) @$\sep$@ []
true @$\mapsto$@ true @$\sep$@ [b2,c]
\begin{nzn}
c @\(\mapsto\)@ true @\(\sep\)@ []
x @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
y @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
b0 @\(\mapsto\)@ int_abs(x, z) @\(\sep\)@ []
b1 @\(\mapsto\)@ int_gt(t,y) @\(\sep\)@ []
z @\(\mapsto\)@ mkvar(-infinity,infinity) @\(\sep\)@ []
t @\(\mapsto\)@ z @\(\sep\)@ [b0]
b2 @\(\mapsto\)@ bool_or(b1,c) @\(\sep\)@ []
true @\(\mapsto\)@ true @\(\sep\)@ [b2,c]
\end{mzn}
Since \mzninline{c} is bound to \mzninline{true}, the disjunction
@ -699,12 +699,12 @@ auxiliary definitions (the \mzninline{@$\sep\phi$@} part).
and can be removed, and then \mzninline{z}. The resulting \nanozinc\ program
is much more compact:
\begin{mzn}
c @$\mapsto$@ true @$\sep$@ []
x @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
y @$\mapsto$@ mkvar(-10..10) @$\sep$@ []
true @$\mapsto$@ true @$\sep$@ []
\end{mzn}
\begin{nzn}
c @\(\mapsto\)@ true @\(\sep\)@ []
x @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
y @\(\mapsto\)@ mkvar(-10..10) @\(\sep\)@ []
true @\(\mapsto\)@ true @\(\sep\)@ []
\end{nzn}
We assume here that \mzninline{c}, \mzninline{x} and \mzninline{y} are used
in other parts of the model not shown here and therefore not removed.
@ -829,16 +829,16 @@ The more complicated case for \mzninline{x=y} is when both \mzninline{x} and
as \mzninline{constraint f(a)=g(b)}. Let us assume that part of the
corresponding \nanozinc\ code looks like this:
\begin{mzn}
x @$\mapsto$@ mkvar() @$\sep$@ [];
y @$\mapsto$@ mkvar() @$\sep$@ [];
b0 @$\mapsto$@ f_rel(a,x) @$\sep$@ [];
b1 @$\mapsto$@ g_rel(b,y) @$\sep$@ [];
t0 @$\mapsto$@ x @$\sep$@ [b0];
t1 @$\mapsto$@ y @$\sep$@ [b1];
b2 @$\mapsto$@ int_eq(t0,t1) @$\sep$@ [];
true @$\mapsto$@ true @$\sep$@ [b2];
\end{mzn}
\begin{nzn}
x @\(\mapsto\)@ mkvar() @\(\sep\)@ [];
y @\(\mapsto\)@ mkvar() @\(\sep\)@ [];
b0 @\(\mapsto\)@ f_rel(a,x) @\(\sep\)@ [];
b1 @\(\mapsto\)@ g_rel(b,y) @\(\sep\)@ [];
t0 @\(\mapsto\)@ x @\(\sep\)@ [b0];
t1 @\(\mapsto\)@ y @\(\sep\)@ [b1];
b2 @\(\mapsto\)@ int_eq(t0,t1) @\(\sep\)@ [];
true @\(\mapsto\)@ true @\(\sep\)@ [b2];
\end{nzn}
In this case, simply removing either \mzninline{t0} or \mzninline{t1} would not
be correct, since that would trigger the removal of the corresponding definition
@ -852,13 +852,13 @@ definition is removed. The interpreter moves all auxiliary constraints from
\mzninline{true} item, and then removes the \mzninline{int_eq} constraint and
\mzninline{t1}. The resulting \nanozinc\ looks like this:
\begin{mzn}
x @$\mapsto$@ mkvar() @$\sep$@ [];
b0 @$\mapsto$@ f_rel(a,x) @$\sep$@ [];
b1 @$\mapsto$@ g_rel(b,t0) @$\sep$@ [];
t0 @$\mapsto$@ x @$\sep$@ [b0];
true @$\mapsto$@ true @$\sep$@ [b1];
\end{mzn}
\begin{nzn}
x @\(\mapsto\)@ mkvar() @\(\sep\)@ [];
b0 @\(\mapsto\)@ f_rel(a,x) @\(\sep\)@ [];
b1 @\(\mapsto\)@ g_rel(b,t0) @\(\sep\)@ [];
t0 @\(\mapsto\)@ x @\(\sep\)@ [b0];
true @\(\mapsto\)@ true @\(\sep\)@ [b1];
\end{nzn}
The process of equality propagation is similar to unification in logic
programming \autocite{warren-1983-wam}. However, since equations in \minizinc\
@ -1081,7 +1081,7 @@ Times are averages of 10 runs.\footnote{All models obtained from
\Cref{sfig:4-compareruntime} compares the flattening time for each of the 100
instances. Points below the line indicate that the new system is faster. On
average, the new system achieves a speed-up of $2.3$, with very few instances
average, the new system achieves a speed-up of \(2.3\), with very few instances
not achieving any speedup. In terms of memory performance
(\cref{sfig:4-comparemem}), version 2.4.3 can sometimes still outperform the new
prototype. We have identified that the main memory bottlenecks are our currently