# expression.infiltrate¶

$\newcommand{\Ed}{\mathsf{E}} \newcommand{\Fd}{\mathsf{F}} \newcommand{\Gd}{\mathsf{G}} \newcommand{\infiltrate}{\mathbin{\uparrow}} \newcommand{\shuffle}{\mathbin{\between}}$ Create the infiltration product of two expressions. In a way the infiltration product combines the conjunction (synchronized product) and the shuffle product.

## Examples¶

In :
import vcsn
c = vcsn.context('lal_char, seriesset<lal_char, z>')
exp = c.expression
c

Out:
$\{\ldots\}\to\mathsf{Series}[\{\ldots\}\to\mathbb{Z}]$

The following simple example aims at emphasizing that the transitions of the infiltration combine those of the shuffle and the conjunction products.

In :
x = exp("<x>a"); x

Out:
$\left\langle x \right\rangle \,a$
In :
y = exp("<y>a"); y

Out:
$\left\langle y \right\rangle \,a$
In :
conj = x & y ; conj

Out:
$\left\langle x \, y \right\rangle \,a$
In :
shuff = x.shuffle(y) ; shuff

Out:
$\left\langle x \right\rangle \,a \between \left\langle y \right\rangle \,a$
In :
inf = x.infiltrate(y) ; inf

Out:
$\left\langle x \right\rangle \,a \uparrow \left\langle y \right\rangle \,a$
In :
inf.automaton() == (conj + shuff).automaton()

Out:
True

### Associativity¶

This operator is associative: $(\Ed \infiltrate \Fd) \infiltrate \Gd \equiv \Ed \infiltrate (\Fd \infiltrate \Gd)$, i.e., both expressions denote the same series.

In :
x = exp('<x>a', 'trivial')
y = exp('<y>a', 'trivial')
z = exp('<z>a', 'trivial')

In :
x.infiltrate(y).infiltrate(z).automaton()

Out:
In :
x.infiltrate(y.infiltrate(z)).automaton()

Out: