Translation
We write ⟦e
⟧Ξ to denote the translation of SimplicityHL expression e
using environment Ξ from A.
The translation produces a Simplicity expression with source type A.
The target type depends on the SimplicityHL expression e
.
Unit literal
⟦()
⟧Ξ = unit: A → 𝟙
Product constructor
If Ctx(Ξ) ⊩ b
: B
If Ctx(Ξ) ⊩ c
: C
Then ⟦(b, c)
⟧Ξ = pair ⟦b
⟧Ξ ⟦c
⟧Ξ: A → B × C
Left constructor
If Ctx(Ξ) ⊩ b
: B
Then ⟦Left(b)
⟧Ξ = injl ⟦b
⟧Ξ: A → B + C
For any C
Right constructor
If Ctx(Ξ) ⊩ c
: C
Then ⟦Right(c)
⟧Ξ = injr ⟦c
⟧Ξ: A → B + C
For any B
Bit string literal
If s
is a bit string of 2^n bits
Then ⟦0bs
⟧Ξ = comp unit const 0bs: A → 𝟚^(2^n)
Byte string literal
If s
is a hex string of 2^n digits
Then ⟦0xs
⟧Ξ = comp unit const 0xs: A → 𝟚^(4 * 2^n)
Variable
If Ctx(Ξ)(v
) = B
Then ⟦v
⟧Ξ = Ξ(v
): A → B
Witness value
Ctx(Ξ) ⊩ witness(name)
: B
Then ⟦witness(name)
⟧Ξ = witness: A → B
Jet
If j
is the name of a jet of type B → C
If Ctx(Ξ) ⊩ b
: B
Then ⟦jet::j b
⟧Ξ = comp ⟦b
⟧Ξ j: A → C
Chaining
If Ctx(Ξ) ⊩ b
: 𝟙
If Ctx(Ξ) ⊩ c
: C
Then ⟦b; c
⟧Ξ = comp (pair ⟦b
⟧Ξ ⟦c
⟧Ξ) (drop iden): A → C
Let statement
If Ctx(Ξ) ⊩ b
: B
If Product(PEnv(B, p
), Ξ) ⊩ c
: C
Then ⟦let p: B = b; c
⟧Ξ = comp (pair ⟦b
⟧Ξ iden) ⟦c
⟧Product(PEnv(B, p
), Ξ): A → C
Match statement
If Ctx(Ξ) ⊩ a
: B + C
If Product(PEnv(B, x
), Ξ) ⊩ b
: D
If Product(PEnv(C, y
), Ξ) ⊩ c
: D
Then ⟦match a { Left(x) => b, Right(y) => c, }
⟧Ξ = comp (pair ⟦a
⟧Ξ iden) (case ⟦b
⟧Product(PEnv(B, x
), Ξ) ⟦c
⟧Product(PEnv(C, y
), Ξ)): A → D
Left unwrap
If Ctx(Ξ) ⊩ b
: B + C
Then ⟦b.unwrap_left()
⟧Ξ = comp (pair ⟦b
⟧Ξ unit) (assertl iden #{fail 0}): A → B
Right unwrap
If Ctx(Ξ) ⊩ c
: B + C
Then ⟦c.unwrap_right()
⟧Ξ = comp (pair ⟦c
⟧Ξ unit) (assertr #{fail 0} iden): A → C