Possible types of modules
- proc : ProcedureSignature → ModuleTypeRep
- prod : ModuleTypeRep → ModuleTypeRep → ModuleTypeRep
- arr : ModuleTypeRep → ModuleTypeRep → ModuleTypeRep
- unit : ModuleTypeRep
Instances For
Module context typing: Types of a given module contexts; just a list of module types
- empty : ModuleContext
- append : ModuleContext → ModuleTypeRep → ModuleContext
Instances For
Pointer into a module context; type safe for a given module context typing
- zero {a : ModuleTypeRep} {Γ : ModuleContext} : ModuleContextIdx (Γ.append a) a
- succ {Γ : ModuleContext} {a b : ModuleTypeRep} : ModuleContextIdx Γ a → ModuleContextIdx (Γ.append b) a
Instances For
Instances For
Note: lives in GaudisCrypt.TypedModules, not in GaudisCrypt.HoleSigs, so that it does not
clash with GaudisCrypt.HoleSigs.toModuleTypeRepTuple from Language/ModuleExpressions.lean
(same name, different ModuleTypeRep). Dot notation on a HoleSigs therefore does not find
it; write HoleSigs.toModuleTypeRepTuple holes.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.HoleSigs.toModuleTypeRepTuple GaudisCrypt.HoleSigs.empty = GaudisCrypt.TypedModules.ModuleTypeRep.unit
Instances For
ModuleExpression Γ T is the type of all module expressions that are well-typed in
module contexts of type Γ and have type T.
- proc {Δ : ModuleContext} {sig : ProcedureSignature} : Procedure sig → ModuleExpression Δ (ModuleTypeRep.proc sig)
- procHoles {Δ : ModuleContext} {holes : HoleSigs} {sig : ProcedureSignature} : holes.NonEmpty → ProcedureWithHoles holes sig → ModuleExpression Δ ((HoleSigs.toModuleTypeRepTuple holes).arr (ModuleTypeRep.proc sig))
- var {Δ : ModuleContext} {M : ModuleTypeRep} : ModuleContextIdx Δ M → ModuleExpression Δ M
- app {Δ : ModuleContext} {A B : ModuleTypeRep} : ModuleExpression Δ (A.arr B) → ModuleExpression Δ A → ModuleExpression Δ B
- fst {Δ : ModuleContext} {A B : ModuleTypeRep} : ModuleExpression Δ (A.prod B) → ModuleExpression Δ A
- snd {Δ : ModuleContext} {A B : ModuleTypeRep} : ModuleExpression Δ (A.prod B) → ModuleExpression Δ B
- abs {B : ModuleTypeRep} {Δ : ModuleContext} {A : ModuleTypeRep} : ModuleExpression (Δ.append A) B → ModuleExpression Δ (A.arr B)
- pair {Δ : ModuleContext} {A B : ModuleTypeRep} : ModuleExpression Δ A → ModuleExpression Δ B → ModuleExpression Δ (A.prod B)
- unit {Δ : ModuleContext} : ModuleExpression Δ ModuleTypeRep.unit
Instances For
Equations
Instances For
Equations
- GaudisCrypt.TypedModules.instDecidableIsPair (a.pair a_1) = isTrue ⋯
- GaudisCrypt.TypedModules.instDecidableIsPair (GaudisCrypt.TypedModules.ModuleExpression.var a) = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsPair (a.app a_1) = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsPair a.fst = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsPair a.snd = isFalse Bool.false_ne_true
Equations
Instances For
Instances For
Instances For
Equations
Instances For
Equations
- GaudisCrypt.TypedModules.instDecidableIsAbs = isTrue ⋯
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
- GaudisCrypt.TypedModules.instDecidableIsAbs = isFalse Bool.false_ne_true
Instances For
Equations
Instances For
Equations
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isTrue trivial
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcHoles = isFalse not_false
IsProcTuple m holds when m is a right-nested tuple of hole-free procedures:
either .proc _, or .pair (.proc _) rest with IsProcTuple rest. These are exactly
the ground arguments a procedure-with-holes can be instantiated with (the module-level
analogue of STLC BasicTerms).
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.instDecidableIsProcTuple GaudisCrypt.TypedModules.ModuleExpression.unit = isTrue trivial
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (GaudisCrypt.TypedModules.ModuleExpression.unit.pair rest) = isFalse GaudisCrypt.TypedModules.instDecidableIsProcTuple._proof_1
- GaudisCrypt.TypedModules.instDecidableIsProcTuple ((GaudisCrypt.TypedModules.ModuleExpression.var a_2).pair rest) = isFalse ⋯
- GaudisCrypt.TypedModules.instDecidableIsProcTuple ((a_2.app a_3).pair rest) = isFalse ⋯
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (a_2.fst.pair rest) = isFalse ⋯
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (a_2.snd.pair rest) = isFalse ⋯
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (a_2.abs.pair rest) = isFalse GaudisCrypt.TypedModules.instDecidableIsProcTuple._proof_1
- GaudisCrypt.TypedModules.instDecidableIsProcTuple ((a_2.pair a_3).pair rest) = isFalse GaudisCrypt.TypedModules.instDecidableIsProcTuple._proof_1
- GaudisCrypt.TypedModules.instDecidableIsProcTuple ((GaudisCrypt.TypedModules.ModuleExpression.procHoles a_2 a_3).pair rest) = isFalse GaudisCrypt.TypedModules.instDecidableIsProcTuple._proof_1
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (GaudisCrypt.TypedModules.ModuleExpression.proc a) = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (GaudisCrypt.TypedModules.ModuleExpression.var a) = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (a.app a_1) = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple a.fst = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple a.snd = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple a.abs = isFalse not_false
- GaudisCrypt.TypedModules.instDecidableIsProcTuple (GaudisCrypt.TypedModules.ModuleExpression.procHoles a a_1) = isFalse not_false
A type that can be the argument type of a procedure-with-holes: a right-nested tuple of procedure types.
Equations
Instances For
Instances For
Beta-normal form: no beta-redex anywhere in the term.
- neutral {Δ : ModuleContext} {T : ModuleTypeRep} {e : ModuleExpression Δ T} : Neutral e → Normal e
- abs {Δ : ModuleContext} {A B : ModuleTypeRep} {body : ModuleExpression (Δ.append A) B} : Normal body → Normal body.abs
- pair {Δ : ModuleContext} {A B : ModuleTypeRep} {a : ModuleExpression Δ A} {b : ModuleExpression Δ B} : Normal a → Normal b → Normal (a.pair b)
- proc {Δ : ModuleContext} {x✝ : ProcedureSignature} {p : Procedure x✝} : Normal (ModuleExpression.proc p)
- procHoles {Δ : ModuleContext} {holes : HoleSigs} {sig : ProcedureSignature} {ne : holes.NonEmpty} {p : ProcedureWithHoles holes sig} : Normal (ModuleExpression.procHoles ne p)
- unit {Δ : ModuleContext} : Normal ModuleExpression.unit
Instances For
Neutral form: no outermost redex. Either the head is a variable, or it is a
procedure-with-holes applied to a normal argument that is not a proc-tuple (so the
δ-rule cannot fire) — both are stuck.
Neutral f in app rules out app (abs ..) ...
Neutral e in fst/snd rules out fst (pair ..) / snd (pair ..).
- var {Δ : ModuleContext} {T : ModuleTypeRep} {r : ModuleContextIdx Δ T} : Neutral (ModuleExpression.var r)
- app {Δ : ModuleContext} {A B : ModuleTypeRep} {f : ModuleExpression Δ (A.arr B)} {arg : ModuleExpression Δ A} : Neutral f → Normal arg → Neutral (f.app arg)
- appProcHoles {Δ : ModuleContext} {A B : ModuleTypeRep} {f : ModuleExpression Δ (A.arr B)} {arg : ModuleExpression Δ A} : IsProcHoles f → Normal arg → ¬IsProcTuple arg → Neutral (f.app arg)
- fst {Δ : ModuleContext} {T x✝ : ModuleTypeRep} {e : ModuleExpression Δ (T.prod x✝)} : Neutral e → Neutral e.fst
- snd {Δ : ModuleContext} {T x✝ : ModuleTypeRep} {e : ModuleExpression Δ (x✝.prod T)} : Neutral e → Neutral e.snd
Instances For
Beta-normal form for closed terms (empty context).
Neutral terms cannot occur (they would require a variable in the empty context),
so this has fewer cases than Normal. The abs body is in a one-variable context
and therefore still uses the general Normal.
- proc {x✝ : ProcedureSignature} {p : Procedure x✝} : NormalClosed (ModuleExpression.proc p)
- procHoles {x✝ : HoleSigs} {n : x✝.NonEmpty} {x✝¹ : ProcedureSignature} {p : ProcedureWithHoles x✝ x✝¹} : NormalClosed (ModuleExpression.procHoles n p)
- abs {A B : ModuleTypeRep} {body : ModuleExpression (ModuleContext.empty.append A) B} : Normal body → NormalClosed body.abs
- pair {A B : ModuleTypeRep} {a : ModuleExpression ModuleContext.empty A} {b : ModuleExpression ModuleContext.empty B} : NormalClosed a → NormalClosed b → NormalClosed (a.pair b)
- unit : NormalClosed ModuleExpression.unit
Instances For
Extends a renaming ρ : ModuleContextIdx Δ → ModuleContextIdx Γ to work under one
binder of type A.
The bound variable .zero maps to itself; outer variables .succ r are renamed by ρ
and re-wrapped with .succ. This is the typed analogue of incrementing the cutoff c
in Pierce's shift operation.
Equations
Instances For
Applies a renaming ρ : ModuleContextIdx Δ → ModuleContextIdx Γ to every variable in a term,
producing a term over context Γ.
Goes under binders by lifting ρ with liftRename.
This is the typed analogue of Pierce's shift ↑_c^d, where ρ encodes both the
cutoff c and the displacement d.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ GaudisCrypt.TypedModules.ModuleExpression.unit = GaudisCrypt.TypedModules.ModuleExpression.unit
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ (GaudisCrypt.TypedModules.ModuleExpression.proc p) = GaudisCrypt.TypedModules.ModuleExpression.proc p
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ (GaudisCrypt.TypedModules.ModuleExpression.procHoles ne p) = GaudisCrypt.TypedModules.ModuleExpression.procHoles ne p
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ (GaudisCrypt.TypedModules.ModuleExpression.var r) = GaudisCrypt.TypedModules.ModuleExpression.var (ρ r)
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ e.fst = (GaudisCrypt.TypedModules.ModuleExpression.rename (fun {T : GaudisCrypt.TypedModules.ModuleTypeRep} => ρ) e).fst
- GaudisCrypt.TypedModules.ModuleExpression.rename ρ e.snd = (GaudisCrypt.TypedModules.ModuleExpression.rename (fun {T : GaudisCrypt.TypedModules.ModuleTypeRep} => ρ) e).snd
Instances For
Extends a simultaneous substitution σ : ModuleContextIdx Δ → ModuleExpression Γ
to work under one binder of type A,
yielding a substitution ModuleContextIdx (Δ,A) → ModuleExpression (Γ,A).
The bound variable .zero maps to the fresh variable .var .zero;
outer variables .succ r are substituted by σ r and then weakened into the
extended context Γ,A by renaming with .succ.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.liftSubstitution σ GaudisCrypt.TypedModules.ModuleContextIdx.zero = GaudisCrypt.TypedModules.ModuleExpression.var GaudisCrypt.TypedModules.ModuleContextIdx.zero
Instances For
Applies a simultaneous substitution σ : ModuleContextIdx Δ → ModuleExpression Γ
to every variable in a term, producing a term over context Γ.
Goes under binders by lifting σ with liftSubst.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.substituteSimultaneously σ GaudisCrypt.TypedModules.ModuleExpression.unit = GaudisCrypt.TypedModules.ModuleExpression.unit
- GaudisCrypt.TypedModules.substituteSimultaneously σ (GaudisCrypt.TypedModules.ModuleExpression.proc p) = GaudisCrypt.TypedModules.ModuleExpression.proc p
- GaudisCrypt.TypedModules.substituteSimultaneously σ (GaudisCrypt.TypedModules.ModuleExpression.procHoles ne p) = GaudisCrypt.TypedModules.ModuleExpression.procHoles ne p
- GaudisCrypt.TypedModules.substituteSimultaneously σ (GaudisCrypt.TypedModules.ModuleExpression.var r) = σ r
- GaudisCrypt.TypedModules.substituteSimultaneously σ e.fst = (GaudisCrypt.TypedModules.substituteSimultaneously (fun {T : GaudisCrypt.TypedModules.ModuleTypeRep} => σ) e).fst
- GaudisCrypt.TypedModules.substituteSimultaneously σ e.snd = (GaudisCrypt.TypedModules.substituteSimultaneously (fun {T : GaudisCrypt.TypedModules.ModuleTypeRep} => σ) e).snd
Instances For
The single-variable substitution map used as the σ argument to substSimultaneous:
de Bruijn index 0 (the outermost bound variable) maps to arg;
any other index k+1 maps back to the variable at index k.
Equations
Instances For
Single-variable de Bruijn substitution: replaces de Bruijn index 0 in body with arg.
Implemented via substSimultaneous with the point substitution substVar arg.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Convert a HoleSigs.Instantiation into the corresponding module-expression tuple.
Like HoleSigs.toModuleTypeRepTuple, this lives in GaudisCrypt.TypedModules rather than in
GaudisCrypt.HoleSigs, so dot notation on an Instantiation does not find it.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.HoleSigs.Instantiation.toModuleTuple x_2 = GaudisCrypt.TypedModules.ModuleExpression.unit
- GaudisCrypt.TypedModules.HoleSigs.Instantiation.toModuleTuple inst = (GaudisCrypt.TypedModules.ModuleExpression.proc inst).pair GaudisCrypt.TypedModules.ModuleExpression.unit
Instances For
Non-deterministic single-step reduction: all possible one-step reductions.
- beta {Δ : ModuleContext} {A T : ModuleTypeRep} {body : ModuleExpression (Δ.append A) T} {arg : ModuleExpression Δ A} : ReductionStep (body.abs.app arg) (substitute body arg)
- appL {Δ : ModuleContext} {A T : ModuleTypeRep} {f f' : ModuleExpression Δ (A.arr T)} {arg : ModuleExpression Δ A} : ReductionStep f f' → ReductionStep (f.app arg) (f'.app arg)
- appR {Δ : ModuleContext} {A T : ModuleTypeRep} {f : ModuleExpression Δ (A.arr T)} {arg arg' : ModuleExpression Δ A} : ReductionStep arg arg' → ReductionStep (f.app arg) (f.app arg')
- lam {Δ : ModuleContext} {A B : ModuleTypeRep} {body body' : ModuleExpression (Δ.append A) B} : ReductionStep body body' → ReductionStep body.abs body'.abs
- pairL {Δ : ModuleContext} {A B : ModuleTypeRep} {a a' : ModuleExpression Δ A} {b : ModuleExpression Δ B} : ReductionStep a a' → ReductionStep (a.pair b) (a'.pair b)
- pairR {Δ : ModuleContext} {A B : ModuleTypeRep} {a : ModuleExpression Δ A} {b b' : ModuleExpression Δ B} : ReductionStep b b' → ReductionStep (a.pair b) (a.pair b')
- fstPair {Δ : ModuleContext} {A B : ModuleTypeRep} {a : ModuleExpression Δ A} {b : ModuleExpression Δ B} : ReductionStep (a.pair b).fst a
- fst {Δ : ModuleContext} {A T : ModuleTypeRep} {e e' : ModuleExpression Δ (A.prod T)} : ReductionStep e e' → ReductionStep e.fst e'.fst
- sndPair {Δ : ModuleContext} {A B : ModuleTypeRep} {a : ModuleExpression Δ A} {b : ModuleExpression Δ B} : ReductionStep (a.pair b).snd b
- snd {Δ : ModuleContext} {A T : ModuleTypeRep} {e e' : ModuleExpression Δ (A.prod T)} : ReductionStep e e' → ReductionStep e.snd e'.snd
- delta
{Δ : ModuleContext}
{holes : HoleSigs}
{sigs : ProcedureSignature}
{ne : holes.NonEmpty}
{proc : ProcedureWithHoles holes sigs}
(instantiation : holes.Instantiation)
: ReductionStep ((ModuleExpression.procHoles ne proc).app (HoleSigs.Instantiation.toModuleTuple instantiation))
(ModuleExpression.proc (proc.instantiate instantiation))
δ-reduction: a procedure-with-holes applied to a ground proc-tuple argument is instantiated, producing the closed procedure
substituteProcedure proc args.
Instances For
Equations
Instances For
Inverse of HoleSigs.Instantiation.toModuleTuple: extract a Procedure for each hole index
from a ModuleExpression that is a right-nested tuple of procedures (IsProcTuple).
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.procTupleLookup x_3 x_4 = PUnit.unit
Instances For
Round-trip: converting a proc-tuple back to an instantiation and then to a tuple recovers the original expression.
Equations
- One or more equations did not get rendered due to their size.
- GaudisCrypt.TypedModules.cbvReductionStep (GaudisCrypt.TypedModules.ModuleExpression.proc p) nn_2 = absurd ⋯ nn_2
- GaudisCrypt.TypedModules.cbvReductionStep (GaudisCrypt.TypedModules.ModuleExpression.procHoles a p) nn_2 = absurd ⋯ nn_2
- GaudisCrypt.TypedModules.cbvReductionStep body.abs nn_2 = (GaudisCrypt.TypedModules.cbvReductionStep body ⋯).abs
- GaudisCrypt.TypedModules.cbvReductionStep (GaudisCrypt.TypedModules.ModuleExpression.var n) nn_2 = absurd ⋯ nn_2
- GaudisCrypt.TypedModules.cbvReductionStep GaudisCrypt.TypedModules.ModuleExpression.unit nn_2 = absurd ⋯ nn_2
Instances For
Equations
- (GaudisCrypt.TypedModules.ModuleExpression.proc p).erasedEqual (GaudisCrypt.TypedModules.ModuleExpression.proc p') = (sig = sig' ∧ p ≍ p')
- (GaudisCrypt.TypedModules.ModuleExpression.procHoles a p).erasedEqual (GaudisCrypt.TypedModules.ModuleExpression.procHoles a_1 p') = (holes = holes' ∧ sig = sig' ∧ p ≍ p')
- (GaudisCrypt.TypedModules.ModuleExpression.var r).erasedEqual (GaudisCrypt.TypedModules.ModuleExpression.var r') = (r.toNat = r'.toNat)
- (f.app a).erasedEqual (f'.app a') = (f.erasedEqual f' ∧ a.erasedEqual a')
- e.fst.erasedEqual e'.fst = e.erasedEqual e'
- e.snd.erasedEqual e'.snd = e.erasedEqual e'
- (a.pair b).erasedEqual (a'.pair b') = (a.erasedEqual a' ∧ b.erasedEqual b')
- body.abs.erasedEqual body'.abs = body.erasedEqual body'
- GaudisCrypt.TypedModules.ModuleExpression.unit.erasedEqual GaudisCrypt.TypedModules.ModuleExpression.unit = True
- m.erasedEqual m' = False
Instances For
toModuleTuple inst always satisfies IsProcTuple.
Equations
Instances For
- expression : ModuleExpression ModuleContext.empty T
- normal : NormalClosed self.expression
Instances For
Equations
- m.toModule = { expression := GaudisCrypt.TypedModules.reduce m, normal := ⋯ }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- m.fst' = m.expression.fst.toModule
Instances For
Equations
- m.snd' = m.expression.snd.toModule
Instances For
Equations
- m1.pair' m2 = (m1.expression.pair m2.expression).toModule
Instances For
Equations
Instances For
- moduleTypeRep : ModuleTypeRep
Instances
Equations
- GaudisCrypt.TypedModules.instIsModuleModule = { moduleTypeRep := t, isModule := ⋯ }
Equations
Instances For
Equations
- GaudisCrypt.TypedModules.Module.cast T m = ⋯ ▸ m
Instances For
Equations
- GaudisCrypt.TypedModules.Module.cast' T m = ⋯ ▸ m
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
Instances For
Equations
- GaudisCrypt.TypedModules.instIsModuleProc = { moduleTypeRep := GaudisCrypt.TypedModules.ModuleTypeRep.proc sig, isModule := ⋯ }
Equations
- m.app' m' = (m.expression.app m'.expression).toModule
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Instances For
- main : Module (ModuleTypeRep.proc sig)
- aux : Module (ModuleTypeRep.proc sig)
Instances For
Instances For
Equations
- GaudisCrypt.TypedModules.TestModule.mk str = str.main.pair' str.aux