Instances For
Equations
- Esolangs.Cornucopia.CompatibleCnd defs fs = (Esolangs.Cornucopia.CompatibleDefs (Map.ofList defs) fs ∧ ∀ (fs' : Map String (List ℕ → ℕ)), Esolangs.Cornucopia.CompatibleDefs (Map.ofList defs) fs' → ∀ (name : String) (d : Esolangs.Cornucopia.Def) (f : List ℕ → ℕ), (name, d) ∈ defs → Map.get? name fs' = some f → Map.get! name fs = f)
Instances For
structure
Esolangs.Cornucopia.WFDefs
(defs : List (String × Def))
extends Esolangs.Cornucopia.WFDefs' defs :
Instances For
Equations
- Esolangs.Cornucopia.isBuiltin name = Esolangs.Cornucopia.builtins.any fun (x : Esolangs.Cornucopia.Builtin) => decide (x.name = name)
Instances For
Equations
- Esolangs.Cornucopia.findBuiltin name = (List.find? (fun (x : Esolangs.Cornucopia.Builtin) => decide (x.name = name)) Esolangs.Cornucopia.builtins).get!
Instances For
@[irreducible]
Equations
- (Esolangs.Cornucopia.Expr.arg i).decideEq (Esolangs.Cornucopia.Expr.arg j) = (i == j)
- (Esolangs.Cornucopia.Expr.call name₁ es₁).decideEq (Esolangs.Cornucopia.Expr.call name₂ es₂) = (name₁ == name₂ && decide (es₁.length = es₂.length) && (es₁.zip es₂).attach.all fun (x : { x : Esolangs.Cornucopia.Expr × Esolangs.Cornucopia.Expr // x ∈ es₁.zip es₂ }) => match x with | ⟨(x, y), _h⟩ => x.decideEq y)
- x✝¹.decideEq x✝ = false
Instances For
@[instance_reducible]
@[simp]
@[instance_reducible]
Equations
- Esolangs.Cornucopia.instBuiltinCName = { b := b, name_eq := ⋯ }
@[simp]
@[simp]
theorem
Esolangs.Cornucopia.IsBuiltin.get?_builtinDefs
{name : String}
[h : Cornucopia.BuiltinC name]
:
@[simp]
@[simp]
@[simp]
theorem
Esolangs.Cornucopia.WFDefs'.hasDef
{defs : List (String × Def)}
{name : String}
{d : Def}
(H : WFDefs' defs)
(h : Map.get? name (builtinDefs ∪ Map.ofList defs) = some d)
:
(Prog.ofDefs defs).HasDef name
theorem
Esolangs.Cornucopia.CompatibleDefs.alt₁
{defs : Map String Def}
{fs : Map String (List ℕ → ℕ)}
(h : CompatibleDefs defs fs)
:
CompatibleDefsAlt₁ defs fs
@[simp]
@[simp]
theorem
Esolangs.Cornucopia.WFDefs'.compatible_fs_aux₁
{defs : List (String × Def)}
{fs : Map String (List ℕ → ℕ)}
(H : WFDefs' defs)
(H₁ : CompatibleDefs (Map.ofList defs) fs)
:
(Prog.ofDefs defs).Compatible (builtinFs ∪ fs)
theorem
Esolangs.Cornucopia.WFDefs'.compatible_fs_aux₂
{defs : List (String × Def)}
{fs' : Map String (List ℕ → ℕ)}
(H : WFDefs' defs)
(H₂ : (Prog.ofDefs defs).Compatible (builtinFs ∪ fs'))
(h : ∀ (b : Builtin), b.name ∉ fs')
:
CompatibleDefs (Map.ofList defs) fs'
@[simp]
@[simp]
@[instance_reducible]
instance
Esolangs.Cornucopia.IsBuiltin.BuiltinC
{name : String}
[h : IsBuiltin name]
:
Cornucopia.BuiltinC name
Equations
- Esolangs.Cornucopia.IsBuiltin.BuiltinC = { b := Esolangs.Cornucopia.findBuiltin name, name_eq := ⋯ }
theorem
Esolangs.Cornucopia.WFDefs'.wf'
{defs : List (String × Def)}
(H : WFDefs' defs)
:
(Prog.ofDefs defs).WF'
theorem
Esolangs.Cornucopia.WFDefs.wf
{defs : List (String × Def)}
(H : WFDefs defs)
:
(Prog.ofDefs defs).WF
@[simp]
@[instance_reducible]
@[instance_reducible]
theorem
Esolangs.Cornucopia.WFDefs'.compatible
{defs : List (String × Def)}
{fs : Map String (List ℕ → ℕ)}
(H : WFDefs' defs)
(H₁ : CompatibleDefs (Map.ofList defs) fs)
:
(Prog.ofDefs defs).Compatible (builtinFs ∪ fs)
theorem
Esolangs.Cornucopia.WFDefs'.wf
{defs : List (String × Def)}
(H : WFDefs' defs)
(h : ∃ (fs : Map String (List ℕ → ℕ)), CompatibleCnd defs fs)
:
(Prog.ofDefs defs).WF
@[instance_reducible]
Equations
@[instance_reducible]
Equations
@[instance_reducible]
Equations
@[instance_reducible]
Equations
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
theorem
Esolangs.Cornucopia.Prog.Compatible.get!_builtin
{prog : Prog}
{fs : Map String (List ℕ → ℕ)}
{name : String}
[h : BuiltinC name]
(H : prog.Compatible fs)
:
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.hasDef_builtin
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
prog.HasDef name
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.mem_defs_builtin
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.def?_builtin_eq
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.def_builtin_eq
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.arity_builtin_eq
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
@[simp]
theorem
Esolangs.Cornucopia.Prog.WFBuiltins.expr_builtin_eq
{prog : Prog}
{name : String}
[h₁ : prog.WFBuiltins]
[h₂ : BuiltinC name]
:
@[instance_reducible]
Equations
- Esolangs.Cornucopia.instDecidableEqExpr x✝¹ x✝ = decidable_of_bool (x✝¹.decideEq x✝) ⋯
Equations
Instances For
@[instance_reducible]
@[instance_reducible]
theorem
Esolangs.Cornucopia.Prog.def?_ofDefs
{defs : List (String × Def)}
{name : String}
(h : (List.map (fun (x : String × Def) => x.1) defs).Nodup)
:
(ofDefs defs).def? name = (Option.map Prod.snd (List.find? (fun (x : String × Def) => decide (x.1 = name)) defs)).or
(Option.map Builtin.def (List.find? (fun (x : Builtin) => decide (x.name = name)) builtins))
theorem
Esolangs.Cornucopia.imp_fs_and_of
{fs : Map String (List ℕ → ℕ)}
{name : String}
{y z : List ℕ → ℕ}
{p : List ℕ → Prop}
{n : ℕ}
(h₁ : Map.get? name fs = some (fn n y))
(h₂ : ∀ (xs : List ℕ), xs.length = n → z xs = y xs)
(h₃ : Map.get! name (builtinFs ∪ fs) = fn n z → ∀ (xs : List ℕ), p xs)
(h₀ : ¬IsBuiltin name := by decide)
(xs : List ℕ)
: