diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 747f88e204..5ed9d0264d 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -233,7 +233,9 @@ let post_tile_indent = (t: Tile.t) => { let complete_fun = Tile.is_complete(t) && ( - t.label == Form.get("fun_").label || t.label == Form.get("if_").label + t.label == Form.get("fun_").label + || t.label == Form.get("typfun").label + || t.label == Form.get("if_").label ); let missing_right_extreme = Tile.r_shard(t) < List.length(t.label) - 1; complete_fun || missing_right_extreme; diff --git a/src/haz3lcore/assistant/AssistantForms.re b/src/haz3lcore/assistant/AssistantForms.re index b9fb8bffa8..2080d9427f 100644 --- a/src/haz3lcore/assistant/AssistantForms.re +++ b/src/haz3lcore/assistant/AssistantForms.re @@ -25,6 +25,7 @@ module Typ = { let of_leading_delim: list((Token.t, Typ.t)) = [ ("case" ++ leading_expander, unk), ("fun" ++ leading_expander, Arrow(unk, unk)), + ("typfun" ++ leading_expander, Forall("", unk)), ("if" ++ leading_expander, unk), ("let" ++ leading_expander, unk), ("test" ++ leading_expander, Prod([])), diff --git a/src/haz3lcore/dynamics/Constraint.re b/src/haz3lcore/dynamics/Constraint.re new file mode 100644 index 0000000000..a56f435e55 --- /dev/null +++ b/src/haz3lcore/dynamics/Constraint.re @@ -0,0 +1,153 @@ +open Sexplib.Std; + +[@deriving (show({with_path: false}), sexp, yojson)] +type t = + | Truth + | Falsity + | Hole + | Int(int) + | NotInt(int) + | Float(float) + | NotFloat(float) + | String(string) + | NotString(string) + | And(t, t) + | Or(t, t) + | InjL(t) + | InjR(t) + | Pair(t, t); + +let rec dual = (c: t): t => + switch (c) { + | Truth => Falsity + | Falsity => Truth + | Hole => Hole + | Int(n) => NotInt(n) + | NotInt(n) => Int(n) + | Float(n) => NotFloat(n) + | NotFloat(n) => Float(n) + | String(s) => NotString(s) + | NotString(s) => String(s) + | And(c1, c2) => Or(dual(c1), dual(c2)) + | Or(c1, c2) => And(dual(c1), dual(c2)) + | InjL(c1) => Or(InjL(dual(c1)), InjR(Truth)) + | InjR(c2) => Or(InjR(dual(c2)), InjL(Truth)) + | Pair(c1, c2) => + Or( + Pair(c1, dual(c2)), + Or(Pair(dual(c1), c2), Pair(dual(c1), dual(c2))), + ) + }; + +/** substitute Truth for Hole */ +let rec truify = (c: t): t => + switch (c) { + | Hole => Truth + | Truth + | Falsity + | Int(_) + | NotInt(_) + | Float(_) + | NotFloat(_) + | String(_) + | NotString(_) => c + | And(c1, c2) => And(truify(c1), truify(c2)) + | Or(c1, c2) => Or(truify(c1), truify(c2)) + | InjL(c) => InjL(truify(c)) + | InjR(c) => InjR(truify(c)) + | Pair(c1, c2) => Pair(truify(c1), truify(c2)) + }; + +/** substitute Falsity for Hole */ +let rec falsify = (c: t): t => + switch (c) { + | Hole => Falsity + | Truth + | Falsity + | Int(_) + | NotInt(_) + | Float(_) + | NotFloat(_) + | String(_) + | NotString(_) => c + | And(c1, c2) => And(falsify(c1), falsify(c2)) + | Or(c1, c2) => Or(falsify(c1), falsify(c2)) + | InjL(c) => InjL(falsify(c)) + | InjR(c) => InjR(falsify(c)) + | Pair(c1, c2) => Pair(falsify(c1), falsify(c2)) + }; + +let is_injL = + fun + | InjL(_) => true + | _ => false; + +let is_injR = + fun + | InjR(_) => true + | _ => false; + +let unwrapL = + fun + | InjL(c) => c + | _ => failwith("input can only be InjL(_)"); + +let unwrapR = + fun + | InjR(c) => c + | _ => failwith("input can only be InjR(_)"); + +let unwrap_pair = + fun + | Pair(c1, c2) => (c1, c2) + | _ => failwith("input can only be pair(_, _)"); + +let rec or_constraints = (lst: list(t)): t => + switch (lst) { + | [] => Falsity + | [xi] => xi + | [xi, ...xis] => Or(xi, or_constraints(xis)) + }; + +let rec ctr_of_nth_variant = (num_variants, nth): (t => t) => + if (num_variants == 1) { + Fun.id; + } else if (nth == 0) { + xi => InjL(xi); + } else { + xi => InjR(xi |> ctr_of_nth_variant(num_variants - 1, nth - 1)); + }; + +let of_ap = (ctx, mode, ctr: option(Constructor.t), arg: t, syn_ty): t => + switch (ctr) { + | Some(name) => + let ty = + switch (mode) { + | Mode.Ana(ty) => Some(ty) + | Syn => syn_ty + | _ => None + }; + switch (ty) { + | Some(ty) => + switch (Typ.weak_head_normalize(ctx, ty)) { + | Sum(map) => + let num_variants = ConstructorMap.cardinal(map); + switch (ConstructorMap.nth(map, name)) { + | Some(nth) => arg |> ctr_of_nth_variant(num_variants, nth) + | None => Falsity + }; + | _ => Falsity + } + | None => Falsity + }; + | None => Falsity + }; + +let of_ctr = (ctx, mode, name, self) => { + let syn_ty = + switch (self) { + | Self.IsConstructor({syn_ty, _}) => syn_ty + | _ => assert(false) // impossible + }; + of_ap(ctx, mode, Some(name), Truth, syn_ty); +}; diff --git a/src/haz3lcore/dynamics/DH.re b/src/haz3lcore/dynamics/DH.re index fb52a695bb..19566e8ee0 100644 --- a/src/haz3lcore/dynamics/DH.re +++ b/src/haz3lcore/dynamics/DH.re @@ -10,7 +10,6 @@ module rec DHExp: { type t = | EmptyHole(MetaVar.t, HoleInstanceId.t) | NonEmptyHole(ErrStatus.HoleReason.t, MetaVar.t, HoleInstanceId.t, t) - | ExpandingKeyword(MetaVar.t, HoleInstanceId.t, ExpandingKeyword.t) | FreeVar(MetaVar.t, HoleInstanceId.t, Var.t) | InvalidText(MetaVar.t, HoleInstanceId.t, string) | InconsistentBranches(MetaVar.t, HoleInstanceId.t, case) @@ -21,6 +20,8 @@ module rec DHExp: { | Let(DHPat.t, t, t) | FixF(Var.t, Typ.t, t) | Fun(DHPat.t, Typ.t, t, option(Var.t)) + | TypFun(Term.UTPat.t, t, option(Var.t)) + | TypAp(t, Typ.t) | Ap(t, t) | ApBuiltin(string, t) | BuiltinFun(string) @@ -59,13 +60,15 @@ module rec DHExp: { let strip_casts: t => t; let fast_equal: (t, t) => bool; + + let assign_name_if_none: (t, option(Var.t)) => t; + let ty_subst: (Typ.t, TypVar.t, t) => t; } = { [@deriving (show({with_path: false}), sexp, yojson)] type t = /* Hole types */ | EmptyHole(MetaVar.t, HoleInstanceId.t) | NonEmptyHole(ErrStatus.HoleReason.t, MetaVar.t, HoleInstanceId.t, t) - | ExpandingKeyword(MetaVar.t, HoleInstanceId.t, ExpandingKeyword.t) | FreeVar(MetaVar.t, HoleInstanceId.t, Var.t) | InvalidText(MetaVar.t, HoleInstanceId.t, string) | InconsistentBranches(MetaVar.t, HoleInstanceId.t, case) @@ -78,6 +81,8 @@ module rec DHExp: { | Let(DHPat.t, t, t) | FixF(Var.t, Typ.t, t) | Fun(DHPat.t, Typ.t, t, option(Var.t)) + | TypFun(Term.UTPat.t, t, option(Var.t)) + | TypAp(t, Typ.t) | Ap(t, t) | ApBuiltin(string, t) | BuiltinFun(string) @@ -110,7 +115,6 @@ module rec DHExp: { switch (d) { | EmptyHole(_, _) => "EmptyHole" | NonEmptyHole(_, _, _, _) => "NonEmptyHole" - | ExpandingKeyword(_, _, _) => "ExpandingKeyword" | FreeVar(_, _, _) => "FreeVar" | InvalidText(_) => "InvalidText" | BoundVar(_) => "BoundVar" @@ -119,8 +123,10 @@ module rec DHExp: { | Let(_, _, _) => "Let" | FixF(_, _, _) => "FixF" | Fun(_, _, _, _) => "Fun" + | TypFun(_) => "TypFun" | Closure(_, _) => "Closure" | Ap(_, _) => "Ap" + | TypAp(_) => "TypAp" | ApBuiltin(_, _) => "ApBuiltin" | BuiltinFun(_) => "BuiltinFun" | Test(_) => "Test" @@ -178,7 +184,9 @@ module rec DHExp: { | Let(dp, b, c) => Let(dp, strip_casts(b), strip_casts(c)) | FixF(a, b, c) => FixF(a, b, strip_casts(c)) | Fun(a, b, c, d) => Fun(a, b, strip_casts(c), d) + | TypFun(a, b, c) => TypFun(a, strip_casts(b), c) | Ap(a, b) => Ap(strip_casts(a), strip_casts(b)) + | TypAp(a, b) => TypAp(strip_casts(a), b) | Test(id, a) => Test(id, strip_casts(a)) | ApBuiltin(fn, args) => ApBuiltin(fn, strip_casts(args)) | BuiltinFun(fn) => BuiltinFun(fn) @@ -198,7 +206,6 @@ module rec DHExp: { Case(strip_casts(scrut), List.map(strip_casts_rule, rules), n), ) | EmptyHole(_) as d - | ExpandingKeyword(_) as d | FreeVar(_) as d | InvalidText(_) as d | BoundVar(_) as d @@ -241,6 +248,9 @@ module rec DHExp: { f1 == f2 && ty1 == ty2 && fast_equal(d1, d2) | (Fun(dp1, ty1, d1, s1), Fun(dp2, ty2, d2, s2)) => dp1 == dp2 && ty1 == ty2 && fast_equal(d1, d2) && s1 == s2 + | (TypFun(_tpat1, d1, s1), TypFun(_tpat2, d2, s2)) => + _tpat1 == _tpat2 && fast_equal(d1, d2) && s1 == s2 + | (TypAp(d1, ty1), TypAp(d2, ty2)) => fast_equal(d1, d2) && ty1 == ty2 | (Ap(d11, d21), Ap(d12, d22)) | (Cons(d11, d21), Cons(d12, d22)) => fast_equal(d11, d12) && fast_equal(d21, d22) @@ -282,8 +292,10 @@ module rec DHExp: { | (Let(_), _) | (FixF(_), _) | (Fun(_), _) + | (TypFun(_), _) | (Test(_), _) | (Ap(_), _) + | (TypAp(_), _) | (ApBuiltin(_), _) | (BuiltinFun(_), _) | (Cons(_), _) @@ -308,8 +320,6 @@ module rec DHExp: { | (EmptyHole(u1, i1), EmptyHole(u2, i2)) => u1 == u2 && i1 == i2 | (NonEmptyHole(reason1, u1, i1, d1), NonEmptyHole(reason2, u2, i2, d2)) => reason1 == reason2 && u1 == u2 && i1 == i2 && fast_equal(d1, d2) - | (ExpandingKeyword(u1, i1, kw1), ExpandingKeyword(u2, i2, kw2)) => - u1 == u2 && i1 == i2 && kw1 == kw2 | (FreeVar(u1, i1, x1), FreeVar(u2, i2, x2)) => u1 == u2 && i1 == i2 && x1 == x2 | (InvalidText(u1, i1, text1), InvalidText(u2, i2, text2)) => @@ -323,7 +333,6 @@ module rec DHExp: { u1 == u2 && i1 == i2 && fast_equal_case(case1, case2) | (EmptyHole(_), _) | (NonEmptyHole(_), _) - | (ExpandingKeyword(_), _) | (FreeVar(_), _) | (InvalidText(_), _) | (Closure(_), _) @@ -341,6 +350,78 @@ module rec DHExp: { ) && i1 == i2; }; + + let assign_name_if_none = (t, name) => + switch (t) { + | Fun(arg, ty, body, None) => Fun(arg, ty, body, name) + | TypFun(utpat, body, None) => TypFun(utpat, body, name) + | _ => t + }; + + let rec ty_subst = (s: Typ.t, x: TypVar.t, exp: DHExp.t): t => { + let re = e2 => ty_subst(s, x, e2); + let t_re = ty => Typ.subst(s, x, ty); + switch (exp) { + | Cast(t, t1, t2) => Cast(re(t), t_re(t1), t_re(t2)) + | FixF(arg, ty, body) => FixF(arg, t_re(ty), re(body)) + | Fun(arg, ty, body, var) => Fun(arg, t_re(ty), re(body), var) + | TypAp(tfun, ty) => TypAp(re(tfun), t_re(ty)) + | ListLit(mv, mvi, t, lst) => + ListLit(mv, mvi, t_re(t), List.map(re, lst)) + | TypFun(utpat, body, var) => + switch (Term.UTPat.tyvar_of_utpat(utpat)) { + | Some(x') when x == x' => exp + | _ => + /* Note that we do not have to worry about capture avoidance, since s will always be closed. */ + TypFun(utpat, re(body), var) + } + | NonEmptyHole(errstat, mv, hid, t) => + NonEmptyHole(errstat, mv, hid, re(t)) + | Test(id, t) => Test(id, re(t)) + | InconsistentBranches(mv, hid, case) => + InconsistentBranches(mv, hid, ty_subst_case(s, x, case)) + | Closure(ce, t) => Closure(ce, re(t)) + | Sequence(t1, t2) => Sequence(re(t1), re(t2)) + | Let(dhpat, t1, t2) => Let(dhpat, re(t1), re(t2)) + | Ap(t1, t2) => Ap(re(t1), re(t2)) + | ApBuiltin(s, args) => ApBuiltin(s, re(args)) + | BinBoolOp(op, t1, t2) => BinBoolOp(op, re(t1), re(t2)) + | BinIntOp(op, t1, t2) => BinIntOp(op, re(t1), re(t2)) + | BinFloatOp(op, t1, t2) => BinFloatOp(op, re(t1), re(t2)) + | BinStringOp(op, t1, t2) => BinStringOp(op, re(t1), re(t2)) + | Cons(t1, t2) => Cons(re(t1), re(t2)) + | ListConcat(t1, t2) => ListConcat(re(t1), re(t2)) + | Tuple(args) => Tuple(List.map(re, args)) + | Prj(t, n) => Prj(re(t), n) + | ConsistentCase(case) => ConsistentCase(ty_subst_case(s, x, case)) + | InvalidOperation(t, err) => InvalidOperation(re(t), err) + | Filter(filt, exp) => Filter(DHFilter.map(re, filt), re(exp)) + | IfThenElse(consis, i, t, e) => + IfThenElse(consis, re(i), re(t), re(e)) + + | BuiltinFun(_) + | EmptyHole(_) + | FreeVar(_, _, _) + | InvalidText(_, _, _) + | Constructor(_) + | BoundVar(_) + | BoolLit(_) + | IntLit(_) + | FloatLit(_) + | StringLit(_) + | FailedCast(_, _, _) => exp + }; + } + and ty_subst_case = (s, x, Case(t, rules, n)) => + Case( + ty_subst(s, x, t), + List.map( + (DHExp.Rule(dhpat, t)) => DHExp.Rule(dhpat, ty_subst(s, x, t)), + rules, + ), + n, + ); + //TODO: Inconsistent cases: need to check again for inconsistency? } and Environment: { diff --git a/src/haz3lcore/dynamics/DHPat.re b/src/haz3lcore/dynamics/DHPat.re index 8f9513acf4..0a343d2f0d 100644 --- a/src/haz3lcore/dynamics/DHPat.re +++ b/src/haz3lcore/dynamics/DHPat.re @@ -5,7 +5,6 @@ type t = | EmptyHole(MetaVar.t, MetaVarInst.t) | NonEmptyHole(ErrStatus.HoleReason.t, MetaVar.t, MetaVarInst.t, t) | Wild - | ExpandingKeyword(MetaVar.t, MetaVarInst.t, ExpandingKeyword.t) | InvalidText(MetaVar.t, MetaVarInst.t, string) | BadConstructor(MetaVar.t, MetaVarInst.t, string) | Var(Var.t) @@ -39,8 +38,7 @@ let rec binds_var = (x: Var.t, dp: t): bool => | FloatLit(_) | BoolLit(_) | StringLit(_) - | Constructor(_) - | ExpandingKeyword(_, _, _) => false + | Constructor(_) => false | Var(y) => Var.eq(x, y) | Tuple(dps) => dps |> List.exists(binds_var(x)) | Cons(dp1, dp2) => binds_var(x, dp1) || binds_var(x, dp2) @@ -61,8 +59,7 @@ let rec bound_vars = (dp: t): list(Var.t) => | FloatLit(_) | BoolLit(_) | StringLit(_) - | Constructor(_) - | ExpandingKeyword(_, _, _) => [] + | Constructor(_) => [] | Var(y) => [y] | Tuple(dps) => List.flatten(List.map(bound_vars, dps)) | Cons(dp1, dp2) => bound_vars(dp1) @ bound_vars(dp2) diff --git a/src/haz3lcore/dynamics/Elaborator.re b/src/haz3lcore/dynamics/Elaborator.re index b48bbf6ddf..451afbca7f 100644 --- a/src/haz3lcore/dynamics/Elaborator.re +++ b/src/haz3lcore/dynamics/Elaborator.re @@ -37,6 +37,14 @@ let cast = (ctx: Ctx.t, mode: Mode.t, self_ty: Typ.t, d: DHExp.t) => | Arrow(_) => d | _ => failwith("Elaborator.wrap: SynFun non-arrow-type") } + | SynTypFun => + switch (self_ty) { + | Unknown(prov) => + /* ? |> forall _. ? */ + DHExp.cast(d, Unknown(prov), Forall("_", Unknown(prov))) + | Forall(_) => d + | _ => failwith("Elaborator.wrap: SynTypFun non-forall-type") + } | Ana(ana_ty) => let ana_ty = Typ.normalize(ctx, ana_ty); /* Forms with special ana rules get cast from their appropriate Matched types */ @@ -53,6 +61,12 @@ let cast = (ctx: Ctx.t, mode: Mode.t, self_ty: Typ.t, d: DHExp.t) => let (_, ana_out) = Typ.matched_arrow(ctx, ana_ty); let (self_in, _) = Typ.matched_arrow(ctx, self_ty); DHExp.cast(d, Arrow(self_in, ana_out), ana_ty); + | TypFun(_) => + switch (ana_ty) { + | Unknown(prov) => + DHExp.cast(d, Forall("grounded_forall", Unknown(prov)), ana_ty) + | _ => d + } | Tuple(ds) => switch (ana_ty) { | Unknown(prov) => @@ -62,6 +76,7 @@ let cast = (ctx: Ctx.t, mode: Mode.t, self_ty: Typ.t, d: DHExp.t) => } | Ap(NonEmptyHole(_, _, _, Constructor(_)), _) | Ap(Constructor(_), _) + | TypAp(Constructor(_), _) | Constructor(_) => switch (ana_ty, self_ty) { | (Unknown(prov), Rec(_, Sum(_))) @@ -78,7 +93,6 @@ let cast = (ctx: Ctx.t, mode: Mode.t, self_ty: Typ.t, d: DHExp.t) => /* Hole-like forms: Don't cast */ | InvalidText(_) | FreeVar(_) - | ExpandingKeyword(_) | EmptyHole(_) | NonEmptyHole(_) => d /* DHExp-specific forms: Don't cast */ @@ -101,7 +115,10 @@ let cast = (ctx: Ctx.t, mode: Mode.t, self_ty: Typ.t, d: DHExp.t) => | BinIntOp(_) | BinFloatOp(_) | BinStringOp(_) - | Test(_) => DHExp.cast(d, self_ty, ana_ty) + | Test(_) + | TypAp(_) => + // TODO: check with andrew + DHExp.cast(d, self_ty, ana_ty) }; }; @@ -155,6 +172,9 @@ let rec dhexp_of_uexp = let+ ty = fixed_pat_typ(m, p); let ty = Typ.normalize(ctx, ty); DHExp.Fun(dp, ty, d1, None); + | TypFun(tpat, body) => + let+ d1 = dhexp_of_uexp(m, body); + DHExp.TypFun(tpat, d1, None); | Tuple(es) => let+ ds = es |> List.map(dhexp_of_uexp(m)) |> OptUtil.sequence; DHExp.Tuple(ds); @@ -233,48 +253,64 @@ let rec dhexp_of_uexp = name => fun | Fun(p, ty, e, _) => DHExp.Fun(p, ty, e, name) + | TypFun(tpat, e, _) => DHExp.TypFun(tpat, e, name) | d => d ); let* dp = dhpat_of_upat(m, p); let* ddef = dhexp_of_uexp(m, def); let* dbody = dhexp_of_uexp(m, body); let+ ty = fixed_pat_typ(m, p); - let ty = Typ.normalize(ctx, ty); - switch (Term.UPat.get_recursive_bindings(p)) { - | None => + if (!Statics.is_recursive(ctx, p, def, ty)) { /* not recursive */ - DHExp.Let(dp, add_name(Term.UPat.get_var(p), ddef), dbody) - | Some([f]) => - /* simple recursion */ - Let(dp, FixF(f, ty, add_name(Some(f ++ "+"), ddef)), dbody) - | Some(fs) => - /* mutual recursion */ - let ddef = - switch (ddef) { - | Tuple(a) => - DHExp.Tuple(List.map2(s => add_name(Some(s ++ "+")), fs, a)) - | _ => ddef - }; - let uniq_id = List.nth(def.ids, 0); - let self_id = "__mutual__" ++ Id.to_string(uniq_id); - let self_var = DHExp.BoundVar(self_id); - let (_, substituted_def) = - fs - |> List.fold_left( - ((i, ddef), f) => { - let ddef = - Substitution.subst_var(DHExp.Prj(self_var, i), f, ddef); - (i + 1, ddef); - }, - (0, ddef), - ); - Let(dp, FixF(self_id, ty, substituted_def), dbody); + DHExp.Let( + dp, + add_name(Term.UPat.get_var(p), ddef), + dbody, + ); + } else { + let ty = Typ.normalize(ctx, ty); + switch (Term.UPat.get_bindings(p) |> Option.get) { + | [f] => + /* simple recursion */ + Let(dp, FixF(f, ty, add_name(Some(f ++ "+"), ddef)), dbody) + | fs => + /* mutual recursion */ + let ddef = + switch (ddef) { + | Tuple(a) => + DHExp.Tuple( + List.map2(s => add_name(Some(s ++ "+")), fs, a), + ) + | _ => ddef + }; + let uniq_id = List.nth(def.ids, 0); + let self_id = "__mutual__" ++ Id.to_string(uniq_id); + let self_var = DHExp.BoundVar(self_id); + let (_, substituted_def) = + fs + |> List.fold_left( + ((i, ddef), f) => { + let ddef = + Substitution.subst_var( + DHExp.Prj(self_var, i), + f, + ddef, + ); + (i + 1, ddef); + }, + (0, ddef), + ); + Let(dp, FixF(self_id, ty, substituted_def), dbody); + }; }; | Ap(fn, arg) | Pipeline(arg, fn) => let* c_fn = dhexp_of_uexp(m, fn); let+ c_arg = dhexp_of_uexp(m, arg); DHExp.Ap(c_fn, c_arg); + | TypAp(fn, uty_arg) => + let+ d_fn = dhexp_of_uexp(m, fn); + DHExp.TypAp(d_fn, Term.UTyp.to_typ(ctx, uty_arg)); | DeferredAp(fn, args) => switch (err_status) { | InHole(BadPartialAp(NoDeferredArgs)) => dhexp_of_uexp(m, fn) @@ -354,7 +390,8 @@ let rec dhexp_of_uexp = |> OptUtil.sequence; let d = DHExp.Case(d_scrut, d_rules, 0); switch (err_status) { - | InHole(Common(Inconsistent(Internal(_)))) => + | InHole(Common(Inconsistent(Internal(_)))) + | InHole(InexhaustiveMatch(Some(Inconsistent(Internal(_))))) => DHExp.InconsistentBranches(id, 0, d) | _ => ConsistentCase(d) }; @@ -371,6 +408,13 @@ let rec dhexp_of_uexp = and dhpat_of_upat = (m: Statics.Map.t, upat: Term.UPat.t): option(DHPat.t) => { switch (Id.Map.find_opt(Term.UPat.rep_id(upat), m)) { | Some(InfoPat({mode, self, ctx, _})) => + // NOTE: for the current implementation, redundancy is considered a static error + // but not a runtime error. + let self = + switch (self) { + | Redundant(self) => self + | _ => self + }; let err_status = Info.status_pat(ctx, mode, self); let maybe_reason: option(ErrStatus.HoleReason.t) = switch (err_status) { diff --git a/src/haz3lcore/dynamics/EvalCtx.re b/src/haz3lcore/dynamics/EvalCtx.re index 85ba47f5dd..7f20e9ec28 100644 --- a/src/haz3lcore/dynamics/EvalCtx.re +++ b/src/haz3lcore/dynamics/EvalCtx.re @@ -11,6 +11,7 @@ type cls = | Sequence2 | Let1 | Let2 + | TypAp | Ap1 | Ap2 | Fun @@ -58,6 +59,7 @@ type t = | Let2(DHPat.t, DHExp.t, t) | Fun(DHPat.t, Typ.t, t, option(Var.t)) | FixF(Var.t, Typ.t, t) + | TypAp(t, Typ.t) | Ap1(t, DHExp.t) | Ap2(DHExp.t, t) | IfThenElse1(if_consistency, t, DHExp.t, DHExp.t) @@ -126,6 +128,7 @@ let rec fuzzy_mark = | Let2(_) | Fun(_) | FixF(_) + | TypAp(_) | Ap1(_) | Ap2(_) | IfThenElse1(_) @@ -172,6 +175,7 @@ let rec unwrap = (ctx: t, sel: cls): option(t) => { | (Let2, Let2(_, _, c)) | (Fun, Fun(_, _, c, _)) | (FixF, FixF(_, _, c)) + | (TypAp, TypAp(c, _)) | (Ap1, Ap1(c, _)) | (Ap2, Ap2(_, c)) | (BinBoolOp1, BinBoolOp1(_, c, _)) diff --git a/src/haz3lcore/dynamics/EvaluatorError.re b/src/haz3lcore/dynamics/EvaluatorError.re index 7cd750d1bc..352dab9968 100644 --- a/src/haz3lcore/dynamics/EvaluatorError.re +++ b/src/haz3lcore/dynamics/EvaluatorError.re @@ -7,6 +7,7 @@ type t = | FreeInvalidVar(Var.t) | BadPatternMatch | CastBVHoleGround(DHExp.t) + | InvalidBoxedTypFun(DHExp.t) | InvalidBoxedFun(DHExp.t) | InvalidBoxedBoolLit(DHExp.t) | InvalidBoxedIntLit(DHExp.t) diff --git a/src/haz3lcore/dynamics/EvaluatorError.rei b/src/haz3lcore/dynamics/EvaluatorError.rei index e5a07fe847..4fc4e59dde 100644 --- a/src/haz3lcore/dynamics/EvaluatorError.rei +++ b/src/haz3lcore/dynamics/EvaluatorError.rei @@ -5,6 +5,7 @@ type t = | FreeInvalidVar(Var.t) | BadPatternMatch | CastBVHoleGround(DHExp.t) + | InvalidBoxedTypFun(DHExp.t) | InvalidBoxedFun(DHExp.t) | InvalidBoxedBoolLit(DHExp.t) | InvalidBoxedIntLit(DHExp.t) diff --git a/src/haz3lcore/dynamics/EvaluatorPost.re b/src/haz3lcore/dynamics/EvaluatorPost.re index 90b6920642..1d679f2138 100644 --- a/src/haz3lcore/dynamics/EvaluatorPost.re +++ b/src/haz3lcore/dynamics/EvaluatorPost.re @@ -62,6 +62,10 @@ let rec pp_eval = (d: DHExp.t): m(DHExp.t) => let* d2' = pp_eval(d2); Ap(d1', d2') |> return; + | TypAp(d1, ty) => + let* d1' = pp_eval(d1); + TypAp(d1', ty) |> return; + | ApBuiltin(f, d1) => let* d1' = pp_eval(d1); ApBuiltin(f, d1') |> return; @@ -151,9 +155,9 @@ let rec pp_eval = (d: DHExp.t): m(DHExp.t) => | Let(_) | ConsistentCase(_) | Fun(_) + | TypFun(_) | EmptyHole(_) | NonEmptyHole(_) - | ExpandingKeyword(_) | FreeVar(_) | InvalidText(_) | InconsistentBranches(_) => raise(Exception(UnevalOutsideClosure)) @@ -176,6 +180,10 @@ let rec pp_eval = (d: DHExp.t): m(DHExp.t) => let* d = pp_uneval(env, d); Fun(dp, ty, d, s) |> return; + | TypFun(tpat, d1, s) => + let* d1' = pp_uneval(env, d1); + TypFun(tpat, d1', s) |> return; + | Let(dp, d1, d2) => /* d1 should already be evaluated, d2 is not */ let* d1 = pp_eval(d1); @@ -213,7 +221,6 @@ let rec pp_eval = (d: DHExp.t): m(DHExp.t) => |> return; | EmptyHole(_) - | ExpandingKeyword(_) | FreeVar(_) | InvalidText(_) => pp_uneval(env, d) @@ -298,14 +305,23 @@ and pp_uneval = (env: ClosureEnvironment.t, d: DHExp.t): m(DHExp.t) => let* d'' = pp_uneval(env, d'); Fun(dp, ty, d'', s) |> return; + | TypFun(tpat, d1, s) => + let* d1' = pp_uneval(env, d1); + TypFun(tpat, d1', s) |> return; + | Ap(d1, d2) => let* d1' = pp_uneval(env, d1); let* d2' = pp_uneval(env, d2); Ap(d1', d2') |> return; + | TypAp(d1, ty) => + let* d1' = pp_uneval(env, d1); + TypAp(d1', ty) |> return; + | ApBuiltin(f, d1) => let* d1' = pp_uneval(env, d1); ApBuiltin(f, d1') |> return; + | BuiltinFun(f) => BuiltinFun(f) |> return | BinBoolOp(op, d1, d2) => @@ -407,10 +423,6 @@ and pp_uneval = (env: ClosureEnvironment.t, d: DHExp.t): m(DHExp.t) => let* i = hii_add_instance(u, env); Closure(env, NonEmptyHole(reason, u, i, d')) |> return; - | ExpandingKeyword(u, _, kw) => - let* i = hii_add_instance(u, env); - Closure(env, ExpandingKeyword(u, i, kw)) |> return; - | FreeVar(u, _, x) => let* i = hii_add_instance(u, env); Closure(env, FreeVar(u, i, x)) |> return; @@ -463,6 +475,8 @@ let rec track_children_of_hole = | Test(_, d) | FixF(_, _, d) | Fun(_, _, d, _) + | TypFun(_, d, _) + | TypAp(d, _) | Prj(d, _) | Cast(d, _, _) | FailedCast(d, _, _) @@ -519,7 +533,6 @@ let rec track_children_of_hole = let hii = track_children_of_hole_rules(hii, parent, rules); hii |> HoleInstanceInfo.add_parent((u, i), parent); | EmptyHole(u, i) - | ExpandingKeyword(u, i, _) | FreeVar(u, i, _) | InvalidText(u, i, _) => hii |> HoleInstanceInfo.add_parent((u, i), parent) diff --git a/src/haz3lcore/dynamics/EvaluatorStep.re b/src/haz3lcore/dynamics/EvaluatorStep.re index b6fad324f2..2684cbd77a 100644 --- a/src/haz3lcore/dynamics/EvaluatorStep.re +++ b/src/haz3lcore/dynamics/EvaluatorStep.re @@ -228,6 +228,9 @@ let rec compose = (ctx: EvalCtx.t, d: DHExp.t): DHExp.t => { | Sequence2(d1, ctx) => let d2 = compose(ctx, d); Sequence(d1, d2); + | TypAp(ctx, typ) => + let d1 = compose(ctx, d); + TypAp(d1, typ); | Ap1(ctx, d2) => let d1 = compose(ctx, d); Ap(d1, d2); diff --git a/src/haz3lcore/dynamics/FilterMatcher.re b/src/haz3lcore/dynamics/FilterMatcher.re index ae43810351..003026f998 100644 --- a/src/haz3lcore/dynamics/FilterMatcher.re +++ b/src/haz3lcore/dynamics/FilterMatcher.re @@ -82,6 +82,10 @@ let rec matches_exp = | (BuiltinFun(dn), BuiltinFun(fn)) => dn == fn | (BuiltinFun(_), _) => false + | (TypFun(pat1, d1, s1), TypFun(pat2, d2, s2)) => + s1 == s2 && matches_utpat(pat1, pat2) && matches_exp(env, d1, d2) + | (TypFun(_), _) => false + | (Fun(dp1, dty1, d1, dname1), Fun(fp1, fty1, f1, fname1)) => matches_pat(dp1, fp1) && dty1 == fty1 @@ -99,6 +103,10 @@ let rec matches_exp = && matches_exp(env, d2, f2) | (Let(_), _) => false + | (TypAp(d1, t1), TypAp(d2, t2)) => + matches_exp(env, d1, d2) && matches_typ(t1, t2) + | (TypAp(_), _) => false + | (Ap(d1, d2), Ap(f1, f2)) => matches_exp(env, d1, f1) && matches_exp(env, d2, f2) | (Ap(_), _) => false @@ -194,7 +202,6 @@ let rec matches_exp = | (InconsistentBranches(_), _) => false | (NonEmptyHole(_), _) => false - | (ExpandingKeyword(_), _) => false | (InvalidText(_), _) => false | (InvalidOperation(_), _) => false @@ -248,7 +255,6 @@ and matches_pat = (d: DHPat.t, f: DHPat.t): bool => { | (Cons(_), _) => false | (EmptyHole(_), _) => false | (NonEmptyHole(_), _) => false - | (ExpandingKeyword(_), _) => false | (InvalidText(_), _) => false }; } @@ -260,6 +266,16 @@ and matches_rul = (env, d: DHExp.rule, f: DHExp.rule) => { | (Rule(dp, d), Rule(fp, f)) => matches_pat(dp, fp) && matches_exp(env, d, f) }; +} +and matches_utpat = (d: Term.UTPat.t, f: Term.UTPat.t): bool => { + switch (d.term, f.term) { + | (Invalid(_), _) => false + | (_, Invalid(_)) => false + | (_, EmptyHole) => true + | (MultiHole(l1), MultiHole(l2)) => List.length(l1) == List.length(l2) /* TODO: probably should define a matches_any and recurse in here...? */ + | (Var(t1), Var(t2)) => t1 == t2 + | _ => false + }; }; let matches = diff --git a/src/haz3lcore/dynamics/Incon.re b/src/haz3lcore/dynamics/Incon.re new file mode 100644 index 0000000000..6f5c6af13f --- /dev/null +++ b/src/haz3lcore/dynamics/Incon.re @@ -0,0 +1,145 @@ +open Sets; + +let is_inconsistent_int = (xis: list(Constraint.t)): bool => { + let (int_set, not_int_list) = + List.fold_left( + ((int_set, not_int_list), xi: Constraint.t) => + switch (xi) { + | Int(n) => (IntSet.add(n, int_set), not_int_list) + | NotInt(n) => (int_set, [n, ...not_int_list]) + | _ => failwith("input can only be Int | NotInt") + }, + (IntSet.empty, []), + xis, + ); + IntSet.cardinal(int_set) > 1 + || List.exists(IntSet.mem(_, int_set), not_int_list); +}; + +let is_inconsistent_float = (xis: list(Constraint.t)): bool => { + let (float_set, not_float_list) = + List.fold_left( + ((float_set, not_float_list), xi: Constraint.t) => + switch (xi) { + | Float(n) => (FloatSet.add(n, float_set), not_float_list) + | NotFloat(n) => (float_set, [n, ...not_float_list]) + | _ => failwith("input can only be Float | NotFloat") + }, + (FloatSet.empty, []), + xis, + ); + FloatSet.cardinal(float_set) > 1 + || List.exists(FloatSet.mem(_, float_set), not_float_list); +}; + +let is_inconsistent_string = (xis: list(Constraint.t)): bool => { + let (string_set, not_string_list) = + List.fold_left( + ((string_set, not_string_list), xi: Constraint.t) => + switch (xi) { + | String(s) => (StringSet.add(s, string_set), not_string_list) + | NotString(s) => (string_set, [s, ...not_string_list]) + | _ => failwith("input can only be String | NotString") + }, + (StringSet.empty, []), + xis, + ); + StringSet.cardinal(string_set) > 1 + || List.exists(StringSet.mem(_, string_set), not_string_list); +}; + +let rec is_inconsistent = (xis: list(Constraint.t)): bool => + switch (xis) { + | [] => false + | _ + when + List.exists(Constraint.is_injL, xis) + && List.exists(Constraint.is_injR, xis) => + true + | [xi, ...xis'] => + switch (xi) { + | Truth => is_inconsistent(xis') + | Falsity => true + | Hole => assert(false) // Impossible + | And(xi1, xi2) => is_inconsistent([xi1, xi2, ...xis']) + | Or(xi1, xi2) => + is_inconsistent([xi1, ...xis']) && is_inconsistent([xi2, ...xis']) + | InjL(_) => + switch (List.partition(Constraint.is_injL, xis)) { + | (injLs, []) => + injLs |> List.map(Constraint.unwrapL) |> is_inconsistent + | (injLs, others) => is_inconsistent(others @ injLs) + } + | InjR(_) => + switch (List.partition(Constraint.is_injR, xis)) { + | (injRs, []) => + injRs |> List.map(Constraint.unwrapR) |> is_inconsistent + | (injRs, others) => is_inconsistent(others @ injRs) + } + | Int(_) + | NotInt(_) => + switch ( + List.partition( + fun + | Constraint.Int(_) + | NotInt(_) => true + | _ => false, + xis, + ) + ) { + | (ns, []) => is_inconsistent_int(ns) + | (ns, others) => is_inconsistent(others @ ns) + } + | Float(_) + | NotFloat(_) => + switch ( + List.partition( + fun + | Constraint.Float(_) + | NotFloat(_) => true + | _ => false, + xis, + ) + ) { + | (fs, []) => is_inconsistent_float(fs) + | (fs, others) => is_inconsistent(others @ fs) + } + | String(_) + | NotString(_) => + switch ( + List.partition( + fun + | Constraint.String(_) + | NotString(_) => true + | _ => false, + xis, + ) + ) { + | (ss, []) => is_inconsistent_string(ss) + | (ss, others) => is_inconsistent(others @ ss) + } + | Pair(_, _) => + switch ( + List.partition( + fun + | Constraint.Pair(_) => true + | _ => false, + xis, + ) + ) { + | (pairs, []) => + let (xisL, xisR) = + pairs |> List.map(Constraint.unwrap_pair) |> List.split; + is_inconsistent(xisL) || is_inconsistent(xisR); + | (pairs, others) => is_inconsistent(others @ pairs) + } + } + }; + +let is_redundant = (xi_cur: Constraint.t, xi_pre: Constraint.t): bool => + is_inconsistent( + Constraint.[And(truify(xi_cur), dual(falsify(xi_pre)))], + ); + +let is_exhaustive = (xi: Constraint.t): bool => + is_inconsistent(Constraint.[dual(truify(xi))]); diff --git a/src/haz3lcore/dynamics/PatternMatch.re b/src/haz3lcore/dynamics/PatternMatch.re index 6107a0827b..52a33b46b6 100644 --- a/src/haz3lcore/dynamics/PatternMatch.re +++ b/src/haz3lcore/dynamics/PatternMatch.re @@ -34,7 +34,6 @@ let rec matches = (dp: DHPat.t, d: DHExp.t): match_result => | (EmptyHole(_), _) | (NonEmptyHole(_), _) => IndetMatch | (Wild, _) => Matches(Environment.empty) - | (ExpandingKeyword(_), _) => DoesNotMatch | (InvalidText(_), _) => IndetMatch | (BadConstructor(_), _) => IndetMatch | (Var(x), _) => @@ -237,9 +236,9 @@ and matches_cast_Sum = | Cast(d', Unknown(_), Sum(_) | Rec(_, Sum(_))) => matches_cast_Sum(ctr, dp, d', castmaps) | FreeVar(_) - | ExpandingKeyword(_) | InvalidText(_) | Let(_) + | TypAp(_) | Ap(_) | ApBuiltin(_) | BinBoolOp(_) @@ -259,6 +258,7 @@ and matches_cast_Sum = | Cast(_) | BoundVar(_) | FixF(_) + | TypFun(_) | Fun(_) | BoolLit(_) | IntLit(_) @@ -331,12 +331,13 @@ and matches_cast_Tuple = | BoundVar(_) => DoesNotMatch | FreeVar(_) => IndetMatch | InvalidText(_) => IndetMatch - | ExpandingKeyword(_) => IndetMatch | Let(_, _, _) => IndetMatch | FixF(_, _, _) => DoesNotMatch + | TypFun(_, _, _) => DoesNotMatch | Fun(_, _, _, _) => DoesNotMatch | Closure(_, Fun(_)) => DoesNotMatch | Closure(_, _) => IndetMatch + | TypAp(_, _) => IndetMatch | Filter(_, _) => IndetMatch | Ap(_, _) => IndetMatch | ApBuiltin(_, _) => IndetMatch @@ -471,11 +472,12 @@ and matches_cast_Cons = | BoundVar(_) => DoesNotMatch | FreeVar(_) => IndetMatch | InvalidText(_) => IndetMatch - | ExpandingKeyword(_) => IndetMatch | Let(_, _, _) => IndetMatch | FixF(_, _, _) => DoesNotMatch + | TypFun(_, _, _) => DoesNotMatch | Fun(_, _, _, _) => DoesNotMatch | Closure(_, d') => matches_cast_Cons(dp, d', elt_casts) + | TypAp(_, _) => IndetMatch | Filter(_, d') => matches_cast_Cons(dp, d', elt_casts) | Ap(_, _) => IndetMatch | ApBuiltin(_, _) => IndetMatch diff --git a/src/haz3lcore/dynamics/Sets.re b/src/haz3lcore/dynamics/Sets.re new file mode 100644 index 0000000000..5c2179da68 --- /dev/null +++ b/src/haz3lcore/dynamics/Sets.re @@ -0,0 +1,23 @@ +module IntSet = + Set.Make({ + type t = int; + let compare = compare; + }); + +module BoolSet = + Set.Make({ + type t = bool; + let compare = compare; + }); + +module FloatSet = + Set.Make({ + type t = float; + let compare = compare; + }); + +module StringSet = + Set.Make({ + type t = string; + let compare = compare; + }); diff --git a/src/haz3lcore/dynamics/Stepper.re b/src/haz3lcore/dynamics/Stepper.re index 0e9f0e478a..04f1c5c4d6 100644 --- a/src/haz3lcore/dynamics/Stepper.re +++ b/src/haz3lcore/dynamics/Stepper.re @@ -83,6 +83,9 @@ let rec matches = | FixF(name, ty, ctx) => let+ ctx = matches(env, flt, ctx, exp, act, idx); FixF(name, ty, ctx); + | TypAp(ctx, ty) => + let+ ctx = matches(env, flt, ctx, exp, act, idx); + TypAp(ctx, ty); | Ap1(ctx, d2) => let+ ctx = matches(env, flt, ctx, exp, act, idx); Ap1(ctx, d2); @@ -391,6 +394,7 @@ let get_justification: step_kind => string = | Sequence => "sequence" | FixUnwrap => "unroll fixpoint" | UpdateTest => "update test" + | TypFunAp => "apply type function" | FunAp => "apply function" | BuiltinWrap => "wrap builtin" | BuiltinAp(s) => "evaluate " ++ s @@ -411,6 +415,7 @@ let get_justification: step_kind => string = | Projection => "projection" // TODO(Matt): We don't want to show projection to the user | InvalidStep => "error" | VarLookup => "variable lookup" + | CastTypAp | CastAp | Cast => "cast calculus" | FixClosure => "fixpoint closure" diff --git a/src/haz3lcore/dynamics/Substitution.re b/src/haz3lcore/dynamics/Substitution.re index cb08e83231..11d949383c 100644 --- a/src/haz3lcore/dynamics/Substitution.re +++ b/src/haz3lcore/dynamics/Substitution.re @@ -9,7 +9,6 @@ let rec subst_var = (d1: DHExp.t, x: Var.t, d2: DHExp.t): DHExp.t => } | FreeVar(_) => d2 | InvalidText(_) => d2 - | ExpandingKeyword(_) => d2 | Sequence(d3, d4) => let d3 = subst_var(d1, x, d3); let d4 = subst_var(d1, x, d4); @@ -42,6 +41,7 @@ let rec subst_var = (d1: DHExp.t, x: Var.t, d2: DHExp.t): DHExp.t => let d3 = subst_var(d1, x, d3); Fun(dp, ty, d3, s); } + | TypFun(tpat, d3, s) => TypFun(tpat, subst_var(d1, x, d3), s) | Closure(env, d3) => /* Closure shouldn't appear during substitution (which only is called from elaboration currently) */ @@ -52,9 +52,8 @@ let rec subst_var = (d1: DHExp.t, x: Var.t, d2: DHExp.t): DHExp.t => let d3 = subst_var(d1, x, d3); let d4 = subst_var(d1, x, d4); Ap(d3, d4); - | ApBuiltin(ident, d1) => - let d2 = subst_var(d1, x, d1); - ApBuiltin(ident, d2); + | TypAp(d3, ty) => TypAp(subst_var(d1, x, d3), ty) + | ApBuiltin(ident, args) => ApBuiltin(ident, subst_var(d1, x, args)) | BuiltinFun(ident) => BuiltinFun(ident) | Test(id, d3) => Test(id, subst_var(d1, x, d3)) | BoolLit(_) diff --git a/src/haz3lcore/dynamics/Transition.re b/src/haz3lcore/dynamics/Transition.re index 4cd02b2882..943f781a34 100644 --- a/src/haz3lcore/dynamics/Transition.re +++ b/src/haz3lcore/dynamics/Transition.re @@ -40,8 +40,8 @@ open DH; - if all requirements are values, then the output will be a value - if some requirements are indet, then the output will be indet - A value is either a literal, or a function with a closure. (functions without - closures immediately inside them do not count as values). + A value is either a literal, or a function with a closure, or a type function. + (functions without closures immediately inside them do not count as values). */ [@deriving (show({with_path: false}), sexp, yojson)] @@ -54,7 +54,9 @@ type step_kind = | FixUnwrap | FixClosure | UpdateTest + | TypFunAp | FunAp + | CastTypAp | CastAp | BuiltinWrap | BuiltinAp(string) @@ -84,6 +86,9 @@ module CastHelpers = { let grounded_Arrow = NotGroundOrHole(Arrow(Unknown(Internal), Unknown(Internal))); + // TODO: Maybe the Forall should allow a hole in the variable position? + let grounded_Forall = + NotGroundOrHole(Forall("grounded_forall", Unknown(Internal))); let grounded_Prod = length => NotGroundOrHole( Prod(ListUtil.replicate(length, Typ.Unknown(Internal))), @@ -108,6 +113,7 @@ module CastHelpers = { | String | Var(_) | Rec(_) + | Forall(_, Unknown(_)) | Arrow(Unknown(_), Unknown(_)) | List(Unknown(_)) => Ground | Prod(tys) => @@ -125,6 +131,7 @@ module CastHelpers = { sm |> ConstructorMap.is_ground(is_ground_arg) ? Ground : grounded_Sum(sm) | Arrow(_, _) => grounded_Arrow + | Forall(_) => grounded_Forall | List(_) => grounded_List }; }; @@ -224,6 +231,7 @@ module Transition = (EV: EV_MODE) => { and. d1' = req_final(req(state, env), d1 => Let1(dp, d1, d2), d1); let.match env' = (env, matches(dp, d1')); Step({apply: () => Closure(env', d2), kind: LetBind, value: false}); + | TypFun(_) | Fun(_, _, Closure(_), _) => let. _ = otherwise(env, d); Constructor; @@ -265,6 +273,64 @@ module Transition = (EV: EV_MODE) => { kind: UpdateTest, value: true, }); + | TypAp(d, tau) => + let. _ = otherwise(env, d => TypAp(d, tau)) + and. d' = req_value(req(state, env), d => TypAp(d, tau), d); + switch (d') { + | TypFun(utpat, tfbody, name) => + /* Rule ITTLam */ + switch (Term.UTPat.tyvar_of_utpat(utpat)) { + | Some(tyvar) => + /* Perform substitution */ + Step({ + apply: () => + DHExp.assign_name_if_none( + /* Inherit name for user clarity */ + DHExp.ty_subst(tau, tyvar, tfbody), + Option.map( + x => x ++ "@<" ++ Typ.pretty_print(tau) ++ ">", + name, + ), + ), + kind: TypFunAp, + value: false, + }) + | None => + /* Treat a hole or invalid tyvar name as a unique type variable that doesn't appear anywhere else. Thus instantiating it at anything doesn't produce any substitutions. */ + Step({ + apply: () => + DHExp.assign_name_if_none( + tfbody, + Option.map( + x => x ++ "@<" ++ Typ.pretty_print(tau) ++ ">", + name, + ), + ), + kind: TypFunAp, + value: false, + }) + } + | Cast(d'', Forall(x, t), Forall(x', t')) => + /* Rule ITTApCast */ + Step({ + apply: () => + Cast( + TypAp(d'', tau), + Typ.subst(tau, x, t), + Typ.subst(tau, x', t'), + ), + kind: CastTypAp, + value: false, + }) + | _ => + Step({ + apply: () => { + raise(EvaluatorError.Exception(InvalidBoxedTypFun(d'))); + }, + kind: InvalidStep, + value: true, + }) + }; | Ap(d1, d2) => let. _ = otherwise(env, (d1, d2) => Ap(d1, d2)) and. d1' = req_value(req(state, env), d1 => Ap1(d1, d2), d1) @@ -579,8 +645,7 @@ module Transition = (EV: EV_MODE) => { | EmptyHole(_) | FreeVar(_) | InvalidText(_) - | InvalidOperation(_) - | ExpandingKeyword(_) => + | InvalidOperation(_) => let. _ = otherwise(env, d); Indet; | Cast(d, t1, t2) => @@ -655,6 +720,7 @@ let should_hide_step = (~settings: CoreSettings.Evaluation.t) => | LetBind | Sequence | UpdateTest + | TypFunAp | FunAp | BuiltinAp(_) | BinBoolOp(_) @@ -669,6 +735,7 @@ let should_hide_step = (~settings: CoreSettings.Evaluation.t) => | Conditional(_) | InvalidStep => false | VarLookup => !settings.show_lookup_steps + | CastTypAp | CastAp | Cast => !settings.show_casts | FixUnwrap => !settings.show_fixpoints diff --git a/src/haz3lcore/dynamics/TypeAssignment.re b/src/haz3lcore/dynamics/TypeAssignment.re index e67174a1e7..fd53b71ea4 100644 --- a/src/haz3lcore/dynamics/TypeAssignment.re +++ b/src/haz3lcore/dynamics/TypeAssignment.re @@ -15,6 +15,7 @@ let delta_ty = (id: MetaVar.t, m: Statics.Map.t): option(Typ.t) => { | Some(InfoExp({mode, ctx, _})) => switch (mode) { | Syn + | SynTypFun | SynFun => Some(Unknown(Internal)) | Ana(ana_ty) => Some(Typ.normalize(ctx, ana_ty)) } @@ -29,7 +30,8 @@ let ground = (ty: Typ.t): bool => { }; }; -let dhpat_extend_ctx = (dhpat: DHPat.t, ty: Typ.t, ctx: Ctx.t): option(Ctx.t) => { +let dhpat_extend_ctx = + (dhpat: DHPat.t, ty: Typ.t, m: Statics.Map.t, ctx: Ctx.t): option(Ctx.t) => { let rec dhpat_var_entry = (dhpat: DHPat.t, ty: Typ.t): option(list(Ctx.entry)) => { switch (dhpat) { @@ -65,18 +67,25 @@ let dhpat_extend_ctx = (dhpat: DHPat.t, ty: Typ.t, ctx: Ctx.t): option(Ctx.t) => | Ap(Constructor(_, typ), dhp) => let (ty1, ty2) = Typ.matched_arrow(ctx, typ); Typ.eq(ty2, ty) ? dhpat_var_entry(dhp, ty1) : None; - | EmptyHole(_) - | NonEmptyHole(_) + | EmptyHole(id, _) => + switch (delta_ty(id, m)) { + | None => None + | Some(_) => Some([]) + } + | NonEmptyHole(_, id, _, dhp) => + switch (delta_ty(id, m)) { + | None => None + | Some(_) => dhpat_var_entry(dhp, ty) + } | Wild - | ExpandingKeyword(_) | InvalidText(_) - | BadConstructor(_) - | IntLit(_) - | FloatLit(_) - | BoolLit(_) - | StringLit(_) - | Constructor(_) - | Ap(_) => Some([]) + | Ap(_) + | BadConstructor(_) => Some([]) + | IntLit(_) => Typ.eq(ty, Int) ? Some([]) : None + | FloatLit(_) => Typ.eq(ty, Float) ? Some([]) : None + | BoolLit(_) => Typ.eq(ty, Bool) ? Some([]) : None + | StringLit(_) => Typ.eq(ty, String) ? Some([]) : None + | Constructor(_, typ) => Typ.eq(ty, typ) ? Some([]) : None }; }; let+ l = dhpat_var_entry(dhpat, ty); @@ -93,21 +102,21 @@ let rec typ_of_dhexp = | Some(_) => delta_ty(id, m) } | FreeVar(id, _, _) => delta_ty(id, m) - | ExpandingKeyword(_) | InvalidText(_) => Some(Unknown(Internal)) | InconsistentBranches(_, _, Case(d_scrut, d_rules, _)) => let* ty' = typ_of_dhexp(ctx, m, d_scrut); - let typ_cases = + let* typ_cases = d_rules |> List.map((DHExp.Rule(dhp, de)) => { - let* ctx = dhpat_extend_ctx(dhp, ty', ctx); + let* ctx = dhpat_extend_ctx(dhp, ty', m, ctx); typ_of_dhexp(ctx, m, de); }) |> OptUtil.sequence; - switch (typ_cases) { - | None => None - | Some(_) => Some(Typ.Unknown(Internal)) + //Making sure that there at least one inconsistent branch + switch (equal_typ_list(typ_cases)) { + | None => Some(Typ.Unknown(Internal)) + | Some(_) => None }; | Closure(env, d) => let* l = @@ -134,15 +143,17 @@ let rec typ_of_dhexp = typ_of_dhexp(ctx, m, d2); | Let(dhp, de, db) => let* ty1 = typ_of_dhexp(ctx, m, de); - let* ctx = dhpat_extend_ctx(dhp, ty1, ctx); + let* ctx = dhpat_extend_ctx(dhp, ty1, m, ctx); typ_of_dhexp(ctx, m, db); | FixF(name, ty1, d) => let entry = Ctx.VarEntry({name, id: Id.invalid, typ: ty1}); typ_of_dhexp(Ctx.extend(ctx, entry), m, d); | Fun(dhp, ty1, d, _) => - let* ctx = dhpat_extend_ctx(dhp, ty1, ctx); + let* ctx = dhpat_extend_ctx(dhp, ty1, m, ctx); let* ty2 = typ_of_dhexp(ctx, m, d); Some(Typ.Arrow(ty1, ty2)); + | TypFun(_, d, _) => typ_of_dhexp(ctx, m, d) + | TypAp(d, _) => typ_of_dhexp(ctx, m, d) | Ap(d1, d2) => let* ty1 = typ_of_dhexp(ctx, m, d1); let* ty2 = typ_of_dhexp(ctx, m, d2); @@ -253,7 +264,7 @@ let rec typ_of_dhexp = let* typ_cases: list(Typ.t) = d_rules |> List.map((DHExp.Rule(dhp, de)) => { - let* ctx = dhpat_extend_ctx(dhp, ty', ctx); + let* ctx = dhpat_extend_ctx(dhp, ty', m, ctx); typ_of_dhexp(ctx, m, de); }) |> OptUtil.sequence; @@ -282,9 +293,9 @@ let rec typ_of_dhexp = | IfThenElse(InconsistentIf, d_scrut, d1, d2) => let* ty = typ_of_dhexp(ctx, m, d_scrut); if (Typ.eq(ty, Bool)) { - let* _ = typ_of_dhexp(ctx, m, d1); - let* _ = typ_of_dhexp(ctx, m, d2); - Some(Typ.Unknown(Internal)); + let* ty1 = typ_of_dhexp(ctx, m, d1); + let* ty2 = typ_of_dhexp(ctx, m, d2); + Typ.eq(ty1, ty2) ? None : Some(Typ.Unknown(Internal)); } else { None; }; diff --git a/src/haz3lcore/dynamics/VarErrStatus.re b/src/haz3lcore/dynamics/VarErrStatus.re index 8bb6c4ebc8..167db32cad 100644 --- a/src/haz3lcore/dynamics/VarErrStatus.re +++ b/src/haz3lcore/dynamics/VarErrStatus.re @@ -2,8 +2,7 @@ module HoleReason = { /* Variable: reason */ [@deriving (show({with_path: false}), sexp, yojson)] type t = - | Free - | ExpandingKeyword(ExpandingKeyword.t); + | Free; }; /* Variable: var_err */ diff --git a/src/haz3lcore/lang/Form.re b/src/haz3lcore/lang/Form.re index e726409bb7..b400c97ed0 100644 --- a/src/haz3lcore/lang/Form.re +++ b/src/haz3lcore/lang/Form.re @@ -61,6 +61,9 @@ let ds: expansion = (Delayed, Static); let mk_infix = (t: Token.t, sort: Sort.t, prec) => mk(ss, [t], mk_bin(prec, sort, [])); +let mk_nul_infix = (t: Token.t, prec) => + mk(ss, [t], mk_bin(~l=Any, ~r=Any, prec, Any, [])); + /* Token Recognition Predicates */ /* A. Secondary Notation (Comments, Whitespace, etc.) */ @@ -160,7 +163,7 @@ let is_capitalized_name = regexp("^[A-Z][A-Za-z0-9_]*$"); let is_ctr = is_capitalized_name; let base_typs = ["String", "Int", "Float", "Bool"]; let is_base_typ = regexp("^(" ++ String.concat("|", base_typs) ++ ")$"); -let is_typ_var = is_capitalized_name; +let is_typ_var = str => is_var(str) || is_capitalized_name(str); let wild = "_"; let is_wild = regexp("^" ++ wild ++ "$"); @@ -299,9 +302,17 @@ let forms: list((string, t)) = [ ("ap_exp", mk(ii, ["(", ")"], mk_post(P.ap, Exp, [Exp]))), ("ap_pat", mk(ii, ["(", ")"], mk_post(P.ap, Pat, [Pat]))), ("ap_typ", mk(ii, ["(", ")"], mk_post(P.ap, Typ, [Typ]))), + ( + "ap_exp_typ", + mk((Instant, Static), ["@<", ">"], mk_post(P.ap, Exp, [Typ])), + ), + ("at_sign", mk_nul_infix("@", P.eqs)), // HACK: SUBSTRING REQ ("case", mk(ds, ["case", "end"], mk_op(Exp, [Rul]))), ("test", mk(ds, ["test", "end"], mk_op(Exp, [Exp]))), ("fun_", mk(ds, ["fun", "->"], mk_pre(P.fun_, Exp, [Pat]))), + ("typfun", mk(ds, ["typfun", "->"], mk_pre(P.fun_, Exp, [TPat]))), + ("forall", mk(ds, ["forall", "->"], mk_pre(P.fun_, Typ, [TPat]))), + ("rec", mk(ds, ["rec", "->"], mk_pre(P.fun_, Typ, [TPat]))), ( "rule", mk(ds, ["|", "=>"], mk_bin'(P.rule_sep, Rul, Exp, [Pat], Exp)), diff --git a/src/haz3lcore/statics/ConstructorMap.re b/src/haz3lcore/statics/ConstructorMap.re index c9ff0667dc..a350d16d92 100644 --- a/src/haz3lcore/statics/ConstructorMap.re +++ b/src/haz3lcore/statics/ConstructorMap.re @@ -99,3 +99,12 @@ let rec is_ground = (is_ground_value: 'a => bool, map: t('a)): bool => | [(_, head), ...tail] => is_ground_value(head) && tail |> is_ground(is_ground_value) }; + +let nth = (map: t('a), ctr: Constructor.t): option(int) => { + // TODO: use List.find_index instead, which is available for OCaml 5.1 + let ctrs_sorted = map |> sort |> ctrs_of; + List.find_opt( + nth => List.nth(ctrs_sorted, nth) == ctr, + List.init(List.length(ctrs_sorted), Fun.id), + ); +}; diff --git a/src/haz3lcore/statics/Info.re b/src/haz3lcore/statics/Info.re index df4c10d01c..11c44b1120 100644 --- a/src/haz3lcore/statics/Info.re +++ b/src/haz3lcore/statics/Info.re @@ -66,6 +66,7 @@ type error_common = [@deriving (show({with_path: false}), sexp, yojson)] type error_exp = | FreeVariable(Var.t) /* Unbound variable (not in typing context) */ + | InexhaustiveMatch(option(error_common)) | UnusedDeferral | BadPartialAp(Self.error_partial_ap) | Common(error_common); @@ -73,6 +74,7 @@ type error_exp = [@deriving (show({with_path: false}), sexp, yojson)] type error_pat = | ExpectedConstructor /* Only construtors can be applied */ + | Redundant(option(error_pat)) | Common(error_common); [@deriving (show({with_path: false}), sexp, yojson)] @@ -166,10 +168,17 @@ type type_var_err = | Other | NotCapitalized; +/* What are we shadowing? */ +[@deriving (show({with_path: false}), sexp, yojson)] +type shadow_src = + | BaseTyp + | TyAlias + | TyVar; + /* Type pattern term errors */ [@deriving (show({with_path: false}), sexp, yojson)] type error_tpat = - | ShadowsType(TypVar.t) + | ShadowsType(TypVar.t, shadow_src) | NotAVar(type_var_err); /* Type pattern ok statuses for cursor inspector */ @@ -207,6 +216,7 @@ type pat = { cls: Term.Cls.t, status: status_pat, ty: Typ.t, + constraint_: Constraint.t, }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -309,22 +319,34 @@ let exp_co_ctx: exp => CoCtx.t = ({co_ctx, _}) => co_ctx; let exp_ty: exp => Typ.t = ({ty, _}) => ty; let pat_ctx: pat => Ctx.t = ({ctx, _}) => ctx; let pat_ty: pat => Typ.t = ({ty, _}) => ty; +let pat_constraint: pat => Constraint.t = ({constraint_, _}) => constraint_; let rec status_common = (ctx: Ctx.t, mode: Mode.t, self: Self.t): status_common => switch (self, mode) { - | (Just(syn), Syn) => NotInHole(Syn(syn)) - | (Just(syn), Ana(ana)) => - switch (Typ.join_fix(ctx, ana, syn)) { - | None => InHole(Inconsistent(Expectation({syn, ana}))) - | Some(join) => NotInHole(Ana(Consistent({ana, syn, join}))) + | (Just(ty), Syn) => NotInHole(Syn(ty)) + | (Just(ty), SynFun) => + switch ( + Typ.join_fix(ctx, Arrow(Unknown(Internal), Unknown(Internal)), ty) + ) { + | Some(_) => NotInHole(Syn(ty)) + | None => InHole(Inconsistent(WithArrow(ty))) + } + | (Just(ty), SynTypFun) => + switch (Typ.join_fix(ctx, Forall("?", Unknown(Internal)), ty)) { + | Some(_) => NotInHole(Syn(ty)) + | None => InHole(Inconsistent(WithArrow(ty))) } - | (Just(syn), SynFun) => + | (Just(syn), Ana(ana)) => switch ( - Typ.join_fix(ctx, Arrow(Unknown(Internal), Unknown(Internal)), syn) + Typ.join_fix( + ctx, + ana, + syn /* Note: the ordering of ana, syn matters */ + ) ) { - | None => InHole(Inconsistent(WithArrow(syn))) - | Some(_) => NotInHole(Syn(syn)) + | None => InHole(Inconsistent(Expectation({syn, ana}))) + | Some(join) => NotInHole(Ana(Consistent({ana, syn, join}))) } | (IsConstructor({name, syn_ty}), _) => /* If a ctr is being analyzed against (an arrow type returning) @@ -348,13 +370,25 @@ let rec status_common = Ana(InternallyInconsistent({ana, nojoin: Typ.of_source(tys)})), ) }; - | (NoJoin(_, tys), Syn | SynFun) => + | (NoJoin(_, tys), Syn | SynFun | SynTypFun) => InHole(Inconsistent(Internal(Typ.of_source(tys)))) }; -let status_pat = (ctx: Ctx.t, mode: Mode.t, self: Self.pat): status_pat => +let rec status_pat = (ctx: Ctx.t, mode: Mode.t, self: Self.pat): status_pat => switch (mode, self) { - | (Syn | Ana(_), Common(self_pat)) + | (_, Redundant(self)) => + let additional_err = + switch (status_pat(ctx, mode, self)) { + | InHole(Common(Inconsistent(Internal(_) | Expectation(_))) as err) + | InHole(Common(NoType(_)) as err) => Some(err) + | NotInHole(_) => None + | InHole(Common(Inconsistent(WithArrow(_)))) + | InHole(ExpectedConstructor | Redundant(_)) => + // ExpectedConstructor cannot be a reason to hole-wrap the entire pattern + failwith("InHole(Redundant(impossible_err))") + }; + InHole(Redundant(additional_err)); + | (Syn | SynTypFun | Ana(_), Common(self_pat)) | (SynFun, Common(IsConstructor(_) as self_pat)) => /* Little bit of a hack. Anything other than a bound ctr will, in function position, have SynFun mode (see Typ.ap_mode). Since we @@ -373,9 +407,24 @@ let status_pat = (ctx: Ctx.t, mode: Mode.t, self: Self.pat): status_pat => depending on the mode, which represents the expectations of the surrounding syntactic context, and the self which represents the makeup of the expression / pattern itself. */ -let status_exp = (ctx: Ctx.t, mode: Mode.t, self: Self.exp): status_exp => +let rec status_exp = (ctx: Ctx.t, mode: Mode.t, self: Self.exp): status_exp => switch (self, mode) { | (Free(name), _) => InHole(FreeVariable(name)) + | (InexhaustiveMatch(self), _) => + let additional_err = + switch (status_exp(ctx, mode, self)) { + | InHole(Common(Inconsistent(Internal(_)) as inconsistent_err)) => + Some(inconsistent_err) + | NotInHole(_) + | InHole(Common(Inconsistent(Expectation(_) | WithArrow(_)))) => None /* Type checking should fail and these errors would be nullified */ + | InHole(Common(NoType(_))) + | InHole( + FreeVariable(_) | InexhaustiveMatch(_) | UnusedDeferral | + BadPartialAp(_), + ) => + failwith("InHole(InexhaustiveMatch(impossible_err))") + }; + InHole(InexhaustiveMatch(additional_err)); | (IsDeferral(InAp), Ana(ana)) => NotInHole(AnaDeferralConsistent(ana)) | (IsDeferral(_), _) => InHole(UnusedDeferral) | (IsBadPartialAp(_ as info), _) => InHole(BadPartialAp(info)) @@ -410,7 +459,11 @@ let status_typ = InHole(DuplicateConstructor(name)) | TypeExpected => switch (Ctx.is_alias(ctx, name)) { - | false => InHole(FreeTypeVariable(name)) + | false => + switch (Ctx.is_abstract(ctx, name)) { + | false => InHole(FreeTypeVariable(name)) + | true => NotInHole(Type(Var(name))) + } | true => NotInHole(TypeAlias(name, Typ.weak_head_normalize(ctx, ty))) } } @@ -437,9 +490,15 @@ let status_typ = let status_tpat = (ctx: Ctx.t, utpat: UTPat.t): status_tpat => switch (utpat.term) { | EmptyHole => NotInHole(Empty) - | Var(name) - when Form.is_base_typ(name) || Ctx.lookup_alias(ctx, name) != None => - InHole(ShadowsType(name)) + | Var(name) when Ctx.shadows_typ(ctx, name) => + let f = src => InHole(ShadowsType(name, src)); + if (Form.is_base_typ(name)) { + f(BaseTyp); + } else if (Ctx.is_alias(ctx, name)) { + f(TyAlias); + } else { + f(TyVar); + }; | Var(name) => NotInHole(Var(name)) | Invalid(_) => InHole(NotAVar(NotCapitalized)) | MultiHole(_) => InHole(NotAVar(Other)) @@ -481,11 +540,36 @@ let fixed_typ_ok: ok_pat => Typ.t = | Ana(Consistent({join, _})) => join | Ana(InternallyInconsistent({ana, _})) => ana; -let fixed_typ_pat = (ctx, mode: Mode.t, self: Self.pat): Typ.t => +let fixed_typ_pat = (ctx, mode: Mode.t, self: Self.pat): Typ.t => { + // TODO: get rid of unwrapping (probably by changing the implementation of error_exp.Redundant) + let self = + switch (self) { + | Redundant(self) => self + | _ => self + }; switch (status_pat(ctx, mode, self)) { | InHole(_) => Unknown(Internal) | NotInHole(ok) => fixed_typ_ok(ok) }; +}; + +let fixed_constraint_pat = + ( + upat: UPat.t, + ctx, + mode: Mode.t, + self: Self.pat, + constraint_: Constraint.t, + ) + : Constraint.t => + switch (upat.term) { + | TypeAnn(_) => constraint_ + | _ => + switch (fixed_typ_pat(ctx, mode, self)) { + | Unknown(_) => Constraint.Hole + | _ => constraint_ + } + }; let fixed_typ_exp = (ctx, mode: Mode.t, self: Self.exp): Typ.t => switch (status_exp(ctx, mode, self)) { @@ -505,11 +589,24 @@ let derived_exp = /* Add derivable attributes for pattern terms */ let derived_pat = - (~upat: UPat.t, ~ctx, ~co_ctx, ~mode, ~ancestors, ~self): pat => { + (~upat: UPat.t, ~ctx, ~co_ctx, ~mode, ~ancestors, ~self, ~constraint_) + : pat => { let cls = Cls.Pat(UPat.cls_of_term(upat.term)); let status = status_pat(ctx, mode, self); let ty = fixed_typ_pat(ctx, mode, self); - {cls, self, mode, ty, status, ctx, co_ctx, ancestors, term: upat}; + let constraint_ = fixed_constraint_pat(upat, ctx, mode, self, constraint_); + { + cls, + self, + mode, + ty, + status, + ctx, + co_ctx, + ancestors, + term: upat, + constraint_, + }; }; /* Add derivable attributes for types */ diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index fafee0531a..58a626ab2b 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -185,6 +185,7 @@ and exp_term: unsorted => (UExp.term, list(Id.t)) = { | (["-"], []) => UnOp(Int(Minus), r) | (["!"], []) => UnOp(Bool(Not), r) | (["fun", "->"], [Pat(pat)]) => Fun(pat, r) + | (["typfun", "->"], [TPat(tpat)]) => TypFun(tpat, r) | (["let", "=", "in"], [Pat(pat), Exp(def)]) => Let(pat, def, r) | (["hide", "in"], [Exp(filter)]) => Filter((Eval, One), filter, r) @@ -229,6 +230,7 @@ and exp_term: unsorted => (UExp.term, list(Id.t)) = { ) | _ => ret(Ap(l, arg)) }; + | (["@<", ">"], [Typ(ty)]) => ret(TypAp(l, ty)) | _ => ret(hole(tm)) } | _ => ret(hole(tm)) @@ -279,7 +281,6 @@ and exp_term: unsorted => (UExp.term, list(Id.t)) = { } | tm => ret(hole(tm)); } - and pat = unsorted => { let (term, inner_ids) = pat_term(unsorted); let ids = ids(unsorted) @ inner_ids; @@ -381,6 +382,13 @@ and typ_term: unsorted => (UTyp.term, list(Id.t)) = { | ([(_, (["(", ")"], [Typ(typ)]))], []) => ret(Ap(t, typ)) | _ => ret(hole(tm)) } + /* forall and rec have to be before sum so that they bind tighter. + * Thus `rec A -> Left(A) + Right(B)` get parsed as `rec A -> (Left(A) + Right(B))` + * If this is below the case for sum, then it gets parsed as an invalid form. */ + | Pre(([(_id, (["forall", "->"], [TPat(tpat)]))], []), Typ(t)) => + ret(Forall(tpat, t)) + | Pre(([(_id, (["rec", "->"], [TPat(tpat)]))], []), Typ(t)) => + ret(Rec(tpat, t)) | Pre(tiles, Typ({term: Sum(t0), ids})) as tm => /* Case for leading prefix + preceeding a sum */ switch (tiles) { diff --git a/src/haz3lcore/statics/Mode.re b/src/haz3lcore/statics/Mode.re index f1e3550091..441d3964b6 100644 --- a/src/haz3lcore/statics/Mode.re +++ b/src/haz3lcore/statics/Mode.re @@ -20,6 +20,7 @@ open OptUtil.Syntax; [@deriving (show({with_path: false}), sexp, yojson)] type t = | SynFun /* Used only in function position of applications */ + | SynTypFun | Syn | Ana(Typ.t); @@ -30,47 +31,68 @@ let ty_of: t => Typ.t = fun | Ana(ty) => ty | Syn => Unknown(SynSwitch) - | SynFun => Arrow(Unknown(SynSwitch), Unknown(SynSwitch)); + | SynFun => Arrow(Unknown(SynSwitch), Unknown(SynSwitch)) + | SynTypFun => Forall("syntypfun", Unknown(SynSwitch)); /* TODO: naming the type variable? */ let of_arrow = (ctx: Ctx.t, mode: t): (t, t) => switch (mode) { | Syn - | SynFun => (Syn, Syn) + | SynFun + | SynTypFun => (Syn, Syn) | Ana(ty) => ty |> Typ.matched_arrow(ctx) |> TupleUtil.map2(ana) }; +let of_forall = (ctx: Ctx.t, name_opt: option(TypVar.t), mode: t): t => + switch (mode) { + | Syn + | SynFun + | SynTypFun => Syn + | Ana(ty) => + let (name_expected_opt, item) = Typ.matched_forall(ctx, ty); + switch (name_opt, name_expected_opt) { + | (Some(name), Some(name_expected)) => + Ana(Typ.subst(Var(name), name_expected, item)) + | _ => Ana(item) + }; + }; + let of_prod = (ctx: Ctx.t, mode: t, length): list(t) => switch (mode) { | Syn - | SynFun => List.init(length, _ => Syn) + | SynFun + | SynTypFun => List.init(length, _ => Syn) | Ana(ty) => ty |> Typ.matched_prod(ctx, length) |> List.map(ana) }; let of_cons_hd = (ctx: Ctx.t, mode: t): t => switch (mode) { | Syn - | SynFun => Syn + | SynFun + | SynTypFun => Syn | Ana(ty) => Ana(Typ.matched_list(ctx, ty)) }; let of_cons_tl = (ctx: Ctx.t, mode: t, hd_ty: Typ.t): t => switch (mode) { | Syn - | SynFun => Ana(List(hd_ty)) + | SynFun + | SynTypFun => Ana(List(hd_ty)) | Ana(ty) => Ana(List(Typ.matched_list(ctx, ty))) }; let of_list = (ctx: Ctx.t, mode: t): t => switch (mode) { | Syn - | SynFun => Syn + | SynFun + | SynTypFun => Syn | Ana(ty) => Ana(Typ.matched_list(ctx, ty)) }; let of_list_concat = (ctx: Ctx.t, mode: t): t => switch (mode) { | Syn - | SynFun => Ana(List(Unknown(SynSwitch))) + | SynFun + | SynTypFun => Ana(List(Unknown(SynSwitch))) | Ana(ty) => Ana(List(Typ.matched_list(ctx, ty))) }; @@ -121,6 +143,8 @@ let of_ap = (ctx, mode, ctr: option(Constructor.t)): t => | None => SynFun }; +let typap_mode: t = SynTypFun; + let of_deferred_ap_args = (length: int, ty_ins: list(Typ.t)): list(t) => ( List.length(ty_ins) == length diff --git a/src/haz3lcore/statics/Self.re b/src/haz3lcore/statics/Self.re index 89e8352d41..052bf581ef 100644 --- a/src/haz3lcore/statics/Self.re +++ b/src/haz3lcore/statics/Self.re @@ -49,12 +49,14 @@ type error_partial_ap = [@deriving (show({with_path: false}), sexp, yojson)] type exp = | Free(Var.t) + | InexhaustiveMatch(exp) | IsDeferral(Term.UExp.deferral_position) | IsBadPartialAp(error_partial_ap) | Common(t); [@deriving (show({with_path: false}), sexp, yojson)] type pat = + | Redundant(pat) | Common(t); let join_of = (j: join_type, ty: Typ.t): Typ.t => @@ -80,13 +82,15 @@ let typ_of_exp: (Ctx.t, exp) => option(Typ.t) = ctx => fun | Free(_) + | InexhaustiveMatch(_) | IsDeferral(_) | IsBadPartialAp(_) => None | Common(self) => typ_of(ctx, self); -let typ_of_pat: (Ctx.t, pat) => option(Typ.t) = +let rec typ_of_pat: (Ctx.t, pat) => option(Typ.t) = ctx => fun + | Redundant(pat) => typ_of_pat(ctx, pat) | Common(self) => typ_of(ctx, self); /* The self of a var depends on the ctx; if the diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index 3e159d6529..73d4f02265 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -46,7 +46,10 @@ module Map = { * when iterating over the info_map should have no * effect, beyond supressing the resulting Not_found exs */ switch (Id.Map.find_opt(id, term_ranges)) { - | Some(_) when Info.is_error(info) => [id, ...acc] + | Some(_) when Info.is_error(info) && id == Info.id_of(info) => [ + id, + ...acc, + ] | _ => acc }, info_map, @@ -64,13 +67,28 @@ let map_m = (f, xs, m: Map.t) => let add_info = (ids: list(Id.t), info: Info.t, m: Map.t): Map.t => ids |> List.fold_left((m, id) => Id.Map.add(id, info, m), m); -let extend_let_def_ctx = - (ctx: Ctx.t, pat: UPat.t, pat_ctx: Ctx.t, def: UExp.t): Ctx.t => - if (UPat.is_tuple_of_arrows(pat) && UExp.is_tuple_of_functions(def)) { - pat_ctx; - } else { - ctx; +let rec is_arrow_like = (t: Typ.t) => { + switch (t) { + | Unknown(_) => true + | Arrow(_) => true + | Forall(_, t) => is_arrow_like(t) + | _ => false }; +}; + +let is_recursive = (ctx, p, def, syn: Typ.t) => { + switch (Term.UPat.get_num_of_vars(p), Term.UExp.get_num_of_functions(def)) { + | (Some(num_vars), Some(num_fns)) + when num_vars != 0 && num_vars == num_fns => + switch (Typ.normalize(ctx, syn)) { + | Prod(syns) when List.length(syns) == num_vars => + syns |> List.for_all(is_arrow_like) + | t when is_arrow_like(t) => num_vars == 1 + | _ => false + } + | _ => false + }; +}; let typ_exp_binop_bin_int: UExp.op_bin_int => Typ.t = fun @@ -224,6 +242,7 @@ and uexp_to_info_map = m, ); | ListConcat(e1, e2) => + let mode = Mode.of_list_concat(ctx, mode); let ids = List.map(Term.UExp.rep_id, [e1, e2]); let (e1, m) = go(~mode, e1, m); let (e2, m) = go(~mode, e2, m); @@ -299,6 +318,17 @@ and uexp_to_info_map = && !Typ.is_consistent(ctx, ty_in, Prod([])) ? BadTrivAp(ty_in) : Just(ty_out); add(~self, ~co_ctx=CoCtx.union([fn.co_ctx, arg.co_ctx]), m); + | TypAp(fn, utyp) => + let typfn_mode = Mode.typap_mode; + let (fn, m) = go(~mode=typfn_mode, fn, m); + let (_, m) = utyp_to_info_map(~ctx, ~ancestors, utyp, m); + let (option_name, ty_body) = Typ.matched_forall(ctx, fn.ty); + let ty = Term.UTyp.to_typ(ctx, utyp); + switch (option_name) { + | Some(name) => + add(~self=Just(Typ.subst(ty, name, ty_body)), ~co_ctx=fn.co_ctx, m) + | None => add(~self=Just(ty_body), ~co_ctx=fn.co_ctx, m) /* invalid name matches with no free type variables. */ + }; | DeferredAp(fn, args) => let fn_mode = Mode.of_ap(ctx, mode, UExp.ctr_name(fn)); let (fn, m) = go(~mode=fn_mode, fn, m); @@ -318,37 +348,91 @@ and uexp_to_info_map = /* add co_ctx to pattern */ let (p, m) = go_pat(~is_synswitch=false, ~co_ctx=e.co_ctx, ~mode=mode_pat, p, m); - add( - ~self=Just(Arrow(p.ty, e.ty)), - ~co_ctx=CoCtx.mk(ctx, p.ctx, e.co_ctx), - m, - ); + // TODO: factor out code + let unwrapped_self: Self.exp = Common(Just(Arrow(p.ty, e.ty))); + let is_exhaustive = p |> Info.pat_constraint |> Incon.is_exhaustive; + let self = + is_exhaustive ? unwrapped_self : InexhaustiveMatch(unwrapped_self); + add'(~self, ~co_ctx=CoCtx.mk(ctx, p.ctx, e.co_ctx), m); + | TypFun({term: Var(name), _} as utpat, body) + when !Ctx.shadows_typ(ctx, name) => + let mode_body = Mode.of_forall(ctx, Some(name), mode); + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + let ctx_body = + Ctx.extend_tvar( + ctx, + {name, id: Term.UTPat.rep_id(utpat), kind: Abstract}, + ); + let (body, m) = go'(~ctx=ctx_body, ~mode=mode_body, body, m); + add(~self=Just(Forall(name, body.ty)), ~co_ctx=body.co_ctx, m); + | TypFun(utpat, body) => + let mode_body = Mode.of_forall(ctx, None, mode); + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + let (body, m) = go(~mode=mode_body, body, m); + add(~self=Just(Forall("?", body.ty)), ~co_ctx=body.co_ctx, m); | Let(p, def, body) => let (p_syn, _) = go_pat(~is_synswitch=true, ~co_ctx=CoCtx.empty, ~mode=Syn, p, m); - let def_ctx = extend_let_def_ctx(ctx, p, p_syn.ctx, def); - let (def, m) = go'(~ctx=def_ctx, ~mode=Ana(p_syn.ty), def, m); - /* Analyze pattern to incorporate def type into ctx */ - let (p_ana', _) = - go_pat( - ~is_synswitch=false, - ~co_ctx=CoCtx.empty, - ~mode=Ana(def.ty), - p, - m, - ); - let (body, m) = go'(~ctx=p_ana'.ctx, ~mode, body, m); + let (def, p_ana_ctx, m, ty_p_ana) = + if (!is_recursive(ctx, p, def, p_syn.ty)) { + let (def, m) = go(~mode=Ana(p_syn.ty), def, m); + let ty_p_ana = def.ty; + let (p_ana', _) = + go_pat( + ~is_synswitch=false, + ~co_ctx=CoCtx.empty, + ~mode=Ana(ty_p_ana), + p, + m, + ); + (def, p_ana'.ctx, m, ty_p_ana); + } else { + let (def_base, _) = + go'(~ctx=p_syn.ctx, ~mode=Ana(p_syn.ty), def, m); + let ty_p_ana = def_base.ty; + /* Analyze pattern to incorporate def type into ctx */ + let (p_ana', _) = + go_pat( + ~is_synswitch=false, + ~co_ctx=CoCtx.empty, + ~mode=Ana(ty_p_ana), + p, + m, + ); + let def_ctx = p_ana'.ctx; + let (def_base2, _) = go'(~ctx=def_ctx, ~mode=Ana(p_syn.ty), def, m); + let ana_ty_fn = ((ty_fn1, ty_fn2), ty_p) => { + ty_p == Typ.Unknown(SynSwitch) && !Typ.eq(ty_fn1, ty_fn2) + ? ty_fn1 : ty_p; + }; + let ana = + switch ((def_base.ty, def_base2.ty), p_syn.ty) { + | ((Prod(ty_fns1), Prod(ty_fns2)), Prod(ty_ps)) => + let tys = + List.map2(ana_ty_fn, List.combine(ty_fns1, ty_fns2), ty_ps); + Typ.Prod(tys); + | ((ty_fn1, ty_fn2), ty_p) => ana_ty_fn((ty_fn1, ty_fn2), ty_p) + }; + let (def, m) = go'(~ctx=def_ctx, ~mode=Ana(ana), def, m); + (def, def_ctx, m, ty_p_ana); + }; + let (body, m) = go'(~ctx=p_ana_ctx, ~mode, body, m); /* add co_ctx to pattern */ let (p_ana, m) = go_pat( ~is_synswitch=false, ~co_ctx=body.co_ctx, - ~mode=Ana(def.ty), + ~mode=Ana(ty_p_ana), p, m, ); - add( - ~self=Just(body.ty), + // TODO: factor out code + let unwrapped_self: Self.exp = Common(Just(body.ty)); + let is_exhaustive = p_ana |> Info.pat_constraint |> Incon.is_exhaustive; + let self = + is_exhaustive ? unwrapped_self : InexhaustiveMatch(unwrapped_self); + add'( + ~self, ~co_ctx= CoCtx.union([def.co_ctx, CoCtx.mk(ctx, p_ana.ctx, body.co_ctx)]), m, @@ -389,19 +473,91 @@ and uexp_to_info_map = let e_tys = List.map(Info.exp_ty, es); let e_co_ctxs = List.map2(CoCtx.mk(ctx), p_ctxs, List.map(Info.exp_co_ctx, es)); - /* Add co-ctxs to patterns */ - let (_, m) = - map_m( - ((p, co_ctx)) => - go_pat(~is_synswitch=false, ~co_ctx, ~mode=Mode.Ana(scrut.ty), p), - List.combine(ps, e_co_ctxs), - m, - ); - add( - ~self=Self.match(ctx, e_tys, branch_ids), - ~co_ctx=CoCtx.union([scrut.co_ctx] @ e_co_ctxs), - m, - ); + let unwrapped_self: Self.exp = + Common(Self.match(ctx, e_tys, branch_ids)); + let constraint_ty = + switch (scrut.ty) { + | Unknown(_) => + map_m(go_pat(~is_synswitch=false, ~co_ctx=CoCtx.empty), ps, m) + |> fst + |> List.map(Info.pat_ty) + |> Typ.join_all(~empty=Unknown(Internal), ctx) + | ty => Some(ty) + }; + let (self, m) = + switch (constraint_ty) { + | Some(constraint_ty) => + let pats_to_info_map = (ps: list(UPat.t), m) => { + /* Add co-ctxs to patterns */ + List.fold_left( + ((m, acc_constraint), (p, co_ctx)) => { + let p_constraint = + go_pat( + ~is_synswitch=false, + ~co_ctx, + ~mode=Mode.Ana(constraint_ty), + p, + m, + ) + |> fst + |> Info.pat_constraint; + let (p, m) = + go_pat( + ~is_synswitch=false, + ~co_ctx, + ~mode=Mode.Ana(scrut.ty), + p, + m, + ); + let is_redundant = + Incon.is_redundant(p_constraint, acc_constraint); + let self = is_redundant ? Self.Redundant(p.self) : p.self; + let info = + Info.derived_pat( + ~upat=p.term, + ~ctx=p.ctx, + ~co_ctx=p.co_ctx, + ~mode=p.mode, + ~ancestors=p.ancestors, + ~self, + // Mark patterns as redundant at the top level + // because redundancy doesn't make sense in a smaller context + ~constraint_=p_constraint, + ); + ( + // Override the info for the single upat + add_info(p.term.ids, InfoPat(info), m), + is_redundant + ? acc_constraint // Redundant patterns are ignored + : Constraint.Or(p_constraint, acc_constraint), + ); + }, + (m, Constraint.Falsity), + List.combine(ps, e_co_ctxs), + ); + }; + let (m, final_constraint) = pats_to_info_map(ps, m); + let is_exhaustive = Incon.is_exhaustive(final_constraint); + let self = + is_exhaustive ? unwrapped_self : InexhaustiveMatch(unwrapped_self); + (self, m); + | None => + /* Add co-ctxs to patterns */ + let (_, m) = + map_m( + ((p, co_ctx)) => + go_pat( + ~is_synswitch=false, + ~co_ctx, + ~mode=Mode.Ana(scrut.ty), + p, + ), + List.combine(ps, e_co_ctxs), + m, + ); + (unwrapped_self, m); + }; + add'(~self, ~co_ctx=CoCtx.union([scrut.co_ctx] @ e_co_ctxs), m); | TyAlias(typat, utyp, body) => let m = utpat_to_info_map(~ctx, ~ancestors, typat, m) |> snd; switch (typat.term) { @@ -409,7 +565,7 @@ and uexp_to_info_map = /* Currently we disallow all type shadowing */ /* NOTE(andrew): Currently, UTyp.to_typ returns Unknown(TypeHole) for any type variable reference not in its ctx. So any free variables - in the definition won't be noticed. But we need to check for free + in the definition would be obliterated. But we need to check for free variables to decide whether to make a recursive type or not. So we tentatively add an abtract type to the ctx, representing the speculative rec parameter. */ @@ -428,6 +584,19 @@ and uexp_to_info_map = let ty = UTyp.to_typ(ctx, utyp); (ty, ctx, Ctx.extend_alias(ctx, name, UTPat.rep_id(typat), ty)); }; + /* NOTE(yuchen): Below is an alternative implementation that attempts to + add a rec whenever type alias is present. It may cause trouble to the + runtime, so precede with caution. */ + // Typ.lookup_surface(ty_pre) + // ? { + // let ty_rec = Typ.Rec({item: ty_pre, name}); + // let ctx_def = Ctx.add_alias(ctx, name, utpat_id(typat), ty_rec); + // (ty_rec, ctx_def, ctx_def); + // } + // : { + // let ty = Term.UTyp.to_typ(ctx, utyp); + // (ty, ctx, Ctx.add_alias(ctx, name, utpat_id(typat), ty)); + // }; }; let ctx_body = switch (Typ.get_sum_constructors(ctx, ty_def)) { @@ -462,7 +631,7 @@ and upat_to_info_map = m: Map.t, ) : (Info.pat, Map.t) => { - let add = (~self, ~ctx, m) => { + let add = (~self, ~ctx, ~constraint_, m) => { let info = Info.derived_pat( ~upat, @@ -471,42 +640,74 @@ and upat_to_info_map = ~mode, ~ancestors, ~self=Common(self), + ~constraint_, ); (info, add_info(ids, InfoPat(info), m)); }; - let atomic = self => add(~self, ~ctx, m); + let atomic = (self, constraint_) => add(~self, ~ctx, ~constraint_, m); let ancestors = [UPat.rep_id(upat)] @ ancestors; let go = upat_to_info_map(~is_synswitch, ~ancestors, ~co_ctx); let unknown = Typ.Unknown(is_synswitch ? SynSwitch : Internal); let ctx_fold = (ctx: Ctx.t, m) => List.fold_left2( - ((ctx, tys, m), e, mode) => + ((ctx, tys, cons, m), e, mode) => go(~ctx, ~mode, e, m) - |> (((info, m)) => (info.ctx, tys @ [info.ty], m)), - (ctx, [], m), + |> ( + ((info, m)) => ( + info.ctx, + tys @ [info.ty], + cons @ [info.constraint_], + m, + ) + ), + (ctx, [], [], m), ); + let hole = self => atomic(self, Constraint.Hole); switch (term) { | MultiHole(tms) => let (_, m) = multi(~ctx, ~ancestors, m, tms); - add(~self=IsMulti, ~ctx, m); - | Invalid(token) => atomic(BadToken(token)) - | EmptyHole => atomic(Just(unknown)) - | Int(_) => atomic(Just(Int)) - | Float(_) => atomic(Just(Float)) - | Triv => atomic(Just(Prod([]))) - | Bool(_) => atomic(Just(Bool)) - | String(_) => atomic(Just(String)) + add(~self=IsMulti, ~ctx, ~constraint_=Constraint.Hole, m); + | Invalid(token) => hole(BadToken(token)) + | EmptyHole => hole(Just(unknown)) + | Int(int) => atomic(Just(Int), Constraint.Int(int)) + | Float(float) => atomic(Just(Float), Constraint.Float(float)) + | Triv => atomic(Just(Prod([])), Constraint.Truth) + | Bool(bool) => + atomic( + Just(Bool), + bool + ? Constraint.InjL(Constraint.Truth) + : Constraint.InjR(Constraint.Truth), + ) + | String(string) => atomic(Just(String), Constraint.String(string)) | ListLit(ps) => let ids = List.map(UPat.rep_id, ps); let modes = Mode.of_list_lit(ctx, List.length(ps), mode); - let (ctx, tys, m) = ctx_fold(ctx, m, ps, modes); - add(~self=Self.listlit(~empty=unknown, ctx, tys, ids), ~ctx, m); + let (ctx, tys, cons, m) = ctx_fold(ctx, m, ps, modes); + let rec cons_fold_list = cs => + switch (cs) { + | [] => Constraint.InjL(Constraint.Truth) // Left = nil, Right = cons + | [hd, ...tl] => + Constraint.InjR(Constraint.Pair(hd, cons_fold_list(tl))) + }; + add( + ~self=Self.listlit(~empty=unknown, ctx, tys, ids), + ~ctx, + ~constraint_=cons_fold_list(cons), + m, + ); | Cons(hd, tl) => let (hd, m) = go(~ctx, ~mode=Mode.of_cons_hd(ctx, mode), hd, m); let (tl, m) = go(~ctx=hd.ctx, ~mode=Mode.of_cons_tl(ctx, mode, hd.ty), tl, m); - add(~self=Just(List(hd.ty)), ~ctx=tl.ctx, m); - | Wild => atomic(Just(unknown)) + add( + ~self=Just(List(hd.ty)), + ~ctx=tl.ctx, + ~constraint_= + Constraint.InjR(Constraint.Pair(hd.constraint_, tl.constraint_)), + m, + ); + | Wild => atomic(Just(unknown), Constraint.Truth) | Var(name) => /* NOTE: The self type assigned to pattern variables (Unknown) may be SynSwitch, but SynSwitch is never added to the context; @@ -514,25 +715,50 @@ and upat_to_info_map = let ctx_typ = Info.fixed_typ_pat(ctx, mode, Common(Just(Unknown(Internal)))); let entry = Ctx.VarEntry({name, id: UPat.rep_id(upat), typ: ctx_typ}); - add(~self=Just(unknown), ~ctx=Ctx.extend(ctx, entry), m); + add( + ~self=Just(unknown), + ~ctx=Ctx.extend(ctx, entry), + ~constraint_=Constraint.Truth, + m, + ); | Tuple(ps) => let modes = Mode.of_prod(ctx, mode, List.length(ps)); - let (ctx, tys, m) = ctx_fold(ctx, m, ps, modes); - add(~self=Just(Prod(tys)), ~ctx, m); + let (ctx, tys, cons, m) = ctx_fold(ctx, m, ps, modes); + let rec cons_fold_tuple = cs => + switch (cs) { + | [] => Constraint.Truth + | [elt] => elt + | [hd, ...tl] => Constraint.Pair(hd, cons_fold_tuple(tl)) + }; + add( + ~self=Just(Prod(tys)), + ~ctx, + ~constraint_=cons_fold_tuple(cons), + m, + ); | Parens(p) => let (p, m) = go(~ctx, ~mode, p, m); - add(~self=Just(p.ty), ~ctx=p.ctx, m); - | Constructor(ctr) => atomic(Self.of_ctr(ctx, ctr)) + add(~self=Just(p.ty), ~ctx=p.ctx, ~constraint_=p.constraint_, m); + | Constructor(ctr) => + let self = Self.of_ctr(ctx, ctr); + atomic(self, Constraint.of_ctr(ctx, mode, ctr, self)); | Ap(fn, arg) => - let fn_mode = Mode.of_ap(ctx, mode, UPat.ctr_name(fn)); + let ctr = UPat.ctr_name(fn); + let fn_mode = Mode.of_ap(ctx, mode, ctr); let (fn, m) = go(~ctx, ~mode=fn_mode, fn, m); let (ty_in, ty_out) = Typ.matched_arrow(ctx, fn.ty); let (arg, m) = go(~ctx, ~mode=Ana(ty_in), arg, m); - add(~self=Just(ty_out), ~ctx=arg.ctx, m); + add( + ~self=Just(ty_out), + ~ctx=arg.ctx, + ~constraint_= + Constraint.of_ap(ctx, mode, ctr, arg.constraint_, Some(ty_out)), + m, + ); | TypeAnn(p, ann) => let (ann, m) = utyp_to_info_map(~ctx, ~ancestors, ann, m); let (p, m) = go(~ctx, ~mode=Ana(ann.ty), p, m); - add(~self=Just(ann.ty), ~ctx=p.ctx, m); + add(~self=Just(ann.ty), ~ctx=p.ctx, ~constraint_=p.constraint_, m); }; } and utyp_to_info_map = @@ -595,6 +821,52 @@ and utyp_to_info_map = variants, ); add(m); + | Forall({term: Var(name), _} as utpat, tbody) => + let body_ctx = + Ctx.extend_tvar( + ctx, + {name, id: Term.UTPat.rep_id(utpat), kind: Abstract}, + ); + let m = + utyp_to_info_map( + tbody, + ~ctx=body_ctx, + ~ancestors, + ~expects=TypeExpected, + m, + ) + |> snd; + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + add(m); // TODO: check with andrew + | Forall(utpat, tbody) => + let m = + utyp_to_info_map(tbody, ~ctx, ~ancestors, ~expects=TypeExpected, m) + |> snd; + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + add(m); // TODO: check with andrew + | Rec({term: Var(name), _} as utpat, tbody) => + let body_ctx = + Ctx.extend_tvar( + ctx, + {name, id: Term.UTPat.rep_id(utpat), kind: Abstract}, + ); + let m = + utyp_to_info_map( + tbody, + ~ctx=body_ctx, + ~ancestors, + ~expects=TypeExpected, + m, + ) + |> snd; + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + add(m); // TODO: check with andrew + | Rec(utpat, tbody) => + let m = + utyp_to_info_map(tbody, ~ctx, ~ancestors, ~expects=TypeExpected, m) + |> snd; + let m = utpat_to_info_map(~ctx, ~ancestors, utpat, m) |> snd; + add(m); // TODO: check with andrew }; } and utpat_to_info_map = diff --git a/src/haz3lcore/statics/Term.re b/src/haz3lcore/statics/Term.re index 1546884bcb..7177f2765c 100644 --- a/src/haz3lcore/statics/Term.re +++ b/src/haz3lcore/statics/Term.re @@ -17,8 +17,50 @@ without correponding syntax classes */ include TermBase.Any; - type any = t; + +module UTPat = { + [@deriving (show({with_path: false}), sexp, yojson)] + type cls = + | Invalid + | EmptyHole + | MultiHole + | Var; + + include TermBase.UTPat; + + let rep_id = ({ids, _}) => { + assert(ids != []); + List.hd(ids); + }; + + let hole = (tms: list(any)) => + switch (tms) { + | [] => EmptyHole + | [_, ..._] => MultiHole(tms) + }; + + let cls_of_term: term => cls = + fun + | Invalid(_) => Invalid + | EmptyHole => EmptyHole + | MultiHole(_) => MultiHole + | Var(_) => Var; + + let show_cls: cls => string = + fun + | Invalid => "Invalid type binding name" + | MultiHole => "Broken type binding" + | EmptyHole => "Empty type binding hole" + | Var => "Type binding"; + + let tyvar_of_utpat = ({ids: _, term}) => + switch (term) { + | Var(x) => Some(x) + | _ => None + }; +}; + module UTyp = { [@deriving (show({with_path: false}), sexp, yojson)] type cls = @@ -36,7 +78,9 @@ module UTyp = { | Var | Constructor | Parens - | Ap; + | Ap + | Forall + | Rec; include TermBase.UTyp; @@ -67,7 +111,9 @@ module UTyp = { | Tuple(_) => Tuple | Parens(_) => Parens | Ap(_) => Ap - | Sum(_) => Sum; + | Sum(_) => Sum + | Forall(_) => Forall + | Rec(_) => Rec; let show_cls: cls => string = fun @@ -85,7 +131,9 @@ module UTyp = { | Tuple => "Product type" | Sum => "Sum type" | Parens => "Parenthesized type" - | Ap => "Constructor application"; + | Ap => "Constructor application" + | Forall => "Forall Type" + | Rec => "Recursive Type"; let rec is_arrow = (typ: t) => { switch (typ.term) { @@ -103,7 +151,31 @@ module UTyp = { | Var(_) | Constructor(_) | Ap(_) - | Sum(_) => false + | Sum(_) + | Forall(_) + | Rec(_) => false + }; + }; + + let rec is_forall = (typ: t) => { + switch (typ.term) { + | Parens(typ) => is_forall(typ) + | Forall(_) => true + | Invalid(_) + | EmptyHole + | MultiHole(_) + | Int + | Float + | Bool + | String + | Arrow(_) + | List(_) + | Tuple(_) + | Var(_) + | Constructor(_) + | Ap(_) + | Sum(_) + | Rec(_) => false }; }; @@ -128,6 +200,28 @@ module UTyp = { | Sum(uts) => Sum(to_ctr_map(ctx, uts)) | List(u) => List(to_typ(ctx, u)) | Parens(u) => to_typ(ctx, u) + | Forall({term: Var(name), _} as utpat, tbody) => + let ctx = + Ctx.extend_tvar( + ctx, + {name, id: UTPat.rep_id(utpat), kind: Abstract}, + ); + Forall(name, to_typ(ctx, tbody)); + // Rec is same as Forall + | Rec({term: Var(name), _} as utpat, tbody) => + let ctx = + Ctx.extend_tvar( + ctx, + {name, id: UTPat.rep_id(utpat), kind: Abstract}, + ); + Rec(name, to_typ(ctx, tbody)); + | Forall({term: Invalid(_), _}, tbody) + | Forall({term: EmptyHole, _}, tbody) + | Forall({term: MultiHole(_), _}, tbody) => + Forall("?", to_typ(ctx, tbody)) + | Rec({term: Invalid(_), _}, tbody) + | Rec({term: EmptyHole, _}, tbody) + | Rec({term: MultiHole(_), _}, tbody) => Rec("?", to_typ(ctx, tbody)) /* The below cases should occur only inside sums */ | Constructor(_) | Ap(_) => Unknown(Internal) @@ -149,42 +243,6 @@ module UTyp = { }; }; -module UTPat = { - [@deriving (show({with_path: false}), sexp, yojson)] - type cls = - | Invalid - | EmptyHole - | MultiHole - | Var; - - include TermBase.UTPat; - - let rep_id = ({ids, _}) => { - assert(ids != []); - List.hd(ids); - }; - - let hole = (tms: list(any)) => - switch (tms) { - | [] => EmptyHole - | [_, ..._] => MultiHole(tms) - }; - - let cls_of_term: term => cls = - fun - | Invalid(_) => Invalid - | EmptyHole => EmptyHole - | MultiHole(_) => MultiHole - | Var(_) => Var; - - let show_cls: cls => string = - fun - | Invalid => "Invalid type alias" - | MultiHole => "Broken type alias" - | EmptyHole => "Empty type alias hole" - | Var => "Type alias"; -}; - module UPat = { [@deriving (show({with_path: false}), sexp, yojson)] type cls = @@ -261,9 +319,9 @@ module UPat = { let rec is_var = (pat: t) => { switch (pat.term) { - | Parens(pat) => is_var(pat) + | Parens(pat) + | TypeAnn(pat, _) => is_var(pat) | Var(_) => true - | TypeAnn(_) | Invalid(_) | EmptyHole | MultiHole(_) @@ -284,7 +342,8 @@ module UPat = { let rec is_fun_var = (pat: t) => { switch (pat.term) { | Parens(pat) => is_fun_var(pat) - | TypeAnn(pat, typ) => is_var(pat) && UTyp.is_arrow(typ) + | TypeAnn(pat, typ) => + is_var(pat) && (UTyp.is_arrow(typ) || UTyp.is_forall(typ)) | Invalid(_) | EmptyHole | MultiHole(_) @@ -327,11 +386,35 @@ module UPat = { } ); + let rec is_tuple_of_vars = (pat: t) => + is_var(pat) + || ( + switch (pat.term) { + | Parens(pat) + | TypeAnn(pat, _) => is_tuple_of_vars(pat) + | Tuple(pats) => pats |> List.for_all(is_var) + | Invalid(_) + | EmptyHole + | MultiHole(_) + | Wild + | Int(_) + | Float(_) + | Bool(_) + | String(_) + | Triv + | ListLit(_) + | Cons(_, _) + | Var(_) + | Constructor(_) + | Ap(_) => false + } + ); + let rec get_var = (pat: t) => { switch (pat.term) { - | Parens(pat) => get_var(pat) + | Parens(pat) + | TypeAnn(pat, _) => get_var(pat) | Var(x) => Some(x) - | TypeAnn(_) | Invalid(_) | EmptyHole | MultiHole(_) @@ -353,7 +436,7 @@ module UPat = { switch (pat.term) { | Parens(pat) => get_fun_var(pat) | TypeAnn(pat, typ) => - if (UTyp.is_arrow(typ)) { + if (UTyp.is_arrow(typ) || UTyp.is_forall(typ)) { get_var(pat) |> Option.map(var => var); } else { None; @@ -376,18 +459,45 @@ module UPat = { }; }; - let rec get_recursive_bindings = (pat: t) => { - switch (get_fun_var(pat)) { + let rec get_num_of_vars = (pat: t) => + if (is_var(pat)) { + Some(1); + } else { + switch (pat.term) { + | Parens(pat) + | TypeAnn(pat, _) => get_num_of_vars(pat) + | Tuple(pats) => + is_tuple_of_vars(pat) ? Some(List.length(pats)) : None + | Invalid(_) + | EmptyHole + | MultiHole(_) + | Wild + | Int(_) + | Float(_) + | Bool(_) + | String(_) + | Triv + | ListLit(_) + | Cons(_, _) + | Var(_) + | Constructor(_) + | Ap(_) => None + }; + }; + + let rec get_bindings = (pat: t) => + switch (get_var(pat)) { | Some(x) => Some([x]) | None => switch (pat.term) { - | Parens(pat) => get_recursive_bindings(pat) + | Parens(pat) + | TypeAnn(pat, _) => get_bindings(pat) | Tuple(pats) => - let fun_vars = pats |> List.map(get_fun_var); - if (List.exists(Option.is_none, fun_vars)) { + let vars = pats |> List.map(get_var); + if (List.exists(Option.is_none, vars)) { None; } else { - Some(List.map(Option.get, fun_vars)); + Some(List.map(Option.get, vars)); }; | Invalid(_) | EmptyHole @@ -401,12 +511,10 @@ module UPat = { | ListLit(_) | Cons(_, _) | Var(_) - | TypeAnn(_) | Constructor(_) | Ap(_) => None } }; - }; let ctr_name = (p: t): option(Constructor.t) => switch (p.term) { @@ -432,12 +540,14 @@ module UExp = { | ListLit | Constructor | Fun + | TypFun | Tuple | Var | MetaVar | Let | TyAlias | Ap + | TypAp | DeferredAp | Pipeline | If @@ -476,11 +586,13 @@ module UExp = { | ListLit(_) => ListLit | Constructor(_) => Constructor | Fun(_) => Fun + | TypFun(_) => TypFun | Tuple(_) => Tuple | Var(_) => Var | Let(_) => Let | TyAlias(_) => TyAlias | Ap(_) => Ap + | TypAp(_) => TypAp | DeferredAp(_) => DeferredAp | Pipeline(_) => Pipeline | If(_) => If @@ -571,12 +683,14 @@ module UExp = { | ListLit => "List literal" | Constructor => "Constructor" | Fun => "Function literal" + | TypFun => "Type Function Literal" | Tuple => "Tuple literal" | Var => "Variable reference" | MetaVar => "Meta variable reference" | Let => "Let expression" | TyAlias => "Type Alias definition" | Ap => "Application" + | TypAp => "Type application" | DeferredAp => "Partial Application" | Pipeline => "Pipeline expression" | If => "If expression" @@ -590,9 +704,12 @@ module UExp = { | UnOp(op) => show_unop(op) | Match => "Case expression"; + // Typfun should be treated as a function here as this is only used to + // determine when to allow for recursive definitions in a let binding. let rec is_fun = (e: t) => { switch (e.term) { | Parens(e) => is_fun(e) + | TypFun(_) | Fun(_) => true | Invalid(_) | EmptyHole @@ -609,6 +726,7 @@ module UExp = { | Let(_) | TyAlias(_) | Ap(_) + | TypAp(_) | DeferredAp(_) | Pipeline(_) | If(_) @@ -641,10 +759,12 @@ module UExp = { | String(_) | ListLit(_) | Fun(_) + | TypFun(_) | Var(_) | Let(_) | TyAlias(_) | Ap(_) + | TypAp(_) | DeferredAp(_) | Pipeline(_) | If(_) @@ -672,6 +792,45 @@ module UExp = { | _ => false }; }; + + let rec get_num_of_functions = (e: t) => + if (is_fun(e)) { + Some(1); + } else { + switch (e.term) { + | Parens(e) => get_num_of_functions(e) + | Tuple(es) => is_tuple_of_functions(e) ? Some(List.length(es)) : None + | Invalid(_) + | EmptyHole + | MultiHole(_) + | Triv + | Deferral(_) + | Bool(_) + | Int(_) + | Float(_) + | String(_) + | ListLit(_) + | Fun(_) + | TypFun(_) + | Var(_) + | Let(_) + | Filter(_) + | TyAlias(_) + | Ap(_) + | TypAp(_) + | DeferredAp(_) + | Pipeline(_) + | If(_) + | Seq(_) + | Test(_) + | Cons(_) + | ListConcat(_) + | UnOp(_) + | BinOp(_) + | Match(_) + | Constructor(_) => None + }; + }; }; // TODO(d): consider just folding this into UExp diff --git a/src/haz3lcore/statics/TermBase.re b/src/haz3lcore/statics/TermBase.re index 5a0cfbce58..80724aff20 100644 --- a/src/haz3lcore/statics/TermBase.re +++ b/src/haz3lcore/statics/TermBase.re @@ -113,12 +113,15 @@ and UExp: { | Float | String | ListLit - | Tag + | Constructor | Fun + | TypFun | Tuple | Var | Let + | TyAlias | Ap + | TypAp | If | Seq | Test @@ -149,11 +152,13 @@ and UExp: { | ListLit(list(t)) | Constructor(string) | Fun(UPat.t, t) + | TypFun(UTPat.t, t) | Tuple(list(t)) | Var(Var.t) | Let(UPat.t, t, t) | TyAlias(UTPat.t, UTyp.t, t) | Ap(t, t) + | TypAp(t, UTyp.t) | DeferredAp(t, list(t)) | Pipeline(t, t) | If(t, t, t) @@ -251,12 +256,15 @@ and UExp: { | Float | String | ListLit - | Tag + | Constructor | Fun + | TypFun | Tuple | Var | Let + | TyAlias | Ap + | TypAp | If | Seq | Test @@ -287,11 +295,13 @@ and UExp: { | ListLit(list(t)) | Constructor(string) | Fun(UPat.t, t) + | TypFun(UTPat.t, t) | Tuple(list(t)) | Var(Var.t) | Let(UPat.t, t, t) | TyAlias(UTPat.t, UTyp.t, t) | Ap(t, t) + | TypAp(t, UTyp.t) | DeferredAp(t, list(t)) | Pipeline(t, t) | If(t, t, t) @@ -423,6 +433,8 @@ and UTyp: { | Parens(t) | Ap(t, t) | Sum(list(variant)) + | Forall(UTPat.t, t) + | Rec(UTPat.t, t) and variant = | Variant(Constructor.t, list(Id.t), option(t)) | BadEntry(t) @@ -448,6 +460,8 @@ and UTyp: { | Parens(t) | Ap(t, t) | Sum(list(variant)) + | Forall(UTPat.t, t) + | Rec(UTPat.t, t) and variant = | Variant(Constructor.t, list(Id.t), option(t)) | BadEntry(t) diff --git a/src/haz3lcore/statics/TypBase.re b/src/haz3lcore/statics/TypBase.re index 1589fa766e..58690c3aec 100644 --- a/src/haz3lcore/statics/TypBase.re +++ b/src/haz3lcore/statics/TypBase.re @@ -33,6 +33,7 @@ module rec Typ: { | Sum(sum_map) | Prod(list(t)) | Rec(TypVar.t, t) + | Forall(TypVar.t, t) and sum_map = ConstructorMap.t(option(t)); [@deriving (show({with_path: false}), sexp, yojson)] @@ -52,6 +53,7 @@ module rec Typ: { let join_type_provenance: (type_provenance, type_provenance) => type_provenance; let matched_arrow: (Ctx.t, t) => (t, t); + let matched_forall: (Ctx.t, t) => (option(string), t); let matched_prod: (Ctx.t, int, t) => list(t); let matched_list: (Ctx.t, t) => t; let matched_args: (Ctx.t, int, t) => list(t); @@ -69,6 +71,8 @@ module rec Typ: { let sum_entry: (Constructor.t, sum_map) => option(sum_entry); let get_sum_constructors: (Ctx.t, t) => option(sum_map); let is_unknown: t => bool; + let needs_parens: t => bool; + let pretty_print: t => string; } = { [@deriving (show({with_path: false}), sexp, yojson)] type type_provenance = @@ -91,6 +95,7 @@ module rec Typ: { | Sum(sum_map) | Prod(list(t)) | Rec(TypVar.t, t) + | Forall(TypVar.t, t) and sum_map = ConstructorMap.t(option(t)); [@deriving (show({with_path: false}), sexp, yojson)] @@ -131,12 +136,42 @@ module rec Typ: { | Unknown(_) | Var(_) | Rec(_) + | Forall(_) | Sum(_) => precedence_Sum | List(_) => precedence_Const | Prod(_) => precedence_Prod | Arrow(_, _) => precedence_Arrow }; + let rec free_vars = (~bound=[], ty: t): list(Var.t) => + switch (ty) { + | Unknown(_) + | Int + | Float + | Bool + | String => [] + | Var(v) => List.mem(v, bound) ? [] : [v] + | List(ty) => free_vars(~bound, ty) + | Arrow(t1, t2) => free_vars(~bound, t1) @ free_vars(~bound, t2) + | Sum(sm) => + ListUtil.flat_map( + fun + | None => [] + | Some(typ) => free_vars(~bound, typ), + List.map(snd, sm), + ) + | Prod(tys) => ListUtil.flat_map(free_vars(~bound), tys) + | Rec(x, ty) => free_vars(~bound=[x, ...bound], ty) + | Forall(x, ty) => free_vars(~bound=[x, ...bound], ty) + }; + + let var_count = ref(0); + let fresh_var = (var_name: string) => { + let x = var_count^; + var_count := x + 1; + var_name ++ "_α" ++ string_of_int(x); + }; + let rec subst = (s: t, x: TypVar.t, ty: t) => { switch (ty) { | Int => Int @@ -148,7 +183,15 @@ module rec Typ: { | Prod(tys) => Prod(List.map(subst(s, x), tys)) | Sum(sm) => Sum(ConstructorMap.map(Option.map(subst(s, x)), sm)) | Rec(y, ty) when TypVar.eq(x, y) => Rec(y, ty) + | Rec(y, ty) when List.mem(y, free_vars(s)) => + let fresh = fresh_var(y); + Rec(fresh, subst(s, x, subst(Var(fresh), y, ty))); | Rec(y, ty) => Rec(y, subst(s, x, ty)) + | Forall(y, ty) when TypVar.eq(x, y) => Forall(y, ty) + | Forall(y, ty) when List.mem(y, free_vars(s)) => + let fresh = fresh_var(y); + Forall(fresh, subst(s, x, subst(Var(fresh), y, ty))); + | Forall(y, ty) => Forall(y, subst(s, x, ty)) | List(ty) => List(subst(s, x, ty)) | Var(y) => TypVar.eq(x, y) ? s : Var(y) }; @@ -160,12 +203,19 @@ module rec Typ: { | _ => ty }; - /* Type Equality: At the moment, this coincides with alpha equivalence, - but this will change when polymorphic types are implemented */ - let rec eq = (t1: t, t2: t): bool => { + /* Type Equality: This coincides with alpha equivalence for normalized types. + Other types may be equivalent but this will not detect so if they are not normalized. */ + let rec eq_internal = (n: int, t1: t, t2: t) => { switch (t1, t2) { - | (Rec(x1, t1), Rec(x2, t2)) => eq(t1, subst(Var(x1), x2, t2)) + | (Rec(x1, t1), Rec(x2, t2)) + | (Forall(x1, t1), Forall(x2, t2)) => + eq_internal( + n + 1, + subst(Var("=" ++ string_of_int(n)), x1, t1), + subst(Var("=" ++ string_of_int(n)), x2, t2), + ) | (Rec(_), _) => false + | (Forall(_), _) => false | (Int, Int) => true | (Int, _) => false | (Float, Float) => true @@ -176,40 +226,23 @@ module rec Typ: { | (String, _) => false | (Unknown(_), Unknown(_)) => true | (Unknown(_), _) => false - | (Arrow(t1, t2), Arrow(t1', t2')) => eq(t1, t1') && eq(t2, t2') + | (Arrow(t1, t2), Arrow(t1', t2')) => + eq_internal(n, t1, t1') && eq_internal(n, t2, t2') | (Arrow(_), _) => false - | (Prod(tys1), Prod(tys2)) => List.equal(eq, tys1, tys2) + | (Prod(tys1), Prod(tys2)) => List.equal(eq_internal(n), tys1, tys2) | (Prod(_), _) => false - | (List(t1), List(t2)) => eq(t1, t2) + | (List(t1), List(t2)) => eq_internal(n, t1, t2) | (List(_), _) => false | (Sum(sm1), Sum(sm2)) => - ConstructorMap.equal(Option.equal(eq), sm1, sm2) + /* Does not normalize the types. */ + ConstructorMap.equal(Option.equal(eq_internal(n)), sm1, sm2) | (Sum(_), _) => false | (Var(n1), Var(n2)) => n1 == n2 | (Var(_), _) => false }; }; - let rec free_vars = (~bound=[], ty: t): list(Var.t) => - switch (ty) { - | Unknown(_) - | Int - | Float - | Bool - | String => [] - | Var(v) => List.mem(v, bound) ? [] : [v] - | List(ty) => free_vars(~bound, ty) - | Arrow(t1, t2) => free_vars(~bound, t1) @ free_vars(~bound, t2) - | Sum(sm) => - ListUtil.flat_map( - fun - | None => [] - | Some(typ) => free_vars(~bound, typ), - List.map(snd, sm), - ) - | Prod(tys) => ListUtil.flat_map(free_vars(~bound), tys) - | Rec(x, ty) => free_vars(~bound=[x, ...bound], ty) - }; + let eq = (t1: t, t2: t): bool => eq_internal(0, t1, t2); /* Lattice join on types. This is a LUB join in the hazel2 sense in that any type dominates Unknown. The optional @@ -245,18 +278,23 @@ module rec Typ: { !resolve && eq(ty_name, ty_join) ? Var(name) : ty_join; /* Note: Ordering of Unknown, Var, and Rec above is load-bearing! */ | (Rec(x1, ty1), Rec(x2, ty2)) => - /* TODO: - This code isn't fully correct, as we may be doing - substitution on open terms; if x1 occurs in ty2, - we should be substituting x1 for a fresh variable - in ty2. This is annoying, and should be obviated - by the forthcoming debruijn index implementation - */ let ctx = Ctx.extend_dummy_tvar(ctx, x1); let+ ty_body = - join(~resolve, ~fix, ctx, ty1, subst(Var(x1), x2, ty2)); + join(~resolve, ~fix, ctx, subst(Var(x2), x1, ty1), ty2); Rec(x1, ty_body); + | (Forall(x1, ty1), Forall(x2, ty2)) => + let ctx = Ctx.extend_dummy_tvar(ctx, x1); + let+ ty_body = + join(~resolve, ~fix, ctx, subst(Var(x2), x1, ty1), ty2); + Forall(x1, ty_body); + /* Note for above: there is no danger of free variable capture as + subst itself performs capture avoiding substitution. However this + may generate internal type variable names that in corner cases can + be exposed to the user. We preserve the variable name of the + second type to preserve synthesized type variable names, which + come from user annotations. */ | (Rec(_), _) => None + | (Forall(_), _) => None | (Int, Int) => Some(Int) | (Int, _) => None | (Float, Float) => Some(Float) @@ -356,6 +394,8 @@ module rec Typ: { as in current implementation Recs do not occur in the surface syntax, so we won't try to jump to them. */ Rec(name, normalize(Ctx.extend_dummy_tvar(ctx, name), ty)) + | Forall(name, ty) => + Forall(name, normalize(Ctx.extend_dummy_tvar(ctx, name), ty)) }; }; @@ -366,6 +406,13 @@ module rec Typ: { | _ => (Unknown(Internal), Unknown(Internal)) }; + let matched_forall = (ctx, ty) => + switch (weak_head_normalize(ctx, ty)) { + | Forall(t, ty) => (Some(t), ty) + | Unknown(SynSwitch) => (None, Unknown(SynSwitch)) + | _ => (None, Unknown(Internal)) + }; + let matched_prod = (ctx, length, ty) => switch (weak_head_normalize(ctx, ty)) { | Prod(tys) when List.length(tys) == length => tys @@ -432,7 +479,71 @@ module rec Typ: { | Unknown(_) => true | _ => false }; + + /* Does the type require parentheses when on the left of an arrow for printing? */ + let needs_parens = (ty: t): bool => + switch (ty) { + | Unknown(_) + | Int + | Float + | String + | Bool + | Var(_) => false + | Rec(_, _) + | Forall(_, _) => true + | List(_) => false /* is already wrapped in [] */ + | Arrow(_, _) => true + | Prod(_) + | Sum(_) => true /* disambiguate between (A + B) -> C and A + (B -> C) */ + }; + + /* Essentially recreates haz3lweb/view/Type.re's view_ty but with string output */ + let rec pretty_print = (ty: t): string => + switch (ty) { + | Unknown(_) => "?" + | Int => "Int" + | Float => "Float" + | Bool => "Bool" + | String => "String" + | Var(tvar) => tvar + | List(t) => "[" ++ pretty_print(t) ++ "]" + | Arrow(t1, t2) => paren_pretty_print(t1) ++ "->" ++ pretty_print(t2) + | Sum(sm) => + switch (sm) { + | [] => "+?" + | [t0] => "+" ++ ctr_pretty_print(t0) + | [t0, ...ts] => + List.fold_left( + (acc, t) => acc ++ "+" ++ ctr_pretty_print(t), + ctr_pretty_print(t0), + ts, + ) + } + | Prod([]) => "()" + | Prod([t0, ...ts]) => + "(" + ++ List.fold_left( + (acc, t) => acc ++ ", " ++ pretty_print(t), + pretty_print(t0), + ts, + ) + ++ ")" + | Rec(tv, t) => "rec " ++ tv ++ "->" ++ pretty_print(t) + | Forall(tv, t) => "forall " ++ tv ++ "->" ++ pretty_print(t) + } + and ctr_pretty_print = ((ctr, typ)) => + switch (typ) { + | None => ctr + | Some(typ) => ctr ++ "(" ++ pretty_print(typ) ++ ")" + } + and paren_pretty_print = typ => + if (needs_parens(typ)) { + "(" ++ pretty_print(typ) ++ ")"; + } else { + pretty_print(typ); + }; } + and Ctx: { [@deriving (show({with_path: false}), sexp, yojson)] type var_entry = { @@ -467,6 +578,7 @@ and Ctx: { let lookup_var: (t, string) => option(var_entry); let lookup_ctr: (t, string) => option(var_entry); let is_alias: (t, TypVar.t) => bool; + let is_abstract: (t, TypVar.t) => bool; let add_ctrs: (t, TypVar.t, Id.t, Typ.sum_map) => t; let subtract_prefix: (t, t) => option(t); let added_bindings: (t, t) => t; @@ -550,6 +662,12 @@ and Ctx: { | None => false }; + let is_abstract = (ctx: t, name: TypVar.t): bool => + switch (lookup_tvar(ctx, name)) { + | Some({kind: Abstract, _}) => true + | _ => false + }; + let add_ctrs = (ctx: t, name: TypVar.t, id: Id.t, ctrs: Typ.sum_map): t => List.map( ((ctr, typ)) => @@ -614,7 +732,7 @@ and Ctx: { |> (((ctx, _, _)) => List.rev(ctx)); let shadows_typ = (ctx: t, name: TypVar.t): bool => - Form.is_base_typ(name) || lookup_alias(ctx, name) != None; + Form.is_base_typ(name) || is_alias(ctx, name) || is_abstract(ctx, name); } and Kind: { [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/statics/Var.re b/src/haz3lcore/statics/Var.re index 998e53262b..f684dacfe5 100644 --- a/src/haz3lcore/statics/Var.re +++ b/src/haz3lcore/statics/Var.re @@ -31,12 +31,6 @@ let is_case = eq("case"); let is_wild = eq("_"); -let is_keyword = s => - switch (ExpandingKeyword.mk(s)) { - | Some(_) => true - | None => false - }; - let split = (pos, name) => { let left_var = String.sub(name, 0, pos); let right_var = String.sub(name, pos, String.length(name) - pos); diff --git a/src/haz3lcore/zipper/EditorUtil.re b/src/haz3lcore/zipper/EditorUtil.re index 795d96498b..bccb43ced0 100644 --- a/src/haz3lcore/zipper/EditorUtil.re +++ b/src/haz3lcore/zipper/EditorUtil.re @@ -55,9 +55,11 @@ let rec append_exp = (e1: TermBase.UExp.t, e2: TermBase.UExp.t) => { | ListLit(_) | Constructor(_) | Fun(_) + | TypFun(_) | Tuple(_) | Var(_) | Ap(_) + | TypAp(_) | DeferredAp(_) | Pipeline(_) | If(_) diff --git a/src/haz3lschool/SyntaxTest.re b/src/haz3lschool/SyntaxTest.re index d6cb7c35c3..15113a8dd8 100644 --- a/src/haz3lschool/SyntaxTest.re +++ b/src/haz3lschool/SyntaxTest.re @@ -14,6 +14,29 @@ type syntax_result = { percentage: float, }; +let rec find_var_upat = (name: string, upat: Term.UPat.t): bool => { + switch (upat.term) { + | Var(x) => x == name + | EmptyHole + | Wild + | Triv + | Invalid(_) + | MultiHole(_) + | Int(_) + | Float(_) + | Bool(_) + | String(_) + | Constructor(_) => false + | Cons(up1, up2) => find_var_upat(name, up1) || find_var_upat(name, up2) + | ListLit(l) + | Tuple(l) => + List.fold_left((acc, up) => {acc || find_var_upat(name, up)}, false, l) + | Parens(up) => find_var_upat(name, up) + | Ap(up1, up2) => find_var_upat(name, up1) || find_var_upat(name, up2) + | TypeAnn(up, _) => find_var_upat(name, up) + }; +}; + /* Helper function used in the function find_fn which takes the pattern (upat) and the definition (def) of a let expression and @@ -73,7 +96,9 @@ let rec find_fn = | ListLit(ul) | Tuple(ul) => List.fold_left((acc, u1) => {find_fn(name, u1, acc)}, l, ul) + | TypFun(_, body) | Fun(_, body) => l |> find_fn(name, body) + | TypAp(u1, _) | Parens(u1) | UnOp(_, u1) | TyAlias(_, _, u1) @@ -167,6 +192,8 @@ let rec var_mention = (name: string, uexp: Term.UExp.t): bool => { | Let(p, def, body) => var_mention_upat(name, p) ? false : var_mention(name, def) || var_mention(name, body) + | TypFun(_, u) + | TypAp(u, _) | Test(u) | Parens(u) | UnOp(_, u) @@ -220,11 +247,17 @@ let rec var_applied = (name: string, uexp: Term.UExp.t): bool => { | Let(p, def, body) => var_mention_upat(name, p) ? false : var_applied(name, def) || var_applied(name, body) + | TypFun(_, u) | Test(u) | Parens(u) | UnOp(_, u) | TyAlias(_, _, u) | Filter(_, _, u) => var_applied(name, u) + | TypAp(u, _) => + switch (u.term) { + | Var(x) => x == name ? true : false + | _ => var_applied(name, u) + } | Ap(u1, u2) => switch (u1.term) { | Var(x) => x == name ? true : var_applied(name, u2) @@ -305,6 +338,8 @@ let rec tail_check = (name: string, uexp: Term.UExp.t): bool => { | Test(_) => false | TyAlias(_, _, u) | Filter(_, _, u) + | TypFun(_, u) + | TypAp(u, _) | Parens(u) => tail_check(name, u) | UnOp(_, u) => !var_mention(name, u) | Ap(u1, u2) => var_mention(name, u2) ? false : tail_check(name, u1) diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 0b08bb2617..84116e2fe6 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -8589,7 +8589,7 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ c02465e1-d580-455a-aa60-b6aeb9216493)(content(Comment\"# \ Hazel Language Quick Reference #\"))))(Secondary((id \ eac6ad58-e3bb-434f-9db0-2e8fd6072393)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -10228,3965 +10228,6190 @@ let startup : PersistentData.t = \"))))(Secondary((id \ ba102ddc-ef92-487c-b01f-3e1dc2efa6c2)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ 33dd8e04-138e-4c10-a0d3-21170aac493f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - d74ffc8b-d059-4d7a-9e68-c03ea87db97d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 325d816c-fcaf-4734-a327-3c7e241b7d9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 272ef5a0-043b-451d-a6e4-3f18571d2c60)(content(Comment\"# \ - Strings #\"))))(Secondary((id \ - 4d0dd9cb-c943-4384-a682-8884ac792b31)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 26109999-748a-492d-8991-dedcf22f3c8f)(label(let = \ + 9991f3a8-0275-4b2d-b84b-dc1f08b7f0c0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b90baab9-f7d3-4fbb-addd-99040020a2d6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + edfce7ce-180d-431a-b9b2-a2e7a51639ef)(content(Comment\"# \ + Polymorphic Functions #\"))))(Secondary((id \ + d74ffc8b-d059-4d7a-9e68-c03ea87db97d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + be30a708-71f1-4d22-b019-f2fa6a852c36)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4b4ec423-bdf0-4f77-9cff-633eca5eb8f6)(content(Whitespace\" \ + ccf15e74-30da-475b-a0c2-478d1625f8bf)(content(Whitespace\" \ \"))))(Tile((id \ - 8f2bf699-8a6e-4a4a-acce-4a801b081fc5)(label(string_lits))(mold((out \ + b7f6dd49-e74e-47e0-9442-c67a9337c079)(label(poly_id))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 76fa4320-9686-418b-bae1-2e16981ef6df)(content(Whitespace\" \ + d3788600-3613-40f5-8a38-d4c3f512bd11)(content(Whitespace\" \ + \"))))(Tile((id \ + edc9de0a-0f75-46a9-b412-17ea5fbafe3f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 25a95d9b-158a-4afc-9aee-a6f3663a5267)(content(Whitespace\" \ + \"))))(Tile((id \ + 6eea38a1-2acb-405c-b00a-175c767b094c)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 19b97957-796a-4a68-bed4-e9bacb1a438b)(content(Whitespace\" \ + \"))))(Tile((id \ + a9f2034f-6f84-43f1-825a-4222508c85ac)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 79e3788d-780b-44f3-bebc-bb7b72b6c4f6)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 330b36a2-7516-479c-b8d0-d3296ef52d22)(content(Whitespace\" \ + \"))))(Tile((id \ + aa180020-b296-4890-91d0-23b42ae036f5)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 07a039d0-ad3c-425a-8351-ea29333cbe86)(content(Whitespace\" \ + \"))))(Tile((id \ + dcb3a139-8a15-4ca5-804b-7790b2db8454)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + b546a9d7-62e6-4831-9951-02257cd8be0d)(content(Whitespace\" \ + \"))))(Tile((id \ + 29e8d470-5c3c-4446-a49d-1510641e1489)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 3c96f25f-b9b8-4a4d-bd88-970efe02a038)(content(Whitespace\" \ \")))))((Secondary((id \ - dc5fbac0-a612-4966-b776-a5b222ee2837)(content(Whitespace\" \ + ea0072f4-75ba-4373-8200-b1d1cbfa944d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a30494f3-c10f-449f-a47e-9cac67ec43e4)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 8b4c1606-1f5f-4619-b841-2bd570127056)(content(Whitespace\" \ \"))))(Tile((id \ - eb0ff38c-7c16-49f9-9547-019753f2f677)(label(\"\\\"Hello, \ - world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 4561c14d-dc9c-4e62-9c83-2258ba03da27)(content(Whitespace\" \ + 29351975-8dc7-455a-a313-eb4133370d9e)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 5fc9ced0-2b6f-4f95-98e8-e6871ee17cf8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8387e074-4d46-46a6-a37c-d10aab222c02)(content(Whitespace\" \ - \"))))(Secondary((id \ - a6f7d9a5-1f93-42a7-9365-fb6f3beb8c74)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d573bc1e-fc6e-4c9b-bd47-b21d74a42b50)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 0a7aab63-f372-4baf-863a-99f536c5764c)(content(Whitespace\" \ + 0351c740-c538-4e10-b168-2a19621720cb)(content(Whitespace\" \ \"))))(Tile((id \ - 41148c0d-9e2b-49b5-be97-c798c36ec89a)(label(string_equality))(mold((out \ + 3edfb2a6-ae95-424f-960b-3a8165db4d2a)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 4237578d-8437-47d1-8135-0dd226630c52)(content(Whitespace\" \ + \"))))(Tile((id \ + f1f49520-1f5c-4c42-8c1e-0afbd693de61)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fdbb6a30-47a8-4665-bd2b-709aad04126a)(content(Whitespace\" \ - \")))))((Secondary((id \ - bfb84ac4-7973-473c-b655-71b846366ae4)(content(Whitespace\" \ - \"))))(Tile((id \ - d2e0ac51-b1d5-47c5-9d9e-28671583db5c)(label(string_lits))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c14d9212-5436-4359-aed1-4c12bc651145)(content(Whitespace\" \ + 523cb91b-d643-4bce-aa48-7e75bfca2eb6)(content(Whitespace\" \ \"))))(Tile((id \ - 479deac9-99cd-44c2-afd7-83aa87dc31c3)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 92d22bfe-5056-482f-ad46-5ed1c4787fa1)(content(Whitespace\" \ + fe554f4e-89ee-4d69-b788-d78d5e43b0a4)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 77dc15d2-f278-43a4-a720-45082382fe8e)(content(Whitespace\" \ \"))))(Tile((id \ - dec5173c-0001-412c-acec-9d1dc2ca4424)(label(\"\\\"Hello, \ - world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 242b38cc-9ec3-496b-a61b-180d2dab6eee)(content(Whitespace\" \ + c86b754d-9643-4cc0-b5dc-de2074cc9486)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 3afe26ba-61a0-4712-8369-f75dba447c41)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2fcdc646-7a16-44a7-bdbd-2db157c25c29)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0916a810-eeaa-4b3b-a5d3-3750e01e4ec9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3f1d1253-4e0e-4331-bf9c-180e141079b2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 29d208e1-0c45-44d2-9d94-99224e7b7bae)(content(Comment\"# \ - Non-empty holes are the red dotted boxes around errors \ - #\"))))(Secondary((id \ - 394efbca-78fe-4391-aed8-7cf3e9954cff)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5501da01-0362-43bd-90d2-2f73051ebd5d)(content(Comment\"# (you \ - can still run programs with non-empty holes) \ - #\"))))(Secondary((id \ - 83366e95-3f7a-43c0-b6dd-b8b856c15bff)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8ff64362-463c-4a28-b9fb-c5874d923bb7)(label(let = \ + fceafefa-bde0-4f4a-8250-e480e42a456e)(content(Whitespace\" \ + \"))))(Tile((id \ + 821578a3-efe2-4747-968c-1af34fa66cd8)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 43e7a315-d368-4859-bb56-66839a8292e7)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 17810f4f-b62b-46e7-8613-a80821e1f896)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 547b939e-ffd6-46ff-929f-2b0e225fe9df)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 907bcaba-6a39-4298-be9c-a9933d6bb965)(content(Whitespace\" \ + b66c0b83-c059-4925-b25f-9c23c0cc6413)(content(Whitespace\" \ \"))))(Tile((id \ - e3cc5308-0a4a-486b-8505-50d4759fadea)(label(non_empty_hole))(mold((out \ + 31be1813-03d0-4110-b37b-d710f5dcc43c)(label(apply_both))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3869b181-7c6a-4947-8188-34ac4be2e935)(content(Whitespace\" \ + 06a274cd-38db-4c54-98d8-69fe9c184c5e)(content(Whitespace\" \ \"))))(Tile((id \ - 6116797d-7f61-4299-8d03-b3b55489807f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 6ed96af6-8bf7-4fb1-b1e8-d2c9814299b1)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2c2c4658-b792-43a5-8414-1cb5aae4c7c1)(content(Whitespace\" \ + 9dd0b82e-5563-4cd3-a81d-069903c7b67b)(content(Whitespace\" \ \"))))(Tile((id \ - 3778ca66-6e86-4b5a-984e-de82e05a54e1)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7406cf71-6145-4be2-80b9-c2a2a292175b)(content(Whitespace\" \ - \")))))((Secondary((id \ - 3d632ecf-da09-4334-8577-c8b9ede604d0)(content(Whitespace\" \ + 490bc44f-0166-4717-b032-82cffdddff56)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 1425337b-b260-4e7b-b37a-b8b6dcf8d34a)(content(Whitespace\" \ \"))))(Tile((id \ - f5fb9f60-65fd-4b86-ac03-f79a42e79876)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d9032067-95b2-4bc6-8813-402fb0516108)(content(Whitespace\" \ + 832da6f4-dbd5-43ad-ac4c-cfe93abf8ea5)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + d46f7c08-56dd-4a91-a99a-4e9465f96c26)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1add6c79-d411-4ab9-b51d-581ef672ed1d)(content(Whitespace\" \ - \"))))(Secondary((id \ - efe99dcd-cd32-4bd1-ba0a-32508d520ddf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 96260b30-8ae6-454d-8da1-c532a1efa904)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 376a24fd-5524-4558-902c-6fc859f4e3b0)(content(Comment\"# \ - Tests, separated by semicolons #\"))))(Secondary((id \ - aa070fd5-bc99-4e35-bf85-988cf2e6f881)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25740099-dda9-4234-9886-803c1d4d51af)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ + a502d207-63e7-4c91-80ad-5ff3a9db03e6)(content(Whitespace\" \ + \"))))(Tile((id \ + 4c3e1db6-5c4d-4594-8220-1f9c07d8357e)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - e86c5199-a0ce-4e44-9ad3-692c435fe93d)(content(Whitespace\" \ + 91b1a7e1-a477-4be0-89f2-6640bb6f9d0f)(content(Whitespace\" \ \"))))(Tile((id \ - d6db200b-52b4-4ed8-925f-579fdf8b2c6d)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5f310898-295b-4f16-9d11-b01123b2ea2c)(content(Whitespace\" \ + 84ff8f7c-f5e8-43a2-907f-614545ee7614)(label(b))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 51a93e99-b088-48da-8904-bf952381385c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + d23b8939-dba3-4a78-b463-6ae659079d06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 98703e4f-6c3e-4702-8684-564ad220603d)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 1569f18f-bf5b-4e0b-b373-0968d9c027a3)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 52872153-6dab-4f58-aafe-36daf66c1385)(content(Whitespace\" \ \"))))(Tile((id \ - 1e38b972-1809-4feb-8c1c-4f67d652d375)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 8ed6c237-4bd0-412a-971c-dcf07e161f93)(content(Whitespace\" \ + f11f90e4-ad88-4379-b935-aca0278995aa)(label(c))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 5b6cdedf-02b7-412e-9a23-2bcdefc0f4b0)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 78f728ff-af0b-4aa5-adf0-edb7af8dc68c)(content(Whitespace\" \ \"))))(Tile((id \ - 3ac3b7c8-a4ff-4f33-bfa2-d218822fcd19)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f572a698-4a16-4dbf-a54d-6e6945297665)(content(Whitespace\" \ + 4dcddeed-ee1e-4c65-b636-26ce6a4646ab)(label(c))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4c82fe91-2252-4282-85e2-8b188cd8079c)(content(Whitespace\" \ \"))))(Tile((id \ - 132cb08f-c280-42b5-b6fd-c1e85d17ec5c)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 709f0d1f-d997-42e8-bb16-23abf054df5f)(content(Whitespace\" \ + 004a40c8-8e5b-4985-b0e2-9703a1ef0a94)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c9ba11bb-0b6f-4fc7-8cf8-d979f001b850)(content(Whitespace\" \ \"))))(Tile((id \ - bafddf28-368f-4c9b-9759-a5e16424a41d)(label(4))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - eba3a299-0151-4d0e-b13d-0d61577a6733)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 607a9a2f-36fd-416b-8f2a-0dcd654a3f56)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 3a0443fb-e5e5-4675-a280-c675d359ed87)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cb3e52f3-b846-49c6-813f-2066ca14e149)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - a51bf06d-4934-4799-ac2e-a4652aaaafe7)(content(Whitespace\" \ + 1601c6aa-0e48-49f2-a921-4d98f128ec7a)(label(c))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 50de9230-1cb3-4967-8e5d-2686ab33b797)(content(Whitespace\" \ \"))))(Tile((id \ - f2c74fe8-2500-4886-a23e-5a5d5155ae8b)(label(3))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 09d392c0-e2cc-4307-89d7-0483627378b7)(content(Whitespace\" \ + a3015949-a4c0-4cd8-9346-6323090d0c55)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a758f40e-83a9-42dc-b97e-38f432a461e6)(content(Whitespace\" \ \"))))(Tile((id \ - b85776e4-f63f-49a1-9b09-77c013375af7)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - a4c131e0-fc31-4fcb-aa84-b16c046436ee)(content(Whitespace\" \ + 80d2b6e5-cc53-42e1-a34e-302cb24435bf)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 62d3e953-d36e-40a8-bb31-d3a1d29c9d25)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 129b9f69-db91-4538-a078-58f8eb5795e8)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 7370cc86-5f2d-480e-a154-aa2c09d32826)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d94c8dc7-3d78-49a5-b93e-50d2b18af498)(content(Whitespace\" \ \"))))(Tile((id \ - 18d3169f-ed3f-4138-b5b9-9610e304c013)(label(3))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0b7c6984-8436-4b21-8258-c37dd6be30f2)(content(Whitespace\" \ + 0c251b37-e176-459c-bbfb-925cf7d09987)(label(b))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + bdb464cf-15d6-4023-84cc-fe983c5e8467)(content(Whitespace\" \ \"))))(Tile((id \ - c63b9193-5ad3-4d09-8187-b9b13b9a5210)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - be000067-f14a-4cf6-a64a-384a94fa32ac)(content(Whitespace\" \ + 79b66a41-0336-4baa-81c4-ef5e7107e431)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d52538e2-1524-47a7-b72f-ff70dc2bf97d)(content(Whitespace\" \ \"))))(Tile((id \ - 005342e2-5425-4530-b074-13babb8f58df)(label(6))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 12cf1b4d-dcf5-4070-a839-a70b836df238)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 6dce00b6-58ad-4711-922d-182cb8ae2b7c)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 3f85c74f-7e59-4d18-ab32-2fc003551cae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 69c51fcc-36be-4bc1-a336-cfea114e8780)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ + baa44352-3f92-40d8-94ac-dcdb590fa503)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 6cb20c8f-1360-4b44-b423-56addbd92f44)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 83172c4a-d27c-44f0-8fd0-3942f74e3635)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ff148a90-409b-4903-97b3-5869b166b5f3)(content(Whitespace\" \ + \"))))(Tile((id \ + 07c72e86-9abe-415a-be06-5b9fa5f2adf8)(label(b))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ + b975b9e6-9750-4a57-8a27-499653bb604e)(content(Whitespace\" \ + \")))))((Secondary((id \ + 66e8dcdd-d358-4a3b-8d4c-c93140df5369)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + debae5ca-2828-4460-9307-929eb725736c)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 45576ba4-4586-4df3-888d-3bfef94972be)(content(Whitespace\" \ + 3144ba77-8417-456b-9345-0d6b5e7c590c)(content(Whitespace\" \ \"))))(Tile((id \ - ea9e7253-a352-4836-881f-0127b1c871b8)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f3e14f9e-507a-4d26-a2df-78c11523af0a)(content(Whitespace\" \ + 35d9db9c-3710-47b1-997b-3dcea9b83b6e)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + b9f0d6e7-d029-455d-ac83-b17de4aa172e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 8192adb7-ad34-4ab1-8844-0ab46b5c4771)(content(Whitespace\" \ \"))))(Tile((id \ - becaa096-cb19-4568-9e9a-5863d1ae1c96)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c450606e-1ef4-4fbb-9773-d9566f54d260)(content(Whitespace\" \ + aff9b212-bbe9-4333-a769-8caf2115d8de)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 25e1ce2d-c3c8-413a-8e9f-5e9792b44f1e)(content(Whitespace\" \ \"))))(Tile((id \ - 60e938aa-3416-4c33-81a8-25f37ef306d9)(label(2))(mold((out \ + 7a612d19-b4bc-4d31-bfb0-cc7dbc80d5fe)(label(b))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + f26f75e0-b159-4e1b-805c-e405170e82f5)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cc766fc6-23b5-4600-b2b2-082aac3a14b7)(content(Whitespace\" \ + \"))))(Tile((id \ + 01917c22-4fb2-4a0b-94f7-b244e9fbfda2)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 8f4768bf-6ca2-4f3f-b2f6-8038ad7d73dd)(content(Whitespace\" \ + \"))))(Tile((id \ + f7e1fe6d-3867-42e8-9fa5-99d50953da90)(label(f))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 54c5b743-ac18-4099-835f-666dc529f5cc)(content(Whitespace\" \ + \"))))(Tile((id \ + c55d17ae-d41f-461f-bf4f-4be94bd65762)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 33481f20-38ef-4609-ad30-d2b1833d9fd7)(content(Whitespace\" \ + \"))))(Tile((id \ + d27fd47d-eebc-4f61-b6e3-8b3ef398ec1c)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 651e3781-854e-4e7b-98bd-e3fa6cc6003f)(content(Whitespace\" \ + \"))))(Tile((id \ + 4b997e0a-bd24-4396-b8bc-aecdb8b036a5)(label(c))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + c352e753-c5ff-48de-8b59-0ec50c239e6e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 796833a7-5f5b-42a6-bb69-8ae8d17fb133)(content(Whitespace\" \ + \"))))(Tile((id \ + 6545b7f1-f73e-422a-8435-a07c9da93673)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 8add133a-0bac-4b51-9946-8b321359410d)(label(c))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 7cd03ffe-2c25-4828-b6f6-dbf473064a4c)(content(Whitespace\" \ + \"))))(Tile((id \ + 662e2713-f973-4583-9cc9-0790cbb04af4)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7190604a-1045-4ce3-be03-e2a25c9ac980)(content(Whitespace\" \ + \"))))(Tile((id \ + 657cba03-c1df-436a-96a6-7de49ee86436)(label(c))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + b0264a1d-e50c-4ffa-9d11-0bc306f1e9a8)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 8c303280-adaa-402a-85ed-8fe1442c8903)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 184871c4-f611-4679-9af9-6d31f7d1c094)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 411cc97e-44aa-44e5-88f7-90d5f53924ab)(content(Whitespace\" \ + \"))))(Tile((id \ + 41df693e-7029-4f55-9048-63be308c4ef5)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 943e8fea-aee7-4392-b251-df60f3101e77)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 8eda0e7b-49cc-4234-b390-0d18d5444c55)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 9f925a0d-487f-4dab-bc1b-91b7c2b6d77d)(content(Whitespace\" \ + \"))))(Tile((id \ + c60b29e0-2207-4f8f-b2d6-4d318a896fb1)(label(y))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 3fe52b30-bc25-4360-8e49-7d383c6d7630)(content(Whitespace\" \ + \"))))(Tile((id \ + 6b64f1db-59d9-427b-b91c-a9586a46a423)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 76ad5b97-a2a2-487a-8e08-ef95afdcfaba)(content(Whitespace\" \ + \"))))(Tile((id \ + 8fc5e79c-5af4-4a87-b340-e49d3a07108d)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 3981524e-b182-4229-9558-317c5e3b674e)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + d1d74e3e-b370-448c-b8fa-a2a3354cd25d)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 5f875c31-b3fe-4d3f-a673-fb0c4d82820c)(content(Whitespace\" \ + \"))))(Tile((id \ + dfc82e9a-f945-4b24-aa6f-72245f4a5c61)(label(b))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 131ac428-7dea-47f1-afd3-ef87d2185aaa)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f4c1b938-fc33-417a-b232-08b15a775042)(content(Whitespace\" \ + \"))))(Tile((id \ + b3ddaea7-5ebf-4049-bb7b-608b9bb0403c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2e7b5910-8655-4268-a6c4-e7c7785b6e26)(label(f))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + b5cf1c4e-0da5-4b49-bb26-4f50f5f3e629)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + c7950c78-5a3d-4088-9b03-0a2af7dc6e9f)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 4ed40475-c207-4ebd-bc7e-49afe8c8f0a4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + c3ec60f2-6f1e-4301-8dca-4cf7b809395d)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 529625d9-356a-493c-a793-5fa4f7b93e41)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + b39992d0-0283-4224-9d1a-e51bc9440f95)(content(Whitespace\" \ + \"))))(Tile((id \ + 7542242b-5136-4bc2-9b9c-30735f140547)(label(f))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + b5304c8f-34c9-4605-99be-d0507f4e6672)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2a0d138e-74ba-4db7-9962-7ef419c56dc0)(label(b))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + e859f280-7c20-474e-9199-d461338ed7ba)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 500daabf-5b93-41be-8d74-e888efccc3c6)(label(y))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + f9008b43-eb37-4f20-8288-21730a00cfbc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 75ceecb7-3e64-4d27-b023-695cf1c84001)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + e62cbb30-9d9b-4379-860b-7cd8ba6b7a46)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 667c7f20-f052-4b97-a3dd-b218e6e0ca36)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 75e69bc3-13ab-47ab-a5fb-8c41efc2ab19)(content(Whitespace\" \ + \"))))(Tile((id \ + b87b594b-269c-41e6-a0d4-3ef656087765)(label(list_length))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 96cba48e-755b-48a3-9205-81c4895f9823)(content(Whitespace\" \ + \"))))(Tile((id \ + 29b7ad19-9afa-4988-a121-e849985757cc)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 1d792ce3-2829-4a10-b39c-da41929c6f8b)(content(Whitespace\" \ + \"))))(Tile((id \ + 673bb7d6-17d2-48ff-b510-7f263e931dc5)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 990868f0-0b96-48f2-8be3-dc46a5e646ec)(content(Whitespace\" \ + \"))))(Tile((id \ + 1344c73d-4fa9-440b-99db-6ffbbf521ffe)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 8936b101-cda3-4ab5-b814-ca4cf531bc1c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + ea04d1fc-1502-432a-9d50-5c67eda840c4)(content(Whitespace\" \ + \"))))(Tile((id 65a53d44-aa06-486a-b2c2-da74363f6569)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 7a3e47cc-1fa7-4cb8-9d21-a8e2a2056394)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 1d890687-75e1-4e6a-8667-a6698bd7cfad)(content(Whitespace\" \ + \"))))(Tile((id \ + c204f982-3974-4638-8d45-474543fe2d98)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 45eae717-5578-4faf-a4eb-88ad779586b9)(content(Whitespace\" \ + \"))))(Tile((id \ + 9dfbcc29-143e-4401-b6be-65368b51b436)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + b06a2789-c2aa-41ca-902f-c8461eea3fb7)(content(Whitespace\" \ + \")))))((Secondary((id \ + 148a1cb1-7874-4a6f-8f87-bee712bd36df)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c889e055-d438-4564-b5a8-a3e12bea4882)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + ec5f5c24-9fe1-4597-8c16-47111b2d9326)(content(Whitespace\" \ + \"))))(Tile((id \ + cc54e849-a52f-4199-a7d4-9fb85a2e659d)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 6381761f-cd9f-4d53-b9f7-33f3934836ea)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 55908c47-4807-4903-b209-7d2e1c97f444)(content(Whitespace\" \ + \"))))(Tile((id \ + eeca22d4-8f3f-417f-bb29-1fd63e213dd8)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 4e8322c3-bbe2-4e31-a317-0ac6a7f5c4eb)(content(Whitespace\" \ + \"))))(Tile((id \ + 4ca6ea59-fa8f-413d-a50c-73bd8c42ca1e)(label(l))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 7a8be493-8da0-4cb7-88c7-32fdca9fd952)(content(Whitespace\" \ + \"))))(Tile((id \ + 2b0587d4-bade-4601-a255-131007e9aa54)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 81f7e8c3-9791-4af2-a104-14c08fbc8a69)(content(Whitespace\" \ + \"))))(Tile((id cc82b421-4cdf-4cac-8e48-43e0b8e17707)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 55955b07-22bb-42ed-9303-a3fc1e391a7f)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 2ad5c071-2227-468e-b04d-5446fbe2b615)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 022ed86b-84b9-4b3a-b141-57a61504e634)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6fcf1112-9f01-4925-b436-b07c25b97ff2)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 01273f90-4def-4b70-a62d-b1ba96c336e9)(content(Whitespace\" \ + \"))))(Tile((id \ + fa1d5f5a-66af-4665-ad51-ac09e5f1381b)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cd32360c-d3f4-430d-8ad2-5dbd660e8158)(content(Whitespace\" \ + 0d3c9e5e-4e5c-4608-9256-59d58e9751c1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 386721b7-716b-460c-8627-ed4178a545fb)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 1cfb6cc3-eed6-43d6-8725-a2910ea65758)(content(Whitespace\" \ \"))))(Tile((id \ - ac66d29d-6f93-47a8-872c-b26ae92463a4)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f58eeaed-a321-4813-a71a-d99e1684c500)(content(Whitespace\" \ + 5ef0f099-e7a0-4314-8270-07db3a1ccb1e)(label([]))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + cc25fa53-916a-48dd-a0bf-4568830e311a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 6a9989f1-e856-486c-bee9-ae166a274e20)(content(Whitespace\" \ \"))))(Tile((id \ - ee4b755a-2962-4a97-9b71-1fa874175270)(label(5))(mold((out \ + c738920d-a28a-4491-984f-37974eac24b5)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0efd8178-50ee-47dc-9f5d-f6f503733d3e)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 01eef806-3025-4681-841a-138b95f6f827)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f59bc277-d399-48e3-8d1b-72164b9e13bb)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 446ce379-8fef-47e5-85d4-f7d3fc16dd6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 31a81066-ecfa-49ce-a762-34904947da99)(label(2))(mold((out \ + f434b12c-1dfb-4171-a491-eef97c57cb51)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b4fc4437-f64e-4f18-9767-e3d07eb58283)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 15b71a7f-e121-4cb7-87e7-6cd34311578c)(content(Whitespace\" \ + \"))))(Tile((id \ + ef2a816b-8c42-4d03-9341-318a0849283d)(label(hd))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + b3b13782-65c6-4df1-9000-dc2709d67c06)(label(::))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 7))(sort \ + Pat))((shape(Concave 7))(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 10df6bbe-686d-4739-986c-504de476497a)(label(tl))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 560ba905-59ed-4b0f-b958-3c4b9e5813c1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 51358db7-933c-456b-b73c-7ab0bf112d71)(content(Whitespace\" \ + \"))))(Tile((id \ + a86bedfb-70a7-4906-ba28-631c705586b2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 77d8a251-42c9-4631-a941-094827a503c4)(content(Whitespace\" \ + 519ad1eb-b19a-4447-a2a9-bf906527765a)(content(Whitespace\" \ \"))))(Tile((id \ - 546b42b3-2f6a-4f08-9e69-854b8e88b1be)(label(+))(mold((out \ + d777f3b0-b2ea-4725-b928-a462e00d9281)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 28d8c0a0-4515-4637-98ca-22e78630cf20)(content(Whitespace\" \ + 4d229f35-897c-4d30-8bdb-0425dd7031a2)(content(Whitespace\" \ \"))))(Tile((id \ - 09d04b4d-2f29-4aef-a73b-badd00299b3b)(label(2))(mold((out \ + 29f706a8-64c9-42c9-ad50-85feaf02b0eb)(label(list_length))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2d373321-8994-4495-93f1-2eb2a498df5a)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + a9464742-2fa7-4b5a-8bcd-e167571c719a)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + c8d0ab0a-1ac6-49c6-9e3f-1827b74cad60)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + bffbd8ae-8579-4588-9453-68634acf5441)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer))"; - backup_text = - "# Hazel Language Quick Reference #\n\n\ - # Empty holes stand for missing expressions, patterns, or \ - types #\n\ - let empty_hole = in\n\n\ - # Integers #\n\ - let int_lits : Int = 1 in\n\ - let negation = -1 in\n\ - let arithmetic = 1*2 + 8/4 in\n\ - let int_comparison = (10 == 10, 1 < 2, 2 <= 3, 3 > 2, 2 >= 1) \ - in\n\n\ - # Floating Point Numbers #\n\ - let float_lits : Float = 1.5 in\n\ - let float_artih = 1. *. 2. +. 8. /. 4. in\n\ - let float_comparison = (10. ==.10., 1. <.2., 2. <=.3., 3. \ - >.2., 2. >=.1.) in\n\n\ - # Booleans #\n\ - let booleans : (Bool, Bool) = (true, false) in\n\ - let conditionals =\n\ - let (x, y) = (2 + 2, 3 + 3) in\n\ - if y > x then 1\n\ - else 2\n\ - in\n\n\ - # Tuples #\n\ - let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, 3)) \ - in\n\ - let (a, b, (c, d)) = tuples in\n\n\ - # Functions #\n\ - let y : (Int, Int, Int) -> Int =\n\ - fun (m, x, b) -> m * x + b\n\ - in\n\n\ - # Recursive Functions (arrow type annotation required) #\n\ - let double_recursively : Int -> Int =\n\ - fun n ->\n\ - if n == 0 then 0\n\ - else double_recursively(n - 1) + 2\n\ - in\n\n\ - # Mutual Recursion (bind tuples of functions) #\n\ - let (even : Int -> Bool, odd : Int -> Bool) = \n\ - (fun n -> if n == 0 then true else odd(n - 1), \n\ - fun n -> if n == 0 then false else even(n - 1)) in \n\n\ - # Lists #\n\ - let empty_list : [Int] = [] in\n\ - let non_empty_list : [Int] = 1::2::3::[] in\n\ - let list_literals : [Int] = [1, 2, 3] in\n\ - let length : [Int] -> Int =\n\ - fun xs ->\n\ - case xs\n\ - | [] => 0\n\ - | hd::tl => 1 + length(tl) \n\ - end\n\ - in\n\ - let has_at_least_two_elements : [Int] -> Bool =\n\ - fun xs ->\n\ - case xs\n\ - | [] => false\n\ - | hd::[] => false\n\ - | a::b::[] => true \n\ - end\n\ - in\n\n\ - # Strings #\n\ - let string_lits = \"Hello, world!\" in \n\ - let string_equality = string_lits $== \"Hello, world!\" in \n\n\ - # Non-empty holes are the red dotted boxes around errors #\n\ - # (you can still run programs with non-empty holes) #\n\ - let non_empty_hole : Int = true in \n\n\ - # Tests, separated by semicolons #\n\ - test 2 + 2 == 4 end;\n\ - test 3 + 3 == 6 end;\n\ - test 2 + 2 == 5 end;\n\n\ - 2 + 2"; - } ); - ( "Types & static errors", - { - zipper = - "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - c2890a35-b3f1-4653-9767-8d5f9752ead5)(content(Comment\"# \ - Internal Regression Tests: Type errors #\"))))(Secondary((id \ - 090c5ddf-5c26-4a14-a1b9-eab92cb073c4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5a4d6644-ce5b-4818-a4c6-2905ca7b9d43)(content(Comment\"# Each \ - line should show errors or not as indicated \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + a4a52e3e-c4fe-4b62-a7a6-2e3ca370ccca)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0bf24958-e48d-4e88-b326-1700d756dea0)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 1d2368d0-fdce-4ebb-9fbe-514b6e74e232)(content(Whitespace\" \ + \"))))(Secondary((id \ + bacbb401-f981-45a2-a27c-b789bce6074e)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + ae7692c4-5cb7-4ecc-afcc-c60ad2fd7cf1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 325d816c-fcaf-4734-a327-3c7e241b7d9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 272ef5a0-043b-451d-a6e4-3f18571d2c60)(content(Comment\"# \ + Strings #\"))))(Secondary((id \ + 4d0dd9cb-c943-4384-a682-8884ac792b31)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 26109999-748a-492d-8991-dedcf22f3c8f)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 4b4ec423-bdf0-4f77-9cff-633eca5eb8f6)(content(Whitespace\" \ + \"))))(Tile((id \ + 8f2bf699-8a6e-4a4a-acce-4a801b081fc5)(label(string_lits))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 76fa4320-9686-418b-bae1-2e16981ef6df)(content(Whitespace\" \ + \")))))((Secondary((id \ + dc5fbac0-a612-4966-b776-a5b222ee2837)(content(Whitespace\" \ + \"))))(Tile((id \ + eb0ff38c-7c16-49f9-9547-019753f2f677)(label(\"\\\"Hello, \ + world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4561c14d-dc9c-4e62-9c83-2258ba03da27)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 8387e074-4d46-46a6-a37c-d10aab222c02)(content(Whitespace\" \ + \"))))(Secondary((id \ + a6f7d9a5-1f93-42a7-9365-fb6f3beb8c74)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d573bc1e-fc6e-4c9b-bd47-b21d74a42b50)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 0a7aab63-f372-4baf-863a-99f536c5764c)(content(Whitespace\" \ + \"))))(Tile((id \ + 41148c0d-9e2b-49b5-be97-c798c36ec89a)(label(string_equality))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + fdbb6a30-47a8-4665-bd2b-709aad04126a)(content(Whitespace\" \ + \")))))((Secondary((id \ + bfb84ac4-7973-473c-b655-71b846366ae4)(content(Whitespace\" \ + \"))))(Tile((id \ + d2e0ac51-b1d5-47c5-9d9e-28671583db5c)(label(string_lits))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c14d9212-5436-4359-aed1-4c12bc651145)(content(Whitespace\" \ + \"))))(Tile((id \ + 479deac9-99cd-44c2-afd7-83aa87dc31c3)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 8))(sort \ + Exp))((shape(Concave 8))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 92d22bfe-5056-482f-ad46-5ed1c4787fa1)(content(Whitespace\" \ + \"))))(Tile((id \ + dec5173c-0001-412c-acec-9d1dc2ca4424)(label(\"\\\"Hello, \ + world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 242b38cc-9ec3-496b-a61b-180d2dab6eee)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 2fcdc646-7a16-44a7-bdbd-2db157c25c29)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0916a810-eeaa-4b3b-a5d3-3750e01e4ec9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3f1d1253-4e0e-4331-bf9c-180e141079b2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 29d208e1-0c45-44d2-9d94-99224e7b7bae)(content(Comment\"# \ + Non-empty holes are the red dotted boxes around errors \ #\"))))(Secondary((id \ - 49670809-d955-4be4-8de7-a13e0c26ec98)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8b8ae6b5-2df0-42a9-a2e7-d53e2e0517fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d69298b9-16ce-48c6-a813-04d4c6acbb6f)(label(let = \ + 394efbca-78fe-4391-aed8-7cf3e9954cff)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5501da01-0362-43bd-90d2-2f73051ebd5d)(content(Comment\"# (you \ + can still run programs with non-empty holes) \ + #\"))))(Secondary((id \ + 83366e95-3f7a-43c0-b6dd-b8b856c15bff)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8ff64362-463c-4a28-b9fb-c5874d923bb7)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 907bcaba-6a39-4298-be9c-a9933d6bb965)(content(Whitespace\" \ + \"))))(Tile((id \ + e3cc5308-0a4a-486b-8505-50d4759fadea)(label(non_empty_hole))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 3869b181-7c6a-4947-8188-34ac4be2e935)(content(Whitespace\" \ + \"))))(Tile((id \ + 6116797d-7f61-4299-8d03-b3b55489807f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2c2c4658-b792-43a5-8414-1cb5aae4c7c1)(content(Whitespace\" \ + \"))))(Tile((id \ + 3778ca66-6e86-4b5a-984e-de82e05a54e1)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 7406cf71-6145-4be2-80b9-c2a2a292175b)(content(Whitespace\" \ + \")))))((Secondary((id \ + 3d632ecf-da09-4334-8577-c8b9ede604d0)(content(Whitespace\" \ + \"))))(Tile((id \ + f5fb9f60-65fd-4b86-ac03-f79a42e79876)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + d9032067-95b2-4bc6-8813-402fb0516108)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 1add6c79-d411-4ab9-b51d-581ef672ed1d)(content(Whitespace\" \ + \"))))(Secondary((id \ + efe99dcd-cd32-4bd1-ba0a-32508d520ddf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 96260b30-8ae6-454d-8da1-c532a1efa904)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 376a24fd-5524-4558-902c-6fc859f4e3b0)(content(Comment\"# \ + Tests, separated by semicolons #\"))))(Secondary((id \ + aa070fd5-bc99-4e35-bf85-988cf2e6f881)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 25740099-dda9-4234-9886-803c1d4d51af)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + e86c5199-a0ce-4e44-9ad3-692c435fe93d)(content(Whitespace\" \ + \"))))(Tile((id \ + d6db200b-52b4-4ed8-925f-579fdf8b2c6d)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 5f310898-295b-4f16-9d11-b01123b2ea2c)(content(Whitespace\" \ + \"))))(Tile((id \ + 1e38b972-1809-4feb-8c1c-4f67d652d375)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 8ed6c237-4bd0-412a-971c-dcf07e161f93)(content(Whitespace\" \ + \"))))(Tile((id \ + 3ac3b7c8-a4ff-4f33-bfa2-d218822fcd19)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + f572a698-4a16-4dbf-a54d-6e6945297665)(content(Whitespace\" \ + \"))))(Tile((id \ + 132cb08f-c280-42b5-b6fd-c1e85d17ec5c)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 709f0d1f-d997-42e8-bb16-23abf054df5f)(content(Whitespace\" \ + \"))))(Tile((id \ + bafddf28-368f-4c9b-9759-a5e16424a41d)(label(4))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + eba3a299-0151-4d0e-b13d-0d61577a6733)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 607a9a2f-36fd-416b-8f2a-0dcd654a3f56)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 3a0443fb-e5e5-4675-a280-c675d359ed87)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cb3e52f3-b846-49c6-813f-2066ca14e149)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + a51bf06d-4934-4799-ac2e-a4652aaaafe7)(content(Whitespace\" \ + \"))))(Tile((id \ + f2c74fe8-2500-4886-a23e-5a5d5155ae8b)(label(3))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 09d392c0-e2cc-4307-89d7-0483627378b7)(content(Whitespace\" \ + \"))))(Tile((id \ + b85776e4-f63f-49a1-9b09-77c013375af7)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + a4c131e0-fc31-4fcb-aa84-b16c046436ee)(content(Whitespace\" \ + \"))))(Tile((id \ + 18d3169f-ed3f-4138-b5b9-9610e304c013)(label(3))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0b7c6984-8436-4b21-8258-c37dd6be30f2)(content(Whitespace\" \ + \"))))(Tile((id \ + c63b9193-5ad3-4d09-8187-b9b13b9a5210)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + be000067-f14a-4cf6-a64a-384a94fa32ac)(content(Whitespace\" \ + \"))))(Tile((id \ + 005342e2-5425-4530-b074-13babb8f58df)(label(6))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 12cf1b4d-dcf5-4070-a839-a70b836df238)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 6dce00b6-58ad-4711-922d-182cb8ae2b7c)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 3f85c74f-7e59-4d18-ab32-2fc003551cae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 69c51fcc-36be-4bc1-a336-cfea114e8780)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 45576ba4-4586-4df3-888d-3bfef94972be)(content(Whitespace\" \ + \"))))(Tile((id \ + ea9e7253-a352-4836-881f-0127b1c871b8)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + f3e14f9e-507a-4d26-a2df-78c11523af0a)(content(Whitespace\" \ + \"))))(Tile((id \ + becaa096-cb19-4568-9e9a-5863d1ae1c96)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c450606e-1ef4-4fbb-9773-d9566f54d260)(content(Whitespace\" \ + \"))))(Tile((id \ + 60e938aa-3416-4c33-81a8-25f37ef306d9)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + cd32360c-d3f4-430d-8ad2-5dbd660e8158)(content(Whitespace\" \ + \"))))(Tile((id \ + ac66d29d-6f93-47a8-872c-b26ae92463a4)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + f58eeaed-a321-4813-a71a-d99e1684c500)(content(Whitespace\" \ + \"))))(Tile((id \ + ee4b755a-2962-4a97-9b71-1fa874175270)(label(5))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0efd8178-50ee-47dc-9f5d-f6f503733d3e)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 01eef806-3025-4681-841a-138b95f6f827)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + f59bc277-d399-48e3-8d1b-72164b9e13bb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 446ce379-8fef-47e5-85d4-f7d3fc16dd6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 31a81066-ecfa-49ce-a762-34904947da99)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 77d8a251-42c9-4631-a941-094827a503c4)(content(Whitespace\" \ + \"))))(Tile((id \ + 546b42b3-2f6a-4f08-9e69-854b8e88b1be)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 28d8c0a0-4515-4637-98ca-22e78630cf20)(content(Whitespace\" \ + \"))))(Tile((id \ + 09d04b4d-2f29-4aef-a73b-badd00299b3b)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ + Outer))"; + backup_text = + "# Hazel Language Quick Reference #\n\n\ + # Empty holes stand for missing expressions, patterns, or \ + types #\n\ + let empty_hole = in\n\n\ + # Integers #\n\ + let int_lits : Int = 1 in\n\ + let negation = -1 in\n\ + let arithmetic = 1*2 + 8/4 in\n\ + let int_comparison = (10 == 10, 1 < 2, 2 <= 3, 3 > 2, 2 >= 1) \ + in\n\n\ + # Floating Point Numbers #\n\ + let float_lits : Float = 1.5 in\n\ + let float_artih = 1. *. 2. +. 8. /. 4. in\n\ + let float_comparison = (10. ==.10., 1. <.2., 2. <=.3., 3. \ + >.2., 2. >=.1.) in\n\n\ + # Booleans #\n\ + let booleans : (Bool, Bool) = (true, false) in\n\ + let conditionals =\n\ + let (x, y) = (2 + 2, 3 + 3) in\n\ + if y > x then 1\n\ + else 2\n\ + in\n\n\ + # Tuples #\n\ + let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, 3)) \ + in\n\ + let (a, b, (c, d)) = tuples in\n\n\ + # Functions #\n\ + let y : (Int, Int, Int) -> Int =\n\ + fun (m, x, b) -> m * x + b\n\ + in\n\n\ + # Recursive Functions (arrow type annotation required) #\n\ + let double_recursively : Int -> Int =\n\ + fun n ->\n\ + if n == 0 then 0\n\ + else double_recursively(n - 1) + 2\n\ + in\n\n\ + # Mutual Recursion (bind tuples of functions) #\n\ + let (even : Int -> Bool, odd : Int -> Bool) = \n\ + (fun n -> if n == 0 then true else odd(n - 1), \n\ + fun n -> if n == 0 then false else even(n - 1)) in \n\n\ + # Lists #\n\ + let empty_list : [Int] = [] in\n\ + let non_empty_list : [Int] = 1::2::3::[] in\n\ + let list_literals : [Int] = [1, 2, 3] in\n\ + let length : [Int] -> Int =\n\ + fun xs ->\n\ + case xs\n\ + | [] => 0\n\ + | hd::tl => 1 + length(tl) \n\ + end\n\ + in\n\ + let has_at_least_two_elements : [Int] -> Bool =\n\ + fun xs ->\n\ + case xs\n\ + | [] => false\n\ + | hd::[] => false\n\ + | a::b::[] => true \n\ + end\n\ + in\n\n\ + # Polymorphic Functions #\n\ + let poly_id : forall a -> a -> a =\n\ + typfun a -> fun x : a -> x\n\ + in\n\ + let apply_both : forall a -> forall b ->\n\ + (forall c -> c -> c) -> ((a, b) -> (a, b)) =\n\ + typfun a -> typfun b -> fun f : forall c -> (c -> c) ->\n\ + fun (x, y) : (a, b) -> (f@(x), f@(y))\n\ + in\n\ + let list_length : forall a -> [a] -> Int =\n\ + typfun a -> fun l : [a] ->\n\ + case l\n\ + | [] => 0\n\ + | hd::tl => 1 + list_length@(tl)\n\ + end\n\ + in\n\n\ + # Strings #\n\ + let string_lits = \"Hello, world!\" in \n\ + let string_equality = string_lits $== \"Hello, world!\" in \n\n\ + # Non-empty holes are the red dotted boxes around errors #\n\ + # (you can still run programs with non-empty holes) #\n\ + let non_empty_hole : Int = true in \n\n\ + # Tests, separated by semicolons #\n\ + test 2 + 2 == 4 end;\n\ + test 3 + 3 == 6 end;\n\ + test 2 + 2 == 5 end;\n\n\ + 2 + 2"; + } ); + ( "Types & static errors", + { + zipper = + "((selection((focus Left)(content())(mode \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ + c2890a35-b3f1-4653-9767-8d5f9752ead5)(content(Comment\"# \ + Internal Regression Tests: Type errors #\"))))(Secondary((id \ + 090c5ddf-5c26-4a14-a1b9-eab92cb073c4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a4d6644-ce5b-4818-a4c6-2905ca7b9d43)(content(Comment\"# Each \ + line should show errors or not as indicated \ + #\"))))(Secondary((id \ + 49670809-d955-4be4-8de7-a13e0c26ec98)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8b8ae6b5-2df0-42a9-a2e7-d53e2e0517fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d69298b9-16ce-48c6-a813-04d4c6acbb6f)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 87784971-c398-4a3f-9537-9a2eba847372)(content(Whitespace\" \ + \"))))(Tile((id \ + 9cc5b09c-65a4-4a8e-853d-62d8f15d4e24)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 1e775429-5e8e-4b11-b66c-9cc3c1324739)(content(Whitespace\" \ + \")))))((Secondary((id \ + 04d76c28-7577-41c5-964a-fc54eeae9062)(content(Whitespace\" \ + \"))))(Tile((id \ + 51f991bb-2c1f-435a-920a-a20148cbc2dd)(label(unbound))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + bf68d8ff-145a-4e77-a735-120746818a4b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4491f5f7-9ada-4420-acb7-fa9e6ec73fe9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 474b7d65-a3a0-4c3e-b0f8-cf2a0ad43887)(content(Comment \ + #err#))))(Secondary((id \ + ffe1df31-0a25-4513-97c2-c36fc135468b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ff782a2c-aef7-4a7d-9ae0-848429b11fbd)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + e2eca969-e0a4-4a91-a89e-878e09aec2f6)(content(Whitespace\" \ + \"))))(Tile((id \ + 3c035ee1-6d4f-47fc-a76f-94f51898e718)(label(Undefined))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + dc02b1d3-06fa-4b3e-aa76-9766d01c3bc2)(content(Whitespace\" \ + \")))))((Secondary((id \ + 1d42290f-3641-4c65-a280-94551377a573)(content(Whitespace\" \ + \"))))(Tile((id \ + 0b3c4696-05af-4c34-8ab1-515fbae5550f)(label(Undefined))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b56b3924-e775-41ca-9e61-ac4112c6d40b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c2c7deac-19e5-41d8-9cc2-fe9e73a29960)(content(Whitespace\" \ + \"))))(Secondary((id \ + fec4e3ce-5421-40fb-96fa-8474e5a9fab3)(content(Comment\"# 2x \ + err#\"))))(Secondary((id \ + 02f65251-ccbd-4e70-b60e-cbe1e13adc6c)(content(Whitespace\" \ + \"))))(Secondary((id \ + cadfcea7-7c09-433f-8e03-df9e89dfd9e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6c52236e-4a4a-4b7e-b318-84bd95c543ed)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 557dc615-9e1c-4a9e-a00f-15234e53a953)(content(Whitespace\" \ + \"))))(Tile((id \ + 13897887-613e-408c-b120-59b8666fc0b6)(label(true))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 34fd4c5a-2433-40a8-9ded-9c6500142356)(content(Whitespace\" \ + \")))))((Secondary((id \ + 83207004-3161-4071-a526-cf9459533d67)(content(Whitespace\" \ + \"))))(Tile((id \ + 2f5a444b-0006-47ac-bd94-14c9ffd80548)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 503d2940-fcd4-4a54-879d-81d129596ad1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e425406e-6252-47b9-8a4c-c8870d3c1376)(content(Whitespace\" \ + \"))))(Secondary((id \ + 13255468-04e2-4816-9461-74dce40c9b27)(content(Comment \ + #err#))))(Secondary((id \ + 9d763cf1-1e07-4c47-b8ef-2b6435de5a49)(content(Whitespace\" \ + \"))))(Secondary((id \ + d2541b33-1f10-4474-9939-cd2e164493c2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 26b81a4e-e0a8-4a8b-8b59-e0278cb81758)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f412044b-ae99-40e1-ac43-a8785e7a2ce1)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 96732395-1218-4909-b454-484f2dc33583)(content(Whitespace\" \ + \"))))(Grout((id fdd65dce-3851-4173-8c0d-a8ac07ced2b6)(shape \ + Convex)))(Secondary((id \ + 3dae5dc2-012e-4f8a-b54a-3562c4f88afc)(content(Whitespace\" \ + \")))))((Secondary((id \ + ba4613e8-5288-4f23-a6d1-7e3206f398d6)(content(Whitespace\" \ + \"))))(Tile((id \ + c873fdfc-ead5-4cab-bbf9-f319e65eb545)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 4fc68723-e8b9-4d8e-ac28-3066739c26f9)(content(Whitespace\" \ + \"))))(Tile((id \ + f36c50b4-776a-44c5-b033-a70e463f1813)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 537690ac-06c0-4b1d-84c1-6d4acc73e474)(content(Whitespace\" \ + \")))))((Secondary((id \ + a1d0648d-8c62-4713-b170-bc7db0c20504)(content(Whitespace\" \ + \"))))(Tile((id \ + 5247456c-6550-4072-8cc9-980f61c699d1)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 2acd1b5f-7510-4a74-a56f-36267b0a512b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 7616aa0a-4eeb-4db8-865f-5b61dc1263b8)(content(Whitespace\" \ + \"))))(Tile((id \ + 81bfcb19-79c1-4bf5-b34c-3dcc7cfd192c)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 4b260629-7c2f-4a27-9081-844c47be8ff3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c71f0361-b8aa-41a1-8b35-ac1d81df2bda)(content(Whitespace\" \ + \"))))(Secondary((id \ + abe0800b-ccae-4935-b9f1-0db885b79a53)(content(Comment \ + #err#))))(Secondary((id \ + a6632e31-7765-49e2-8b18-3359f88183b2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 890064f6-db5c-48da-b11e-79a014c051cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9c0e9437-19f4-4071-aada-9b464e0479f2)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d821f513-71c8-47e0-91f0-012fd7269dd2)(content(Whitespace\" \ + \"))))(Tile((id \ + 81c8a5e4-c8b9-444b-b66b-29dd2bd98f39)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 955b5d47-5dfe-4140-8ebe-f1cdb5d166df)(content(Whitespace\" \ + \")))))((Secondary((id \ + 60ba9fd8-2ae1-4031-aab1-0d31582db521)(content(Whitespace\" \ + \"))))(Tile((id \ + 09d1e608-b3e5-43c8-b5bd-f3986790dd19)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d0d97c16-df70-43e7-8c19-4b2618e3df63)(content(Whitespace\" \ + \"))))(Tile((id \ + 67304d61-8d7a-4779-84f0-e4d60a495118)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + da91c6a5-b71d-4e9b-8206-f9b83d98dd89)(content(Whitespace\" \ + \")))))((Secondary((id \ + 979e7fce-a579-46b9-995b-464e1d6d5210)(content(Whitespace\" \ + \"))))(Tile((id \ + 4728443e-07bd-46eb-a07a-876ab64a9b5f)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 317643ae-3383-413d-9708-f183ee4971f1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0dac4f18-67d7-4bca-acf1-50183a763e9d)(content(Whitespace\" \ + \"))))(Tile((id \ + 6e4f414a-719a-4eda-93c0-baab66a8296e)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 2f303db8-f575-4235-8ccd-dca273aae20c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 526338c8-55fc-432a-9c0a-b9b6f877b413)(content(Whitespace\" \ + \"))))(Secondary((id \ + a9d1100b-abd6-4d20-be7d-a58c5ed507b5)(content(Comment \ + #err#))))(Secondary((id \ + a3580f56-6d80-4396-9869-c50ee7735d62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 50e8b8e5-6ce5-4536-bda6-3ddf728ea643)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + a5e847c7-5a2d-400b-8328-943165b1db2b)(content(Whitespace\" \ + \"))))(Tile((id \ + a4e3d9e1-8d16-4e74-b645-9e9c10b71d13)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + fa1d3aa3-edea-4d2d-afed-e613ec30dab2)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Grout((id \ + a2bb9040-1c54-4168-9f49-8716cbc12dfd)(shape \ + Convex)))(Secondary((id \ + ded9718d-58e0-44cf-83fd-1b6c5a46562d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5acbe062-4da5-47a8-a6c0-4f2ead2bbdb6)(content(Whitespace\" \ + \"))))(Secondary((id \ + 36a49252-eb7f-4210-b283-24e08b053000)(content(Whitespace\" \ + \")))))((Secondary((id \ + e648f5f6-a693-42fa-8995-b4a20961ba07)(content(Whitespace\" \ + \"))))(Tile((id \ + 46b21c79-7191-46bf-94e9-4fb884c21526)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 7d306a94-ff74-4f62-be10-af0f06529c21)(content(Whitespace\" \ + \"))))(Tile((id \ + 7276eb67-791c-48e7-94b2-240b9d7e3fe6)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 8ad575d3-bede-46e4-a4d7-f942c2aa8640)(content(Whitespace\" \ + \")))))((Secondary((id \ + b32b622a-da19-48f3-af59-95accf570e1f)(content(Whitespace\" \ + \"))))(Tile((id \ + 275151f6-414f-46ff-8927-653979248dc5)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 9ba58510-58c1-479a-a9f6-6a70a07df983)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 78eed0fa-3bcb-41a4-b6e7-fa15bbf05d29)(content(Whitespace\" \ + \"))))(Tile((id \ + 5513e260-636a-402a-94c7-c2a8cce3d454)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0ed17b54-7b3a-45d8-bd6e-1604f8af3da3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 72fe8d09-0a4c-4c0d-8ca0-50d5057a9eeb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d95a7a94-7e7d-4841-b9d1-fd772e2d80dd)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d8e95474-b6f1-44e0-85a7-ed0cc7dbde42)(content(Whitespace\" \ + \"))))(Tile((id \ + 73906d81-9d17-41e3-9632-7bf31280bc99)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + c556f619-c3cd-4aed-8ee2-92848aece57c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 260c4a39-fa49-4a42-8ca5-f6bfd86d705c)(content(Whitespace\" \ + \"))))(Tile((id \ + c3e638a7-2c00-4098-94cd-05563acab569)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + cd497267-e360-4eb6-8b8e-7384fc549dbd)(content(Whitespace\" \ + \")))))((Secondary((id \ + d696e851-3001-4a34-ac58-cc213ab1f833)(content(Whitespace\" \ + \"))))(Tile((id \ + b5f73e45-81d0-44c7-b1b5-39f0ed28d790)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 895d56e8-04dc-4c2a-8edb-aa307da44814)(content(Whitespace\" \ + \"))))(Tile((id \ + 7bdc158c-09c4-4303-98a2-95ac217c0d7b)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 7f09b95b-c5ab-4274-8803-eece59459312)(content(Whitespace\" \ + \")))))((Secondary((id \ + bc2998b3-bf64-4a57-aa06-33d6e3f57b29)(content(Whitespace\" \ + \"))))(Tile((id \ + 503aa496-5d44-4876-b72c-22f53e38841e)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0c5a8275-a28a-4f93-817b-4dad704c3671)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + bee57263-7e8b-4736-bc4b-177652f48018)(content(Whitespace\" \ + \"))))(Tile((id \ + 24bd3d9e-ef99-4acf-b267-51739222ba13)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 5c7038c0-6b3f-4f97-905f-2ac8a826a9a1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 79209500-88d2-4efb-ae12-36961422af5f)(content(Whitespace\" \ + \"))))(Secondary((id \ + c15476f2-b945-4bd3-9d0d-b56187d74ac0)(content(Comment \ + #err#))))(Secondary((id \ + 9d3164ad-7956-48c7-9060-1585f2263536)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8f8e5371-c0a9-4882-abab-4793d534ae95)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 5171b496-42b3-4ad6-afbd-734e7dfab18a)(content(Whitespace\" \ + \"))))(Tile((id \ + 597937bb-e437-4f79-8336-62f0bfe633b7)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 93961230-3aeb-4fe0-aa51-724650152a86)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + bad1b945-64ed-46ba-b27f-6e6ec46b3207)(content(Whitespace\" \ + \"))))(Tile((id \ + 936b28c1-68b5-4e53-88b7-838ee7cbbcd5)(label(Fake))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f1a2e20b-212c-4dae-88d4-fd0e86aa2998)(content(Whitespace\" \ + \")))))((Secondary((id \ + 660312dd-2c63-4eb7-a6c0-ab34eae4ae85)(content(Whitespace\" \ + \"))))(Tile((id \ + 8520a1ed-7cc4-43e2-8a2b-66821f37871f)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + c65d4f9e-96fe-4c50-af8a-0acd2f008513)(content(Whitespace\" \ + \"))))(Tile((id \ + 1f09612d-cdf3-4a5a-8634-b7e7f4edd704)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + fc30bcc8-3a0a-4801-bbe4-54e44fef77e5)(content(Whitespace\" \ + \")))))((Secondary((id \ + 19280f06-f9c1-4ecd-a813-9783f1377a5d)(content(Whitespace\" \ + \"))))(Tile((id \ + ed3868a2-eeb4-4028-b399-7170800c18dd)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + e180c714-6f53-42f0-a7bc-c014691ea0a7)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 862e99a5-2143-4e3f-bfa7-fec564a23095)(content(Whitespace\" \ + \"))))(Tile((id \ + 5f88e61d-db92-494f-8b44-fa1fe0518da0)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 412a6380-f0a9-495b-a742-f8c4600f6638)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + d030eb4f-0f88-41d1-a12e-1a8aa9d7c4c6)(content(Whitespace\" \ + \"))))(Secondary((id \ + 472d7373-2de2-4699-ab83-06dbf689e446)(content(Comment \ + #err#))))(Secondary((id \ + 5946e251-b954-444b-8571-73a07f028d0f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7c9b44aa-0b0c-4493-b4d1-b596ccfb5860)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 3d187f37-a8db-44b9-b5eb-79988c3e2c5a)(content(Whitespace\" \ + \"))))(Tile((id \ + 5f4e0850-7a82-4784-a8c1-e0cdb072b720)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 37ec8304-8678-40ac-a78c-e1564cf1096a)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 5e98976c-354d-4f26-86f2-cefb7a80ee5c)(content(Whitespace\" \ + \"))))(Tile((id \ + 79281c40-1b91-4475-8293-ffdb3420f211)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 3dc98b9e-8880-4035-a61f-346a23cb05e8)(content(Whitespace\" \ + \")))))((Secondary((id \ + 4cfd5f82-9500-4f00-9fbf-de9d15dcb2c5)(content(Whitespace\" \ + \"))))(Tile((id \ + 78fe5eeb-03df-4ff0-b565-41e9c49c239f)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + ede7a6c1-c15f-4648-9310-48732cd24e51)(content(Whitespace\" \ + \"))))(Tile((id \ + 0db9775e-926b-43b2-b3f5-d078c14cf73a)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b03a6005-6308-475e-8f5e-4eff52656710)(content(Whitespace\" \ + \")))))((Secondary((id \ + 9a9b8d8b-d056-4aab-9156-470737187412)(content(Whitespace\" \ + \"))))(Tile((id \ + cb245d33-d282-4db3-a227-b645e9b75790)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 2cd250fd-dc35-4a9a-bc4f-9426959354e8)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 787ba6f3-84b1-4f93-b5dc-a8b870e9ba4c)(content(Whitespace\" \ + \"))))(Tile((id \ + 9a45395d-bcf2-41c3-b21b-cedec3e6a113)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 3105b687-fd5e-473d-b967-9da7c0647341)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + db3f8bb1-72d2-4aca-a6c4-c7c554a879ef)(content(Whitespace\" \ + \"))))(Secondary((id \ + f0d098d6-5609-4f15-a04e-0ede743aeb94)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ + 4d693f72-81cb-4c75-bde0-23592716a92f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d8b04ba0-8b64-4a94-9a97-70c2920e2530)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 2a8bf909-8ac9-434a-956d-cf4efbcc8af8)(content(Whitespace\" \ + \"))))(Tile((id \ + f6d6e84d-8550-473e-853d-b77f12bbefae)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 02f88e70-2821-4de0-b7a6-73287b575c61)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + a1648162-6ae8-4d24-8b93-6c537e8aabcf)(content(Whitespace\" \ + \"))))(Tile((id \ + 253ac0e4-fd26-4abc-aa21-1149fad7d43b)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 0ba56612-4438-4f63-9617-78d3c4ffa5bc)(content(Whitespace\" \ + \")))))((Secondary((id \ + ad6af5c1-5817-4b0c-ba82-321f042705f2)(content(Whitespace\" \ + \"))))(Tile((id \ + 0ba4458d-bee8-48e6-933a-18d06c343a42)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 608bb807-8d6c-4844-8d59-d3efe58d3843)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 77d36a72-5ba6-4ed4-aa9a-12b37970424c)(content(Whitespace\" \ + \"))))(Tile((id \ + 5af082f1-4d3e-4854-8ff1-1ffdaad55851)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + d48e22a5-f65a-4767-a9d0-1a40cc32b3d9)(content(Whitespace\" \ + \")))))((Secondary((id \ + 9609e0a9-f5f0-4fa6-b677-3a82f5b3c887)(content(Whitespace\" \ + \"))))(Tile((id \ + ff4f682c-091a-45ea-ac96-feb28081efc3)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 2cce8860-ee1b-4ec9-a66d-c8a748a30290)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 324ceb15-0215-4d88-8cf2-060903955c6f)(content(Whitespace\" \ + \"))))(Tile((id \ + e9a7860c-6db8-4a81-8ae4-bfdd79d70282)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 275a0228-3bff-48ff-a304-8f6edc108009)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Grout((id \ + 17047b05-1174-4151-937d-b4833dfd6d1a)(shape \ + Convex)))(Secondary((id \ + 13edcba8-486c-44b4-93d8-c1bf41f98fc5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1bdbf758-cf85-4d57-9d74-41588be677bf)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3a70753f-0da6-4a2a-bd04-12907709acb1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + aa17c661-b339-4613-87f5-9cc5ab23d5cf)(content(Whitespace\" \ + \"))))(Secondary((id \ + 80b2cb6c-da1b-4a39-8396-bbcb94900dbc)(content(Comment \ + #err#))))(Secondary((id \ + d1468a7b-ca13-4ee5-be11-c9d8ee744a90)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 11a94a5f-356a-4c36-855d-dbb81005f92d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 87784971-c398-4a3f-9537-9a2eba847372)(content(Whitespace\" \ + bd717dc5-9699-42e4-819e-a605ae33c705)(content(Whitespace\" \ \"))))(Tile((id \ - 9cc5b09c-65a4-4a8e-853d-62d8f15d4e24)(label(_))(mold((out \ + 90b78761-c7bf-40e4-a659-a899afa81b5c)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 1c9d9db0-dd3d-42eb-b038-aaf42bd3b7d6)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 9fca87f4-9b31-4e5c-8982-03f73b8d1b00)(content(Whitespace\" \ + \"))))(Grout((id 29f35a2c-4d0e-46f3-a17d-cdb6f0b58159)(shape \ + Convex)))(Tile((id \ + 3d63fe1d-8723-4fc2-96a7-579952450f50)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 8cff05d8-1ceb-4dc5-abd5-601a0737609e)(content(Whitespace\" \ + \"))))(Tile((id \ + ae9cbd45-3c84-4a8e-8580-4fae57ee8c20)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1e775429-5e8e-4b11-b66c-9cc3c1324739)(content(Whitespace\" \ + 25aaeff6-8269-4919-a321-5ae18d116be9)(content(Whitespace\" \ \")))))((Secondary((id \ - 04d76c28-7577-41c5-964a-fc54eeae9062)(content(Whitespace\" \ + eaacbf10-9ca6-47d5-8f8f-e286b53ce6ce)(content(Whitespace\" \ \"))))(Tile((id \ - 51f991bb-2c1f-435a-920a-a20148cbc2dd)(label(unbound))(mold((out \ + 1c286055-6c42-4648-b43e-330a792f075b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4db679dd-6f17-4ff2-b8f1-2a08acc594a6)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d22f9463-63f4-451c-9850-be72b1d06b56)(content(Whitespace\" \ + \"))))(Tile((id \ + c5d62b24-fd05-404d-a7c0-21cdfeacd1f4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bf68d8ff-145a-4e77-a735-120746818a4b)(content(Whitespace\" \ + 2336603c-c334-408f-a1e6-5f61132d0687)(content(Whitespace\" \ + \")))))((Secondary((id \ + bed23ec7-8aa3-4470-8236-81e76586c7a4)(content(Whitespace\" \ + \"))))(Tile((id \ + 6fc53068-7615-432a-a026-eb54d842336f)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + ffd73edf-b438-446a-990e-1b05534f81c4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4491f5f7-9ada-4420-acb7-fa9e6ec73fe9)(content(Whitespace\" \ + ee921cb7-b3fb-4dd1-a280-c91d2d9223d6)(content(Whitespace\" \ + \"))))(Tile((id \ + 3d27f98b-ba04-4145-98ff-501bc97c9b23)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + a9ae7e4e-dcaa-45cc-823f-edcb1cbdf947)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Grout((id \ + 4e543e67-9133-4e9d-b1ff-b835632a681a)(shape \ + Convex)))(Secondary((id \ + c39d6789-d1f4-4a6b-a29c-c8c25b5a0838)(content(Whitespace\" \ \"))))(Secondary((id \ - 474b7d65-a3a0-4c3e-b0f8-cf2a0ad43887)(content(Comment \ - #err#))))(Secondary((id \ - ffe1df31-0a25-4513-97c2-c36fc135468b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ff782a2c-aef7-4a7d-9ae0-848429b11fbd)(label(let = \ + 92e67be4-ea93-497b-a2ea-45c9966fea4e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 110afdaf-1fde-4e5c-ac9b-6e0bbb6d1d30)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 5189f641-bafa-420d-b91a-204be24e470a)(content(Whitespace\" \ + \"))))(Secondary((id \ + c3c3b2ea-b824-40df-a919-9a4e441d8759)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f9090b6a-5094-4660-a053-22404727e172)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e2eca969-e0a4-4a91-a89e-878e09aec2f6)(content(Whitespace\" \ - \"))))(Tile((id \ - 3c035ee1-6d4f-47fc-a76f-94f51898e718)(label(Undefined))(mold((out \ + 12e87a6a-048e-48da-82ea-382dc457ceac)(content(Whitespace\" \ + \"))))(Tile((id 8e8628df-8459-456b-84d6-2cb36af4b9e7)(label([ \ + ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ + Pat))((shape Convex)(sort Pat))))))(shards(0 \ + 1))(children(((Tile((id \ + cf25941f-eaa9-4a1a-b357-8c5b117c95ee)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dc02b1d3-06fa-4b3e-aa76-9766d01c3bc2)(content(Whitespace\" \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 3a1a98da-cf5a-4fcf-aa2c-548aef9e0b9e)(content(Whitespace\" \ \")))))((Secondary((id \ - 1d42290f-3641-4c65-a280-94551377a573)(content(Whitespace\" \ + 67cc35c8-7838-4a4e-ad76-367c9369ab0e)(content(Whitespace\" \ + \"))))(Tile((id e262c9fa-ae87-4fc8-9057-a9461bfd9bd5)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + a7254a23-019e-4314-af62-6d9c7bfb672b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 10ec1999-7398-48f7-863d-d1d5e36f3d2f)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + c7ac74b1-6e15-4e71-a746-39bc1efc8c27)(content(Whitespace\" \ \"))))(Tile((id \ - 0b3c4696-05af-4c34-8ab1-515fbae5550f)(label(Undefined))(mold((out \ + ba2f5cb7-3230-4ec9-a771-b691c357108a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b56b3924-e775-41ca-9e61-ac4112c6d40b)(content(Whitespace\" \ + b7fc917b-738e-423c-904d-05a96059bced)(content(Whitespace\" \ + \")))))((Secondary((id \ + dd935528-15f2-4c7d-8804-a4d472b14489)(content(Whitespace\" \ + \"))))(Tile((id \ + ff4d570b-28f6-4b30-a316-3a409235447b)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 1fb75734-2d7a-4769-9753-b17b1592087b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c2c7deac-19e5-41d8-9cc2-fe9e73a29960)(content(Whitespace\" \ - \"))))(Secondary((id \ - fec4e3ce-5421-40fb-96fa-8474e5a9fab3)(content(Comment\"# 2x \ - err#\"))))(Secondary((id \ - 02f65251-ccbd-4e70-b60e-cbe1e13adc6c)(content(Whitespace\" \ + eed1455f-cad2-4bae-8f40-ea91ebc25208)(content(Whitespace\" \ + \"))))(Tile((id \ + 2371b8a3-f2d4-46ec-bbc4-a60cbf89ef6d)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + f1e569ab-92b8-47e3-a64f-35fdc0407aa3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 342903af-c89d-49a7-bc25-5de96ac97281)(content(Whitespace\" \ \"))))(Secondary((id \ - cadfcea7-7c09-433f-8e03-df9e89dfd9e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c52236e-4a4a-4b7e-b318-84bd95c543ed)(label(let = \ + 2836626f-426e-4d0f-abb8-e947f32132f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3d735aba-e54e-400b-8573-7e839a3b9594)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 557dc615-9e1c-4a9e-a00f-15234e53a953)(content(Whitespace\" \ - \"))))(Tile((id \ - 13897887-613e-408c-b120-59b8666fc0b6)(label(true))(mold((out \ + 1855f1ad-a3ba-4224-99f2-d575807cf9f4)(content(Whitespace\" \ + \"))))(Tile((id 9e393b21-55dc-4ce9-ad66-de202a408331)(label([ \ + ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ + Pat))((shape Convex)(sort Pat))))))(shards(0 \ + 1))(children(((Tile((id \ + ea98ca45-1496-4863-93f8-3c2332b1b479)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 34fd4c5a-2433-40a8-9ded-9c6500142356)(content(Whitespace\" \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + f2df6024-92a9-49a5-88aa-39ffdfe6dd94)(content(Whitespace\" \ \")))))((Secondary((id \ - 83207004-3161-4071-a526-cf9459533d67)(content(Whitespace\" \ + 62c5a63b-cd57-4076-9551-1ae18d2b5025)(content(Whitespace\" \ \"))))(Tile((id \ - 2f5a444b-0006-47ac-bd94-14c9ffd80548)(label(2))(mold((out \ + e6e249a9-c461-4c0f-acce-c5fb18660415)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 28e5f8e2-b712-4c28-98f0-be264ed0d9d9)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + e243b1c2-c613-4578-be3c-c3a352c1b602)(content(Whitespace\" \ + \"))))(Tile((id \ + e155439a-5123-4b48-891e-d66bd6c15636)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 503d2940-fcd4-4a54-879d-81d129596ad1)(content(Whitespace\" \ + 2fbc7089-202c-447c-ae1f-0befd34a6f25)(content(Whitespace\" \ + \")))))((Secondary((id \ + 457ce868-2756-43d6-85fd-3dbd77b0bf43)(content(Whitespace\" \ + \"))))(Tile((id \ + aa2b1a04-2234-4c8d-bf1f-dde6283f8c6e)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 4cb364cd-2ae7-44b0-9e42-20c673269007)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e425406e-6252-47b9-8a4c-c8870d3c1376)(content(Whitespace\" \ + 84e6798d-a1d4-4688-83bc-941ceb1f1eca)(content(Whitespace\" \ + \"))))(Tile((id \ + 9e910694-b45d-4b2e-9f3b-6f3e92f40280)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 6e1b78c6-08fb-4eea-ad24-8a25bb546292)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 60c6c426-b0f5-4c23-b7ad-2d2599c327bf)(content(Whitespace\" \ \"))))(Secondary((id \ - 13255468-04e2-4816-9461-74dce40c9b27)(content(Comment \ - #err#))))(Secondary((id \ - 9d763cf1-1e07-4c47-b8ef-2b6435de5a49)(content(Whitespace\" \ + e0a7fd21-7379-4620-be7d-9fc89c0748c5)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ + f50e71ce-8170-4aba-ad79-d299d2f91a57)(content(Whitespace\" \ \"))))(Secondary((id \ - d2541b33-1f10-4474-9939-cd2e164493c2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 26b81a4e-e0a8-4a8b-8b59-e0278cb81758)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f412044b-ae99-40e1-ac43-a8785e7a2ce1)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 4dd92573-6d7c-4296-9208-937e7a2aa82a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d77b580d-b094-478f-9565-14ce2c48c3cd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f042fe33-b554-4f20-b618-2fa3c8e72461)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ + da5f7a94-d56f-419d-81a4-e90f5e4ad103)(shape \ + Convex))))))))(Tile((id \ + c005aa0c-43a6-4084-8b73-db752bd727db)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 597ecf17-421a-4853-9600-eb6e87ad1fc1)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 96732395-1218-4909-b454-484f2dc33583)(content(Whitespace\" \ - \"))))(Grout((id fdd65dce-3851-4173-8c0d-a8ac07ced2b6)(shape \ - Convex)))(Secondary((id \ - 3dae5dc2-012e-4f8a-b54a-3562c4f88afc)(content(Whitespace\" \ + c6d281a5-7366-4fc6-b93f-a5b506a71e24)(content(Whitespace\" \ + \"))))(Tile((id \ + 565daa13-0e6f-484d-9db2-c2c4412a54a7)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0606bb3b-03a8-4d74-beb9-0d8fc732f979)(content(Whitespace\" \ \")))))((Secondary((id \ - ba4613e8-5288-4f23-a6d1-7e3206f398d6)(content(Whitespace\" \ + cf5c6a9f-abe1-4fb9-b6dc-a9dbd6d7dba8)(content(Whitespace\" \ + \"))))(Tile((id \ + 1998792d-d014-4ac8-9359-2a97c35a8f4d)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + d55d2bae-a087-4fd1-8d06-bc046516f54f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + bce25bdc-97f5-4167-b0a5-28a7838bebdf)(content(Whitespace\" \ + \"))))(Tile((id \ + a37487be-086a-4d06-9e37-f4a6e0c74f15)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 0dd1749c-08c8-463b-8c08-d7540b7fd5f1)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 570a141b-ab07-4691-840a-ea9e46b4aa3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 387cc421-9cee-4b2e-b8c9-64420e4e3e0c)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 8000090f-6960-4cc4-8972-4b3b4934bbdf)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 21e644ea-f7ec-4444-be5f-6a628e76b1a5)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 9dd67d89-f568-45ca-a855-b39658cf456c)(content(Whitespace\" \ + \"))))(Tile((id \ + 87fdc732-9c35-45c0-b05d-841c3f76fcb7)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + e426f078-9c62-4ab7-b8e5-f3846f02e372)(content(Whitespace\" \ + \")))))((Secondary((id \ + 9eaced5b-63a5-43e5-9f9b-65877c1e2646)(content(Whitespace\" \ + \"))))(Tile((id \ + 93aea0bc-7454-4307-bddc-19b83469ac2f)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 00645620-caec-4675-8b29-deddb545f394)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f38ed27d-79ac-4416-893c-56aa5b086d7d)(content(Whitespace\" \ \"))))(Tile((id \ - c873fdfc-ead5-4cab-bbf9-f319e65eb545)(label(if then \ + 56d55ff8-a6c7-499a-9c41-e7249a9f2789)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 92403899-717e-4808-ac3e-3767e0eac20d)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 0f4bf478-ad4e-4543-867d-48080fbacb3c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 634ebd5a-061f-426d-8278-caf13efe2fcf)(content(Comment \ + #err#))))(Secondary((id \ + 6341373a-1b18-4f9e-a516-25b97197b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 91b8fd2b-50d5-46f3-9e2a-f4114ad5d08e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 35bef15d-fb86-4914-aea9-f26da914d8b5)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 55037480-08df-43b7-885d-c02860217f6d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 66791c1d-5fd9-4219-96fb-4bd8ba9165e6)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4fc68723-e8b9-4d8e-ac28-3066739c26f9)(content(Whitespace\" \ + 4534c71d-fbf2-49b3-8733-70c5c53f9fb6)(content(Whitespace\" \ \"))))(Tile((id \ - f36c50b4-776a-44c5-b033-a70e463f1813)(label(true))(mold((out \ + 5936b2bb-c495-41ac-915b-84720407aa82)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 537690ac-06c0-4b1d-84c1-6d4acc73e474)(content(Whitespace\" \ + dd27ba1f-0e47-47dc-8a19-b1ab49ddc6ae)(content(Whitespace\" \ \")))))((Secondary((id \ - a1d0648d-8c62-4713-b170-bc7db0c20504)(content(Whitespace\" \ + a8d6513a-d522-478e-a64e-ed20e95ced90)(content(Whitespace\" \ \"))))(Tile((id \ - 5247456c-6550-4072-8cc9-980f61c699d1)(label(1))(mold((out \ + 6b75f592-c667-4990-b872-45254ae84f58)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2acd1b5f-7510-4a74-a56f-36267b0a512b)(content(Whitespace\" \ + 7d563839-85f2-4636-99f5-0e0eab764be6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7616aa0a-4eeb-4db8-865f-5b61dc1263b8)(content(Whitespace\" \ + bb0e52cd-b00d-42d8-9697-52cda117a7be)(content(Whitespace\" \ \"))))(Tile((id \ - 81bfcb19-79c1-4bf5-b34c-3dcc7cfd192c)(label(1.))(mold((out \ + 11b0bba6-2add-46c0-80ea-eaae5fe2a612)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4b260629-7c2f-4a27-9081-844c47be8ff3)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - c71f0361-b8aa-41a1-8b35-ac1d81df2bda)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + d4989258-1177-43cc-85c8-0dece96af223)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + bde6f2f6-7dee-41fb-8ec8-7ce0a8d5de20)(content(Whitespace\" \ \"))))(Secondary((id \ - abe0800b-ccae-4935-b9f1-0db885b79a53)(content(Comment \ + 1da33e8c-40ca-40fe-8e25-c58069bda77c)(content(Comment \ #err#))))(Secondary((id \ - a6632e31-7765-49e2-8b18-3359f88183b2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 890064f6-db5c-48da-b11e-79a014c051cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9c0e9437-19f4-4071-aada-9b464e0479f2)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - d821f513-71c8-47e0-91f0-012fd7269dd2)(content(Whitespace\" \ - \"))))(Tile((id \ - 81c8a5e4-c8b9-444b-b66b-29dd2bd98f39)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 955b5d47-5dfe-4140-8ebe-f1cdb5d166df)(content(Whitespace\" \ - \")))))((Secondary((id \ - 60ba9fd8-2ae1-4031-aab1-0d31582db521)(content(Whitespace\" \ - \"))))(Tile((id \ - 09d1e608-b3e5-43c8-b5bd-f3986790dd19)(label(if then \ + f7d18d01-968b-40cf-a368-ecc331878420)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c84b88f4-3ab1-449c-bac0-1788f3910edd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + fd353163-012c-4c4d-a5c5-e394ecd16ae2)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 048898ab-996f-4b90-b66c-bff87aa60b61)(content(Whitespace\" \ + \"))))(Grout((id 859388a0-5d8a-48a1-b60d-d1a89e219d08)(shape \ + Convex)))(Secondary((id \ + 10d220ad-0935-4d34-a650-a3cd9d04f606)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 9e5262aa-2218-4b3c-a2ae-81123cf669d7)(content(Whitespace\" \ + \"))))(Grout((id 64517fe7-e255-4bc2-8834-b72704af952f)(shape \ + Convex))))))))(Tile((id \ + 783434d2-9a4d-4a4f-879d-214deb152945)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 33189c28-075e-45a0-b322-bf95b999fe4a)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d0d97c16-df70-43e7-8c19-4b2618e3df63)(content(Whitespace\" \ + a56657fc-4b1f-46f8-882c-ddfa6b681f37)(content(Whitespace\" \ \"))))(Tile((id \ - 67304d61-8d7a-4779-84f0-e4d60a495118)(label(true))(mold((out \ + 7c2df4aa-19e5-4677-bacd-5b7a724798a5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - da91c6a5-b71d-4e9b-8206-f9b83d98dd89)(content(Whitespace\" \ + a336b9e2-f9a1-416a-982f-96e525d7a097)(content(Whitespace\" \ \")))))((Secondary((id \ - 979e7fce-a579-46b9-995b-464e1d6d5210)(content(Whitespace\" \ + fa4494a5-f20c-4f3c-bdac-93367e9f675d)(content(Whitespace\" \ \"))))(Tile((id \ - 4728443e-07bd-46eb-a07a-876ab64a9b5f)(label(1))(mold((out \ + becfa6ad-81a4-4043-b34f-f9cd6968bdd4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 317643ae-3383-413d-9708-f183ee4971f1)(content(Whitespace\" \ + e636ba9d-f4f0-4b6a-a857-f72272703edd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0dac4f18-67d7-4bca-acf1-50183a763e9d)(content(Whitespace\" \ + c4907dc5-0d6b-4f19-876e-2a7d837d2526)(content(Whitespace\" \ \"))))(Tile((id \ - 6e4f414a-719a-4eda-93c0-baab66a8296e)(label(1.))(mold((out \ + afea6b91-26f2-4c46-b1ea-15e893de8d44)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2f303db8-f575-4235-8ccd-dca273aae20c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 526338c8-55fc-432a-9c0a-b9b6f877b413)(content(Whitespace\" \ - \"))))(Secondary((id \ - a9d1100b-abd6-4d20-be7d-a58c5ed507b5)(content(Comment \ - #err#))))(Secondary((id \ - a3580f56-6d80-4396-9869-c50ee7735d62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 50e8b8e5-6ce5-4536-bda6-3ddf728ea643)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - a5e847c7-5a2d-400b-8328-943165b1db2b)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + a4226d0f-0630-440b-b925-355c4323e26d)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 01ff0dc7-27f6-4bb5-a4fa-018d7296f307)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 953c3984-84f7-4724-b92a-a9a829788351)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 38407f72-07a5-493b-af4a-23ddcba9b306)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 808ba58b-c96b-4222-996e-d20bc439b39d)(content(Whitespace\" \ \"))))(Tile((id \ - a4e3d9e1-8d16-4e74-b645-9e9c10b71d13)(label(_))(mold((out \ + 71431cc7-a1ba-42a6-9e18-048bf7ed09ca)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fa1d3aa3-edea-4d2d-afed-e613ec30dab2)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - a2bb9040-1c54-4168-9f49-8716cbc12dfd)(shape \ - Convex)))(Secondary((id \ - ded9718d-58e0-44cf-83fd-1b6c5a46562d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5acbe062-4da5-47a8-a6c0-4f2ead2bbdb6)(content(Whitespace\" \ - \"))))(Secondary((id \ - 36a49252-eb7f-4210-b283-24e08b053000)(content(Whitespace\" \ - \")))))((Secondary((id \ - e648f5f6-a693-42fa-8995-b4a20961ba07)(content(Whitespace\" \ - \"))))(Tile((id \ - 46b21c79-7191-46bf-94e9-4fb884c21526)(label(if then \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 2b68db99-6d3c-4256-bc00-252ced2dd688)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + a0235b54-2e45-4d56-b677-baf460eeb39d)(content(Whitespace\" \ + \"))))(Grout((id 30ecd689-7fdd-4a7e-b180-65fd090457c9)(shape \ + Convex))))))))(Tile((id \ + c57eb10b-f7b5-47af-8678-f6ea4067c6f7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 3ddcb139-95a9-4888-ba0f-5442df48f9a7)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7d306a94-ff74-4f62-be10-af0f06529c21)(content(Whitespace\" \ + e695ba82-cf68-46ce-925e-31249261cd8c)(content(Whitespace\" \ \"))))(Tile((id \ - 7276eb67-791c-48e7-94b2-240b9d7e3fe6)(label(true))(mold((out \ + 0486935e-9996-4670-9f7d-c454f07554a0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8ad575d3-bede-46e4-a4d7-f942c2aa8640)(content(Whitespace\" \ + 528c71f4-4aa9-4397-b56a-b3fa05d26e80)(content(Whitespace\" \ \")))))((Secondary((id \ - b32b622a-da19-48f3-af59-95accf570e1f)(content(Whitespace\" \ + fd2ee037-5c94-450e-9bb0-00783b2adda9)(content(Whitespace\" \ \"))))(Tile((id \ - 275151f6-414f-46ff-8927-653979248dc5)(label(1))(mold((out \ + fc17fe9b-be91-40f4-b6d8-334ae02cf696)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9ba58510-58c1-479a-a9f6-6a70a07df983)(content(Whitespace\" \ + 28ac697b-72c1-4380-a4ac-77a6d620ce07)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 78eed0fa-3bcb-41a4-b6e7-fa15bbf05d29)(content(Whitespace\" \ + 5d6063b7-7b37-4a0a-b94e-2d416668609e)(content(Whitespace\" \ \"))))(Tile((id \ - 5513e260-636a-402a-94c7-c2a8cce3d454)(label(1.))(mold((out \ + 62e9e671-3419-4b81-ab5d-370a5a394aa9)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0ed17b54-7b3a-45d8-bd6e-1604f8af3da3)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 72fe8d09-0a4c-4c0d-8ca0-50d5057a9eeb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d95a7a94-7e7d-4841-b9d1-fd772e2d80dd)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - d8e95474-b6f1-44e0-85a7-ed0cc7dbde42)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 055bba99-c1db-48af-9aa6-4ba45f916bd5)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 12c3e8d4-f091-46c0-9755-5635c4f2b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a331d7b3-e0e5-4503-8eda-98fb4017d7b8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 93dd678e-5279-495a-aa88-2fa862389909)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 4597f735-731c-4066-9851-cd52d6542cee)(content(Whitespace\" \ \"))))(Tile((id \ - 73906d81-9d17-41e3-9632-7bf31280bc99)(label(_))(mold((out \ + 87294766-b061-4b33-84e7-b820bc4fb3cf)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c556f619-c3cd-4aed-8ee2-92848aece57c)(label(:))(mold((out \ + 394ec58a-fb30-407f-b376-432f454bc179)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 260c4a39-fa49-4a42-8ca5-f6bfd86d705c)(content(Whitespace\" \ - \"))))(Tile((id \ - c3e638a7-2c00-4098-94cd-05563acab569)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - cd497267-e360-4eb6-8b8e-7384fc549dbd)(content(Whitespace\" \ - \")))))((Secondary((id \ - d696e851-3001-4a34-ac58-cc213ab1f833)(content(Whitespace\" \ - \"))))(Tile((id \ - b5f73e45-81d0-44c7-b1b5-39f0ed28d790)(label(if then \ + 41c4021b-e111-4501-8940-762c147bfc82)(content(Whitespace\" \ + \"))))(Grout((id c347ce4a-b918-4de4-8400-cf7174b04eec)(shape \ + Convex)))(Secondary((id \ + 092d4568-73e7-4dab-aeb2-a96ba06aad7c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 89f8d64f-4dca-452f-a5e5-405b0dd06197)(content(Whitespace\" \ + \"))))(Grout((id 3fcdc9aa-d3ea-48dc-aa4e-50d47fe5def0)(shape \ + Convex))))))))(Tile((id \ + 0affb0e4-3f8f-4a78-b155-9cf118ca8eb7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + bffb5f4a-a206-4568-b182-a633e4b7d67e)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 895d56e8-04dc-4c2a-8edb-aa307da44814)(content(Whitespace\" \ + 7da6ae55-bd62-4139-8b5c-b3467b28d15e)(content(Whitespace\" \ \"))))(Tile((id \ - 7bdc158c-09c4-4303-98a2-95ac217c0d7b)(label(true))(mold((out \ + a38e5299-1158-4600-a4db-05d26b529068)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7f09b95b-c5ab-4274-8803-eece59459312)(content(Whitespace\" \ + 56db0b7d-70ce-482f-8bdd-f261e4bb033a)(content(Whitespace\" \ \")))))((Secondary((id \ - bc2998b3-bf64-4a57-aa06-33d6e3f57b29)(content(Whitespace\" \ + 366cc558-76f6-4454-ac7d-a42dd3da2584)(content(Whitespace\" \ \"))))(Tile((id \ - 503aa496-5d44-4876-b72c-22f53e38841e)(label(1))(mold((out \ + 9d875eaf-40a4-4826-95ea-ba72c0cd2c81)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0c5a8275-a28a-4f93-817b-4dad704c3671)(content(Whitespace\" \ + 5d888c4a-19d5-4e34-9401-04e577bc1c48)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bee57263-7e8b-4736-bc4b-177652f48018)(content(Whitespace\" \ + 85c80d5f-538f-40d0-b5d6-e235a7f5141f)(content(Whitespace\" \ \"))))(Tile((id \ - 24bd3d9e-ef99-4acf-b267-51739222ba13)(label(1.))(mold((out \ + 74612f3f-3d30-472f-86a4-fbc1857c058a)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c7038c0-6b3f-4f97-905f-2ac8a826a9a1)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 79209500-88d2-4efb-ae12-36961422af5f)(content(Whitespace\" \ - \"))))(Secondary((id \ - c15476f2-b945-4bd3-9d0d-b56187d74ac0)(content(Comment \ - #err#))))(Secondary((id \ - 9d3164ad-7956-48c7-9060-1585f2263536)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8f8e5371-c0a9-4882-abab-4793d534ae95)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 5171b496-42b3-4ad6-afbd-734e7dfab18a)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 470469dc-d8c3-469b-9c18-3d8e008b193b)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + d1dc00cb-ccae-41d1-bddb-107de0e308be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6c61507f-9013-45f0-aa48-1a3d015573cd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 84bef4da-1203-478f-85ca-9ee88c6f3beb)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 6a9d6562-d5e6-4b2b-a031-11739b0c2c3e)(content(Whitespace\" \ \"))))(Tile((id \ - 597937bb-e437-4f79-8336-62f0bfe633b7)(label(_))(mold((out \ + 33442197-55d4-4dbd-9138-5e50ff98d573)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 93961230-3aeb-4fe0-aa51-724650152a86)(label(:))(mold((out \ + 8cb1eae4-c597-4b00-a2eb-5b57a125a194)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bad1b945-64ed-46ba-b27f-6e6ec46b3207)(content(Whitespace\" \ + 6465c91e-5f51-4910-918f-9d204e1bcbd3)(content(Whitespace\" \ \"))))(Tile((id \ - 936b28c1-68b5-4e53-88b7-838ee7cbbcd5)(label(Fake))(mold((out \ + 55757bfd-ff22-42bb-9cd6-5608f5f015ff)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f1a2e20b-212c-4dae-88d4-fd0e86aa2998)(content(Whitespace\" \ - \")))))((Secondary((id \ - 660312dd-2c63-4eb7-a6c0-ab34eae4ae85)(content(Whitespace\" \ - \"))))(Tile((id \ - 8520a1ed-7cc4-43e2-8a2b-66821f37871f)(label(if then \ + f99eed79-6ba7-4182-ac8a-299afd43bbe9)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 420ac88a-4caa-46b4-9d0a-0bb5b1b14db6)(content(Whitespace\" \ + \"))))(Grout((id bc42c4d1-dd82-433f-b065-ac7de6dde15b)(shape \ + Convex))))))))(Tile((id \ + d9dfdd76-ecde-417a-ba68-8cfb016ab80f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + ea8ee01c-941d-4c66-a647-7918eefbb221)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c65d4f9e-96fe-4c50-af8a-0acd2f008513)(content(Whitespace\" \ + eb92a4a6-8137-46ff-8763-0f1c1cce4e0f)(content(Whitespace\" \ \"))))(Tile((id \ - 1f09612d-cdf3-4a5a-8634-b7e7f4edd704)(label(true))(mold((out \ + 3d6f8955-5d58-4093-9901-4cb799e4da68)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fc30bcc8-3a0a-4801-bbe4-54e44fef77e5)(content(Whitespace\" \ + 5c39d9d8-1353-4c82-95aa-cfd3c710d2ef)(content(Whitespace\" \ \")))))((Secondary((id \ - 19280f06-f9c1-4ecd-a813-9783f1377a5d)(content(Whitespace\" \ + dbd5746c-73d2-4bfd-b1d4-9bb4ddee1844)(content(Whitespace\" \ \"))))(Tile((id \ - ed3868a2-eeb4-4028-b399-7170800c18dd)(label(1))(mold((out \ + c3b3c0c4-46c1-4190-9173-0ba09eb387a3)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e180c714-6f53-42f0-a7bc-c014691ea0a7)(content(Whitespace\" \ + e8ee62da-8d62-4ef9-97b9-159f1b4a212a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 862e99a5-2143-4e3f-bfa7-fec564a23095)(content(Whitespace\" \ + 50dac4a7-2903-4ad4-a0ba-647854776727)(content(Whitespace\" \ \"))))(Tile((id \ - 5f88e61d-db92-494f-8b44-fa1fe0518da0)(label(true))(mold((out \ + 6c624d4a-3555-428a-954b-a312f3029cab)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 412a6380-f0a9-495b-a742-f8c4600f6638)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - d030eb4f-0f88-41d1-a12e-1a8aa9d7c4c6)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + a73dcc1e-7ade-4348-a466-c52a96e93884)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 9f00a5ef-4f7a-40d8-befd-c7c0d3c8a9ea)(content(Whitespace\" \ \"))))(Secondary((id \ - 472d7373-2de2-4699-ab83-06dbf689e446)(content(Comment \ + e8ad89fd-898f-4e2b-a3eb-f1220739d5ee)(content(Comment \ #err#))))(Secondary((id \ - 5946e251-b954-444b-8571-73a07f028d0f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7c9b44aa-0b0c-4493-b4d1-b596ccfb5860)(label(let = \ + 0d081213-9d46-42ee-b251-c3833afa9268)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d38dbc1a-10d5-43bf-9b21-c0fb792ff103)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 35f80ac8-05d2-47c0-96b0-fe39ffa828ba)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3d187f37-a8db-44b9-b5eb-79988c3e2c5a)(content(Whitespace\" \ + 3ff96410-6cde-468e-b92e-60c5dbcdbb1a)(content(Whitespace\" \ \"))))(Tile((id \ - 5f4e0850-7a82-4784-a8c1-e0cdb072b720)(label(_))(mold((out \ + cd0d9dc1-2890-40ad-bb56-9bff2cd214d9)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 37ec8304-8678-40ac-a78c-e1564cf1096a)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 5e98976c-354d-4f26-86f2-cefb7a80ee5c)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 09519fa6-8a8d-49a7-b97b-9446691ac068)(content(Whitespace\" \ + \")))))((Secondary((id \ + 7d48115d-4ed4-49d3-9026-f7ad7b3258dc)(content(Whitespace\" \ \"))))(Tile((id \ - 79281c40-1b91-4475-8293-ffdb3420f211)(label(_))(mold((out \ + 8438b733-c653-40e7-bbff-5d4b99a40808)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 103b9289-b28a-4c91-b38b-16ddba0518b5)(content(Whitespace\" \ + \"))))(Tile((id \ + 673dd059-8cdc-4b7e-a624-2f4006e16b66)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3dc98b9e-8880-4035-a61f-346a23cb05e8)(content(Whitespace\" \ - \")))))((Secondary((id \ - 4cfd5f82-9500-4f00-9fbf-de9d15dcb2c5)(content(Whitespace\" \ + 4d32ab0e-aa4c-4440-a471-858d48f0649e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 76eb013f-ee4d-4f01-958d-945f5cdc1b0a)(content(Whitespace\" \ \"))))(Tile((id \ - 78fe5eeb-03df-4ff0-b565-41e9c49c239f)(label(if then \ + f2867227-a84e-48c0-aefd-0a6d27dffd3f)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ede7a6c1-c15f-4648-9310-48732cd24e51)(content(Whitespace\" \ + 536f6d84-2485-4700-856a-629a00f30c51)(content(Whitespace\" \ \"))))(Tile((id \ - 0db9775e-926b-43b2-b3f5-d078c14cf73a)(label(true))(mold((out \ + fb05cdc7-856b-413c-9130-26a7b33fb7a6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b03a6005-6308-475e-8f5e-4eff52656710)(content(Whitespace\" \ + d3cb1bb1-3557-4483-b9ef-8df266b162c2)(content(Whitespace\" \ \")))))((Secondary((id \ - 9a9b8d8b-d056-4aab-9156-470737187412)(content(Whitespace\" \ + 277e68f0-754d-4e80-8a7b-d56b9b9aa9f4)(content(Whitespace\" \ \"))))(Tile((id \ - cb245d33-d282-4db3-a227-b645e9b75790)(label(1))(mold((out \ + a9256755-3fd2-4341-8307-7806781ac7ac)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2cd250fd-dc35-4a9a-bc4f-9426959354e8)(content(Whitespace\" \ + dce7ceae-84ee-4d61-8c22-b695f164af14)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 787ba6f3-84b1-4f93-b5dc-a8b870e9ba4c)(content(Whitespace\" \ + fb80563f-83de-49db-8e2a-a9211d8c0b0a)(content(Whitespace\" \ \"))))(Tile((id \ - 9a45395d-bcf2-41c3-b21b-cedec3e6a113)(label(1.))(mold((out \ + ce8523a7-3bf0-46ed-9e10-c06b9cbb72a7)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3105b687-fd5e-473d-b967-9da7c0647341)(content(Whitespace\" \ + ff99f97c-f2ff-400a-bfc8-0c9a6bcff924)(content(Whitespace\" \ \")))))))))(Secondary((id \ - db3f8bb1-72d2-4aca-a6c4-c7c554a879ef)(content(Whitespace\" \ + 695a14e2-4ca6-46fd-99eb-862ef7629ffe)(content(Whitespace\" \ \"))))(Secondary((id \ - f0d098d6-5609-4f15-a04e-0ede743aeb94)(content(Comment\"#2x \ - err#\"))))(Secondary((id \ - 4d693f72-81cb-4c75-bde0-23592716a92f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d8b04ba0-8b64-4a94-9a97-70c2920e2530)(label(let = \ + 592c2ffd-79a2-45c3-bc3d-283cb6aa7a76)(content(Comment \ + #err#))))(Secondary((id \ + bcb2d205-cf7c-43ef-acc3-978957fecbe9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 25ed166a-87e0-4172-818b-2b62a8bda24c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2a8bf909-8ac9-434a-956d-cf4efbcc8af8)(content(Whitespace\" \ + 9868c377-1e5e-4a84-a575-cc38ab948866)(content(Whitespace\" \ \"))))(Tile((id \ - f6d6e84d-8550-473e-853d-b77f12bbefae)(label(_))(mold((out \ + 4918c91e-8e50-4735-883b-a356720ea9d2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 02f88e70-2821-4de0-b7a6-73287b575c61)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - a1648162-6ae8-4d24-8b93-6c537e8aabcf)(content(Whitespace\" \ + a52427c4-8fad-4952-9ce2-071dbbab89d9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8fe334cd-5fa8-4d94-84d3-34385126ca98)(content(Whitespace\" \ + \"))))(Grout((id 653091cf-f907-4593-90a5-0f8c07a68006)(shape \ + Convex)))(Secondary((id \ + 991a094b-7379-4445-a8ee-87b39301f44b)(content(Whitespace\" \ + \")))))((Secondary((id \ + c7ba46b9-2795-4e23-9257-c980fa33f40a)(content(Whitespace\" \ \"))))(Tile((id \ - 253ac0e4-fd26-4abc-aa21-1149fad7d43b)(label(_))(mold((out \ + 4839dfee-a097-40eb-b968-4762751a00cf)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + fb185c7a-882a-4d4d-a696-b835827a067e)(content(Whitespace\" \ + \"))))(Tile((id \ + 3386719d-5ae9-466e-bcbb-76c10b1a7cd9)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0ba56612-4438-4f63-9617-78d3c4ffa5bc)(content(Whitespace\" \ - \")))))((Secondary((id \ - ad6af5c1-5817-4b0c-ba82-321f042705f2)(content(Whitespace\" \ + cf81b859-0f34-44cb-84c4-ee0a294618b3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f0a26556-e334-473c-8cf8-c57092e4f36a)(content(Whitespace\" \ \"))))(Tile((id \ - 0ba4458d-bee8-48e6-933a-18d06c343a42)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 608bb807-8d6c-4844-8d59-d3efe58d3843)(label(if then \ + d5d5e598-a807-4bf5-bfec-fe007c7b3a22)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 77d36a72-5ba6-4ed4-aa9a-12b37970424c)(content(Whitespace\" \ + c8e619cc-2d91-4991-85d5-546da420b09d)(content(Whitespace\" \ \"))))(Tile((id \ - 5af082f1-4d3e-4854-8ff1-1ffdaad55851)(label(true))(mold((out \ + 3a199739-00ab-427d-868a-d401e27d83fe)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d48e22a5-f65a-4767-a9d0-1a40cc32b3d9)(content(Whitespace\" \ + ac76f6fa-c89a-483b-bf41-4593f9f1b21f)(content(Whitespace\" \ \")))))((Secondary((id \ - 9609e0a9-f5f0-4fa6-b677-3a82f5b3c887)(content(Whitespace\" \ + be7ef864-67a0-4fe0-9bf6-4f882754dc82)(content(Whitespace\" \ \"))))(Tile((id \ - ff4f682c-091a-45ea-ac96-feb28081efc3)(label(1))(mold((out \ + dfa24cb1-5893-41e9-a062-bd4ec11e605e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2cce8860-ee1b-4ec9-a66d-c8a748a30290)(content(Whitespace\" \ + 50514c7a-0b13-4c44-80d5-a3357fcc0012)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 324ceb15-0215-4d88-8cf2-060903955c6f)(content(Whitespace\" \ + 490e8e38-b288-4122-bc9f-ec6882b9ff61)(content(Whitespace\" \ \"))))(Tile((id \ - e9a7860c-6db8-4a81-8ae4-bfdd79d70282)(label(1.))(mold((out \ + af9ae9a8-74b0-4d58-8107-7dba40c5e153)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 275a0228-3bff-48ff-a304-8f6edc108009)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 17047b05-1174-4151-937d-b4833dfd6d1a)(shape \ - Convex)))(Secondary((id \ - 13edcba8-486c-44b4-93d8-c1bf41f98fc5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1bdbf758-cf85-4d57-9d74-41588be677bf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3a70753f-0da6-4a2a-bd04-12907709acb1)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + d8cbf47c-8aa1-4f01-b414-892b1512aa51)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aa17c661-b339-4613-87f5-9cc5ab23d5cf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 80b2cb6c-da1b-4a39-8396-bbcb94900dbc)(content(Comment \ - #err#))))(Secondary((id \ - d1468a7b-ca13-4ee5-be11-c9d8ee744a90)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 11a94a5f-356a-4c36-855d-dbb81005f92d)(label(let = \ + 0083e628-0325-46bf-a55f-b2d9673a1778)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6c7603d2-1f45-46e9-9fc4-477dc7140cca)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd717dc5-9699-42e4-819e-a605ae33c705)(content(Whitespace\" \ + 37df505f-e3b7-483b-85e1-99d1a420a9b6)(content(Whitespace\" \ \"))))(Tile((id \ - 90b78761-c7bf-40e4-a659-a899afa81b5c)(label(_))(mold((out \ + 35390017-9451-4508-a83b-7524bad86fc4)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1c9d9db0-dd3d-42eb-b038-aaf42bd3b7d6)(label(:))(mold((out \ + a3206d48-65ee-4b0e-b65c-addfe0e9c62e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9fca87f4-9b31-4e5c-8982-03f73b8d1b00)(content(Whitespace\" \ - \"))))(Grout((id 29f35a2c-4d0e-46f3-a17d-cdb6f0b58159)(shape \ - Convex)))(Tile((id \ - 3d63fe1d-8723-4fc2-96a7-579952450f50)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 8cff05d8-1ceb-4dc5-abd5-601a0737609e)(content(Whitespace\" \ + b7ecddd6-8846-4963-a461-1f0b9bd84979)(content(Whitespace\" \ + \"))))(Grout((id 4da9fa71-62ee-4931-bcd1-1a33bb41840d)(shape \ + Convex)))(Secondary((id \ + b3f4fb40-e05d-466c-ab85-39d6e23e0767)(content(Whitespace\" \ \"))))(Tile((id \ - ae9cbd45-3c84-4a8e-8580-4fae57ee8c20)(label(_))(mold((out \ + def384f8-b29b-4dfb-a36d-85a809641dbc)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 3bf09644-328a-4419-8c85-f02f99efb9d2)(content(Whitespace\" \ + \"))))(Grout((id a95b9978-19ec-48f9-ba13-6d458ca30443)(shape \ + Convex)))(Secondary((id \ + ec61c941-3afd-4226-8ffc-fc1b54122412)(content(Whitespace\" \ + \")))))((Secondary((id \ + b5fd0857-94d1-45a2-8ac0-41c72af48c00)(content(Whitespace\" \ + \"))))(Tile((id \ + a3677a6f-6aa9-44e8-a44e-f4643498eec4)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 17fcc7ed-aa0e-493b-97a8-aa78cf51b2fe)(content(Whitespace\" \ + \"))))(Tile((id \ + a25707f6-8e51-420a-aa12-05df1b5b9152)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 25aaeff6-8269-4919-a321-5ae18d116be9)(content(Whitespace\" \ - \")))))((Secondary((id \ - eaacbf10-9ca6-47d5-8f8f-e286b53ce6ce)(content(Whitespace\" \ + d22d1ad5-68bc-4ff3-ab87-1eadd3a003ec)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 90fdd949-668d-4977-a390-869262719fab)(content(Whitespace\" \ \"))))(Tile((id \ - 1c286055-6c42-4648-b43e-330a792f075b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4db679dd-6f17-4ff2-b8f1-2a08acc594a6)(label(if then \ + 0557157c-33b3-43b4-a046-c7b881d19216)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d22f9463-63f4-451c-9850-be72b1d06b56)(content(Whitespace\" \ + 755a7811-722a-41f6-9b56-80cdfda1b034)(content(Whitespace\" \ \"))))(Tile((id \ - c5d62b24-fd05-404d-a7c0-21cdfeacd1f4)(label(true))(mold((out \ + 7b63343b-a942-4302-9ce3-56ef30b62d39)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2336603c-c334-408f-a1e6-5f61132d0687)(content(Whitespace\" \ + ffbc6847-3a7e-4b9e-9514-92e5d8b3e277)(content(Whitespace\" \ \")))))((Secondary((id \ - bed23ec7-8aa3-4470-8236-81e76586c7a4)(content(Whitespace\" \ + bc4fee4b-bfc4-4d8d-a21c-32ddd20d4115)(content(Whitespace\" \ \"))))(Tile((id \ - 6fc53068-7615-432a-a026-eb54d842336f)(label(1))(mold((out \ + 61ef3fd6-dc5e-4173-a46c-21a4e9e903b7)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffd73edf-b438-446a-990e-1b05534f81c4)(content(Whitespace\" \ + 1a42a366-5df3-4b08-b9b8-ddc50e9fa073)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee921cb7-b3fb-4dd1-a280-c91d2d9223d6)(content(Whitespace\" \ + d36add28-c6d6-4d4a-ae6b-3b53f65a813c)(content(Whitespace\" \ \"))))(Tile((id \ - 3d27f98b-ba04-4145-98ff-501bc97c9b23)(label(1.))(mold((out \ + e6fb11d1-572b-4992-bb6f-c3ce42c31a5b)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a9ae7e4e-dcaa-45cc-823f-edcb1cbdf947)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 4e543e67-9133-4e9d-b1ff-b835632a681a)(shape \ - Convex)))(Secondary((id \ - c39d6789-d1f4-4a6b-a29c-c8c25b5a0838)(content(Whitespace\" \ - \"))))(Secondary((id \ - 92e67be4-ea93-497b-a2ea-45c9966fea4e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 110afdaf-1fde-4e5c-ac9b-6e0bbb6d1d30)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + a1564a6d-ddcd-4382-b57e-1852880686af)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5189f641-bafa-420d-b91a-204be24e470a)(content(Whitespace\" \ - \"))))(Secondary((id \ - c3c3b2ea-b824-40df-a919-9a4e441d8759)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f9090b6a-5094-4660-a053-22404727e172)(label(let = \ + 4c9de5ed-d3f5-40ab-957a-ab2b7ebacf82)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e9a91bdd-1b8a-4628-805f-0a21e5b22197)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 12e87a6a-048e-48da-82ea-382dc457ceac)(content(Whitespace\" \ - \"))))(Tile((id 8e8628df-8459-456b-84d6-2cb36af4b9e7)(label([ \ - ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ - Pat))((shape Convex)(sort Pat))))))(shards(0 \ - 1))(children(((Tile((id \ - cf25941f-eaa9-4a1a-b357-8c5b117c95ee)(label(_))(mold((out \ + 2d6fed2a-48c6-4b44-b0c2-ab7d7f51af72)(content(Whitespace\" \ + \"))))(Tile((id \ + b2cdc1f9-3351-483c-9638-f771257810d1)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 3a1a98da-cf5a-4fcf-aa2c-548aef9e0b9e)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 8e161d9b-fe98-4adb-846d-3183117c15fc)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d7e9e9af-16d9-4be7-b772-47fe800aa248)(content(Whitespace\" \ + \"))))(Grout((id cf9694be-3b9f-4fd3-ad55-858faa4e5f02)(shape \ + Convex)))(Secondary((id \ + de591d6c-a4d8-4591-9c3d-016e28ab0985)(content(Whitespace\" \ + \"))))(Tile((id \ + 57226fd7-6fe7-4284-a58e-3e828da4c10b)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 0d276a95-1daa-457d-ab45-dd7874086238)(content(Whitespace\" \ + \"))))(Tile((id \ + 2c187a0a-a6d7-4dbd-bf2f-1254faf967c8)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c5305727-7034-47c4-9b13-76e2ac8b158f)(content(Whitespace\" \ \")))))((Secondary((id \ - 67cc35c8-7838-4a4e-ad76-367c9369ab0e)(content(Whitespace\" \ - \"))))(Tile((id e262c9fa-ae87-4fc8-9057-a9461bfd9bd5)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - a7254a23-019e-4314-af62-6d9c7bfb672b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 10ec1999-7398-48f7-863d-d1d5e36f3d2f)(label(if then \ + 66945bb7-c5c7-4a6a-bb95-9ab4a4096aca)(content(Whitespace\" \ + \"))))(Tile((id \ + dcf922aa-beb1-4e2b-8b31-79696c1ba35e)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + b86c3ae2-f820-4b20-8f4d-c8cd2d034d4c)(content(Whitespace\" \ + \"))))(Tile((id \ + 78164bbb-a765-4907-a883-0b43f38c8f40)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 7c476086-ecce-47b4-b7e0-6eda1e7f99ce)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + bc736e1b-63f4-4e30-b612-8cce38bb2f4f)(content(Whitespace\" \ + \"))))(Tile((id \ + 774faf15-02ca-49db-aa2c-ed9951c7e422)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c7ac74b1-6e15-4e71-a746-39bc1efc8c27)(content(Whitespace\" \ + dec59fd4-6edc-4055-a1e8-db02398bd11e)(content(Whitespace\" \ \"))))(Tile((id \ - ba2f5cb7-3230-4ec9-a771-b691c357108a)(label(true))(mold((out \ + 66dc2eb8-49b8-4770-a380-03ecb1c39654)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b7fc917b-738e-423c-904d-05a96059bced)(content(Whitespace\" \ + a6da3ecb-cbbf-4467-b699-f33c2e198794)(content(Whitespace\" \ \")))))((Secondary((id \ - dd935528-15f2-4c7d-8804-a4d472b14489)(content(Whitespace\" \ + 97c06b6c-f2fc-4f85-8233-e1e24f55f183)(content(Whitespace\" \ \"))))(Tile((id \ - ff4d570b-28f6-4b30-a316-3a409235447b)(label(1))(mold((out \ + 49f69120-67f3-4f12-8473-25854331d0a7)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1fb75734-2d7a-4769-9753-b17b1592087b)(content(Whitespace\" \ + e7adea10-9083-4988-afcf-d748d5c83dc0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eed1455f-cad2-4bae-8f40-ea91ebc25208)(content(Whitespace\" \ + c4bf9155-bdf3-4583-810d-7fbc5963d1a4)(content(Whitespace\" \ \"))))(Tile((id \ - 2371b8a3-f2d4-46ec-bbc4-a60cbf89ef6d)(label(1.))(mold((out \ + 736d66cf-946f-4560-89b4-3fc126888dc1)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - f1e569ab-92b8-47e3-a64f-35fdc0407aa3)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 4492e518-d63e-4b85-91c2-26cb60446eb3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 342903af-c89d-49a7-bc25-5de96ac97281)(content(Whitespace\" \ + 1e2692c3-306c-409d-b336-cef082edcd8c)(content(Whitespace\" \ \"))))(Secondary((id \ - 2836626f-426e-4d0f-abb8-e947f32132f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3d735aba-e54e-400b-8573-7e839a3b9594)(label(let = \ + ae09d83c-ae42-4b0e-8765-8aee441f0616)(content(Comment \ + #err#))))(Secondary((id \ + 03b03c43-459d-491b-ad03-a72757614270)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 092b9051-f708-4479-9166-d6161e6b254f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1855f1ad-a3ba-4224-99f2-d575807cf9f4)(content(Whitespace\" \ - \"))))(Tile((id 9e393b21-55dc-4ce9-ad66-de202a408331)(label([ \ - ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ - Pat))((shape Convex)(sort Pat))))))(shards(0 \ - 1))(children(((Tile((id \ - ea98ca45-1496-4863-93f8-3c2332b1b479)(label(_))(mold((out \ + bd68afd2-4abd-43b7-b370-539fc05fc7f5)(content(Whitespace\" \ + \"))))(Tile((id \ + b4ed8e27-adb1-4436-b2d2-fe1faf8d36f1)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - f2df6024-92a9-49a5-88aa-39ffdfe6dd94)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + c21f3089-a8fa-414a-b6f4-d07fc101fccc)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 583749a3-eba6-4e91-9cfe-36ff52355aca)(content(Whitespace\" \ + \"))))(Grout((id 4e5cdbcf-6fc5-48e0-abf0-2fc5054d3574)(shape \ + Convex)))(Secondary((id \ + 5a84df8d-23ef-4dac-8388-201f94248eb4)(content(Whitespace\" \ + \"))))(Tile((id \ + edb29728-1267-4abc-9081-195f6663856f)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8a308706-b82c-4215-a4bd-c8cf8fbd1a8d)(content(Whitespace\" \ + \"))))(Tile((id 6bfd0ba4-08a4-4f77-8b64-126378c1907e)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Grout((id \ + e89b84de-7ab4-46de-a7d5-94abf6588ec0)(shape \ + Convex))))))))(Secondary((id \ + f7dde1a7-74ac-4b68-bf6a-812a666fd963)(content(Whitespace\" \ \")))))((Secondary((id \ - 62c5a63b-cd57-4076-9551-1ae18d2b5025)(content(Whitespace\" \ + 4ee83851-34f6-4867-a055-ca51562dfb48)(content(Whitespace\" \ \"))))(Tile((id \ - e6e249a9-c461-4c0f-acce-c5fb18660415)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28e5f8e2-b712-4c28-98f0-be264ed0d9d9)(label(if then \ + bba577e3-68f9-4353-ae2d-e24914773aa9)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 342ca27b-4acf-4a91-aef6-2426ae0200a6)(content(Whitespace\" \ + \"))))(Tile((id \ + 6271d837-e1af-407a-8f42-902f46019fdb)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 3857a916-2ca2-4b91-9ce3-08bdcea49694)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 830c1a4e-d2eb-4d27-b5af-9edfe71db503)(content(Whitespace\" \ + \"))))(Tile((id \ + 5c18044e-489b-458e-ab15-649911a03030)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e243b1c2-c613-4578-be3c-c3a352c1b602)(content(Whitespace\" \ + 389ce73f-f26f-4be2-a221-dc4713f67f29)(content(Whitespace\" \ \"))))(Tile((id \ - e155439a-5123-4b48-891e-d66bd6c15636)(label(true))(mold((out \ + 1c4d1edf-c38e-4a8b-a654-eda7ac54fbfc)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2fbc7089-202c-447c-ae1f-0befd34a6f25)(content(Whitespace\" \ + 5e8c1968-ee4f-426a-a161-a578efb13975)(content(Whitespace\" \ \")))))((Secondary((id \ - 457ce868-2756-43d6-85fd-3dbd77b0bf43)(content(Whitespace\" \ + 802b0b26-b087-4fc5-b422-fd7727778899)(content(Whitespace\" \ \"))))(Tile((id \ - aa2b1a04-2234-4c8d-bf1f-dde6283f8c6e)(label(1))(mold((out \ + db1691b5-be53-42ea-a42b-48615ce08542)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4cb364cd-2ae7-44b0-9e42-20c673269007)(content(Whitespace\" \ + 3815c49c-0867-467f-9881-1ebb7e272bbc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 84e6798d-a1d4-4688-83bc-941ceb1f1eca)(content(Whitespace\" \ + 90d59c52-5f6a-4dd5-a008-08a674362dd2)(content(Whitespace\" \ \"))))(Tile((id \ - 9e910694-b45d-4b2e-9f3b-6f3e92f40280)(label(1.))(mold((out \ + 77a1c18c-e388-464c-8a96-99d509f09a60)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6e1b78c6-08fb-4eea-ad24-8a25bb546292)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c4b13785-8b02-4432-98b3-734f7f00dee5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 60c6c426-b0f5-4c23-b7ad-2d2599c327bf)(content(Whitespace\" \ + c4f76c84-7f32-4d47-b5f1-81bf03e05f9d)(content(Whitespace\" \ \"))))(Secondary((id \ - e0a7fd21-7379-4620-be7d-9fc89c0748c5)(content(Comment\"#2x \ + f791a637-6547-4952-b2af-2df75636a400)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - f50e71ce-8170-4aba-ad79-d299d2f91a57)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4dd92573-6d7c-4296-9208-937e7a2aa82a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d77b580d-b094-478f-9565-14ce2c48c3cd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f042fe33-b554-4f20-b618-2fa3c8e72461)(label(\"(\"\")\"))(mold((out \ + b280e9ea-b425-4fed-a57a-3299273288d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 12f499da-76c3-4ae2-93d0-5ca9e69753b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 232006c7-a8ef-48b8-9a78-3cf60d23ceaf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - da5f7a94-d56f-419d-81a4-e90f5e4ad103)(shape \ + c4738729-fba4-45b6-8020-a79d3a26c31f)(shape \ Convex))))))))(Tile((id \ - c005aa0c-43a6-4084-8b73-db752bd727db)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + cffc0f76-df2f-4dae-a3ce-3d509789faf9)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + f6e93383-434a-48e3-a0b9-9186037e3047)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 597ecf17-421a-4853-9600-eb6e87ad1fc1)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - c6d281a5-7366-4fc6-b93f-a5b506a71e24)(content(Whitespace\" \ - \"))))(Tile((id \ - 565daa13-0e6f-484d-9db2-c2c4412a54a7)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0606bb3b-03a8-4d74-beb9-0d8fc732f979)(content(Whitespace\" \ - \")))))((Secondary((id \ - cf5c6a9f-abe1-4fb9-b6dc-a9dbd6d7dba8)(content(Whitespace\" \ - \"))))(Tile((id \ - 1998792d-d014-4ac8-9359-2a97c35a8f4d)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d55d2bae-a087-4fd1-8d06-bc046516f54f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - bce25bdc-97f5-4167-b0a5-28a7838bebdf)(content(Whitespace\" \ - \"))))(Tile((id \ - a37487be-086a-4d06-9e37-f4a6e0c74f15)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0dd1749c-08c8-463b-8c08-d7540b7fd5f1)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 570a141b-ab07-4691-840a-ea9e46b4aa3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 387cc421-9cee-4b2e-b8c9-64420e4e3e0c)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8000090f-6960-4cc4-8972-4b3b4934bbdf)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a9cda473-0dbe-410f-b9ad-521eb61cf321)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 21e644ea-f7ec-4444-be5f-6a628e76b1a5)(label(if then \ + cb5da907-a7ee-4650-9c61-27b4e3d65121)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9dd67d89-f568-45ca-a855-b39658cf456c)(content(Whitespace\" \ + b6fc370c-918a-434d-b3b6-cdd8eabff95e)(content(Whitespace\" \ \"))))(Tile((id \ - 87fdc732-9c35-45c0-b05d-841c3f76fcb7)(label(true))(mold((out \ + ed44da3d-79ac-4881-98a4-e782ba366300)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e426f078-9c62-4ab7-b8e5-f3846f02e372)(content(Whitespace\" \ + fba985da-7e06-4f50-a970-38d7c6ae21a7)(content(Whitespace\" \ \")))))((Secondary((id \ - 9eaced5b-63a5-43e5-9f9b-65877c1e2646)(content(Whitespace\" \ + 651eb65f-6715-43ac-812c-f1f48bd31f4f)(content(Whitespace\" \ \"))))(Tile((id \ - 93aea0bc-7454-4307-bddc-19b83469ac2f)(label(1))(mold((out \ + 5866ac7e-9854-4845-86a3-02fb42bb4d6e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 00645620-caec-4675-8b29-deddb545f394)(content(Whitespace\" \ + 955402bf-b94d-4e9a-b95f-440e8a942c04)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f38ed27d-79ac-4416-893c-56aa5b086d7d)(content(Whitespace\" \ + d4fe1496-194e-4abb-b7ab-7f0aab65d877)(content(Whitespace\" \ \"))))(Tile((id \ - 56d55ff8-a6c7-499a-9c41-e7249a9f2789)(label(1.))(mold((out \ + a3157ede-51e6-4eb4-a998-15ec007ca8fe)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 92403899-717e-4808-ac3e-3767e0eac20d)(label(\";\"))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Tile((id \ + d5ae6ad5-5f2a-4934-9fa7-ffb96b15e9ce)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0f4bf478-ad4e-4543-867d-48080fbacb3c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 634ebd5a-061f-426d-8278-caf13efe2fcf)(content(Comment \ - #err#))))(Secondary((id \ - 6341373a-1b18-4f9e-a516-25b97197b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 91b8fd2b-50d5-46f3-9e2a-f4114ad5d08e)(label(\"(\"\")\"))(mold((out \ + 2e1b0250-b0cb-438a-addf-8604f846c3af)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a3a9866e-fb72-4fc0-aa55-e54dc312fd45)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 6367200c-4fd9-412c-be16-02b8bebead75)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + a56c9c39-7aea-4e94-ad02-25c9017c06ee)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 35bef15d-fb86-4914-aea9-f26da914d8b5)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 55037480-08df-43b7-885d-c02860217f6d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + aaa9b7f2-0032-48e3-8658-07f826c0a19c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 66791c1d-5fd9-4219-96fb-4bd8ba9165e6)(label(if then \ + accb22c4-cf7b-4bc2-a1f1-4d0c80a4635d)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4534c71d-fbf2-49b3-8733-70c5c53f9fb6)(content(Whitespace\" \ + e1b1486e-f426-4623-869f-be7d4b147b6c)(content(Whitespace\" \ \"))))(Tile((id \ - 5936b2bb-c495-41ac-915b-84720407aa82)(label(true))(mold((out \ + 9a4bed25-55cc-4951-9efa-027aa0216064)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dd27ba1f-0e47-47dc-8a19-b1ab49ddc6ae)(content(Whitespace\" \ + 63eebaad-cc2d-4899-bc2b-22fbf548c4dc)(content(Whitespace\" \ \")))))((Secondary((id \ - a8d6513a-d522-478e-a64e-ed20e95ced90)(content(Whitespace\" \ + 4f914036-bad1-4d1b-b8cd-01000178c611)(content(Whitespace\" \ \"))))(Tile((id \ - 6b75f592-c667-4990-b872-45254ae84f58)(label(1))(mold((out \ + a07cee91-fc9a-4f3c-aae3-5e82cca71f06)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7d563839-85f2-4636-99f5-0e0eab764be6)(content(Whitespace\" \ + 33c9f869-287f-4ebe-8bdf-f8e1e03558a2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bb0e52cd-b00d-42d8-9697-52cda117a7be)(content(Whitespace\" \ + e5ef7784-cd98-410c-b653-22ab8af2b11a)(content(Whitespace\" \ \"))))(Tile((id \ - 11b0bba6-2add-46c0-80ea-eaae5fe2a612)(label(1.))(mold((out \ + 3ab4da6a-7aed-487d-b0fb-3113913c693a)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d4989258-1177-43cc-85c8-0dece96af223)(label(\";\"))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Tile((id \ + 09efe17e-bc3a-44ac-99a7-a868e3452897)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bde6f2f6-7dee-41fb-8ec8-7ce0a8d5de20)(content(Whitespace\" \ + af722baf-632d-4d28-92d3-c2f914bd31cc)(content(Whitespace\" \ \"))))(Secondary((id \ - 1da33e8c-40ca-40fe-8e25-c58069bda77c)(content(Comment \ + f2e03598-6017-43f2-be61-b8442de25fce)(content(Comment \ #err#))))(Secondary((id \ - f7d18d01-968b-40cf-a368-ecc331878420)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c84b88f4-3ab1-449c-bac0-1788f3910edd)(label(\"(\"\")\"))(mold((out \ + 88af9827-b2be-471c-add1-70a096838b49)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e01b6ac4-8715-4662-9fc1-87aeb2060bf9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fd353163-012c-4c4d-a5c5-e394ecd16ae2)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 048898ab-996f-4b90-b66c-bff87aa60b61)(content(Whitespace\" \ - \"))))(Grout((id 859388a0-5d8a-48a1-b60d-d1a89e219d08)(shape \ - Convex)))(Secondary((id \ - 10d220ad-0935-4d34-a650-a3cd9d04f606)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 9e5262aa-2218-4b3c-a2ae-81123cf669d7)(content(Whitespace\" \ - \"))))(Grout((id 64517fe7-e255-4bc2-8834-b72704af952f)(shape \ - Convex))))))))(Tile((id \ - 783434d2-9a4d-4a4f-879d-214deb152945)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6ada54c0-de79-4600-bdd5-f42f2f4744f8)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 54ec4955-7647-4737-87d4-8e21a18943b9)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 5c6fe323-e200-4fe9-8e5e-3a890b129f68)(content(Whitespace\" \ + \"))))(Tile((id \ + 3157b120-93b8-4d06-bc3e-cfde87fe9690)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + d4a9bddb-e237-4100-b2ed-305e25afd150)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 065b6501-e20b-48af-94f3-9265d968d3c3)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33189c28-075e-45a0-b322-bf95b999fe4a)(label(if then \ + 5e4eb96a-5665-41e1-8b9c-b4cc34bf0c0c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + a56978d8-b5e0-491b-8a2b-7648e836e8fd)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a56657fc-4b1f-46f8-882c-ddfa6b681f37)(content(Whitespace\" \ + f9c291e7-47a6-4d4a-8554-85853d267d7a)(content(Whitespace\" \ \"))))(Tile((id \ - 7c2df4aa-19e5-4677-bacd-5b7a724798a5)(label(true))(mold((out \ + 230c9d16-397a-415e-863d-3da8904b8bdf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a336b9e2-f9a1-416a-982f-96e525d7a097)(content(Whitespace\" \ + 23eee358-279b-4887-acd9-be029dc2a7d2)(content(Whitespace\" \ \")))))((Secondary((id \ - fa4494a5-f20c-4f3c-bdac-93367e9f675d)(content(Whitespace\" \ + 388b2fee-7809-4967-9e99-ad49f557a9f4)(content(Whitespace\" \ \"))))(Tile((id \ - becfa6ad-81a4-4043-b34f-f9cd6968bdd4)(label(1))(mold((out \ + ec0c9439-18fa-47c6-89f4-68e8bfd33cb3)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e636ba9d-f4f0-4b6a-a857-f72272703edd)(content(Whitespace\" \ + d15453c9-318b-447a-a077-6c85578cde91)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4907dc5-0d6b-4f19-876e-2a7d837d2526)(content(Whitespace\" \ + b3fd18c7-e008-4eea-8532-ac140f0fe666)(content(Whitespace\" \ \"))))(Tile((id \ - afea6b91-26f2-4c46-b1ea-15e893de8d44)(label(1.))(mold((out \ + b89d7d7f-95fe-42a5-8136-dbcfdaffe43b)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a4226d0f-0630-440b-b925-355c4323e26d)(label(\";\"))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Tile((id \ + adff873a-7d51-4403-aa11-d637d7c536b5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 01ff0dc7-27f6-4bb5-a4fa-018d7296f307)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 953c3984-84f7-4724-b92a-a9a829788351)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 38407f72-07a5-493b-af4a-23ddcba9b306)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 808ba58b-c96b-4222-996e-d20bc439b39d)(content(Whitespace\" \ - \"))))(Tile((id \ - 71431cc7-a1ba-42a6-9e18-048bf7ed09ca)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2b68db99-6d3c-4256-bc00-252ced2dd688)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a0235b54-2e45-4d56-b677-baf460eeb39d)(content(Whitespace\" \ - \"))))(Grout((id 30ecd689-7fdd-4a7e-b180-65fd090457c9)(shape \ - Convex))))))))(Tile((id \ - c57eb10b-f7b5-47af-8678-f6ea4067c6f7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3ddcb139-95a9-4888-ba0f-5442df48f9a7)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 692d2d7a-9aab-4a1e-8ea0-024c787bd0f2)(content(Whitespace\" \ + \"))))(Secondary((id \ + b2bb1ffd-3dbe-4c43-83ee-d0e2f9cbbdab)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ + 47be2cd3-b03b-45a8-b26f-f92060bc3004)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5d198806-3a30-42ac-95c0-1df2acdffadb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 82dc0544-9ae9-488a-a338-819aed1a7c66)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e695ba82-cf68-46ce-925e-31249261cd8c)(content(Whitespace\" \ + a1005730-3689-4276-af36-eed9216be5cb)(content(Whitespace\" \ + \"))))(Grout((id 700bdac9-76cf-4be6-98b1-c032587de447)(shape \ + Convex)))(Secondary((id \ + c5844890-0517-4035-9bf9-160b2dd905c6)(content(Whitespace\" \ + \")))))((Secondary((id \ + 4d4ba1e9-1383-4ca6-b828-421d145b1214)(content(Whitespace\" \ + \"))))(Tile((id bf7c57c8-0bc0-447a-86fd-455f1f8de839)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + e47fffd1-3404-4eec-8a0c-bb44253a8a3f)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 9dd9e624-583a-441c-8649-338da0a92678)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + a2b0087b-2c53-4d62-b2b3-e1222c73f72c)(content(Whitespace\" \ \"))))(Tile((id \ - 0486935e-9996-4670-9f7d-c454f07554a0)(label(true))(mold((out \ + db8f24f1-e424-4ecf-819a-384144315f5d)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 528c71f4-4aa9-4397-b56a-b3fa05d26e80)(content(Whitespace\" \ - \")))))((Secondary((id \ - fd2ee037-5c94-450e-9bb0-00783b2adda9)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 94ff5cbb-c5ba-4d24-8db0-06a3ac347599)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c0f8eeaf-068f-4d16-bb5d-b7453ed807a9)(content(Whitespace\" \ \"))))(Tile((id \ - fc17fe9b-be91-40f4-b6d8-334ae02cf696)(label(1))(mold((out \ + 1ce9a10c-7085-4b41-9ce1-c17cf835b689)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 28ac697b-72c1-4380-a4ac-77a6d620ce07)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 3f19f742-2f54-4c88-9157-76e4fde5317e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5d6063b7-7b37-4a0a-b94e-2d416668609e)(content(Whitespace\" \ + a9ca07b3-0f93-4e17-aae0-418f77d6cf01)(content(Whitespace\" \ + \"))))(Secondary((id \ + 029b56d4-87bc-422d-9b26-05af5d126a65)(content(Comment\"#err: \ + inconsistent#\"))))(Secondary((id \ + 09dd70d6-502d-48b2-846e-c5f8efd647fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 52f2c094-8b57-407b-80cb-925fe808963a)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + f57dce69-2cf4-4a2d-ad9d-7d40490ba01d)(content(Whitespace\" \ \"))))(Tile((id \ - 62e9e671-3419-4b81-ab5d-370a5a394aa9)(label(1.))(mold((out \ + 73fab713-03ee-4900-93aa-2c247ab1693b)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + f0653d97-c095-44b2-8384-aa7ce7488e3f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 47df5f2e-3a90-4ccf-b553-316fddb81a57)(content(Whitespace\" \ + \"))))(Tile((id fc2dc4d9-a9e5-45bd-a9d1-6507d203d663)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + 0b59e204-0333-401e-8afc-d6b4c63394c5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 055bba99-c1db-48af-9aa6-4ba45f916bd5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 034534be-8504-4e02-918d-d368e0fddce7)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 12c3e8d4-f091-46c0-9755-5635c4f2b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a331d7b3-e0e5-4503-8eda-98fb4017d7b8)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 93dd678e-5279-495a-aa88-2fa862389909)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 4597f735-731c-4066-9851-cd52d6542cee)(content(Whitespace\" \ + 2b1f1e0e-b99e-4c62-a294-ff9dcf4b5520)(content(Whitespace\" \ + \"))))(Tile((id \ + 1ea91616-8aec-412d-82f9-4e9351bbd291)(label(1.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + fbe8cbf8-4245-4ba8-a68a-b03eb53c3399)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 007fb3dc-eaa2-4910-b467-287968ed26d3)(content(Whitespace\" \ + \"))))(Tile((id \ + e77e5eff-3894-43f6-96e4-13961e664183)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + d4ed2f71-1740-4928-81d2-b0c0151b5a7d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 1943c974-3ce2-4578-940a-728197ec1ec3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 48c7f1ad-35cc-4f97-95e7-c68ffe8023f7)(content(Comment\"#err: \ + inconsistent#\"))))(Secondary((id \ + 0f0be7c3-2c77-4e05-aba3-ae8405f61d16)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 03a920d7-95a2-4754-8416-1123bd6f2f11)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 826ad200-168b-4a5f-af94-df033e42e4b7)(content(Whitespace\" \ \"))))(Tile((id \ - 87294766-b061-4b33-84e7-b820bc4fb3cf)(label(_))(mold((out \ + ca9ddb7f-5f91-4956-ba30-44aa1648f245)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 394ec58a-fb30-407f-b376-432f454bc179)(label(:))(mold((out \ + 6dc24ff9-bf61-4a92-8f2f-b7c3f67217c2)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 41c4021b-e111-4501-8940-762c147bfc82)(content(Whitespace\" \ - \"))))(Grout((id c347ce4a-b918-4de4-8400-cf7174b04eec)(shape \ + 1499fbd3-ca66-47ba-8411-7500ca3fe394)(content(Whitespace\" \ + \"))))(Grout((id e6ddec97-cd3c-422a-b214-ca8fd61c2331)(shape \ Convex)))(Secondary((id \ - 092d4568-73e7-4dab-aeb2-a96ba06aad7c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 89f8d64f-4dca-452f-a5e5-405b0dd06197)(content(Whitespace\" \ - \"))))(Grout((id 3fcdc9aa-d3ea-48dc-aa4e-50d47fe5def0)(shape \ - Convex))))))))(Tile((id \ - 0affb0e4-3f8f-4a78-b155-9cf118ca8eb7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bffb5f4a-a206-4568-b182-a633e4b7d67e)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 7da6ae55-bd62-4139-8b5c-b3467b28d15e)(content(Whitespace\" \ - \"))))(Tile((id \ - a38e5299-1158-4600-a4db-05d26b529068)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 56db0b7d-70ce-482f-8bdd-f261e4bb033a)(content(Whitespace\" \ + 8d2a046f-1546-4749-858d-626905d77eff)(content(Whitespace\" \ \")))))((Secondary((id \ - 366cc558-76f6-4454-ac7d-a42dd3da2584)(content(Whitespace\" \ - \"))))(Tile((id \ - 9d875eaf-40a4-4826-95ea-ba72c0cd2c81)(label(1))(mold((out \ + ae4808bb-0f13-4a47-8d93-7dc155ad32bb)(content(Whitespace\" \ + \"))))(Tile((id 32ae3fb5-4544-4cd4-a792-f9256875488c)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + ff441609-be5e-4d1b-b544-9799d7a3011b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5d888c4a-19d5-4e34-9401-04e577bc1c48)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 85c80d5f-538f-40d0-b5d6-e235a7f5141f)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + b6463e8d-e7b5-4545-9fc7-4924aa2693a6)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + cd358f94-2daf-4f24-8548-3d5bce3213c0)(content(Whitespace\" \ \"))))(Tile((id \ - 74612f3f-3d30-472f-86a4-fbc1857c058a)(label(1.))(mold((out \ + c5e0a263-a161-49ed-91c8-598982eab8ce)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 470469dc-d8c3-469b-9c18-3d8e008b193b)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 1f911b96-1c72-4e92-92a6-7f2d5a352c90)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d1dc00cb-ccae-41d1-bddb-107de0e308be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c61507f-9013-45f0-aa48-1a3d015573cd)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84bef4da-1203-478f-85ca-9ee88c6f3beb)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 6a9d6562-d5e6-4b2b-a031-11739b0c2c3e)(content(Whitespace\" \ + 5b6d3a14-25dc-405b-8f4a-c0577ded0d7c)(content(Whitespace\" \ \"))))(Tile((id \ - 33442197-55d4-4dbd-9138-5e50ff98d573)(label(_))(mold((out \ + 433e239a-9d57-4e8d-88d4-3d051553fc95)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + b8f71dee-301b-4173-8fd6-f5daf5c8c00d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 534a6cef-6e24-4f16-a7ba-2edbd118aab9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0051a088-619a-4934-8f53-0219031c1bb2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3df4acfd-98e9-4fce-9853-95fb92574871)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 1cfe8911-f9b5-4422-95bb-443dae0d0105)(content(Whitespace\" \ + \"))))(Tile((id \ + 25d47a4e-06ae-48dc-99d6-32a41983492b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8cb1eae4-c597-4b00-a2eb-5b57a125a194)(label(:))(mold((out \ + 3959b315-bd21-4c0d-8385-3dc34326cdb5)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6465c91e-5f51-4910-918f-9d204e1bcbd3)(content(Whitespace\" \ - \"))))(Tile((id \ - 55757bfd-ff22-42bb-9cd6-5608f5f015ff)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f99eed79-6ba7-4182-ac8a-299afd43bbe9)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 420ac88a-4caa-46b4-9d0a-0bb5b1b14db6)(content(Whitespace\" \ - \"))))(Grout((id bc42c4d1-dd82-433f-b065-ac7de6dde15b)(shape \ - Convex))))))))(Tile((id \ - d9dfdd76-ecde-417a-ba68-8cfb016ab80f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ea8ee01c-941d-4c66-a647-7918eefbb221)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - eb92a4a6-8137-46ff-8763-0f1c1cce4e0f)(content(Whitespace\" \ - \"))))(Tile((id \ - 3d6f8955-5d58-4093-9901-4cb799e4da68)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c39d9d8-1353-4c82-95aa-cfd3c710d2ef)(content(Whitespace\" \ + 41cd46f9-c78b-483e-bc9d-5ba5248ce0c8)(content(Whitespace\" \ + \"))))(Tile((id 33511225-301f-493f-9ac5-0c48a3b2301e)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Grout((id \ + a7219f30-6814-4af1-9fb1-560e9131e0d9)(shape \ + Convex))))))))(Secondary((id \ + 09487b14-597f-48f5-bf3a-5f01ce9e2bed)(content(Whitespace\" \ \")))))((Secondary((id \ - dbd5746c-73d2-4bfd-b1d4-9bb4ddee1844)(content(Whitespace\" \ - \"))))(Tile((id \ - c3b3c0c4-46c1-4190-9173-0ba09eb387a3)(label(1))(mold((out \ + 5370e5d1-290d-4e66-9ba7-4c03e6723ff9)(content(Whitespace\" \ + \"))))(Tile((id 6b62996f-8ade-4ed9-817a-6b538a6918eb)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + 9a080685-90e3-41d1-8f92-e7d253dc7245)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e8ee62da-8d62-4ef9-97b9-159f1b4a212a)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 50dac4a7-2903-4ad4-a0ba-647854776727)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 369a1435-3a95-444a-9322-4055172d6863)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + d6a5c2d1-aed3-4c53-a454-2d3922735b2f)(content(Whitespace\" \ \"))))(Tile((id \ - 6c624d4a-3555-428a-954b-a312f3029cab)(label(1.))(mold((out \ + d58190ee-5471-4175-8fef-aceb5596ec09)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a73dcc1e-7ade-4348-a466-c52a96e93884)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + d8eac610-d479-4c9e-9577-cb9989ee9e8c)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9f00a5ef-4f7a-40d8-befd-c7c0d3c8a9ea)(content(Whitespace\" \ - \"))))(Secondary((id \ - e8ad89fd-898f-4e2b-a3eb-f1220739d5ee)(content(Comment \ - #err#))))(Secondary((id \ - 0d081213-9d46-42ee-b251-c3833afa9268)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d38dbc1a-10d5-43bf-9b21-c0fb792ff103)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 35f80ac8-05d2-47c0-96b0-fe39ffa828ba)(label(let = \ + 03e22831-29ab-4096-8d75-455d5c164e84)(content(Whitespace\" \ + \"))))(Tile((id \ + 782f78ca-f815-4a62-a570-fcaf036f954d)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 2797e94b-90e6-4c45-8cb7-e069a6e5c16b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 72fe75f0-3e31-4113-8f25-fce1dfafcf1e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fc4a0da5-2b7f-467b-9d51-c79d28bbd2ce)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3ff96410-6cde-468e-b92e-60c5dbcdbb1a)(content(Whitespace\" \ + 663ff7ee-c38f-43fe-9615-7c4489dfa541)(content(Whitespace\" \ \"))))(Tile((id \ - cd0d9dc1-2890-40ad-bb56-9bff2cd214d9)(label(_))(mold((out \ + 66a49fc3-2189-451d-8f5b-87a4e7a4a1fd)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 09519fa6-8a8d-49a7-b97b-9446691ac068)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 4ede6a03-d0d7-4332-8382-c88b3e0c2d11)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2bf08639-ade9-4636-bb33-b789e670937e)(content(Whitespace\" \ + \"))))(Tile((id 971f3ba1-d70d-47d7-a9a1-dc52bc83fd36)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 5632be0d-1afc-4c45-9fba-7b815246c884)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + e016ef9f-b73f-4ca5-87c0-6e1b9d52fb73)(content(Whitespace\" \ \")))))((Secondary((id \ - 7d48115d-4ed4-49d3-9026-f7ad7b3258dc)(content(Whitespace\" \ - \"))))(Tile((id \ - 8438b733-c653-40e7-bbff-5d4b99a40808)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 103b9289-b28a-4c91-b38b-16ddba0518b5)(content(Whitespace\" \ - \"))))(Tile((id \ - 673dd059-8cdc-4b7e-a624-2f4006e16b66)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4d32ab0e-aa4c-4440-a471-858d48f0649e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 76eb013f-ee4d-4f01-958d-945f5cdc1b0a)(content(Whitespace\" \ - \"))))(Tile((id \ - f2867227-a84e-48c0-aefd-0a6d27dffd3f)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 536f6d84-2485-4700-856a-629a00f30c51)(content(Whitespace\" \ - \"))))(Tile((id \ - fb05cdc7-856b-413c-9130-26a7b33fb7a6)(label(true))(mold((out \ + 40558f24-ca8d-4dda-a0b3-13a39b1927f3)(content(Whitespace\" \ + \"))))(Tile((id a949b592-988a-46d0-ac9f-176609db6dde)(label([ \ + ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + 06fa3969-d9ca-442b-825e-dc407e6f6723)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d3cb1bb1-3557-4483-b9ef-8df266b162c2)(content(Whitespace\" \ - \")))))((Secondary((id \ - 277e68f0-754d-4e80-8a7b-d56b9b9aa9f4)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2bb73b05-ca08-4c0a-a04c-dadb433de26a)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 0f424bab-a2f3-4fe0-8a09-8f2cd90c3a07)(content(Whitespace\" \ \"))))(Tile((id \ - a9256755-3fd2-4341-8307-7806781ac7ac)(label(1))(mold((out \ + 5a87620b-a433-4fb9-9d1a-09c9b3beab6a)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dce7ceae-84ee-4d61-8c22-b695f164af14)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - fb80563f-83de-49db-8e2a-a9211d8c0b0a)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 512129f6-6a3c-49fa-bf77-83e9e10f4705)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 3ce93584-77cc-4b97-a406-c4462d511dcf)(content(Whitespace\" \ \"))))(Tile((id \ - ce8523a7-3bf0-46ed-9e10-c06b9cbb72a7)(label(1.))(mold((out \ + 37022cb4-317b-4348-a086-5283db30d7b9)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ff99f97c-f2ff-400a-bfc8-0c9a6bcff924)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 67645fa7-6a97-4584-8064-fa31c7466741)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 695a14e2-4ca6-46fd-99eb-862ef7629ffe)(content(Whitespace\" \ + a8ae0eb5-666a-43ff-a24c-b8f82ebd4e9c)(content(Whitespace\" \ \"))))(Secondary((id \ - 592c2ffd-79a2-45c3-bc3d-283cb6aa7a76)(content(Comment \ - #err#))))(Secondary((id \ - bcb2d205-cf7c-43ef-acc3-978957fecbe9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25ed166a-87e0-4172-818b-2b62a8bda24c)(label(let = \ + c1852265-6f47-40cd-83ef-8fe57cae7e70)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ + ce5d18a4-9cc3-4438-a7f3-431f8d3a2461)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dac99d0f-a7ce-4629-9f71-f49bd6a718c6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 440becc1-96de-4739-b860-ca47255d3d93)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9868c377-1e5e-4a84-a575-cc38ab948866)(content(Whitespace\" \ + d4ab6143-0bfc-4c9e-9bfb-b9ee50bd5289)(content(Whitespace\" \ \"))))(Tile((id \ - 4918c91e-8e50-4735-883b-a356720ea9d2)(label(_))(mold((out \ + 620340ff-4a97-4b5f-b39b-76f560bf58db)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a52427c4-8fad-4952-9ce2-071dbbab89d9)(label(:))(mold((out \ + e7ff297f-b0a7-4c0d-9772-47acfe9a6d9c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8fe334cd-5fa8-4d94-84d3-34385126ca98)(content(Whitespace\" \ - \"))))(Grout((id 653091cf-f907-4593-90a5-0f8c07a68006)(shape \ - Convex)))(Secondary((id \ - 991a094b-7379-4445-a8ee-87b39301f44b)(content(Whitespace\" \ + 6f00d686-a3ff-4431-b4c2-b70d3b4eca14)(content(Whitespace\" \ + \"))))(Tile((id 00df244e-2507-40cf-a767-3a29432ad8fe)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 130f2a32-39da-49cf-a550-754622dc404a)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 1eab60a0-5c07-4a92-82db-5971b1db666a)(content(Whitespace\" \ \")))))((Secondary((id \ - c7ba46b9-2795-4e23-9257-c980fa33f40a)(content(Whitespace\" \ - \"))))(Tile((id \ - 4839dfee-a097-40eb-b968-4762751a00cf)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - fb185c7a-882a-4d4d-a696-b835827a067e)(content(Whitespace\" \ + f10579e0-e416-410d-8ae3-12925c91671a)(content(Whitespace\" \ \"))))(Tile((id \ - 3386719d-5ae9-466e-bcbb-76c10b1a7cd9)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cf81b859-0f34-44cb-84c4-ee0a294618b3)(content(Whitespace\" \ + 16944a0f-57f1-4e24-a573-1d9231d16e57)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 317f017d-a9c9-467d-8cb9-e56c0495a060)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 6aa18463-de32-445c-8338-c11780d4d4d0)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4a870256-b389-4bbb-95bd-47834fae994b)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 369ea7b7-0d09-42c6-8b54-6cb084d8270f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f0a26556-e334-473c-8cf8-c57092e4f36a)(content(Whitespace\" \ - \"))))(Tile((id \ - d5d5e598-a807-4bf5-bfec-fe007c7b3a22)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 5c3c92c6-a066-49fb-ba63-589c5b309625)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6dbcf6a1-4176-46e9-802a-b16c71d040ab)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c8e619cc-2d91-4991-85d5-546da420b09d)(content(Whitespace\" \ + 9ef098ad-fe36-44f2-9487-6d9ff6656d48)(content(Whitespace\" \ \"))))(Tile((id \ - 3a199739-00ab-427d-868a-d401e27d83fe)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ac76f6fa-c89a-483b-bf41-4593f9f1b21f)(content(Whitespace\" \ + 1d8fcf7b-fa79-4de7-a9f4-55fff3ada3bc)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + cca7629b-c4d5-4045-a00e-197b16dffc60)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7eaffe3b-5b20-4937-a693-400f5a3d7987)(content(Whitespace\" \ + \"))))(Tile((id d1ce8a09-d6e6-443e-8fb6-77904043ba41)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + f2827f6e-aef6-40eb-9e99-959cbeb8f626)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + a5a96d03-071f-4595-bb82-1f287d604bb3)(content(Whitespace\" \ \")))))((Secondary((id \ - be7ef864-67a0-4fe0-9bf6-4f882754dc82)(content(Whitespace\" \ + aa9f6dd4-afc8-432f-9060-c140c31c2b5b)(content(Whitespace\" \ \"))))(Tile((id \ - dfa24cb1-5893-41e9-a062-bd4ec11e605e)(label(1))(mold((out \ + 9c1620d9-ae11-41e1-ad5e-663b10aa1c56)(label(1.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 50514c7a-0b13-4c44-80d5-a3357fcc0012)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 490e8e38-b288-4122-bc9f-ec6882b9ff61)(content(Whitespace\" \ - \"))))(Tile((id \ - af9ae9a8-74b0-4d58-8107-7dba40c5e153)(label(1.))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4c545fe6-4860-489f-aaed-de76ee3722c2)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 90f05b86-6ed6-4da8-a1da-5bc842610088)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 357ac56b-6008-46c3-823c-f71e965f9072)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d8cbf47c-8aa1-4f01-b414-892b1512aa51)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + ef444fb8-d541-400d-9576-a500ff7bea51)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0083e628-0325-46bf-a55f-b2d9673a1778)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c7603d2-1f45-46e9-9fc4-477dc7140cca)(label(let = \ + 125ff66a-6b89-4566-98fd-2a802fd970b5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5939a641-eb88-4f4f-a322-69b1571271b5)(content(Comment \ + #err#))))(Secondary((id \ + 7baecabf-72e3-4455-9cfb-16777b0057ac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bd06e95c-6b0f-4708-b642-e09aec6b32ef)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 37df505f-e3b7-483b-85e1-99d1a420a9b6)(content(Whitespace\" \ + bff70791-8893-4e8b-9f92-e0ac69a6e939)(content(Whitespace\" \ \"))))(Tile((id \ - 35390017-9451-4508-a83b-7524bad86fc4)(label(_))(mold((out \ + 34216c66-e05e-4f03-91a9-61f892a850f8)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a3206d48-65ee-4b0e-b65c-addfe0e9c62e)(label(:))(mold((out \ + f7733b0c-dd77-44b7-b56e-d0c1a6636b6c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b7ecddd6-8846-4963-a461-1f0b9bd84979)(content(Whitespace\" \ - \"))))(Grout((id 4da9fa71-62ee-4931-bcd1-1a33bb41840d)(shape \ - Convex)))(Secondary((id \ - b3f4fb40-e05d-466c-ab85-39d6e23e0767)(content(Whitespace\" \ - \"))))(Tile((id \ - def384f8-b29b-4dfb-a36d-85a809641dbc)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 3bf09644-328a-4419-8c85-f02f99efb9d2)(content(Whitespace\" \ - \"))))(Grout((id a95b9978-19ec-48f9-ba13-6d458ca30443)(shape \ - Convex)))(Secondary((id \ - ec61c941-3afd-4226-8ffc-fc1b54122412)(content(Whitespace\" \ + 8f04892c-18d2-404b-9894-3e9aecc981e2)(content(Whitespace\" \ + \"))))(Tile((id b48afdf7-f131-4d9f-b829-0bb01434f348)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 2546b193-bb89-4e2c-a1e1-c0c3aa775d8a)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 925587ff-8973-457c-853a-0f6c71cd9c4a)(content(Whitespace\" \ \")))))((Secondary((id \ - b5fd0857-94d1-45a2-8ac0-41c72af48c00)(content(Whitespace\" \ - \"))))(Tile((id \ - a3677a6f-6aa9-44e8-a44e-f4643498eec4)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 17fcc7ed-aa0e-493b-97a8-aa78cf51b2fe)(content(Whitespace\" \ - \"))))(Tile((id \ - a25707f6-8e51-420a-aa12-05df1b5b9152)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d22d1ad5-68bc-4ff3-ab87-1eadd3a003ec)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 90fdd949-668d-4977-a390-869262719fab)(content(Whitespace\" \ - \"))))(Tile((id \ - 0557157c-33b3-43b4-a046-c7b881d19216)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 755a7811-722a-41f6-9b56-80cdfda1b034)(content(Whitespace\" \ + 5ca988e2-330d-4e80-91b9-e9031eba4cef)(content(Whitespace\" \ \"))))(Tile((id \ - 7b63343b-a942-4302-9ce3-56ef30b62d39)(label(true))(mold((out \ + ed424387-c3f5-4d4e-a276-ae526e114f39)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffbc6847-3a7e-4b9e-9514-92e5d8b3e277)(content(Whitespace\" \ - \")))))((Secondary((id \ - bc4fee4b-bfc4-4d8d-a21c-32ddd20d4115)(content(Whitespace\" \ - \"))))(Tile((id \ - 61ef3fd6-dc5e-4173-a46c-21a4e9e903b7)(label(1))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 41bdc089-5d46-461e-91f0-3c4d5c8c975c)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 75eaeaea-6d82-4f4f-8ff2-c3d0163c6017)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4516c234-075e-4464-965c-666a0de1e8cd)(label(2.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1a42a366-5df3-4b08-b9b8-ddc50e9fa073)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + cb0e4361-9db0-45cf-9b66-9f1812a87332)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d36add28-c6d6-4d4a-ae6b-3b53f65a813c)(content(Whitespace\" \ - \"))))(Tile((id \ - e6fb11d1-572b-4992-bb6f-c3ce42c31a5b)(label(1.))(mold((out \ + 1be9f5d9-ceb5-4b89-811d-6975be2757f4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8cd1685f-b46f-4d3e-81e3-632df69a6af7)(content(Comment \ + #err#))))(Secondary((id \ + 0193a545-1ce2-4a17-94b8-be94999b8a06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5361ea7-4e12-48c1-8444-5e38cbb19a59)(label(\"\\\"BYE\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a1564a6d-ddcd-4382-b57e-1852880686af)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 4c9de5ed-d3f5-40ab-957a-ab2b7ebacf82)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e9a91bdd-1b8a-4628-805f-0a21e5b22197)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ + Outer))"; + backup_text = + "# Internal Regression Tests: Type errors #\n\ + # Each line should show errors or not as indicated #\n\n\ + let _ = unbound in #err#\n\ + let Undefined = Undefined in # 2x err# \n\ + let true = 2 in #err# \n\n\ + let = if true then 1 else 1. in #err# \n\ + let _ = if true then 1 else 1. in #err#\n\ + let _: = if true then 1 else 1. in\n\ + let _: Int = if true then 1 else 1. in #err#\n\ + let _: Fake = if true then 1 else true in #err#\n\ + let _, _ = if true then 1 else 1. in #2x err#\n\ + let _, _ = (if true then 1 else 1.), in #err#\n\ + let _: , _ = (if true then 1 else 1.), in \n\ + let [_] = [(if true then 1 else 1.)] in \n\ + let [_] = (if true then 1 else 1.) in #2x err# \n\n\ + ( )(if true then 1 else 1.);\n\ + 1(if true then 1 else 1.); #err#\n\ + (1)(if true then 1 else 1.); #err#\n\ + (fun -> )(if true then 1 else 1.);\n\ + (fun _ -> )(if true then 1 else 1.);\n\ + (fun _: -> )(if true then 1 else 1.);\n\ + (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ + let _ = fun x -> if true then 1 else 1. in #err#\n\ + let _: = fun x -> if true then 1 else 1. in\n\ + let _: -> = fun x -> if true then 1 else 1. in\n\ + let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ + let _: -> [ ] = fun x -> if true then 1 else 1. in #2x err#\n\n\ + ( )::[(if true then 1 else 1.)];\n\ + 1::[(if true then 1 else 1.)]; #err#\n\ + (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ + let = [1, 1., true] in #err: inconsistent#\n\ + let _ = [1, 1., true] in #err: inconsistent#\n\ + let _: = [1, 1., true] in \n\ + let _: [ ] = [1, 1., true] in\n\ + let _: [Int] = [1, 1., true] in #2x err#\n\n\ + let _: [Int] = 1::[2] in\n\ + let _: [Int] = 1.0::[2] in #err#\n\ + let _: [Int] = 1::[2.0] in #err#\n\ + \"BYE\""; + } ); + ( "ADT Dynamics", + { + zipper = + "((selection((focus Left)(content())(mode \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ + 1f7bcab0-da00-4299-b43a-3ca1ef8ca2f5)(content(Comment\"# \ + Lambda Calculus via evaluation by substitution \ + #\"))))(Secondary((id \ + a927feba-9938-45cc-88da-4ca88fbace46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 59554d6d-5be9-43cb-a4d6-1edf55e3c098)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 41573bf5-78b0-4f95-b6e2-3c4ce9dbd6d5)(content(Comment\"# An \ + Expression is a variable, function, or application \ + #\"))))(Secondary((id \ + 5e7af976-9c1e-4841-847a-70c966af0583)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a76c3b61-221f-4e94-b8fd-5b45183df229)(label(type = \ + in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2d6fed2a-48c6-4b44-b0c2-ab7d7f51af72)(content(Whitespace\" \ + 40bbb356-6987-428c-a8ed-2a6b99066f39)(content(Whitespace\" \ \"))))(Tile((id \ - b2cdc1f9-3351-483c-9638-f771257810d1)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8e161d9b-fe98-4adb-846d-3183117c15fc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - d7e9e9af-16d9-4be7-b772-47fe800aa248)(content(Whitespace\" \ - \"))))(Grout((id cf9694be-3b9f-4fd3-ad55-858faa4e5f02)(shape \ - Convex)))(Secondary((id \ - de591d6c-a4d8-4591-9c3d-016e28ab0985)(content(Whitespace\" \ + 5b4a5ae1-4e37-4f29-abcf-0ce0108de2c0)(label(Exp))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 1cc38bcf-e0a0-416f-8cc3-1655722f05a4)(content(Whitespace\" \ + \")))))((Secondary((id \ + 09d316ec-a283-4c84-a902-cdb1b0d8fcc7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5c00fca1-9f11-4ed9-bb7b-507bdcb1fae8)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ + 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f097f93b-c8d3-423f-8301-953e7fa560a6)(content(Whitespace\" \ \"))))(Tile((id \ - 57226fd7-6fe7-4284-a58e-3e828da4c10b)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + f02ccc58-351d-499c-87ed-687857f5aafa)(label(Var))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 8096ab83-dd0c-47c0-bb76-b0e811b0c1bf)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + a375c863-da66-4010-a25f-778944a6db48)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 8ee1d2e1-06c2-441c-8fc4-138532d469d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc72ff0d-8a9d-4ee4-ae45-b2c94f67eca9)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 10))(sort \ + Typ))((shape(Concave 10))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0d276a95-1daa-457d-ab45-dd7874086238)(content(Whitespace\" \ + c7ed4279-1d9d-44bf-af67-23ca84632b04)(content(Whitespace\" \ \"))))(Tile((id \ - 2c187a0a-a6d7-4dbd-bf2f-1254faf967c8)(label(Int))(mold((out \ + e2c11b78-0c54-448e-9cca-e4c8bfc8bbb2)(label(Lam))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c5305727-7034-47c4-9b13-76e2ac8b158f)(content(Whitespace\" \ - \")))))((Secondary((id \ - 66945bb7-c5c7-4a6a-bb95-9ab4a4096aca)(content(Whitespace\" \ - \"))))(Tile((id \ - dcf922aa-beb1-4e2b-8b31-79696c1ba35e)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - b86c3ae2-f820-4b20-8f4d-c8cd2d034d4c)(content(Whitespace\" \ - \"))))(Tile((id \ - 78164bbb-a765-4907-a883-0b43f38c8f40)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7c476086-ecce-47b4-b7e0-6eda1e7f99ce)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - bc736e1b-63f4-4e30-b612-8cce38bb2f4f)(content(Whitespace\" \ - \"))))(Tile((id \ - 774faf15-02ca-49db-aa2c-ed9951c7e422)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - dec59fd4-6edc-4055-a1e8-db02398bd11e)(content(Whitespace\" \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 4d2df657-924d-4f14-9eec-0ecd7f5c21c9)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + a64e19fe-5bc6-4139-8b40-96e3583fa4fc)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + f3daa7e8-f243-4222-8ee4-ddc0f9155c46)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 447e6442-bdde-46f7-8882-6bb1f68d67d7)(content(Whitespace\" \ \"))))(Tile((id \ - 66dc2eb8-49b8-4770-a380-03ecb1c39654)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a6da3ecb-cbbf-4467-b699-f33c2e198794)(content(Whitespace\" \ - \")))))((Secondary((id \ - 97c06b6c-f2fc-4f85-8233-e1e24f55f183)(content(Whitespace\" \ + 15875387-e3ed-4473-9c6a-453a68e8b117)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 0f46618b-71ec-4bf5-88ca-75d3bf0a549e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cd1bd397-be90-494c-9ea6-17847e56b805)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 10))(sort \ + Typ))((shape(Concave 10))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 04185bae-3d12-4049-affc-da427e740d6b)(content(Whitespace\" \ \"))))(Tile((id \ - 49f69120-67f3-4f12-8473-25854331d0a7)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e7adea10-9083-4988-afcf-d748d5c83dc0)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - c4bf9155-bdf3-4583-810d-7fbc5963d1a4)(content(Whitespace\" \ + 559ea70c-729f-4295-a48a-c27dd9fad885)(label(Ap))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 2e0537e7-5ee1-499d-9edf-c2eae0b53264)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 2bbfcd7d-a9a0-41f5-9f2b-65e6f4f0fc50)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 40bda1cf-399a-4368-9a93-1b34120aafac)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4f27a6c1-9f31-4f48-9f67-81fb4bdb8815)(content(Whitespace\" \ \"))))(Tile((id \ - 736d66cf-946f-4560-89b4-3fc126888dc1)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4492e518-d63e-4b85-91c2-26cb60446eb3)(content(Whitespace\" \ + f9b126eb-6ecb-42a4-9b11-255fcea67577)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 297a96d2-948f-4fdd-9884-8e547ed933a8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1e2692c3-306c-409d-b336-cef082edcd8c)(content(Whitespace\" \ - \"))))(Secondary((id \ - ae09d83c-ae42-4b0e-8765-8aee441f0616)(content(Comment \ - #err#))))(Secondary((id \ - 03b03c43-459d-491b-ad03-a72757614270)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 092b9051-f708-4479-9166-d6161e6b254f)(label(let = \ + 60f3914c-75d8-45b9-91c8-408f8d99eded)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0a6f99c3-1727-45b2-a08f-1194554cea5f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dfed049c-1560-40ad-adef-7de21ec01615)(content(Comment\"# \ + Syntatic Equality of Expressions #\"))))(Secondary((id \ + 02c2cda8-cd30-4c87-8633-79f6279f2923)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d1c59a7b-15de-49ae-aaf5-056c65738d18)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd68afd2-4abd-43b7-b370-539fc05fc7f5)(content(Whitespace\" \ + 321c3b7f-71b6-433f-8ba5-3a176f503ee2)(content(Whitespace\" \ \"))))(Tile((id \ - b4ed8e27-adb1-4436-b2d2-fe1faf8d36f1)(label(_))(mold((out \ + 20a41284-a854-463e-8f08-880a85b83d3c)(label(exp_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c21f3089-a8fa-414a-b6f4-d07fc101fccc)(label(:))(mold((out \ + 78495729-2b1d-4e8e-8f1d-c9d28f6a7a60)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 583749a3-eba6-4e91-9cfe-36ff52355aca)(content(Whitespace\" \ - \"))))(Grout((id 4e5cdbcf-6fc5-48e0-abf0-2fc5054d3574)(shape \ - Convex)))(Secondary((id \ - 5a84df8d-23ef-4dac-8388-201f94248eb4)(content(Whitespace\" \ + dbee2db7-3f10-4979-9024-bc34f7453770)(content(Whitespace\" \ \"))))(Tile((id \ - edb29728-1267-4abc-9081-195f6663856f)(label(->))(mold((out \ + 72d5e73e-ff5a-4bbc-9d1d-7e6e1581e413)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + cf35fc7b-7318-4d81-8163-b650fd7de4f0)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 3907ffc4-af80-403a-839d-82b1232395f2)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d7aca28b-65fd-473a-9fb6-65ea96ef78d6)(content(Whitespace\" \ + \"))))(Tile((id \ + 22f01e9c-afbb-4e08-8acc-d315f402817b)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 4ab91533-0de3-4d84-b8b2-7fbe33be34a4)(content(Whitespace\" \ + \"))))(Tile((id \ + c59e6b78-fc5b-47bb-b830-9d4fe67c0b13)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a308706-b82c-4215-a4bd-c8cf8fbd1a8d)(content(Whitespace\" \ - \"))))(Tile((id 6bfd0ba4-08a4-4f77-8b64-126378c1907e)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Grout((id \ - e89b84de-7ab4-46de-a7d5-94abf6588ec0)(shape \ - Convex))))))))(Secondary((id \ - f7dde1a7-74ac-4b68-bf6a-812a666fd963)(content(Whitespace\" \ - \")))))((Secondary((id \ - 4ee83851-34f6-4867-a055-ca51562dfb48)(content(Whitespace\" \ + 7b30dd6b-c498-4637-ae4a-f6afea955a90)(content(Whitespace\" \ \"))))(Tile((id \ - bba577e3-68f9-4353-ae2d-e24914773aa9)(label(fun \ + d000d521-0821-47e0-b655-52db20eb828a)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + af54a209-ee0b-4c7b-961a-d2565352172e)(content(Whitespace\" \ + \")))))((Secondary((id \ + 5668d661-45f0-4cfc-bfb1-264fca05b8d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2b529252-636b-410b-8ff5-c917ee8e8b64)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 342ca27b-4acf-4a91-aef6-2426ae0200a6)(content(Whitespace\" \ + 64120593-aefa-4317-bd9d-7901b0b718dc)(content(Whitespace\" \ \"))))(Tile((id \ - 6271d837-e1af-407a-8f42-902f46019fdb)(label(x))(mold((out \ + 24182c8a-50a3-4da8-be1b-25521534c38f)(label(es))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3857a916-2ca2-4b91-9ce3-08bdcea49694)(content(Whitespace\" \ + db377abb-9d27-4f80-aaee-29019fe3fbee)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 830c1a4e-d2eb-4d27-b5af-9edfe71db503)(content(Whitespace\" \ - \"))))(Tile((id \ - 5c18044e-489b-458e-ab15-649911a03030)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 389ce73f-f26f-4be2-a221-dc4713f67f29)(content(Whitespace\" \ + b6e75de0-9f67-4707-b9c0-c1728ae46b3b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 42e957de-23fb-4f1d-b783-5e0467dae1bb)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 41b2af43-6a43-4d11-a81e-d9d17f4bbfd9)(content(Whitespace\" \ \"))))(Tile((id \ - 1c4d1edf-c38e-4a8b-a654-eda7ac54fbfc)(label(true))(mold((out \ + f8796638-2f86-4f8a-b536-31faba9bb8ac)(label(es))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5e8c1968-ee4f-426a-a161-a578efb13975)(content(Whitespace\" \ - \")))))((Secondary((id \ - 802b0b26-b087-4fc5-b422-fd7727778899)(content(Whitespace\" \ + 31770179-3d0d-4744-81af-ca2b9883eab1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2c2de1f3-9f64-4731-b40b-2ae4c85c9487)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + e616366b-7709-4c52-9c3e-b4b841ec4de0)(content(Whitespace\" \ \"))))(Tile((id \ - db1691b5-be53-42ea-a42b-48615ce08542)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3815c49c-0867-467f-9881-1ebb7e272bbc)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 90d59c52-5f6a-4dd5-a008-08a674362dd2)(content(Whitespace\" \ + 26d3098a-59f8-4a5c-8b5c-e0fa8621fcbd)(label(Var))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + ef5324c2-ee25-4eeb-a37b-cfc90fcd42e0)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 15ec3550-c2c7-4ea0-97c4-367815d9b5b7)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + cf5cc86d-6091-4092-99b1-2fe5cf19e552)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 583b25e8-f45f-40d9-b4c5-cb84f2061a99)(content(Whitespace\" \ \"))))(Tile((id \ - 77a1c18c-e388-464c-8a96-99d509f09a60)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c4b13785-8b02-4432-98b3-734f7f00dee5)(content(Whitespace\" \ + ec7b427c-4313-43f3-bf80-c847e66f65b6)(label(Var))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 257f3750-3762-4685-b1a6-6a6fa861007a)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 8006ee75-37d1-4341-8dcf-5a7bcb32460e)(label(y))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + d57b3841-3010-4604-b2fc-c1f1d0aef0e8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4f76c84-7f32-4d47-b5f1-81bf03e05f9d)(content(Whitespace\" \ - \"))))(Secondary((id \ - f791a637-6547-4952-b2af-2df75636a400)(content(Comment\"#2x \ - err#\"))))(Secondary((id \ - b280e9ea-b425-4fed-a57a-3299273288d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 12f499da-76c3-4ae2-93d0-5ca9e69753b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 232006c7-a8ef-48b8-9a78-3cf60d23ceaf)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - c4738729-fba4-45b6-8020-a79d3a26c31f)(shape \ - Convex))))))))(Tile((id \ - cffc0f76-df2f-4dae-a3ce-3d509789faf9)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - f6e93383-434a-48e3-a0b9-9186037e3047)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a9cda473-0dbe-410f-b9ad-521eb61cf321)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cb5da907-a7ee-4650-9c61-27b4e3d65121)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - b6fc370c-918a-434d-b3b6-cdd8eabff95e)(content(Whitespace\" \ + 65d17c9e-a107-4192-9068-c0b205c0069a)(content(Whitespace\" \ \"))))(Tile((id \ - ed44da3d-79ac-4881-98a4-e782ba366300)(label(true))(mold((out \ + 7be050aa-cbc5-42cb-8922-53e6e6b12824)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fba985da-7e06-4f50-a970-38d7c6ae21a7)(content(Whitespace\" \ - \")))))((Secondary((id \ - 651eb65f-6715-43ac-812c-f1f48bd31f4f)(content(Whitespace\" \ + 318d3c65-2497-491f-96f7-cfe6394a8b79)(content(Whitespace\" \ \"))))(Tile((id \ - 5866ac7e-9854-4845-86a3-02fb42bb4d6e)(label(1))(mold((out \ + 853da4a6-5aed-44d8-ab43-75333dd82023)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 8))(sort \ + Exp))((shape(Concave 8))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + cea85df5-b3bd-4017-a952-d64ad8459841)(content(Whitespace\" \ + \"))))(Tile((id \ + e7c511c7-5050-44da-b175-da1e4ff92d52)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 955402bf-b94d-4e9a-b95f-440e8a942c04)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - d4fe1496-194e-4abb-b7ab-7f0aab65d877)(content(Whitespace\" \ + 4f3a5193-c3ac-4370-9c9e-c8df5a37167d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + eb08f193-8966-4277-bc08-9e79add2cde8)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 09f89651-2b39-4c39-b0ca-b69b08429670)(content(Whitespace\" \ \"))))(Tile((id \ - a3157ede-51e6-4eb4-a998-15ec007ca8fe)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + 81672889-56c2-48d7-b53e-bad5b4d1df31)(label(Lam))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + e4c0cf87-1985-4aa9-b4be-8abb8278e176)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + ce2d28c7-d1d1-4ad5-909e-6421f2f39739)(label(x1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + b279ac2d-53a0-4899-a3e7-29e45637f1d3)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 54c7c5cc-5009-4243-baec-df198852f9e8)(content(Whitespace\" \ + \"))))(Tile((id \ + 64075130-f088-457a-82f6-ebe5d0be8451)(label(e1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + e094bdef-fc38-445e-92b7-a730961c8fdf)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + e88a31af-6149-4000-b8e2-94f31e45d5fe)(content(Whitespace\" \ + \"))))(Tile((id \ + f1ce5a32-e138-43d5-8775-e6f75efe37d1)(label(Lam))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + c6bf010d-869d-4271-b2b7-828dd4f1b553)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + bb0a3fd6-4dff-422b-bdf1-8460c7d43829)(label(x2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + ea64a246-122f-41e6-8284-a7b00542c4de)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 6a6b2ec6-56a9-4ad4-8497-ae680f9b1118)(content(Whitespace\" \ + \"))))(Tile((id \ + e17d1a0c-3041-4aae-8312-2164ad00b76a)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - d5ae6ad5-5f2a-4934-9fa7-ffb96b15e9ce)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 2e1b0250-b0cb-438a-addf-8604f846c3af)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a3a9866e-fb72-4fc0-aa55-e54dc312fd45)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6367200c-4fd9-412c-be16-02b8bebead75)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - a56c9c39-7aea-4e94-ad02-25c9017c06ee)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - aaa9b7f2-0032-48e3-8658-07f826c0a19c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - accb22c4-cf7b-4bc2-a1f1-4d0c80a4635d)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - e1b1486e-f426-4623-869f-be7d4b147b6c)(content(Whitespace\" \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + d3650922-ea7a-4f27-89d3-b919d15786be)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cd0e2d13-9e19-4cf8-b896-32cf152976ce)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c948dec9-9f62-48db-a69b-7c4734cb8e9a)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8820244d-86e7-467b-b6ee-412309891bf5)(content(Whitespace\" \ \"))))(Tile((id \ - 9a4bed25-55cc-4951-9efa-027aa0216064)(label(true))(mold((out \ + 6ad0085e-1640-4bcc-966c-63535c4dcb4e)(label(x1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 63eebaad-cc2d-4899-bc2b-22fbf548c4dc)(content(Whitespace\" \ - \")))))((Secondary((id \ - 4f914036-bad1-4d1b-b8cd-01000178c611)(content(Whitespace\" \ + 6a3c75e8-867f-43b4-af30-e3c33700b8ca)(content(Whitespace\" \ \"))))(Tile((id \ - a07cee91-fc9a-4f3c-aae3-5e82cca71f06)(label(1))(mold((out \ + 98252b63-4ae7-4104-81db-be1b271d1b20)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 8))(sort \ + Exp))((shape(Concave 8))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + e85acee5-ac98-4fdb-9b7e-3da31e9a1cdb)(content(Whitespace\" \ + \"))))(Tile((id \ + 517d59c6-6e8a-48e6-9810-deff80d4837b)(label(x2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 33c9f869-287f-4ebe-8bdf-f8e1e03558a2)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - e5ef7784-cd98-410c-b653-22ab8af2b11a)(content(Whitespace\" \ + 64892ab9-5f46-41ec-83ec-830a3771bda2)(content(Whitespace\" \ \"))))(Tile((id \ - 3ab4da6a-7aed-487d-b0fb-3113913c693a)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 09efe17e-bc3a-44ac-99a7-a868e3452897)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + 654196e6-5c40-464b-882e-f000185256ae)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - af722baf-632d-4d28-92d3-c2f914bd31cc)(content(Whitespace\" \ - \"))))(Secondary((id \ - f2e03598-6017-43f2-be61-b8442de25fce)(content(Comment \ - #err#))))(Secondary((id \ - 88af9827-b2be-471c-add1-70a096838b49)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e01b6ac4-8715-4662-9fc1-87aeb2060bf9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 358e8514-a640-4e35-adc2-89e552b48f63)(content(Whitespace\" \ + \"))))(Tile((id \ + e7e712ff-e6a4-4736-a2a9-1051368e4621)(label(exp_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + be1cd4d0-77ec-4b24-806a-d44ab9406dff)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ada54c0-de79-4600-bdd5-f42f2f4744f8)(label(1))(mold((out \ + 2b9171e1-b36a-4b4d-ba94-b1b383e3d876)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 54ec4955-7647-4737-87d4-8e21a18943b9)(label(,))(mold((out \ + ee427415-9cbb-40bb-be41-483d6b055dde)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5c6fe323-e200-4fe9-8e5e-3a890b129f68)(content(Whitespace\" \ + c2233df3-e617-438d-a3f3-9764587db421)(content(Whitespace\" \ \"))))(Tile((id \ - 3157b120-93b8-4d06-bc3e-cfde87fe9690)(label(1))(mold((out \ + c9f2177c-7b5b-458f-a2c8-f1e5e4b6e938)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d4a9bddb-e237-4100-b2ed-305e25afd150)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 065b6501-e20b-48af-94f3-9265d968d3c3)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5e4eb96a-5665-41e1-8b9c-b4cc34bf0c0c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a56978d8-b5e0-491b-8a2b-7648e836e8fd)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - f9c291e7-47a6-4d4a-8554-85853d267d7a)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 9350c7fe-fcd8-4395-b2a5-51f3b4bc28d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4565265b-2b39-4e9d-b8e5-4eac2118eaf5)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 7982873e-6820-415f-a686-58b3b38f3af7)(content(Whitespace\" \ \"))))(Tile((id \ - 230c9d16-397a-415e-863d-3da8904b8bdf)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 23eee358-279b-4887-acd9-be029dc2a7d2)(content(Whitespace\" \ - \")))))((Secondary((id \ - 388b2fee-7809-4967-9e99-ad49f557a9f4)(content(Whitespace\" \ + fc624d2e-62e9-42ea-a935-f0e009fffbc6)(label(Ap))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 39ebe962-9adf-45d0-8874-8bc30d5d4c9f)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + c3628f0d-0cb8-4954-a16a-e791d0f9a30f)(label(e1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 4cabbfa5-38b7-45e5-962d-6310e522dc2c)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 9c108b07-27cd-4d7e-b2e4-6ae975db2eb9)(content(Whitespace\" \ \"))))(Tile((id \ - ec0c9439-18fa-47c6-89f4-68e8bfd33cb3)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d15453c9-318b-447a-a077-6c85578cde91)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - b3fd18c7-e008-4eea-8532-ac140f0fe666)(content(Whitespace\" \ + 7e8c0903-e399-43b6-ba2c-f014879fc966)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + ad3766ab-7abe-4e5a-b44f-9a9cb6badf3b)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 3170e2a0-ebdc-4b38-b2b7-a09434ec3f1c)(content(Whitespace\" \ \"))))(Tile((id \ - b89d7d7f-95fe-42a5-8136-dbcfdaffe43b)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - adff873a-7d51-4403-aa11-d637d7c536b5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 692d2d7a-9aab-4a1e-8ea0-024c787bd0f2)(content(Whitespace\" \ + 545a9cc8-240b-4267-adc8-0b2bbfe70a91)(label(Ap))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + dbc20a7c-0050-4672-bd5b-b298221a315d)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 1a06a7c6-f321-428e-b28c-a4f24b3ab556)(label(e3))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + ec1e7e19-8acc-4a77-8ef5-0b9907518462)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + bba30512-7bbc-4930-b198-d12e690a5b93)(content(Whitespace\" \ + \"))))(Tile((id \ + 0d36e488-3e41-46f9-a972-23750bcece8f)(label(e4))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 4b4d9e3e-ac05-4a5f-b08f-d5563460b5c7)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f282b2b5-5c36-472a-8375-d1a36a8649ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f3bd6390-5a54-48a1-9640-ccfa45160df0)(content(Whitespace\" \ \"))))(Secondary((id \ - b2bb1ffd-3dbe-4c43-83ee-d0e2f9cbbdab)(content(Comment\"#2x \ - err#\"))))(Secondary((id \ - 47be2cd3-b03b-45a8-b26f-f92060bc3004)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5d198806-3a30-42ac-95c0-1df2acdffadb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 82dc0544-9ae9-488a-a338-819aed1a7c66)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - a1005730-3689-4276-af36-eed9216be5cb)(content(Whitespace\" \ - \"))))(Grout((id 700bdac9-76cf-4be6-98b1-c032587de447)(shape \ - Convex)))(Secondary((id \ - c5844890-0517-4035-9bf9-160b2dd905c6)(content(Whitespace\" \ - \")))))((Secondary((id \ - 4d4ba1e9-1383-4ca6-b828-421d145b1214)(content(Whitespace\" \ - \"))))(Tile((id bf7c57c8-0bc0-447a-86fd-455f1f8de839)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - e47fffd1-3404-4eec-8a0c-bb44253a8a3f)(label(1))(mold((out \ + 7df542d2-05f3-4e21-8c5f-64955731be10)(content(Whitespace\" \ + \"))))(Tile((id \ + f60edbaa-954f-42fe-b431-b9bcc014a9c6)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9dd9e624-583a-441c-8649-338da0a92678)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - a2b0087b-2c53-4d62-b2b3-e1222c73f72c)(content(Whitespace\" \ - \"))))(Tile((id \ - db8f24f1-e424-4ecf-819a-384144315f5d)(label(1.))(mold((out \ + b1f04c3d-547f-44e7-8e7a-8a39c04667eb)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 194d5a82-cc1f-4a18-8b5c-c61c904af17e)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94ff5cbb-c5ba-4d24-8db0-06a3ac347599)(label(,))(mold((out \ + 75f2818f-2f9c-4049-878f-c81085700db4)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c0f8eeaf-068f-4d16-bb5d-b7453ed807a9)(content(Whitespace\" \ + 7b3280d2-d974-4cf6-9bb0-516576217085)(content(Whitespace\" \ \"))))(Tile((id \ - 1ce9a10c-7085-4b41-9ce1-c17cf835b689)(label(true))(mold((out \ + 4b4990b5-c883-44de-baa5-6298bdcd9c6c)(label(e3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 3f19f742-2f54-4c88-9157-76e4fde5317e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a9ca07b3-0f93-4e17-aae0-418f77d6cf01)(content(Whitespace\" \ - \"))))(Secondary((id \ - 029b56d4-87bc-422d-9b26-05af5d126a65)(content(Comment\"#err: \ - inconsistent#\"))))(Secondary((id \ - 09dd70d6-502d-48b2-846e-c5f8efd647fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52f2c094-8b57-407b-80cb-925fe808963a)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - f57dce69-2cf4-4a2d-ad9d-7d40490ba01d)(content(Whitespace\" \ + e67b82f1-96e5-4d33-b100-3bfe9707c8c6)(content(Whitespace\" \ \"))))(Tile((id \ - 73fab713-03ee-4900-93aa-2c247ab1693b)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f0653d97-c095-44b2-8384-aa7ce7488e3f)(content(Whitespace\" \ - \")))))((Secondary((id \ - 47df5f2e-3a90-4ccf-b553-316fddb81a57)(content(Whitespace\" \ - \"))))(Tile((id fc2dc4d9-a9e5-45bd-a9d1-6507d203d663)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - 0b59e204-0333-401e-8afc-d6b4c63394c5)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 034534be-8504-4e02-918d-d368e0fddce7)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + bc816646-333d-45c6-87de-126307d9157f)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2b1f1e0e-b99e-4c62-a294-ff9dcf4b5520)(content(Whitespace\" \ + cda90ee2-15a7-475b-a7b7-b58f95ac0541)(content(Whitespace\" \ \"))))(Tile((id \ - 1ea91616-8aec-412d-82f9-4e9351bbd291)(label(1.))(mold((out \ + c6cca4d7-4919-46de-8ffb-52071913367e)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fbe8cbf8-4245-4ba8-a68a-b03eb53c3399)(label(,))(mold((out \ + 46608290-3577-4831-b399-c80d5d767d86)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + cea40954-b0f5-4ea0-abdb-8f3a0a210bcd)(label(e2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 5d251e7a-9910-4012-9c61-96c776587f87)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 007fb3dc-eaa2-4910-b467-287968ed26d3)(content(Whitespace\" \ + ad817f3f-75bc-46fa-ab0a-86718ad8e04e)(content(Whitespace\" \ \"))))(Tile((id \ - e77e5eff-3894-43f6-96e4-13961e664183)(label(true))(mold((out \ + 2c9c3dcc-3d6c-463e-bcd7-fba48da6ecac)(label(e4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d4ed2f71-1740-4928-81d2-b0c0151b5a7d)(content(Whitespace\" \ + a58fe0b7-4a35-4a50-97be-441d4274c616)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e7572e91-07c2-4d65-abca-dd76ec42dbbf)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + c7d795b0-3d34-4bde-aebd-a6712a065da1)(content(Whitespace\" \ + \"))))(Tile((id \ + 68ab1574-8fff-4c61-b8dd-81e4b42bfad5)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 6ee1936d-6b0e-4790-b4fa-a3ec667659a9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1943c974-3ce2-4578-940a-728197ec1ec3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 48c7f1ad-35cc-4f97-95e7-c68ffe8023f7)(content(Comment\"#err: \ - inconsistent#\"))))(Secondary((id \ - 0f0be7c3-2c77-4e05-aba3-ae8405f61d16)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 03a920d7-95a2-4754-8416-1123bd6f2f11)(label(let = \ + 109c64f2-39ac-480c-b33e-96b08c515ffc)(content(Whitespace\" \ + \"))))(Tile((id \ + 215955f2-8a04-40c6-9f1f-14652d8f2637)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 16e0c010-73cd-4dac-ac53-2536fa7068ca)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4f239c3f-102e-4227-9388-89983d93b887)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 8172db9a-32d5-4ceb-a908-3837509edd80)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d3329425-9616-473c-9f10-82c062d01611)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5ed2278f-50d0-4255-94cb-f201169e5a88)(content(Comment\"# \ + Substitute Exp v for variable name in Exp e \ + #\"))))(Secondary((id \ + fdf34800-63c7-4baa-a41e-ec2517696344)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 980a0de3-6dc8-466c-9fc5-57c0161c32ed)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 826ad200-168b-4a5f-af94-df033e42e4b7)(content(Whitespace\" \ + 968f19d7-ca3c-4318-a56c-ddaded903c52)(content(Whitespace\" \ \"))))(Tile((id \ - ca9ddb7f-5f91-4956-ba30-44aa1648f245)(label(_))(mold((out \ + a5a4093b-3f2f-4543-a9e6-d915edb78d16)(label(subst))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6dc24ff9-bf61-4a92-8f2f-b7c3f67217c2)(label(:))(mold((out \ + bf012f47-7904-4b04-b435-261c6898a74f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1499fbd3-ca66-47ba-8411-7500ca3fe394)(content(Whitespace\" \ - \"))))(Grout((id e6ddec97-cd3c-422a-b214-ca8fd61c2331)(shape \ - Convex)))(Secondary((id \ - 8d2a046f-1546-4749-858d-626905d77eff)(content(Whitespace\" \ - \")))))((Secondary((id \ - ae4808bb-0f13-4a47-8d93-7dc155ad32bb)(content(Whitespace\" \ - \"))))(Tile((id 32ae3fb5-4544-4cd4-a792-f9256875488c)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + 292ae481-93fe-4e75-b4d1-85a12c13d583)(content(Whitespace\" \ + \"))))(Tile((id \ + 365f62b2-81b6-4a77-aa1a-c14fafc129f1)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 54243b79-d02b-4ca1-a5ea-b6136ac1bba8)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 15ef7894-18f2-4632-8549-55d65bd68d5e)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 04d28679-49cd-4169-90ac-3ba15295a145)(content(Whitespace\" \ + \"))))(Tile((id \ + 61e87e55-f097-4946-a07e-9608191e9e8d)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + fbbe13a3-aa6d-4dd8-b425-66d31fa6ab5c)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 76d1a094-2cfc-4b1b-8491-faa073126a50)(content(Whitespace\" \ + \"))))(Tile((id \ + 11012759-a911-472b-92c4-13c296f014dd)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 36c53e8b-58b4-4b29-90c7-bcd8283d021a)(content(Whitespace\" \ + \"))))(Tile((id \ + 337cc1de-7007-44a8-b7c0-e2d62dfe038d)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2cbdefda-74b9-4e12-bb77-968981f48d24)(content(Whitespace\" \ + \"))))(Tile((id \ + 6669c981-844e-4bdb-80e8-49f63a37c170)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))((Secondary((id \ + c9570d59-780b-491a-84f6-f38720034df1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cd3956e2-872a-48d0-b61b-49c9627f7da0)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + d889bd03-eae8-466d-8ab2-6a37b228101b)(content(Whitespace\" \ + \"))))(Tile((id \ + 6f2f5c27-b0c6-4d64-bec4-f59a3d62907e)(label(v))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + b1a377a9-9f1f-46ea-b9c8-4a735177c681)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 4e8b2929-daa4-4997-a50c-41215cd5dc97)(content(Whitespace\" \ + \"))))(Tile((id \ + c6e2f602-5f94-4779-9f7d-6150753e387d)(label(name))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + aa15bace-4f95-4777-ae5a-86efcb21d80b)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 13bc3e73-cc08-426f-b842-8f326d5e06fd)(content(Whitespace\" \ + \"))))(Tile((id \ + 70cea4ed-3f34-4564-b948-5b37698e0059)(label(e))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 6fd33e5b-3792-4bb2-9d66-e7c7cfd82c09)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 90f64cae-e6b1-4c17-a7e8-f843bc7533d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 419ebed6-b5b2-4540-a431-3096df690104)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - ff441609-be5e-4d1b-b544-9799d7a3011b)(label(1))(mold((out \ + 1))(children(((Secondary((id \ + 7f57f5da-29d7-4afe-af81-9ba4cdb84290)(content(Whitespace\" \ + \"))))(Tile((id \ + 84bee910-aedb-4d4c-baff-a4571eabd806)(label(e))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 75df8104-bdda-4020-aa34-461d8ef9a61c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f680450c-a013-4374-a0d9-3b7395b2d291)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 5ba10a8b-3767-4f49-ad59-b4d685b3e8d1)(content(Whitespace\" \ + \"))))(Tile((id \ + c85b62c4-519c-4ff6-b53d-084bfc4b3a4a)(label(Var))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + cbe676ad-d210-4614-a6f4-f1288961392a)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + b3d931dd-62c9-49d1-9c23-57e51491e2fd)(label(n))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 39dcfa1c-d518-4072-925b-5a857363d84a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 28da4de0-f438-42e7-8193-7123c709da52)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + de7081b2-0362-4667-be82-f6b027b192fd)(content(Whitespace\" \ + \"))))(Secondary((id \ + 185f0a9a-db51-48ac-9671-7308af2566a6)(content(Whitespace\" \ + \"))))(Tile((id \ + 94fb704e-4ce9-42e6-ae34-d1b88af3c424)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 9298a278-bffd-4a4c-baf9-1aed6d1562dd)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 1b07d13e-1cc4-4476-b7aa-1d947539db97)(content(Whitespace\" \ + \"))))(Tile((id \ + 18e2d5d1-c566-4eb6-85a9-8185ac89e46b)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b6463e8d-e7b5-4545-9fc7-4924aa2693a6)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 3487f0ad-8f80-41de-905f-5c7681cab87f)(content(Whitespace\" \ + \"))))(Tile((id \ + 53fc5638-04b6-4552-82f6-17a089316a9c)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 8))(sort \ + Exp))((shape(Concave 8))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cd358f94-2daf-4f24-8548-3d5bce3213c0)(content(Whitespace\" \ + 955e949d-0d06-4724-bd32-3869a60d1509)(content(Whitespace\" \ \"))))(Tile((id \ - c5e0a263-a161-49ed-91c8-598982eab8ce)(label(1.))(mold((out \ + 714480e4-4cc9-4f0a-bb16-fa5eddae8ba7)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1f911b96-1c72-4e92-92a6-7f2d5a352c90)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 5b6d3a14-25dc-405b-8f4a-c0577ded0d7c)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + cff5290a-3b75-4adc-a07f-57162f45e70a)(content(Whitespace\" \ + \")))))((Secondary((id \ + fd1933b0-7135-44ad-9295-1cdff91a4700)(content(Whitespace\" \ \"))))(Tile((id \ - 433e239a-9d57-4e8d-88d4-3d051553fc95)(label(true))(mold((out \ + f54eda3c-4175-4cdd-a22a-bd44d64754db)(label(v))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 80942fdd-f28f-467c-be15-f40257293d0f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 59fe67c4-9e46-41da-80c5-94a08d421127)(content(Whitespace\" \ + \"))))(Tile((id \ + 053268f5-aa5f-47d4-bc35-7dd044c4d016)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b8f71dee-301b-4173-8fd6-f5daf5c8c00d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 534a6cef-6e24-4f16-a7ba-2edbd118aab9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0051a088-619a-4934-8f53-0219031c1bb2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3df4acfd-98e9-4fce-9853-95fb92574871)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 1cfe8911-f9b5-4422-95bb-443dae0d0105)(content(Whitespace\" \ + 48783eb9-b6b0-4995-98f9-9dea00a51ea6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 446ff674-42cd-4716-9ec5-caedd30229e1)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 026fbda4-70e7-4982-966e-131e89f8b063)(content(Whitespace\" \ \"))))(Tile((id \ - 25d47a4e-06ae-48dc-99d6-32a41983492b)(label(_))(mold((out \ + 970904cf-54f0-4476-949e-6bff04296230)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3959b315-bd21-4c0d-8385-3dc34326cdb5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 41cd46f9-c78b-483e-bc9d-5ba5248ce0c8)(content(Whitespace\" \ - \"))))(Tile((id 33511225-301f-493f-9ac5-0c48a3b2301e)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Grout((id \ - a7219f30-6814-4af1-9fb1-560e9131e0d9)(shape \ - Convex))))))))(Secondary((id \ - 09487b14-597f-48f5-bf3a-5f01ce9e2bed)(content(Whitespace\" \ - \")))))((Secondary((id \ - 5370e5d1-290d-4e66-9ba7-4c03e6723ff9)(content(Whitespace\" \ - \"))))(Tile((id 6b62996f-8ade-4ed9-817a-6b538a6918eb)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - 9a080685-90e3-41d1-8f92-e7d253dc7245)(label(1))(mold((out \ + 1c58d46b-701f-4fdd-8122-3a8b6b717fd1)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 8ee0764c-6ae1-4a7f-a43a-da8e9e2ef1ff)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 139f7e26-a096-45dc-b86c-b1759995e640)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 584fe536-95b9-467b-9d45-8ff79f932322)(content(Whitespace\" \ + \"))))(Tile((id \ + 44b651bc-58e2-4d0f-8fe7-f9f4ef2df975)(label(body))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + d8b7e4b6-2830-4ae4-8765-ad8787599005)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + df1a1724-1680-4c13-86c4-cf1739d1f2f5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b12dc4f1-3584-4d70-9df4-56748637b5d9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 789ee2e2-b17f-46d2-a729-97747b3d3b3c)(content(Whitespace\" \ + \"))))(Tile((id \ + eb31c313-cfaf-4a04-97be-5d02a39afa8e)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 369a1435-3a95-444a-9322-4055172d6863)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - d6a5c2d1-aed3-4c53-a454-2d3922735b2f)(content(Whitespace\" \ - \"))))(Tile((id \ - d58190ee-5471-4175-8fef-aceb5596ec09)(label(1.))(mold((out \ + ebcd5284-9b96-4e09-9e05-1c856050c226)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 33d26cbb-f822-4b7d-a3a9-a76ae159a0c1)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d8eac610-d479-4c9e-9577-cb9989ee9e8c)(label(,))(mold((out \ + f688d2b2-b8c9-4203-ac30-acb9b78b218b)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 03e22831-29ab-4096-8d75-455d5c164e84)(content(Whitespace\" \ + 47729e37-9963-4286-9683-323f9b87bceb)(content(Whitespace\" \ \"))))(Tile((id \ - 782f78ca-f815-4a62-a570-fcaf036f954d)(label(true))(mold((out \ + e5b9286e-a2d4-475c-bbc6-6a0ec96cfa1e)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2797e94b-90e6-4c45-8cb7-e069a6e5c16b)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 72fe75f0-3e31-4113-8f25-fce1dfafcf1e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fc4a0da5-2b7f-467b-9d51-c79d28bbd2ce)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 663ff7ee-c38f-43fe-9615-7c4489dfa541)(content(Whitespace\" \ - \"))))(Tile((id \ - 66a49fc3-2189-451d-8f5b-87a4e7a4a1fd)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4ede6a03-d0d7-4332-8382-c88b3e0c2d11)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 2bf08639-ade9-4636-bb33-b789e670937e)(content(Whitespace\" \ - \"))))(Tile((id 971f3ba1-d70d-47d7-a9a1-dc52bc83fd36)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Tile((id \ - 5632be0d-1afc-4c45-9fba-7b815246c884)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - e016ef9f-b73f-4ca5-87c0-6e1b9d52fb73)(content(Whitespace\" \ - \")))))((Secondary((id \ - 40558f24-ca8d-4dda-a0b3-13a39b1927f3)(content(Whitespace\" \ - \"))))(Tile((id a949b592-988a-46d0-ac9f-176609db6dde)(label([ \ - ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - 06fa3969-d9ca-442b-825e-dc407e6f6723)(label(1))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + cec07007-77a6-4c7c-9ba7-4d851d46afab)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + cc33ccf8-2ba7-420b-b2c6-21aea451a89e)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2bb73b05-ca08-4c0a-a04c-dadb433de26a)(label(,))(mold((out \ + 7d8a5934-f197-4252-a244-ab397fd8f6a5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 0f424bab-a2f3-4fe0-8a09-8f2cd90c3a07)(content(Whitespace\" \ - \"))))(Tile((id \ - 5a87620b-a433-4fb9-9d1a-09c9b3beab6a)(label(1.))(mold((out \ + Exp))))))(shards(0))(children())))(Tile((id \ + cc112f0c-4bf7-4662-917e-846de267fe34)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 512129f6-6a3c-49fa-bf77-83e9e10f4705)(label(,))(mold((out \ + b02b84ec-218c-452a-bf1e-9617cef8490d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ce93584-77cc-4b97-a406-c4462d511dcf)(content(Whitespace\" \ + ed7443d9-4404-44fd-a4e0-3f6559f33e82)(content(Whitespace\" \ \"))))(Tile((id \ - 37022cb4-317b-4348-a086-5283db30d7b9)(label(true))(mold((out \ + ddac8323-ba4e-4d64-b5cc-7e69c920435a)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 67645fa7-6a97-4584-8064-fa31c7466741)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a8ae0eb5-666a-43ff-a24c-b8f82ebd4e9c)(content(Whitespace\" \ - \"))))(Secondary((id \ - c1852265-6f47-40cd-83ef-8fe57cae7e70)(content(Comment\"#2x \ - err#\"))))(Secondary((id \ - ce5d18a4-9cc3-4438-a7f3-431f8d3a2461)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dac99d0f-a7ce-4629-9f71-f49bd6a718c6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 440becc1-96de-4739-b860-ca47255d3d93)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - d4ab6143-0bfc-4c9e-9bfb-b9ee50bd5289)(content(Whitespace\" \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + a26fdd56-19a1-4583-96b1-b2e6f4dce75b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4a409d0b-c2f8-4b1c-b160-ff917085bf6e)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + da613248-93ad-4ad8-8958-3b005c4c4629)(content(Whitespace\" \ \"))))(Tile((id \ - 620340ff-4a97-4b5f-b39b-76f560bf58db)(label(_))(mold((out \ + de5333b3-77bf-44f1-a7b6-64378045d95c)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e7ff297f-b0a7-4c0d-9772-47acfe9a6d9c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 6f00d686-a3ff-4431-b4c2-b70d3b4eca14)(content(Whitespace\" \ - \"))))(Tile((id 00df244e-2507-40cf-a767-3a29432ad8fe)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Tile((id \ - 130f2a32-39da-49cf-a550-754622dc404a)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1eab60a0-5c07-4a92-82db-5971b1db666a)(content(Whitespace\" \ - \")))))((Secondary((id \ - f10579e0-e416-410d-8ae3-12925c91671a)(content(Whitespace\" \ - \"))))(Tile((id \ - 16944a0f-57f1-4e24-a573-1d9231d16e57)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 317f017d-a9c9-467d-8cb9-e56c0495a060)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 6aa18463-de32-445c-8338-c11780d4d4d0)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4a870256-b389-4bbb-95bd-47834fae994b)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 369ea7b7-0d09-42c6-8b54-6cb084d8270f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 5c3c92c6-a066-49fb-ba63-589c5b309625)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6dbcf6a1-4176-46e9-802a-b16c71d040ab)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 9ef098ad-fe36-44f2-9487-6d9ff6656d48)(content(Whitespace\" \ - \"))))(Tile((id \ - 1d8fcf7b-fa79-4de7-a9f4-55fff3ada3bc)(label(_))(mold((out \ + b29c0da4-d842-4d39-93ea-68ad05af9261)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 1e386e4c-0118-4aaa-a61b-7c459652561e)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cca7629b-c4d5-4045-a00e-197b16dffc60)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 7eaffe3b-5b20-4937-a693-400f5a3d7987)(content(Whitespace\" \ - \"))))(Tile((id d1ce8a09-d6e6-443e-8fb6-77904043ba41)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Tile((id \ - f2827f6e-aef6-40eb-9e99-959cbeb8f626)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a5a96d03-071f-4595-bb82-1f287d604bb3)(content(Whitespace\" \ - \")))))((Secondary((id \ - aa9f6dd4-afc8-432f-9060-c140c31c2b5b)(content(Whitespace\" \ + ff5111c7-24e2-441c-ba22-b00b9570b868)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + a5e422b7-f453-4fb9-bf2e-d8fbb0f1fc19)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 2bb31630-3fbf-41d5-a19f-37006e884723)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 334192b2-d1f8-4e50-84a9-f63119f5ea66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5cdcd943-3223-4e31-a4c9-230ddd7cadbc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 04ea99ba-c0d4-4f96-8514-512d2679d38b)(content(Whitespace\" \ \"))))(Tile((id \ - 9c1620d9-ae11-41e1-ad5e-663b10aa1c56)(label(1.0))(mold((out \ + 6698f873-dfec-429f-aa2e-5b753a0e0b13)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4c545fe6-4860-489f-aaed-de76ee3722c2)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 90f05b86-6ed6-4da8-a1da-5bc842610088)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + fd041cbd-11e7-483f-9894-149d647575df)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 357ac56b-6008-46c3-823c-f71e965f9072)(label(2))(mold((out \ + 9b6f0264-1a4e-436d-a922-f0325bc2e4db)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ef444fb8-d541-400d-9576-a500ff7bea51)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 125ff66a-6b89-4566-98fd-2a802fd970b5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5939a641-eb88-4f4f-a322-69b1571271b5)(content(Comment \ - #err#))))(Secondary((id \ - 7baecabf-72e3-4455-9cfb-16777b0057ac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bd06e95c-6b0f-4708-b642-e09aec6b32ef)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - bff70791-8893-4e8b-9f92-e0ac69a6e939)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 7a495fb0-7163-4e39-9013-81f4b1b49d70)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 54fc8758-e83a-451d-bb69-409eb19c6735)(label(v))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + c3e19a5a-f9b6-4f24-8f7b-64f099967f9f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 71fca11a-3419-4757-b711-fdd18405d97c)(content(Whitespace\" \ \"))))(Tile((id \ - 34216c66-e05e-4f03-91a9-61f892a850f8)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f7733b0c-dd77-44b7-b56e-d0c1a6636b6c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 8f04892c-18d2-404b-9894-3e9aecc981e2)(content(Whitespace\" \ - \"))))(Tile((id b48afdf7-f131-4d9f-b829-0bb01434f348)(label([ \ - ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ - Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Tile((id \ - 2546b193-bb89-4e2c-a1e1-c0c3aa775d8a)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 925587ff-8973-457c-853a-0f6c71cd9c4a)(content(Whitespace\" \ - \")))))((Secondary((id \ - 5ca988e2-330d-4e80-91b9-e9031eba4cef)(content(Whitespace\" \ + a763abee-d9b7-45b1-8424-3ef1a0a271e5)(label(name))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4faf4138-d473-4173-95a6-eea2542573f7)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 9e46b718-8343-46e5-8691-99218fd48457)(content(Whitespace\" \ \"))))(Tile((id \ - ed424387-c3f5-4d4e-a276-ae526e114f39)(label(1))(mold((out \ + 2a42a695-0600-4732-b130-fdb906e39384)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 9346f2a0-c777-409b-91ae-ac99409e69dd)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 175d0889-9c8a-40ce-a0d3-9e16bd3e343a)(content(Whitespace\" \ + \"))))(Tile((id \ + 0c57d2e8-6a01-4794-9165-25cbc0175a5e)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 41bdc089-5d46-461e-91f0-3c4d5c8c975c)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 75eaeaea-6d82-4f4f-8ff2-c3d0163c6017)(label([ ]))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 05ee19ae-081d-4fb0-affb-ecad3fc03096)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4516c234-075e-4464-965c-666a0de1e8cd)(label(2.0))(mold((out \ + 7c14b792-807c-4156-af95-90f4cce11fba)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - cb0e4361-9db0-45cf-9b66-9f1812a87332)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 1be9f5d9-ceb5-4b89-811d-6975be2757f4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8cd1685f-b46f-4d3e-81e3-632df69a6af7)(content(Comment \ - #err#))))(Secondary((id \ - 0193a545-1ce2-4a17-94b8-be94999b8a06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b5361ea7-4e12-48c1-8444-5e38cbb19a59)(label(\"\\\"BYE\\\"\"))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3341286f-c3ba-4879-a6f4-24cc00343cee)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 80da2600-590e-496c-9670-31ea4bc2e302)(content(Whitespace\" \ + \"))))(Tile((id \ + 5a0ea697-f4c2-4fca-879b-a4b7ac213c8e)(label(name))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2d9420c7-44dc-4781-8c4f-fabd96d95ad4)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 7bf8c927-0575-470b-b3c5-a29a553b6830)(content(Whitespace\" \ + \"))))(Tile((id \ + 5739b8d1-04a1-4835-8688-50bb5a0929dc)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer))"; - backup_text = - "# Internal Regression Tests: Type errors #\n\ - # Each line should show errors or not as indicated #\n\n\ - let _ = unbound in #err#\n\ - let Undefined = Undefined in # 2x err# \n\ - let true = 2 in #err# \n\n\ - let = if true then 1 else 1. in #err# \n\ - let _ = if true then 1 else 1. in #err#\n\ - let _: = if true then 1 else 1. in\n\ - let _: Int = if true then 1 else 1. in #err#\n\ - let _: Fake = if true then 1 else true in #err#\n\ - let _, _ = if true then 1 else 1. in #2x err#\n\ - let _, _ = (if true then 1 else 1.), in #err#\n\ - let _: , _ = (if true then 1 else 1.), in \n\ - let [_] = [(if true then 1 else 1.)] in \n\ - let [_] = (if true then 1 else 1.) in #2x err# \n\n\ - ( )(if true then 1 else 1.);\n\ - 1(if true then 1 else 1.); #err#\n\ - (1)(if true then 1 else 1.); #err#\n\ - (fun -> )(if true then 1 else 1.);\n\ - (fun _ -> )(if true then 1 else 1.);\n\ - (fun _: -> )(if true then 1 else 1.);\n\ - (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ - let _ = fun x -> if true then 1 else 1. in #err#\n\ - let _: = fun x -> if true then 1 else 1. in\n\ - let _: -> = fun x -> if true then 1 else 1. in\n\ - let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ - let _: -> [ ] = fun x -> if true then 1 else 1. in #2x err#\n\n\ - ( )::[(if true then 1 else 1.)];\n\ - 1::[(if true then 1 else 1.)]; #err#\n\ - (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ - let = [1, 1., true] in #err: inconsistent#\n\ - let _ = [1, 1., true] in #err: inconsistent#\n\ - let _: = [1, 1., true] in \n\ - let _: [ ] = [1, 1., true] in\n\ - let _: [Int] = [1, 1., true] in #2x err#\n\n\ - let _: [Int] = 1::[2] in\n\ - let _: [Int] = 1.0::[2] in #err#\n\ - let _: [Int] = 1::[2.0] in #err#\n\ - \"BYE\""; - } ); - ( "ADT Dynamics", - { - zipper = - "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 1f7bcab0-da00-4299-b43a-3ca1ef8ca2f5)(content(Comment\"# \ - Lambda Calculus via evaluation by substitution \ - #\"))))(Secondary((id \ - a927feba-9938-45cc-88da-4ca88fbace46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 59554d6d-5be9-43cb-a4d6-1edf55e3c098)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 41573bf5-78b0-4f95-b6e2-3c4ce9dbd6d5)(content(Comment\"# An \ - Expression is a variable, function, or application \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + cf9ea30f-5bce-4d8f-bcf1-f47ab170f0a6)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 140b4e40-9a69-4603-a8ff-f54f43833aea)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 83a2646d-03af-4380-950e-4ffbec2efecc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 60a803a0-45dd-4d26-9e50-9d41b42e060b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 55f117b1-90ee-4043-97a5-eaad60fbf8d8)(content(Comment\"# \ + Evaluation can result in either an Exp or an Error \ #\"))))(Secondary((id \ - 5e7af976-9c1e-4841-847a-70c966af0583)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a76c3b61-221f-4e94-b8fd-5b45183df229)(label(type = \ + 75edeef0-b93a-4e52-8eb7-956406120f02)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d9758f2e-b154-4d74-9d8d-ddb629f96371)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 40bbb356-6987-428c-a8ed-2a6b99066f39)(content(Whitespace\" \ + 4e0f5968-053b-43c6-8ee7-f9e839b0d176)(content(Whitespace\" \ \"))))(Tile((id \ - 5b4a5ae1-4e37-4f29-abcf-0ce0108de2c0)(label(Exp))(mold((out \ + 0ee7d546-e23e-4b2c-808e-01af4f749706)(label(Result))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1cc38bcf-e0a0-416f-8cc3-1655722f05a4)(content(Whitespace\" \ + bd8a61cf-b940-40b0-9fbd-c698a60e9df6)(content(Whitespace\" \ \")))))((Secondary((id \ - 09d316ec-a283-4c84-a902-cdb1b0d8fcc7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5c00fca1-9f11-4ed9-bb7b-507bdcb1fae8)(label(+))(mold((out \ + 8a5beda5-5224-4e5c-8dc0-79e6db7f1fd3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 91cccf23-4d44-46e7-a81e-a046a2566144)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f097f93b-c8d3-423f-8301-953e7fa560a6)(content(Whitespace\" \ - \"))))(Tile((id \ - f02ccc58-351d-499c-87ed-687857f5aafa)(label(Var))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8096ab83-dd0c-47c0-bb76-b0e811b0c1bf)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a375c863-da66-4010-a25f-778944a6db48)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 8ee1d2e1-06c2-441c-8fc4-138532d469d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bc72ff0d-8a9d-4ee4-ae45-b2c94f67eca9)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - c7ed4279-1d9d-44bf-af67-23ca84632b04)(content(Whitespace\" \ + 24bf5ab5-af15-4566-9884-a2061fb39d79)(content(Whitespace\" \ \"))))(Tile((id \ - e2c11b78-0c54-448e-9cca-e4c8bfc8bbb2)(label(Lam))(mold((out \ + 4d58cbe8-1f96-4129-a6bc-5fa73566b2cf)(label(Error))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 4d2df657-924d-4f14-9eec-0ecd7f5c21c9)(label(\"(\"\")\"))(mold((out \ + a9b509d2-8f56-48d1-8e5f-3fdafc9415e5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a64e19fe-5bc6-4139-8b40-96e3583fa4fc)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - f3daa7e8-f243-4222-8ee4-ddc0f9155c46)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 447e6442-bdde-46f7-8882-6bb1f68d67d7)(content(Whitespace\" \ - \"))))(Tile((id \ - 15875387-e3ed-4473-9c6a-453a68e8b117)(label(Exp))(mold((out \ + 9f7a0898-680d-4868-a84c-5bb556f1612c)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0f46618b-71ec-4bf5-88ca-75d3bf0a549e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd1bd397-be90-494c-9ea6-17847e56b805)(label(+))(mold((out \ + 689974ef-89e4-498f-bd4e-34a6720427d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 52b2d13f-c806-4877-84fe-6d32ab1182b6)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 10))(sort \ Typ))((shape(Concave 10))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 04185bae-3d12-4049-affc-da427e740d6b)(content(Whitespace\" \ + ecf58e9e-0efb-4e01-ae05-1fe9b21d03b3)(content(Whitespace\" \ \"))))(Tile((id \ - 559ea70c-729f-4295-a48a-c27dd9fad885)(label(Ap))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 2e0537e7-5ee1-499d-9edf-c2eae0b53264)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2bbfcd7d-a9a0-41f5-9f2b-65e6f4f0fc50)(label(Exp))(mold((out \ + afce6860-9293-4f8e-9ef7-dd0c60ca95ab)(label(Ok))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 40bda1cf-399a-4368-9a93-1b34120aafac)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 4f27a6c1-9f31-4f48-9f67-81fb4bdb8815)(content(Whitespace\" \ - \"))))(Tile((id \ - f9b126eb-6ecb-42a4-9b11-255fcea67577)(label(Exp))(mold((out \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + aea698dd-d63d-4fe2-9fcf-7f224c41a59c)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 40472e30-a169-465e-af55-751ecf617aa0)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 297a96d2-948f-4fdd-9884-8e547ed933a8)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 60f3914c-75d8-45b9-91c8-408f8d99eded)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0a6f99c3-1727-45b2-a08f-1194554cea5f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dfed049c-1560-40ad-adef-7de21ec01615)(content(Comment\"# \ - Syntatic Equality of Expressions #\"))))(Secondary((id \ - 02c2cda8-cd30-4c87-8633-79f6279f2923)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d1c59a7b-15de-49ae-aaf5-056c65738d18)(label(let = \ + 2cf73080-004a-4f90-b789-9221717f6081)(content(Whitespace\" \ + \"))))(Secondary((id \ + b27f5376-58b7-4974-beaf-4de3558d93bf)(content(Whitespace\" \ + \"))))(Secondary((id \ + f43fd6da-318e-4965-a2a5-42ed801cc41f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 82677a8a-59a2-49cb-845a-3c3876b5b300)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4f966c26-0371-4ef8-a075-127d1f0321f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 621fd573-caa6-4583-87f9-b5825e167918)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 321c3b7f-71b6-433f-8ba5-3a176f503ee2)(content(Whitespace\" \ + cfd16b5f-c56a-49a9-a7f2-44b0be14f475)(content(Whitespace\" \ \"))))(Tile((id \ - 20a41284-a854-463e-8f08-880a85b83d3c)(label(exp_equal))(mold((out \ + 8581c765-76a3-422c-9479-8eb2cf7c104a)(label(result_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 78495729-2b1d-4e8e-8f1d-c9d28f6a7a60)(label(:))(mold((out \ + 125cc189-7080-41e8-a196-b7ab8ad54f77)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dbee2db7-3f10-4979-9024-bc34f7453770)(content(Whitespace\" \ + db9bdbd0-7b2e-478c-bd6e-8f8b5c508ecc)(content(Whitespace\" \ \"))))(Tile((id \ - 72d5e73e-ff5a-4bbc-9d1d-7e6e1581e413)(label(\"(\"\")\"))(mold((out \ + 1041388d-9c06-4d8a-a535-05b540bff54d)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - cf35fc7b-7318-4d81-8163-b650fd7de4f0)(label(Exp))(mold((out \ + 2ed6f843-67da-461a-80ca-5d01c34c12c5)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3907ffc4-af80-403a-839d-82b1232395f2)(label(,))(mold((out \ + a73ace3b-2a20-43c9-8697-861ce8173c07)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 14))(sort \ Typ))((shape(Concave 14))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7aca28b-65fd-473a-9fb6-65ea96ef78d6)(content(Whitespace\" \ + 320fb96f-b4ff-4d76-a951-a09df19091e0)(content(Whitespace\" \ \"))))(Tile((id \ - 22f01e9c-afbb-4e08-8acc-d315f402817b)(label(Exp))(mold((out \ + cd4f3152-7c7f-4a71-be23-f9d7c0388c9d)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 4ab91533-0de3-4d84-b8b2-7fbe33be34a4)(content(Whitespace\" \ + a92c9445-e047-476f-a541-5edeeeb864ee)(content(Whitespace\" \ \"))))(Tile((id \ - c59e6b78-fc5b-47bb-b830-9d4fe67c0b13)(label(->))(mold((out \ + ca0ae608-6978-4d91-a8cf-9103dc0e87c6)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7b30dd6b-c498-4637-ae4a-f6afea955a90)(content(Whitespace\" \ + 6b67160f-a805-4eab-a904-5786bc35aa7d)(content(Whitespace\" \ \"))))(Tile((id \ - d000d521-0821-47e0-b655-52db20eb828a)(label(Bool))(mold((out \ + cbd87072-37ba-47ef-b34d-4d2da770afe3)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - af54a209-ee0b-4c7b-961a-d2565352172e)(content(Whitespace\" \ + 7c817c8f-ce88-4e4b-b96a-e26c7da1c387)(content(Whitespace\" \ \")))))((Secondary((id \ - 5668d661-45f0-4cfc-bfb1-264fca05b8d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2b529252-636b-410b-8ff5-c917ee8e8b64)(label(fun \ + 64f3bd36-89a3-46b3-bc72-98972d735233)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f64f54c-d03a-4e99-b8e8-cf42d0043c9e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 64120593-aefa-4317-bd9d-7901b0b718dc)(content(Whitespace\" \ + 0286c456-4807-4a6f-91d4-10e73c6aa351)(content(Whitespace\" \ \"))))(Tile((id \ - 24182c8a-50a3-4da8-be1b-25521534c38f)(label(es))(mold((out \ + 075698c5-49d1-4818-a2a0-925e47ebb73c)(label(rs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - db377abb-9d27-4f80-aaee-29019fe3fbee)(content(Whitespace\" \ + 79fb8f75-8463-4067-bc1f-8a01459d9cd4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b6e75de0-9f67-4707-b9c0-c1728ae46b3b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 42e957de-23fb-4f1d-b783-5e0467dae1bb)(label(case \ + 055d2b42-baca-4a18-94a8-2dd4163c3cf9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4666bb19-2d4f-4d4e-acd4-3b375a5d357c)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 41b2af43-6a43-4d11-a81e-d9d17f4bbfd9)(content(Whitespace\" \ + 53c9f8b8-bc8b-4251-ba44-04c921e86785)(content(Whitespace\" \ \"))))(Tile((id \ - f8796638-2f86-4f8a-b536-31faba9bb8ac)(label(es))(mold((out \ + a21b674d-34f5-4d6d-9f85-144377e105c3)(label(rs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 31770179-3d0d-4744-81af-ca2b9883eab1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2c2de1f3-9f64-4731-b40b-2ae4c85c9487)(label(| =>))(mold((out \ + 36300ef2-f0a3-4e40-99de-9e3d54bfcfe0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7d884095-55c3-4b3c-add1-d24317fc7080)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e616366b-7709-4c52-9c3e-b4b841ec4de0)(content(Whitespace\" \ + 9a9b1e20-4bc2-496c-8619-b0a889a7aef8)(content(Whitespace\" \ \"))))(Tile((id \ - 26d3098a-59f8-4a5c-8b5c-e0fa8621fcbd)(label(Var))(mold((out \ + 262fd22c-29f4-48cc-9b52-e7176e683b94)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ef5324c2-ee25-4eeb-a37b-cfc90fcd42e0)(label(\"(\"\")\"))(mold((out \ + f8074977-f93a-463b-98e4-d69bfc55307b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 15ec3550-c2c7-4ea0-97c4-367815d9b5b7)(label(x))(mold((out \ + 9bb655c2-b54d-4741-a1ab-0addfd13c98f)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - cf5cc86d-6091-4092-99b1-2fe5cf19e552)(label(,))(mold((out \ + f9451c6a-d4bd-4b58-b077-397aaa290272)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 14))(sort \ Pat))((shape(Concave 14))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 583b25e8-f45f-40d9-b4c5-cb84f2061a99)(content(Whitespace\" \ + 6f3b3236-cdce-41a4-9232-0006322b7b57)(content(Whitespace\" \ \"))))(Tile((id \ - ec7b427c-4313-43f3-bf80-c847e66f65b6)(label(Var))(mold((out \ + e2d471ef-1c46-4a9c-a54a-fe1ef3cbb19b)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 257f3750-3762-4685-b1a6-6a6fa861007a)(label(\"(\"\")\"))(mold((out \ + 60028cb7-d928-4ee8-aa7b-9dc38e3a7e18)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8006ee75-37d1-4341-8dcf-5a7bcb32460e)(label(y))(mold((out \ + 3a1ad870-b7bc-43d0-b716-12cb9c23597d)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d57b3841-3010-4604-b2fc-c1f1d0aef0e8)(content(Whitespace\" \ + c50a22f8-4eb0-49cd-8144-2300c10e107a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 65d17c9e-a107-4192-9068-c0b205c0069a)(content(Whitespace\" \ + fbb838b6-e6e9-4dff-a09c-523e350c630d)(content(Whitespace\" \ \"))))(Tile((id \ - 7be050aa-cbc5-42cb-8922-53e6e6b12824)(label(x))(mold((out \ + 00557cb6-1130-4a7d-8368-3412f00d393d)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 318d3c65-2497-491f-96f7-cfe6394a8b79)(content(Whitespace\" \ - \"))))(Tile((id \ - 853da4a6-5aed-44d8-ab43-75333dd82023)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + ba4eb367-ef3f-4525-93f9-bfa92d9d7c97)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2502b290-8870-4d81-8f5d-76609e24860d)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + f484106b-41ee-4800-9a7a-a6a885e60b45)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cea85df5-b3bd-4017-a952-d64ad8459841)(content(Whitespace\" \ + 96e06e4d-be79-4633-a71a-a32b52a6153b)(content(Whitespace\" \ \"))))(Tile((id \ - e7c511c7-5050-44da-b175-da1e4ff92d52)(label(y))(mold((out \ + e4b1e526-e611-443f-b5aa-6be2f7aa6253)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4f3a5193-c3ac-4370-9c9e-c8df5a37167d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - eb08f193-8966-4277-bc08-9e79add2cde8)(label(| =>))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 73ddc6f1-7d14-4b25-9602-96415acda0e6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f5c67e0-4040-410e-92f6-62a141252bd0)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 09f89651-2b39-4c39-b0ca-b69b08429670)(content(Whitespace\" \ + ab885d68-e990-49bb-a610-a53b37d77456)(content(Whitespace\" \ \"))))(Tile((id \ - 81672889-56c2-48d7-b53e-bad5b4d1df31)(label(Lam))(mold((out \ + cfa1b087-0510-4b36-ac15-5a61f8aafa38)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e4c0cf87-1985-4aa9-b4be-8abb8278e176)(label(\"(\"\")\"))(mold((out \ + 74c5a935-852f-4da5-878c-887bc26c98e9)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ce2d28c7-d1d1-4ad5-909e-6421f2f39739)(label(x1))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b279ac2d-53a0-4899-a3e7-29e45637f1d3)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 54c7c5cc-5009-4243-baec-df198852f9e8)(content(Whitespace\" \ - \"))))(Tile((id \ - 64075130-f088-457a-82f6-ebe5d0be8451)(label(e1))(mold((out \ + 3ff6542d-a8bb-4716-99da-9367ecbd49a9)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - e094bdef-fc38-445e-92b7-a730961c8fdf)(label(,))(mold((out \ + 58f2f26d-e37e-41cd-b13f-8d7e74228172)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 14))(sort \ Pat))((shape(Concave 14))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e88a31af-6149-4000-b8e2-94f31e45d5fe)(content(Whitespace\" \ + 1e2b816e-7642-4f4e-b95f-adf12abbc8ae)(content(Whitespace\" \ \"))))(Tile((id \ - f1ce5a32-e138-43d5-8775-e6f75efe37d1)(label(Lam))(mold((out \ + 8416cd9f-2529-4db1-9035-20229b62df28)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c6bf010d-869d-4271-b2b7-828dd4f1b553)(label(\"(\"\")\"))(mold((out \ + dff4702f-08b6-447d-98c5-0f1fd993e456)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - bb0a3fd6-4dff-422b-bdf1-8460c7d43829)(label(x2))(mold((out \ + ace2fdc0-80dc-4300-97ea-843487707e22)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 21a5a76f-b56e-4eab-bc27-4365a8a5c5fe)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 987928b6-2cd7-4cd8-92c5-dca894fee268)(content(Whitespace\" \ + \"))))(Tile((id \ + 39426536-b6ae-4d23-b940-c09166c487f3)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + ddc21c27-b545-4704-9b83-73a54e7f97c5)(content(Whitespace\" \ + \"))))(Tile((id \ + b46541b7-7399-43b2-acee-ef0325e8909d)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 8))(sort \ + Exp))((shape(Concave 8))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c9a08e3b-dc53-4576-b101-94199ea10081)(content(Whitespace\" \ + \"))))(Tile((id \ + 4aae0476-095c-4045-843a-f7dd32925cdd)(label(e2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0606e959-ddcf-4d32-b61d-68b1bf791355)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 70cb209e-2fbd-4019-8a9c-f55ae2b12881)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + ea405901-ebf8-4432-9bc9-2ff5ee8500f1)(content(Whitespace\" \ + \"))))(Tile((id \ + bbc620b9-6f94-49ea-8ed2-4c7b6bb323ea)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 460c3b9c-9811-4fe0-a6a3-453ffaf1290e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e36568cc-f82c-438a-9b67-2098c7bfb269)(content(Whitespace\" \ + \"))))(Tile((id \ + 1c3d6b48-108a-431c-817f-138af3f8a50d)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + a61bcd07-c82b-4dd6-838f-f4d9762a0a2e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0e699793-d7c9-477d-834f-c62eb4458558)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e06c3270-8e19-4c45-8888-e9301f3629cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 88cd77a5-2e10-4d67-86dc-c0acddaf3a7f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1f1fecf6-bddb-4813-9c11-306183d4da10)(content(Comment\"# \ + Evaluation by substitution #\"))))(Secondary((id \ + 5ea9e27d-1731-4316-8506-fc45c5e70003)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5fb6f0e7-3581-4553-95f8-a84bd4161861)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 1af286e3-978a-4ff8-a94f-5f2891068195)(content(Whitespace\" \ + \"))))(Tile((id \ + e1e44354-cb44-4d2b-8560-e8ad5adb5dd3)(label(eval))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ea64a246-122f-41e6-8284-a7b00542c4de)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 6a6b2ec6-56a9-4ad4-8497-ae680f9b1118)(content(Whitespace\" \ + 25a60777-31c2-4b6b-b06d-cf6d67d61e3f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + b3f75514-9770-47c1-9545-9e19f15df048)(content(Whitespace\" \ + \"))))(Tile((id \ + 62603e3e-6bba-44d5-bc4a-206542a22f33)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4f14df0f-7731-4364-9efe-7a353e852f82)(content(Whitespace\" \ + \"))))(Tile((id \ + 202553fc-31fa-4c18-afc4-2ebca2469d9b)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 846d17c4-4bc7-44c0-8167-cb7b5f7338a9)(content(Whitespace\" \ + \"))))(Tile((id \ + fc4991bd-f326-428d-a8cc-44bd3c40b891)(label(Result))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 90e6f91f-19c9-4e74-9ece-c08e8cfdb26c)(content(Whitespace\" \ + \")))))((Secondary((id \ + 2916646c-3df4-49f6-86de-25e96dfaa42f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 070d68c0-e8a6-4ccc-80df-51fd8782e5e9)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 10982210-ebae-46dd-8fa5-34a0e418a12a)(content(Whitespace\" \ + \"))))(Tile((id \ + 083a4aba-2a8a-4bd0-a272-ac89effa0f9c)(label(e))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + e2da86a1-b62f-4be6-ad50-bf10dfe5e93c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f4abddd0-6c1e-4227-beba-dc836f87d938)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dc129b5a-7dc2-4b69-8c7f-28ba0e70a587)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 6c3d599d-67f7-4278-ace2-e76739314f6d)(content(Whitespace\" \ + \"))))(Tile((id \ + fbdd7d29-dde8-4fe5-944f-cb29f3309bf4)(label(e))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + e4b8056b-10eb-4155-a896-24716bd904a9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ac689c9a-3569-4419-8081-5276776f7435)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 4244d236-5133-45aa-8b62-20cca6dc5a77)(content(Whitespace\" \ \"))))(Tile((id \ - e17d1a0c-3041-4aae-8312-2164ad00b76a)(label(e2))(mold((out \ + cef34e10-3604-4ce6-910b-2fa21cd6d2f2)(label(Var))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 3cb54504-edb9-4812-be0f-bea0fdc875e0)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 3e8b501d-9a2e-4a7d-833d-89a526a5fb8c)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d3650922-ea7a-4f27-89d3-b919d15786be)(content(Whitespace\" \ + 191e6fef-b0be-4e08-a147-64ae2537fdf7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cd0e2d13-9e19-4cf8-b896-32cf152976ce)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c948dec9-9f62-48db-a69b-7c4734cb8e9a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8820244d-86e7-467b-b6ee-412309891bf5)(content(Whitespace\" \ - \"))))(Tile((id \ - 6ad0085e-1640-4bcc-966c-63535c4dcb4e)(label(x1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6a3c75e8-867f-43b4-af30-e3c33700b8ca)(content(Whitespace\" \ - \"))))(Tile((id \ - 98252b63-4ae7-4104-81db-be1b271d1b20)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - e85acee5-ac98-4fdb-9b7e-3da31e9a1cdb)(content(Whitespace\" \ - \"))))(Tile((id \ - 517d59c6-6e8a-48e6-9810-deff80d4837b)(label(x2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 64892ab9-5f46-41ec-83ec-830a3771bda2)(content(Whitespace\" \ - \"))))(Tile((id \ - 654196e6-5c40-464b-882e-f000185256ae)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 358e8514-a640-4e35-adc2-89e552b48f63)(content(Whitespace\" \ + 1de92859-2011-4c76-866f-c882d0c1cc38)(content(Whitespace\" \ \"))))(Tile((id \ - e7e712ff-e6a4-4736-a2a9-1051368e4621)(label(exp_equal))(mold((out \ + d00194a9-72cc-45ca-9c73-5d46869f610a)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - be1cd4d0-77ec-4b24-806a-d44ab9406dff)(label(\"(\"\")\"))(mold((out \ + c0a0ce90-81d8-4b09-ba8a-98934dd238bb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2b9171e1-b36a-4b4d-ba94-b1b383e3d876)(label(e1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee427415-9cbb-40bb-be41-483d6b055dde)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c2233df3-e617-438d-a3f3-9764587db421)(content(Whitespace\" \ - \"))))(Tile((id \ - c9f2177c-7b5b-458f-a2c8-f1e5e4b6e938)(label(e2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ + 17469555-3ef2-4223-81a3-3e09a59f7c61)(label(\"\\\"Free \ + Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 9350c7fe-fcd8-4395-b2a5-51f3b4bc28d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4565265b-2b39-4e9d-b8e5-4eac2118eaf5)(label(| =>))(mold((out \ + f5ae48cd-7b58-4b89-99d0-ae90a87cfba8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 28d4ec8f-4748-49f2-8af0-aed3a76b2701)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7982873e-6820-415f-a686-58b3b38f3af7)(content(Whitespace\" \ - \"))))(Tile((id \ - fc624d2e-62e9-42ea-a935-f0e009fffbc6)(label(Ap))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 39ebe962-9adf-45d0-8874-8bc30d5d4c9f)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - c3628f0d-0cb8-4954-a16a-e791d0f9a30f)(label(e1))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4cabbfa5-38b7-45e5-962d-6310e522dc2c)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 9c108b07-27cd-4d7e-b2e4-6ae975db2eb9)(content(Whitespace\" \ - \"))))(Tile((id \ - 7e8c0903-e399-43b6-ba2c-f014879fc966)(label(e2))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - ad3766ab-7abe-4e5a-b44f-9a9cb6badf3b)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 3170e2a0-ebdc-4b38-b2b7-a09434ec3f1c)(content(Whitespace\" \ + 52fc7222-801f-4ff1-9367-4021e1a8cc1f)(content(Whitespace\" \ \"))))(Tile((id \ - 545a9cc8-240b-4267-adc8-0b2bbfe70a91)(label(Ap))(mold((out \ + 82301ff9-b986-49ee-a14d-eed128b05b7b)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dbc20a7c-0050-4672-bd5b-b298221a315d)(label(\"(\"\")\"))(mold((out \ + 13384c5c-89b2-4e49-9c29-ff28cdb24c5f)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1a06a7c6-f321-428e-b28c-a4f24b3ab556)(label(e3))(mold((out \ + 2e67fc4b-20fb-48fd-aec5-5c5e6a3c9cf2)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ec1e7e19-8acc-4a77-8ef5-0b9907518462)(label(,))(mold((out \ + 117717d0-9155-4b0f-8082-a371cc2d3555)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 14))(sort \ Pat))((shape(Concave 14))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - bba30512-7bbc-4930-b198-d12e690a5b93)(content(Whitespace\" \ + 9ab8747c-aee4-46b5-855f-07d5c1188b32)(content(Whitespace\" \ \"))))(Tile((id \ - 0d36e488-3e41-46f9-a972-23750bcece8f)(label(e4))(mold((out \ + ce6325f6-7892-4116-acbf-aa92206a96b0)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 4b4d9e3e-ac05-4a5f-b08f-d5563460b5c7)(content(Whitespace\" \ + 89c70863-8308-4aee-9a98-28d74dd74526)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f282b2b5-5c36-472a-8375-d1a36a8649ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f3bd6390-5a54-48a1-9640-ccfa45160df0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7df542d2-05f3-4e21-8c5f-64955731be10)(content(Whitespace\" \ + d38b5a87-d86d-4461-8ee3-e4b504aea6ac)(content(Whitespace\" \ \"))))(Tile((id \ - f60edbaa-954f-42fe-b431-b9bcc014a9c6)(label(exp_equal))(mold((out \ + c0309d83-842f-4163-ba0c-00274c4c765a)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b1f04c3d-547f-44e7-8e7a-8a39c04667eb)(label(\"(\"\")\"))(mold((out \ + a168e86f-de75-4996-b05a-b76c84dc9c83)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 194d5a82-cc1f-4a18-8b5c-c61c904af17e)(label(e1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 75f2818f-2f9c-4049-878f-c81085700db4)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 7b3280d2-d974-4cf6-9bb0-516576217085)(content(Whitespace\" \ - \"))))(Tile((id \ - 4b4990b5-c883-44de-baa5-6298bdcd9c6c)(label(e3))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e67b82f1-96e5-4d33-b100-3bfe9707c8c6)(content(Whitespace\" \ - \"))))(Tile((id \ - bc816646-333d-45c6-87de-126307d9157f)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - cda90ee2-15a7-475b-a7b7-b58f95ac0541)(content(Whitespace\" \ - \"))))(Tile((id \ - c6cca4d7-4919-46de-8ffb-52071913367e)(label(exp_equal))(mold((out \ + 37b7507b-be1a-4d12-a966-9ad509579bca)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 46608290-3577-4831-b399-c80d5d767d86)(label(\"(\"\")\"))(mold((out \ + ae281f5e-25e5-4970-86f2-1ddbca9b48d9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cea40954-b0f5-4ea0-abdb-8f3a0a210bcd)(label(e2))(mold((out \ + f83349a9-1cb1-445b-9d8b-0cb26cf0b432)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d251e7a-9910-4012-9c61-96c776587f87)(label(,))(mold((out \ + 5315a959-83e9-4805-9bc4-dc227d30c63f)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ad817f3f-75bc-46fa-ab0a-86718ad8e04e)(content(Whitespace\" \ + 7a01c28d-bc24-4523-af0f-a19527a9d15e)(content(Whitespace\" \ \"))))(Tile((id \ - 2c9c3dcc-3d6c-463e-bcd7-fba48da6ecac)(label(e4))(mold((out \ + c658b71e-92ce-427a-99dd-d14e07d4b579)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a58fe0b7-4a35-4a50-97be-441d4274c616)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e7572e91-07c2-4d65-abca-dd76ec42dbbf)(label(| =>))(mold((out \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 2ce50808-b44c-435e-87f2-a277c5be92aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1380b225-c096-4d8e-a111-39f805c15707)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c7d795b0-3d34-4bde-aebd-a6712a065da1)(content(Whitespace\" \ + f0c7a241-6ee1-4097-bdd8-d39550de3ad8)(content(Whitespace\" \ \"))))(Tile((id \ - 68ab1574-8fff-4c61-b8dd-81e4b42bfad5)(label(_))(mold((out \ + d41bc9fb-4280-4c3a-86fe-724f87ca056c)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6ee1936d-6b0e-4790-b4fa-a3ec667659a9)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 109c64f2-39ac-480c-b33e-96b08c515ffc)(content(Whitespace\" \ - \"))))(Tile((id \ - 215955f2-8a04-40c6-9f1f-14652d8f2637)(label(false))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16e0c010-73cd-4dac-ac53-2536fa7068ca)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 4f239c3f-102e-4227-9388-89983d93b887)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 8172db9a-32d5-4ceb-a908-3837509edd80)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d3329425-9616-473c-9f10-82c062d01611)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5ed2278f-50d0-4255-94cb-f201169e5a88)(content(Comment\"# \ - Substitute Exp v for variable name in Exp e \ - #\"))))(Secondary((id \ - fdf34800-63c7-4baa-a41e-ec2517696344)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 980a0de3-6dc8-466c-9fc5-57c0161c32ed)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 968f19d7-ca3c-4318-a56c-ddaded903c52)(content(Whitespace\" \ - \"))))(Tile((id \ - a5a4093b-3f2f-4543-a9e6-d915edb78d16)(label(subst))(mold((out \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + b63a9734-7644-4072-a5bb-d8b2397a7dd8)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 2aa0a5e0-c746-4ee7-af22-61de73933464)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bf012f47-7904-4b04-b435-261c6898a74f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 292ae481-93fe-4e75-b4d1-85a12c13d583)(content(Whitespace\" \ - \"))))(Tile((id \ - 365f62b2-81b6-4a77-aa1a-c14fafc129f1)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 54243b79-d02b-4ca1-a5ea-b6136ac1bba8)(label(Exp))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 15ef7894-18f2-4632-8549-55d65bd68d5e)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 04d28679-49cd-4169-90ac-3ba15295a145)(content(Whitespace\" \ - \"))))(Tile((id \ - 61e87e55-f097-4946-a07e-9608191e9e8d)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - fbbe13a3-aa6d-4dd8-b425-66d31fa6ab5c)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 76d1a094-2cfc-4b1b-8491-faa073126a50)(content(Whitespace\" \ - \"))))(Tile((id \ - 11012759-a911-472b-92c4-13c296f014dd)(label(Exp))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + b1308751-e597-4f83-8bdd-f11a6cd7c646)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + df669107-279b-4daa-a84f-0749a93573c7)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 36c53e8b-58b4-4b29-90c7-bcd8283d021a)(content(Whitespace\" \ - \"))))(Tile((id \ - 337cc1de-7007-44a8-b7c0-e2d62dfe038d)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 2cbdefda-74b9-4e12-bb77-968981f48d24)(content(Whitespace\" \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 26880146-1ff6-4797-8c69-313cd096525b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 2fcf5303-c991-46fe-92b1-8dc91a89f05e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8067ba50-823f-4583-b983-fe007004442b)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + c2900d76-5805-4b52-b24f-2f09d3078093)(content(Whitespace\" \ \"))))(Tile((id \ - 6669c981-844e-4bdb-80e8-49f63a37c170)(label(Exp))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + 3b19a74d-4f02-4bb0-a68b-0f2b9459060a)(label(eval))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 0443a8d6-3210-49a2-bd1a-43350c73bc6f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 966493b6-5a35-434e-ae30-f28eaf26ac7a)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Typ))))))(shards(0))(children()))))((Secondary((id \ - c9570d59-780b-491a-84f6-f38720034df1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd3956e2-872a-48d0-b61b-49c9627f7da0)(label(fun \ - ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 18904f6e-8219-42b7-bc23-a52869c83453)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fb1b10f7-a7aa-4b2a-b1e1-868c9cf6700d)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d889bd03-eae8-466d-8ab2-6a37b228101b)(content(Whitespace\" \ + aef8a32d-571e-4aef-92fe-a133e61561df)(content(Whitespace\" \ \"))))(Tile((id \ - 6f2f5c27-b0c6-4d64-bec4-f59a3d62907e)(label(v))(mold((out \ + 1622c6b0-1aa1-4a9f-9ad1-0ee2f44e440c)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b1a377a9-9f1f-46ea-b9c8-4a735177c681)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 4e8b2929-daa4-4997-a50c-41215cd5dc97)(content(Whitespace\" \ - \"))))(Tile((id \ - c6e2f602-5f94-4779-9f7d-6150753e387d)(label(name))(mold((out \ + 53c740db-a127-4286-bbaa-fc1f6bfd897e)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 86981a7b-1855-493a-bb5b-bd50acbb393b)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - aa15bace-4f95-4777-ae5a-86efcb21d80b)(label(,))(mold((out \ + 5e484724-9f82-4027-82b8-3b9c2201e4bf)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 8b69eb6e-d632-45a7-84b8-c2f552f1cb2e)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 516a2ade-2d02-46f6-b79e-6f262e8774c8)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 14))(sort \ Pat))((shape(Concave 14))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 13bc3e73-cc08-426f-b842-8f326d5e06fd)(content(Whitespace\" \ + 94ecff3b-c7f6-47a8-88d5-26fbb6602902)(content(Whitespace\" \ \"))))(Tile((id \ - 70cea4ed-3f34-4564-b948-5b37698e0059)(label(e))(mold((out \ + 88490ba8-3f86-411b-a6e9-817f4f662690)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6fd33e5b-3792-4bb2-9d66-e7c7cfd82c09)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 90f64cae-e6b1-4c17-a7e8-f843bc7533d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 419ebed6-b5b2-4540-a431-3096df690104)(label(case \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ + 6ef6102d-78b5-418d-84e5-9349d627fbfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e35cd324-d16a-4d68-a97a-b6ca15cfe3f3)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7f57f5da-29d7-4afe-af81-9ba4cdb84290)(content(Whitespace\" \ + 446fdd16-d54b-4be9-9b0c-0d8eeafc0543)(content(Whitespace\" \ \"))))(Tile((id \ - 84bee910-aedb-4d4c-baff-a4571eabd806)(label(e))(mold((out \ + 2cd4a45a-528f-4945-998a-3c0b9cf9c2c6)(label(eval))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 75df8104-bdda-4020-aa34-461d8ef9a61c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f680450c-a013-4374-a0d9-3b7395b2d291)(label(| =>))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3c39677a-03f1-428f-b295-7a33f2fe9466)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 1aec83cb-0253-4eab-8bfc-73f5c6ddc33b)(label(e2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + b0b29140-8d63-441e-a576-1a3ab3f24521)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c15d05bf-8519-455a-b0be-d1b096b074df)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5ba10a8b-3767-4f49-ad59-b4d685b3e8d1)(content(Whitespace\" \ + 4d0f5b8e-1a10-409e-b434-2bdff88856df)(content(Whitespace\" \ \"))))(Tile((id \ - c85b62c4-519c-4ff6-b53d-084bfc4b3a4a)(label(Var))(mold((out \ + 136333af-71db-4b8f-bf85-bf623512b58b)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cbe676ad-d210-4614-a6f4-f1288961392a)(label(\"(\"\")\"))(mold((out \ + f0793b56-f2cb-4a53-823a-49dd57145a53)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - b3d931dd-62c9-49d1-9c23-57e51491e2fd)(label(n))(mold((out \ + 9456aff2-b841-41a0-b360-ba6adf6af864)(label(err))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 39dcfa1c-d518-4072-925b-5a857363d84a)(content(Whitespace\" \ + cb066a61-a29e-4636-9e26-a15ca426b0b5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 28da4de0-f438-42e7-8193-7123c709da52)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - de7081b2-0362-4667-be82-f6b027b192fd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 185f0a9a-db51-48ac-9671-7308af2566a6)(content(Whitespace\" \ + 4ee95925-905e-459a-8bb5-b39ec5767d45)(content(Whitespace\" \ \"))))(Tile((id \ - 94fb704e-4ce9-42e6-ae34-d1b88af3c424)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 3c2afa8d-cc20-4d23-a6fc-64fc225fe1c1)(label(Error))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 9e259835-32b3-4d25-b557-fd1b9308b451)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9298a278-bffd-4a4c-baf9-1aed6d1562dd)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 1b07d13e-1cc4-4476-b7aa-1d947539db97)(content(Whitespace\" \ + e6c214e7-1c90-4ac4-9d87-82c9c3f5f71e)(label(err))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + e2d4aebb-8638-43d4-a0a9-b7dfaf103905)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c79c0790-1bae-4fb9-8d15-28b090a7bc01)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 9c30c747-f0e7-4cc7-a456-7dfe67178cf9)(content(Whitespace\" \ \"))))(Tile((id \ - 18e2d5d1-c566-4eb6-85a9-8185ac89e46b)(label(n))(mold((out \ + 1ec5195e-9152-40f7-8116-ccc26b2c8209)(label(Ok))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 3ababe4d-2781-429f-98a9-f502d9dded33)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 49228f0b-a42b-4651-a72b-1517623527be)(label(arg))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + a42e030d-5e30-45ca-8417-58a64f6ff13c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 7b39247b-9eb3-4eae-b44f-90edd3df62f1)(content(Whitespace\" \ + \"))))(Tile((id \ + 0595a373-e5e2-4e31-a669-95d86097e70b)(label(eval))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3487f0ad-8f80-41de-905f-5c7681cab87f)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 82a478f5-4725-472b-a5dd-6cfe2e76f11c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + b6be841c-aaf7-4070-a3e5-a726db8865d9)(label(subst))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 144a7fbf-4378-46bb-89ac-79cb25a98c3f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + e30e8889-ff79-4ebd-8fbb-9402f15aa19b)(label(arg))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 7d914adc-3684-411e-af89-b4e8071ec029)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 1a41d8cd-22a5-40e7-844a-ab4a97c3bcfe)(content(Whitespace\" \ \"))))(Tile((id \ - 53fc5638-04b6-4552-82f6-17a089316a9c)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + a5480aef-5c47-4ace-b998-5be13ee9629b)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + a78fb2be-cb85-4ead-af7f-55cce846673f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 6bcb096a-7abc-451c-a5a9-ab38b4af844c)(content(Whitespace\" \ + \"))))(Tile((id \ + 079f72b2-aba6-494b-9058-3e20faa9d8e2)(label(body))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 13b45363-8f7a-4f40-8523-60c70ae7c46c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 83893eed-46bd-447e-b7bd-83d79a38dbb4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2d63cd2a-1308-4775-a9bf-061a4d2fea11)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 401c3082-3f59-414b-be4e-a13645eb647d)(content(Whitespace\" \ + \"))))(Tile((id \ + cb0c360a-dec4-4a40-a1aa-24869a58fc13)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 898f50b1-2368-4f52-a9c6-cd969565f49a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 9798505e-5af9-4e57-93c7-6f71648ff0c0)(content(Whitespace\" \ + \"))))(Tile((id \ + ef2d1259-52ef-4da0-94ec-570086258675)(label(Error))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 5aada76e-7e1f-4ca7-b2c6-8dd086becf92)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 01634b4c-d027-4844-9f86-dadd64218852)(label(\"\\\"Not a \ + Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + c9b5cbea-1cf6-464c-8cf4-0ed77a1e18f5)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3d67d23c-c9c3-4c4a-b56f-a16e505ce1a6)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + ff921f44-34e5-46e7-993c-6f7dff22bf38)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3fc86b20-6a2b-43b4-8034-94d052a0df3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 673e832f-5fc1-4af6-bc50-4cd857d08c52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f3613090-1dfd-4946-bbfd-3d652d389e93)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 3447e25a-ee47-4222-8bb1-828d0830b231)(content(Whitespace\" \ + \"))))(Tile((id \ + a0e96ed0-2f67-4271-904c-07744c73b7c6)(label(result_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 95ba3fae-6bf1-479a-b63a-6035111e0ebe)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + d846ac6d-a212-4661-a1ed-2bf31f39fd8f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 798271d1-e065-4eb1-8e4d-908ab5f140fe)(label(eval))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + adb0fce9-0053-4a86-8b79-6784f476c68b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + ca7069de-be87-454c-9b0c-3d643c480ed4)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + ff999918-31f2-4bfa-b172-5a905e962eba)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 607cbd1d-522a-40d0-bb3d-b8b45de732df)(label(\"\\\"yo\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Tile((id \ + 6e383875-6c3a-4f2c-a401-91ec7bc58276)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + aa7b31b1-3aef-45b3-ad22-0e5d7059a49e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f7b206f6-d2a5-480a-abc0-b9cacabb4689)(label(Error))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 8945a9d0-81eb-4b24-966f-a818217214ef)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 8794ac1c-4080-48ff-8840-6e796567dd87)(label(\"\\\"Free \ + Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 70900efe-dc3a-48d5-9f91-c70edcedaa33)(content(Whitespace\" \ + \")))))))))(Tile((id \ + e3c9daf5-57f5-47ef-9b24-a7e6d6936805)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + bad9600b-50a3-4377-8ac7-da71b362083c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a6e44360-03aa-490d-9e69-7783234649f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 64a486fe-c95c-4d78-862e-b0d2cc480928)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 931264d4-b6f4-4c62-92e1-0196ed942eb2)(content(Whitespace\" \ + \"))))(Tile((id \ + 1c9eda3f-b714-4c05-9c74-506bd14f6fb5)(label(result_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4cd76acd-9533-406c-ab10-13cd09fbfe12)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + afdaeff5-0984-4feb-9862-b326d63da2c0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 93745552-a939-4d1a-94a8-0b642e9da80b)(label(eval))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + e0aa7d92-c7cf-416d-98c2-737ed6338a36)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + ab486f19-c1ed-4a4b-9604-4be2afe0b0d4)(label(Ap))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + b233e5b7-65d7-4be3-af87-c80e69046876)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + f414241f-8fdc-40a3-a775-3d8b903ac358)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 395ceecd-3b18-4153-9800-e329c7a5598e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + b9ea6977-82ae-4e10-8f43-f3ebe314826e)(label(\"\\\"no\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + ec9c2830-8c19-4483-8b29-90f246a6067a)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 955e949d-0d06-4724-bd32-3869a60d1509)(content(Whitespace\" \ + 83f58d35-a260-4168-a7c9-ac3f29f9d5af)(content(Whitespace\" \ \"))))(Tile((id \ - 714480e4-4cc9-4f0a-bb16-fa5eddae8ba7)(label(name))(mold((out \ + 7e9ce79a-243d-41bb-a607-18a5b570fc7a)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cff5290a-3b75-4adc-a07f-57162f45e70a)(content(Whitespace\" \ - \")))))((Secondary((id \ - fd1933b0-7135-44ad-9295-1cdff91a4700)(content(Whitespace\" \ - \"))))(Tile((id \ - f54eda3c-4175-4cdd-a22a-bd44d64754db)(label(v))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + c121d549-80c7-4b6b-aed9-f6652df7d1a9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 7b74c555-9efd-4351-8d0e-d6bd96f522c5)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 80942fdd-f28f-467c-be15-f40257293d0f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 59fe67c4-9e46-41da-80c5-94a08d421127)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + ed288520-0baa-4871-b514-49e06f702b9f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + aa546db0-cfa4-4049-8ade-00c91c2d9a55)(content(Whitespace\" \ \"))))(Tile((id \ - 053268f5-aa5f-47d4-bc35-7dd044c4d016)(label(e))(mold((out \ + cd5050cd-9f89-440b-a764-46510d8a918d)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + dd639cdd-c2ab-48d9-b7c1-bf7d1e5359e6)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 78ea24ff-db16-4799-941c-563b8f536566)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 48783eb9-b6b0-4995-98f9-9dea00a51ea6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 446ff674-42cd-4716-9ec5-caedd30229e1)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ + 65acf282-5b10-4c18-9d05-ccc5b7a17286)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + bbba711a-f484-4101-9aaf-286054cc8f2e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9fcc45ca-c64f-45d4-9ff7-13acf6aaaf73)(label(Error))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + a361013a-f8c8-4887-9a10-26b954165ab2)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2a3a4f6b-dc4f-47a2-abcd-10af0387e047)(label(\"\\\"Not a \ + Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 8cb6eac9-4e2a-44ea-aa95-e39f67531832)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 9bd804ee-2b9a-432d-a097-988afb9b59c2)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 18dcc81d-619c-4b42-af2e-4056040039d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bce6c1d2-113d-40e3-a191-b64c2935564d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6e8df04b-e852-4d0e-8f1d-fbc121575946)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 026fbda4-70e7-4982-966e-131e89f8b063)(content(Whitespace\" \ - \"))))(Tile((id \ - 970904cf-54f0-4476-949e-6bff04296230)(label(Lam))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1c58d46b-701f-4fdd-8122-3a8b6b717fd1)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8ee0764c-6ae1-4a7f-a43a-da8e9e2ef1ff)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 139f7e26-a096-45dc-b86c-b1759995e640)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 584fe536-95b9-467b-9d45-8ff79f932322)(content(Whitespace\" \ - \"))))(Tile((id \ - 44b651bc-58e2-4d0f-8fe7-f9f4ef2df975)(label(body))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d8b7e4b6-2830-4ae4-8765-ad8787599005)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - df1a1724-1680-4c13-86c4-cf1739d1f2f5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b12dc4f1-3584-4d70-9df4-56748637b5d9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 789ee2e2-b17f-46d2-a729-97747b3d3b3c)(content(Whitespace\" \ + edcaf4e5-eb6e-4180-8a6d-0cc69001dbc3)(content(Whitespace\" \ \"))))(Tile((id \ - eb31c313-cfaf-4a04-97be-5d02a39afa8e)(label(Lam))(mold((out \ + 27acf41b-ea89-4ff0-899c-8c3d9be0b3ba)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ebcd5284-9b96-4e09-9e05-1c856050c226)(label(\"(\"\")\"))(mold((out \ + d6debeb0-6fb3-4ab0-86cb-d4bb187c8c63)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + 4030662c-5407-4ffc-9c27-e4b3e8d5ccfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0ab33bc9-c61e-474c-bd64-1a4650e90b3d)(label(eval))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + be5d6f5f-2e9e-4c55-82e7-0f2950749625)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33d26cbb-f822-4b7d-a3a9-a76ae159a0c1)(label(x))(mold((out \ + 6ec85bf2-374e-4ad4-82c9-9394b268f779)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f688d2b2-b8c9-4203-ac30-acb9b78b218b)(label(,))(mold((out \ + b618b7e5-b03e-4014-b091-604e08e9eda0)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + f856cd2d-583e-4b89-80e4-77bfe5bafa3b)(label(\"\\\"yo\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 62e293ef-5518-40f7-8782-404f25940817)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 47729e37-9963-4286-9683-323f9b87bceb)(content(Whitespace\" \ + 04647702-4dbf-4851-a845-ef76cea684a8)(content(Whitespace\" \ \"))))(Tile((id \ - e5b9286e-a2d4-475c-bbc6-6a0ec96cfa1e)(label(subst))(mold((out \ + b75e01ef-ee6c-421c-8599-991fe24e1e13)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cec07007-77a6-4c7c-9ba7-4d851d46afab)(label(\"(\"\")\"))(mold((out \ + 002b0979-7e4e-4e55-964d-634f97797462)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cc33ccf8-2ba7-420b-b2c6-21aea451a89e)(label(v))(mold((out \ + 7566c730-a883-4559-aafd-36ea07e85266)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7d8a5934-f197-4252-a244-ab397fd8f6a5)(label(,))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ + 87489b74-6fea-4bb7-b188-cc0f293f1501)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - cc112f0c-4bf7-4662-917e-846de267fe34)(label(name))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 5f9cb66a-3c69-44fc-98f9-8d33c2242e62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 305c178a-7da5-485c-9212-97518172660b)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b02b84ec-218c-452a-bf1e-9617cef8490d)(label(,))(mold((out \ + b9c49a17-ddb8-4412-ab2d-e84a31674c1e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 6d928f5a-76ba-432f-84c9-8985bdfbae21)(label(Lam))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + dd04ac7f-c000-46e2-9346-68de5ccb2c37)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 09183f09-b197-4dab-9712-2ad6ec8053c1)(label(\"\\\"yo\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2bac98eb-578c-4187-8d5d-0e428872fabe)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ed7443d9-4404-44fd-a4e0-3f6559f33e82)(content(Whitespace\" \ + 2f510267-53e4-441f-8c4e-164a43cb1d76)(content(Whitespace\" \ \"))))(Tile((id \ - ddac8323-ba4e-4d64-b5cc-7e69c920435a)(label(body))(mold((out \ + 9f53f3e1-50c4-41f6-9e69-d60a4bac4562)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 37e690bc-a872-42fb-a204-ac507f930218)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + bfa62c97-6b4f-485c-91a5-f28b7d3429dc)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - a26fdd56-19a1-4583-96b1-b2e6f4dce75b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4a409d0b-c2f8-4b1c-b160-ff917085bf6e)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ + 4c3b2e45-d2b9-42a4-9096-00e583a9d66d)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 2fe2dd64-bbdc-483d-a33c-8607a5a74f99)(label(\";\"))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + ad91ebe7-fd4d-4455-bd38-c279a70de5d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 461d55f6-6f2e-457a-b986-ba720f4d3dd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ab21e019-9c01-4fa7-a20b-de67b02612f4)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - da613248-93ad-4ad8-8958-3b005c4c4629)(content(Whitespace\" \ - \"))))(Tile((id \ - de5333b3-77bf-44f1-a7b6-64378045d95c)(label(Ap))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b29c0da4-d842-4d39-93ea-68ad05af9261)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1e386e4c-0118-4aaa-a61b-7c459652561e)(label(e1))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ff5111c7-24e2-441c-ba22-b00b9570b868)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - a5e422b7-f453-4fb9-bf2e-d8fbb0f1fc19)(label(e2))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 2bb31630-3fbf-41d5-a19f-37006e884723)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 334192b2-d1f8-4e50-84a9-f63119f5ea66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5cdcd943-3223-4e31-a4c9-230ddd7cadbc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 04ea99ba-c0d4-4f96-8514-512d2679d38b)(content(Whitespace\" \ + fed3fa2c-11a4-4564-8eff-e7704b696268)(content(Whitespace\" \ \"))))(Tile((id \ - 6698f873-dfec-429f-aa2e-5b753a0e0b13)(label(Ap))(mold((out \ + 1fc38e53-5324-4b3b-8a05-04211a30616e)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fd041cbd-11e7-483f-9894-149d647575df)(label(\"(\"\")\"))(mold((out \ + e63a04ff-39de-4da8-af96-438a294a9c92)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + 22edf468-f96f-4297-bae1-f1db449a5712)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dd1f6a2a-39be-4937-9dca-ea18760871ce)(label(eval))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3ce8a7ac-fd0d-48ae-b434-59ee497324c1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9b6f0264-1a4e-436d-a922-f0325bc2e4db)(label(subst))(mold((out \ + 567af97e-40c4-4b66-b5c0-c7dde61131a2)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7a495fb0-7163-4e39-9013-81f4b1b49d70)(label(\"(\"\")\"))(mold((out \ + 3a8e1695-9c19-4860-be5a-b2bf92046582)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 54fc8758-e83a-451d-bb69-409eb19c6735)(label(v))(mold((out \ + 5c422f00-d26f-46d5-92b4-849556a6cffd)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c3e19a5a-f9b6-4f24-8f7b-64f099967f9f)(label(,))(mold((out \ + 2eeb6db0-38aa-4479-bcfe-197543180463)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 84ff238e-dcf0-4449-b9b7-8d1ecd08d65c)(label(\"\\\"yo\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 5eef209e-e9e3-46fd-a7d2-ee1d841fdfd1)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 71fca11a-3419-4757-b711-fdd18405d97c)(content(Whitespace\" \ + 627c15eb-037b-461e-a999-b5c720c0c27b)(content(Whitespace\" \ \"))))(Tile((id \ - a763abee-d9b7-45b1-8424-3ef1a0a271e5)(label(name))(mold((out \ + e329ba5b-ff65-4a54-bd79-11119d2456b3)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + e07b3d06-1fec-4d51-9424-4863f3d93d4d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + f029b961-fcc9-4f8b-899a-0e7fa1cf11d1)(label(\"\\\"yo\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Tile((id \ + 729a33c6-6475-485d-a8ae-d48ac1c2bf6c)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 87f21d69-952d-449f-84d7-1ee2ab05d40b)(content(Whitespace\" \ + \"))))(Tile((id \ + 075b586b-fb78-4d80-8704-b63a67e7cd3b)(label(Lam))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 94246c4e-444f-4b3e-bf20-fd2a13fc27ef)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 208a8991-100f-4cef-b433-eca8159ac882)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4faf4138-d473-4173-95a6-eea2542573f7)(label(,))(mold((out \ + 53653980-ea4f-40b8-9d29-d359d33fa7bf)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9e46b718-8343-46e5-8691-99218fd48457)(content(Whitespace\" \ + ae6269c2-ff33-4f78-83c0-cdf02b2cdc28)(content(Whitespace\" \ \"))))(Tile((id \ - 2a42a695-0600-4732-b130-fdb906e39384)(label(e1))(mold((out \ + 5d26a17d-feb7-4d81-b23c-d80ae50d9dd6)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9346f2a0-c777-409b-91ae-ac99409e69dd)(label(,))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 71b62601-4be1-4205-8377-9ea8c5bd26c5)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + ed958ead-78f6-4f5a-bd6c-94d57f8393f7)(label(\"\\\"bro\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ + 15383e63-cf89-4209-a0bf-6c3d86d862d6)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 175d0889-9c8a-40ce-a0d3-9e16bd3e343a)(content(Whitespace\" \ - \"))))(Tile((id \ - 0c57d2e8-6a01-4794-9165-25cbc0175a5e)(label(subst))(mold((out \ + fd335c92-161b-4e37-988d-acfd90066a8e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0a5045cb-aada-489d-ab45-dbacd4fe44ed)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 05ee19ae-081d-4fb0-affb-ecad3fc03096)(label(\"(\"\")\"))(mold((out \ + aa0170f4-3445-4a3c-bfd6-9dd4bc5349ff)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7c14b792-807c-4156-af95-90f4cce11fba)(label(v))(mold((out \ + d68e6fef-70ce-4b20-b210-e41015a4027a)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3341286f-c3ba-4879-a6f4-24cc00343cee)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 80da2600-590e-496c-9670-31ea4bc2e302)(content(Whitespace\" \ - \"))))(Tile((id \ - 5a0ea697-f4c2-4fca-879b-a4b7ac213c8e)(label(name))(mold((out \ + cda0a2c8-1d02-4e25-ba06-7fb9900cab81)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 36f04861-35cc-4eb9-83d0-01085dcf7656)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2d9420c7-44dc-4781-8c4f-fabd96d95ad4)(label(,))(mold((out \ + e502a97c-aa0c-4e34-a1c9-9d86454fe1c5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7bf8c927-0575-470b-b3c5-a29a553b6830)(content(Whitespace\" \ + 62eb476d-c91c-4c67-bd46-be123833cbdf)(content(Whitespace\" \ \"))))(Tile((id \ - 5739b8d1-04a1-4835-8688-50bb5a0929dc)(label(e2))(mold((out \ + 1ff88e88-1e7c-4117-8cfa-6431b1c60b5e)(label(Var))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4e3e4ddd-946c-4afa-ad49-4dc4096d8f9d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + e9180871-be73-4a92-a949-010ae5b1a3f8)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - cf9ea30f-5bce-4d8f-bcf1-f47ab170f0a6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 140b4e40-9a69-4603-a8ff-f54f43833aea)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 83a2646d-03af-4380-950e-4ffbec2efecc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 60a803a0-45dd-4d26-9e50-9d41b42e060b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 55f117b1-90ee-4043-97a5-eaad60fbf8d8)(content(Comment\"# \ - Evaluation can result in either an Exp or an Error \ + Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ + 88a4c943-608e-454a-94ad-7dcc08046493)(content(Whitespace\" \ + \"))))))))))))(ancestors())))(caret Outer))"; + backup_text = + "# Lambda Calculus via evaluation by substitution #\n\n\ + # An Expression is a variable, function, or application #\n\ + type Exp =\n\ + + Var(String)\n\ + + Lam(String, Exp)\n\ + + Ap(Exp, Exp) in\n\n\ + # Syntatic Equality of Expressions #\n\ + let exp_equal: (Exp, Exp) -> Bool =\n\ + fun es ->\n\ + case es\n\ + | Var(x), Var(y) => x $== y\n\ + | Lam(x1, e1), Lam(x2, e2) =>\n\ + \ x1 $== x2 && exp_equal(e1, e2)\n\ + | Ap(e1, e2), Ap(e3, e4) =>\n\ + \ exp_equal(e1, e3) && exp_equal(e2, e4)\n\ + | _ => false end in\n\n\ + # Substitute Exp v for variable name in Exp e #\n\ + let subst: (Exp, String, Exp) -> Exp=\n\ + fun v, name, e ->\n\ + case e\n\ + | Var(n) =>\n\ + \ (if n $== name then v else e)\n\ + | Lam(x, body) =>\n\ + \ Lam(x, subst(v,name, body))\n\ + | Ap(e1,e2) =>\n\ + \ Ap(subst(v, name, e1), subst(v, name, e2)) end in\n\n\ + # Evaluation can result in either an Exp or an Error #\n\ + type Result =\n\ + + Error(String)\n\ + + Ok(Exp) \n\ + in\n\n\ + let result_equal: (Result, Result) -> Bool =\n\ + fun rs ->\n\ + case rs\n\ + | Ok(e1), Ok(e2) => exp_equal(e1, e2)\n\ + | Error(e1), Error(e2) => e1 $== e2\n\ + | _ => false end in\n\n\ + # Evaluation by substitution #\n\ + let eval: Exp -> Result =\n\ + fun e ->\n\ + case e\n\ + | Var(n) => Error(\"Free Variable\")\n\ + | Lam(x, body) => Ok(Lam(x, body))\n\ + | Ap(e1,e2) =>\n\ + case eval(e1)\n\ + | Ok(Lam(x, body))=>\n\ + case eval(e2)\n\ + | Error(err) => Error(err)\n\ + | Ok(arg) => eval(subst(arg, x, body)) end\n\ + | _ => Error(\"Not a Function\") end end in\n\n\ + test result_equal(\n\ + eval(Var(\"yo\")),\n\ + Error(\"Free Variable\")) end;\n\n\ + test result_equal(\n\ + eval(Ap(Var(\"no\"), Lam(\"bro\", Var(\"bro\")))),\n\ + Error(\"Not a Function\")) end;\n\n\ + test result_equal(\n\ + eval(Lam(\"yo\", Var(\"yo\"))),\n\ + Ok(Lam(\"yo\", Var(\"yo\")))) end;\n\n\ + test result_equal(\n\ + eval(Ap(Lam(\"yo\", Var(\"yo\")), Lam(\"bro\", Var(\"bro\")))),\n\ + Ok(Lam(\"bro\", Var(\"bro\")))) end"; + } ); + ( "Polymorphism", + { + zipper = + "((selection((focus Left)(content())(mode \ + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + ce06e01f-9b12-4ea1-8549-c5615ca7e52a)(content(Comment\"# \ + Polymorphism #\"))))(Secondary((id \ + 3b3f93ba-ca3c-4c1b-8346-2d68f5504958)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + abf1a875-4891-4386-8c1c-a77ad171a596)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e8268e68-25db-4119-aaf2-c1e01ab024a0)(content(Comment\"# We \ + can take types as parameters to type functions, \ #\"))))(Secondary((id \ - 75edeef0-b93a-4e52-8eb7-956406120f02)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d9758f2e-b154-4d74-9d8d-ddb629f96371)(label(type = \ - in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ + 70f57795-15c2-4826-b2d4-b1c2414b09fc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 28bfb176-1ada-450a-9a2e-9ee4f68b9271)(content(Comment\"# and \ + use them in annoatations in the body: #\"))))(Secondary((id \ + 6c16f965-ddc2-4208-8161-9d17a4f71e84)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dbc1d50f-0873-4a56-becd-184560be6a16)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e0f5968-053b-43c6-8ee7-f9e839b0d176)(content(Whitespace\" \ + 3265ecf6-f14c-4851-87bd-29b1c48ad60d)(content(Whitespace\" \ \"))))(Tile((id \ - 0ee7d546-e23e-4b2c-808e-01af4f749706)(label(Result))(mold((out \ + 2f057ddc-b7b4-4a90-8772-0f54a9e6a0f1)(label(id))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 9e9a0675-cf88-464e-a5b2-22ec197d871a)(content(Whitespace\" \ + \")))))((Secondary((id \ + 7c246b01-e879-4704-ab40-1ad600b6a05d)(content(Whitespace\" \ + \"))))(Tile((id \ + 357bc39e-7763-4d16-856a-30f2fdb89cd2)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + f9f6be49-c063-4799-a630-a15c13dc2416)(content(Whitespace\" \ + \"))))(Tile((id \ + d45a8f80-0658-42a7-bff7-6bfbf36e910d)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - bd8a61cf-b940-40b0-9fbd-c698a60e9df6)(content(Whitespace\" \ - \")))))((Secondary((id \ - 8a5beda5-5224-4e5c-8dc0-79e6db7f1fd3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 91cccf23-4d44-46e7-a81e-a046a2566144)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 24bf5ab5-af15-4566-9884-a2061fb39d79)(content(Whitespace\" \ + 9f37693a-1d0d-4720-a547-0bde3a0cf043)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0f5c9f28-98cf-4704-be01-3789b89325ad)(content(Whitespace\" \ \"))))(Tile((id \ - 4d58cbe8-1f96-4129-a6bc-5fa73566b2cf)(label(Error))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a9b509d2-8f56-48d1-8e5f-3fdafc9415e5)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 9f7a0898-680d-4868-a84c-5bb556f1612c)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 689974ef-89e4-498f-bd4e-34a6720427d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52b2d13f-c806-4877-84fe-6d32ab1182b6)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + c41ee313-ae0d-46e3-8763-3c0003823bf6)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 5a50ead3-2382-4702-8edc-82df727a9f98)(content(Whitespace\" \ + \"))))(Tile((id \ + 95012d29-d892-46f6-9d41-9d5b6a1991ea)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 8134e2f9-624a-43ff-9e7e-f4f2fb3c44db)(content(Whitespace\" \ + \"))))(Tile((id \ + e9602009-d959-44c3-bae1-2fcca11436e0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ecf58e9e-0efb-4e01-ae05-1fe9b21d03b3)(content(Whitespace\" \ + d8b777e0-ebea-423b-99cd-6777245529d4)(content(Whitespace\" \ \"))))(Tile((id \ - afce6860-9293-4f8e-9ef7-dd0c60ca95ab)(label(Ok))(mold((out \ + 1e025399-f3a3-40e9-b623-4269d2b4ee01)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - aea698dd-d63d-4fe2-9fcf-7f224c41a59c)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 40472e30-a169-465e-af55-751ecf617aa0)(label(Exp))(mold((out \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 89d852f5-e16c-4b7c-af4b-064b73a7d0b0)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 56b281c4-857e-4223-b818-b33e503e6340)(content(Whitespace\" \ + \"))))(Tile((id \ + fc41c74e-bd60-4cf6-8400-aa6cd0b485d2)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b4b1ea56-6958-44fc-89bd-b6f22e6bade3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 5c77f088-a1f3-4ba8-b7ef-efe73f27f855)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d7c28f98-90c1-46ca-9827-7fb78625c981)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a979ad79-2705-4ca1-9cf2-cccfec5e0086)(content(Comment\"# Such \ + functions are applied like so: #\"))))(Secondary((id \ + 5c84aefa-4652-4c4c-89ff-f05f4da85b58)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2e888173-4ece-4010-a674-13a32957493e)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 32c1835b-c27f-4ccf-be61-a270b6e9c5ba)(content(Whitespace\" \ + \"))))(Tile((id \ + 1c2ef7e4-4439-4110-976e-41a1e8ff3d6b)(label(ex1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 859ef193-f93b-4ae5-b070-4731bf77bc97)(content(Whitespace\" \ + \")))))((Secondary((id \ + ddb1f2b6-3fe6-4079-a75d-dcaebe48bc6f)(content(Whitespace\" \ + \"))))(Tile((id \ + 8439b029-0b7c-47cb-9867-c4c16ed4e733)(label(id))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + c5fe892a-4d64-4346-95bd-056a11c3f7ad)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 7079f97d-6950-4fd4-b76e-f6924cd0ed7e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 35b79c01-e4db-4671-a26a-ec0a7933c24f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 83c93244-e705-4189-a816-70dd13a963ec)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 2cf73080-004a-4f90-b789-9221717f6081)(content(Whitespace\" \ - \"))))(Secondary((id \ - b27f5376-58b7-4974-beaf-4de3558d93bf)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 7e153b1d-8ee5-4f89-a01a-1242f0565511)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 5d0ec35e-42f0-41e6-810c-b4163164e51e)(content(Whitespace\" \ \"))))(Secondary((id \ - f43fd6da-318e-4965-a2a5-42ed801cc41f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 82677a8a-59a2-49cb-845a-3c3876b5b300)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4f966c26-0371-4ef8-a075-127d1f0321f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 621fd573-caa6-4583-87f9-b5825e167918)(label(let = \ + fdb7e231-ff3c-4d22-a8d2-308db57999e4)(content(Comment\"# 1 \ + #\"))))(Secondary((id \ + a4b7e97a-83dd-492f-ae20-a84b2a979e30)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8c74bef9-7177-4774-89aa-805787cf673f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7309f6e2-2d49-45af-b7c6-0ec75a57fc2b)(content(Comment\"# We \ + can annotate the type of a type function with a forall. \ + #\"))))(Secondary((id \ + 4fda5632-5de3-4c5d-b424-bf16d704f35a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d1ace50b-2196-477e-aeda-e84f61901017)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cfd16b5f-c56a-49a9-a7f2-44b0be14f475)(content(Whitespace\" \ + b1df318d-3e75-4630-8f19-d3cbc69bb8ee)(content(Whitespace\" \ \"))))(Tile((id \ - 8581c765-76a3-422c-9479-8eb2cf7c104a)(label(result_equal))(mold((out \ + 7a283681-40a7-483c-ab85-ab4916479faa)(label(const))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 125cc189-7080-41e8-a196-b7ab8ad54f77)(label(:))(mold((out \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 69a7673c-e766-4409-852e-03c46fbbbf56)(content(Whitespace\" \ + \"))))(Tile((id \ + f5115707-8100-478a-bf56-748777fdd0c3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 11))(sort \ Pat))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - db9bdbd0-7b2e-478c-bd6e-8f8b5c508ecc)(content(Whitespace\" \ + 8bc19b04-eb77-4c2a-9668-4350e26a309d)(content(Whitespace\" \ \"))))(Tile((id \ - 1041388d-9c06-4d8a-a535-05b540bff54d)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2ed6f843-67da-461a-80ca-5d01c34c12c5)(label(Result))(mold((out \ + a7889e83-9fe8-49ad-9bef-44e8ce448a64)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + f70ea1f6-288e-407f-8594-1736b20cce67)(content(Whitespace\" \ + \"))))(Tile((id \ + 57bed8d9-e4fb-47da-b21b-fe51fb8ee9e6)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 48e84944-6794-4ec4-9809-f8c9689fd797)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0d8e46dc-456d-471e-9387-04fe16526ad6)(content(Whitespace\" \ + \"))))(Tile((id \ + 913ff727-11a1-4e0d-83fc-99e4de6e34f3)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + fea1b479-fbd8-4564-8a3a-93e7e3d5374b)(content(Whitespace\" \ + \"))))(Tile((id \ + d97d38b4-0e17-4bb8-b342-50937dff5896)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + e43565a7-cbb9-45aa-ab46-5cda424a47c5)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f9ead65c-4436-4958-898c-a7ed360b5b46)(content(Whitespace\" \ + \"))))(Tile((id \ + d6a5887c-ef92-4773-9429-919995401912)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a73ace3b-2a20-43c9-8697-861ce8173c07)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c5801121-b4f8-4751-bca0-6b48d487a7e6)(content(Whitespace\" \ + \"))))(Tile((id \ + a3f602fe-03e9-4b18-8c75-2699369b969e)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 320fb96f-b4ff-4d76-a951-a09df19091e0)(content(Whitespace\" \ + b59e20fa-3d31-411e-b242-a371c0e04d03)(content(Whitespace\" \ \"))))(Tile((id \ - cd4f3152-7c7f-4a71-be23-f9d7c0388c9d)(label(Result))(mold((out \ + 20b8244e-580b-450c-9cd2-db7cc09f9171)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a92c9445-e047-476f-a541-5edeeeb864ee)(content(Whitespace\" \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4e1ba90f-c253-4ea0-af95-d1fe89e671f6)(content(Whitespace\" \ \"))))(Tile((id \ - ca0ae608-6978-4d91-a8cf-9103dc0e87c6)(label(->))(mold((out \ + 3263d74a-307a-4e5d-afc3-74a9344f4b0d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6b67160f-a805-4eab-a904-5786bc35aa7d)(content(Whitespace\" \ + b3466ca7-a0f4-4aa2-a5a3-f9d1646f5033)(content(Whitespace\" \ \"))))(Tile((id \ - cbd87072-37ba-47ef-b34d-4d2da770afe3)(label(Bool))(mold((out \ + 0c0fa783-0e0e-4c53-9dc6-ae591f4c9649)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7c817c8f-ce88-4e4b-b96a-e26c7da1c387)(content(Whitespace\" \ + b5d049f6-643b-4a28-b9d0-8ebacdca3665)(content(Whitespace\" \ \")))))((Secondary((id \ - 64f3bd36-89a3-46b3-bc72-98972d735233)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f64f54c-d03a-4e99-b8e8-cf42d0043c9e)(label(fun \ + 4cf96db7-3321-47be-bbc0-7c6df9c84aac)(content(Whitespace\" \ + \"))))(Secondary((id \ + 26600e0d-d6eb-40b6-9357-12b948bb85f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1992686c-e8b9-4473-a1ae-d2c08a08bd83)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + a13a91a2-4077-4cc3-9f3d-574983bc9b3a)(content(Whitespace\" \ + \"))))(Tile((id \ + 4a3d43e1-6d91-48f8-941f-fc2caa196468)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + c26137e3-a766-4717-a269-2ba155800b8a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 96004d3c-f493-4c07-bd6f-e717bd487554)(content(Whitespace\" \ + \"))))(Tile((id \ + ece966f5-4bfa-4f08-99ce-0a1f41c64f48)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + d9a1daf2-50e7-413b-9254-395a44586281)(content(Whitespace\" \ + \"))))(Tile((id \ + f5d75275-fa16-42f3-ad3c-6c422427c84e)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + da14e1ca-0903-4b7a-9f3d-e4d64ca651ed)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3154b641-f630-4c85-a591-78d0ea4c6aa4)(content(Whitespace\" \ + \"))))(Tile((id \ + 4b5a8664-1772-4700-bad2-4b186a35dc5a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0286c456-4807-4a6f-91d4-10e73c6aa351)(content(Whitespace\" \ + 5f4ee7eb-858b-4375-8bae-ecb4688adca7)(content(Whitespace\" \ \"))))(Tile((id \ - 075698c5-49d1-4818-a2a0-925e47ebb73c)(label(rs))(mold((out \ + 4cb9bfb4-56f0-47a1-b6be-9f0a16c98e9d)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 79fb8f75-8463-4067-bc1f-8a01459d9cd4)(content(Whitespace\" \ + 586ac15a-3af8-4b3f-99b0-0446efd5bd1c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 055d2b42-baca-4a18-94a8-2dd4163c3cf9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4666bb19-2d4f-4d4e-acd4-3b375a5d357c)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 53c9f8b8-bc8b-4251-ba44-04c921e86785)(content(Whitespace\" \ + 5b0b25b1-b94b-45f8-9a89-3e9fe8cd1222)(content(Whitespace\" \ \"))))(Tile((id \ - a21b674d-34f5-4d6d-9f85-144377e105c3)(label(rs))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 36300ef2-f0a3-4e40-99de-9e3d54bfcfe0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7d884095-55c3-4b3c-add1-d24317fc7080)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + b1f6c96a-f3a7-43ea-b304-acf5a99b5d95)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9a9b1e20-4bc2-496c-8619-b0a889a7aef8)(content(Whitespace\" \ + 3cf3fd73-b0f4-4e68-8324-41f2c1a34db5)(content(Whitespace\" \ \"))))(Tile((id \ - 262fd22c-29f4-48cc-9b52-e7176e683b94)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f8074977-f93a-463b-98e4-d69bfc55307b)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9bb655c2-b54d-4741-a1ab-0addfd13c98f)(label(e1))(mold((out \ + 0d9b9fbe-2609-4aeb-894a-e4d883971862)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - f9451c6a-d4bd-4b58-b077-397aaa290272)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 6f3b3236-cdce-41a4-9232-0006322b7b57)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + f9eacdec-ff0f-487f-b4e7-016b5eee0516)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 6dc0f10f-31b0-47f2-876c-973a06e137a6)(content(Whitespace\" \ \"))))(Tile((id \ - e2d471ef-1c46-4a9c-a54a-fe1ef3cbb19b)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 60028cb7-d928-4ee8-aa7b-9dc38e3a7e18)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3a1ad870-b7bc-43d0-b716-12cb9c23597d)(label(e2))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - c50a22f8-4eb0-49cd-8144-2300c10e107a)(content(Whitespace\" \ + 84678463-bd3d-495b-8787-5e15e9f2fb76)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 6b03a744-056f-4464-a52c-a0152aaa7165)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fbb838b6-e6e9-4dff-a09c-523e350c630d)(content(Whitespace\" \ + 378239c7-2535-4a78-8fb0-8d19433db26b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f686ce31-58f6-4e46-9c6c-7ee24a13619b)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 89f204f3-4bc8-4dc3-a31c-9e5d99cb1242)(content(Whitespace\" \ \"))))(Tile((id \ - 00557cb6-1130-4a7d-8368-3412f00d393d)(label(exp_equal))(mold((out \ + c0fd6ffc-1cb2-4d82-a6b4-798bc6251af7)(label(ex2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 85333d35-a563-44eb-8102-a64226fc9c37)(content(Whitespace\" \ + \")))))((Secondary((id \ + 20d23ebb-f489-4103-a55f-0c6024c82896)(content(Whitespace\" \ + \"))))(Tile((id \ + 2e160900-ad22-4eb4-93f9-499a2179dc8d)(label(const))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ba4eb367-ef3f-4525-93f9-bfa92d9d7c97)(label(\"(\"\")\"))(mold((out \ + b64dd6ef-3a63-40ca-a9b3-85453bf6649f)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + c45a9241-5e40-42bb-9738-16984f9cced5)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 6bb9e3d9-9127-4b3e-b129-63e461202adb)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2fa8b7dd-6963-4688-a0d3-c4ea84e886dd)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 137358f3-a48c-4169-a855-495f7fb95ba4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2502b290-8870-4d81-8f5d-76609e24860d)(label(e1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f484106b-41ee-4800-9a7a-a6a885e60b45)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 96e06e4d-be79-4633-a71a-a32b52a6153b)(content(Whitespace\" \ - \"))))(Tile((id \ - e4b1e526-e611-443f-b5aa-6be2f7aa6253)(label(e2))(mold((out \ + 36d3b274-ad9b-4057-aa23-b0481d7c6a59)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 42a0f2f0-96bd-4896-960f-2c5e623c5af1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + f282d501-c0bd-434e-873e-30b7e520cf20)(label(\"\\\"Hello \ + World\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 73ddc6f1-7d14-4b25-9602-96415acda0e6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f5c67e0-4040-410e-92f6-62a141252bd0)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - ab885d68-e990-49bb-a610-a53b37d77456)(content(Whitespace\" \ + 084144f9-6c79-422a-96d8-1ab0db271dde)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + b7c097ca-897c-4549-85b1-a3aa34bd3e48)(content(Whitespace\" \ + \"))))(Secondary((id \ + 17b2ff69-f022-4365-9611-19e153ab3510)(content(Comment\"# 2 \ + #\"))))(Secondary((id \ + 8e6a1044-6ea7-481f-b35c-f5dc277406e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d9204a7d-8903-426c-a2a3-e298948f6645)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 93e3db1d-a91f-4b86-9085-4907952180d9)(content(Comment\"# We \ + can go beyond rank 1 polymorphism: #\"))))(Secondary((id \ + b3a81efa-f007-4976-8864-f0a563e7efd7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5a144dcf-d9f2-402d-9556-b6e8ee0647e5)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + a3f3a127-a472-431b-a04d-20dfb03fee37)(content(Whitespace\" \ \"))))(Tile((id \ - cfa1b087-0510-4b36-ac15-5a61f8aafa38)(label(Error))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 74c5a935-852f-4da5-878c-887bc26c98e9)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3ff6542d-a8bb-4716-99da-9367ecbd49a9)(label(e1))(mold((out \ + 7560359f-5145-4674-9e5d-0427f75cc171)(label(apply_both))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 58f2f26d-e37e-41cd-b13f-8d7e74228172)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 1e2b816e-7642-4f4e-b95f-adf12abbc8ae)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 2b179ba5-1578-439f-8899-d72c14f7780d)(content(Whitespace\" \ \"))))(Tile((id \ - 8416cd9f-2529-4db1-9035-20229b62df28)(label(Error))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dff4702f-08b6-447d-98c5-0f1fd993e456)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ace2fdc0-80dc-4300-97ea-843487707e22)(label(e2))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + 453fb383-28b8-466a-ba99-063b848e02c2)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 462a9b5f-e582-4d33-bbfa-791e557df360)(content(Whitespace\" \ + \"))))(Tile((id \ + 6c464286-72b3-49ad-b83f-571c66c1ade6)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 4885ff9c-656c-4cac-94d3-9946c87758d1)(content(Whitespace\" \ + \"))))(Tile((id \ + b1ef3819-7e49-4952-9b4d-4553df2c1b22)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 21a5a76f-b56e-4eab-bc27-4365a8a5c5fe)(content(Whitespace\" \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 699dc9bb-69ee-4f0d-8eb8-4d08ca395ac0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 987928b6-2cd7-4cd8-92c5-dca894fee268)(content(Whitespace\" \ + fb4c51ac-dd80-4b42-b18a-3460c39ba250)(content(Whitespace\" \ \"))))(Tile((id \ - 39426536-b6ae-4d23-b940-c09166c487f3)(label(e1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ddc21c27-b545-4704-9b83-73a54e7f97c5)(content(Whitespace\" \ + a3a5af75-2734-473b-a402-3339b5a5aed3)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 14b786ee-56d3-4868-9048-38d18607b3ed)(content(Whitespace\" \ \"))))(Tile((id \ - b46541b7-7399-43b2-acee-ef0325e8909d)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c9a08e3b-dc53-4576-b101-94199ea10081)(content(Whitespace\" \ + e3ad6862-da04-4d40-b14d-773a130d2a4f)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + c3613e98-7473-49d7-9dcb-9e35f7d7b10d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e4f9136f-ecd7-497c-989d-dd9ba87a3d11)(content(Whitespace\" \ \"))))(Tile((id \ - 4aae0476-095c-4045-843a-f7dd32925cdd)(label(e2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0606e959-ddcf-4d32-b61d-68b1bf791355)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 70cb209e-2fbd-4019-8a9c-f55ae2b12881)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 9f0b4530-be66-4001-ad6d-5008ade448f5)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + ebeb7669-44b8-433a-9944-dc027f8f7003)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - ea405901-ebf8-4432-9bc9-2ff5ee8500f1)(content(Whitespace\" \ + 37725f50-74ae-4651-a13a-489eddb08955)(content(Whitespace\" \ \"))))(Tile((id \ - bbc620b9-6f94-49ea-8ed2-4c7b6bb323ea)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 460c3b9c-9811-4fe0-a6a3-453ffaf1290e)(content(Whitespace\" \ + 20a12d27-d6b5-4514-ad6f-1e951c2d0391)(label(D))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + c70dd6ff-391d-4c7c-a73d-62b8af7a5c10)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e36568cc-f82c-438a-9b67-2098c7bfb269)(content(Whitespace\" \ + 084c5f67-3772-473b-8121-b5593490d98d)(content(Whitespace\" \ \"))))(Tile((id \ - 1c3d6b48-108a-431c-817f-138af3f8a50d)(label(false))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a61bcd07-c82b-4dd6-838f-f4d9762a0a2e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 0e699793-d7c9-477d-834f-c62eb4458558)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - e06c3270-8e19-4c45-8888-e9301f3629cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 88cd77a5-2e10-4d67-86dc-c0acddaf3a7f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1f1fecf6-bddb-4813-9c11-306183d4da10)(content(Comment\"# \ - Evaluation by substitution #\"))))(Secondary((id \ - 5ea9e27d-1731-4316-8506-fc45c5e70003)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5fb6f0e7-3581-4553-95f8-a84bd4161861)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 1af286e3-978a-4ff8-a94f-5f2891068195)(content(Whitespace\" \ + 374c499d-fbaf-4a2c-8e95-a8c4aab55992)(label(D))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 636bf99a-c682-4a09-9bc3-02abf03a2a95)(content(Whitespace\" \ \"))))(Tile((id \ - e1e44354-cb44-4d2b-8560-e8ad5adb5dd3)(label(eval))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 25a60777-31c2-4b6b-b06d-cf6d67d61e3f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 8f3851f6-33da-415b-82bc-8d7734089747)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b3f75514-9770-47c1-9545-9e19f15df048)(content(Whitespace\" \ + df4c4c83-a640-4b98-9992-cc466142b237)(content(Whitespace\" \ \"))))(Tile((id \ - 62603e3e-6bba-44d5-bc4a-206542a22f33)(label(Exp))(mold((out \ + bc020cbc-2bee-4d21-aada-486e4657ca1a)(label(D))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 80178c33-42d1-40a8-9f89-6cd7257cec81)(content(Whitespace\" \ + \"))))(Tile((id \ + c028b69c-8544-40ce-bd46-b370f61b6050)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c7feb1ec-8ee4-4a45-852c-61dab26295d1)(content(Whitespace\" \ + \"))))(Tile((id \ + 69097f40-c4b8-40fc-8c3f-83320bb1c7f7)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 9dfe9156-9cc5-4484-ad1b-6c2e1ba76e00)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4f14df0f-7731-4364-9efe-7a353e852f82)(content(Whitespace\" \ + 68821505-6886-4514-9cb7-ca680ef6f9fe)(content(Whitespace\" \ \"))))(Tile((id \ - 202553fc-31fa-4c18-afc4-2ebca2469d9b)(label(->))(mold((out \ + f0a182a8-44ea-4c80-b37e-26545127421e)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ee9e3c98-29c3-4191-96f7-d759ba9831d0)(content(Whitespace\" \ + \"))))(Tile((id \ + 03c0b912-b205-4ee3-83f4-20654cef76a4)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 704883ad-e1f1-4931-8c20-75137f6125bb)(content(Whitespace\" \ + \"))))(Tile((id \ + e57b4dfc-0ec1-4c60-9114-4db7ed161100)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 846d17c4-4bc7-44c0-8167-cb7b5f7338a9)(content(Whitespace\" \ + 12d67f9f-300d-47d2-9456-b46834577095)(content(Whitespace\" \ + \"))))(Tile((id \ + 8f554256-0ab9-4c84-a1c2-63596877e225)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + b9860364-7fb8-4a87-9813-2bd5178200fd)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 6e303e7d-fe77-4b6d-80eb-674991ecebb2)(content(Whitespace\" \ + \"))))(Tile((id \ + f6db9b79-e371-44cd-acf3-18fd4f06770b)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8bdca6d8-d33a-4c35-9f51-021fc98c298e)(content(Whitespace\" \ + \"))))(Tile((id \ + 4fb9e567-2954-4690-b71e-8cc92ca17d13)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 19eece83-ea6a-4e60-a5d6-4207048bc574)(content(Whitespace\" \ + \")))))((Secondary((id \ + 4b9fc364-d0a1-435e-a0d6-3a490349b143)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b8c143a9-c3ee-41ad-81d4-53d28c0c861c)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 2029fa53-3073-4967-87a8-b0869112189f)(content(Whitespace\" \ + \"))))(Tile((id \ + 454ea17c-4c69-456f-bf12-55d3e1142ab1)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 23c91397-4f7f-4121-8e3b-bbdb2cf73612)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 60524143-0ca7-4857-8f40-cf6deea6407d)(content(Whitespace\" \ + \"))))(Tile((id \ + 24999367-7d4d-4a2f-888a-01caf8064af4)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 697b85eb-ebaa-4da2-b3ff-f8784abce982)(content(Whitespace\" \ + \"))))(Tile((id \ + 9268bf3d-d2ad-45b8-a656-4c5fc7da9a8e)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + f7a80654-16be-46ef-84dc-cbbfe538eec1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4fac1b77-6181-4276-8df7-69ec0b498670)(content(Whitespace\" \ \"))))(Tile((id \ - fc4991bd-f326-428d-a8cc-44bd3c40b891)(label(Result))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 90e6f91f-19c9-4e74-9ece-c08e8cfdb26c)(content(Whitespace\" \ - \")))))((Secondary((id \ - 2916646c-3df4-49f6-86de-25e96dfaa42f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 070d68c0-e8a6-4ccc-80df-51fd8782e5e9)(label(fun \ + 14f05a85-9351-421d-8012-e644bee593b8)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 10982210-ebae-46dd-8fa5-34a0e418a12a)(content(Whitespace\" \ + ec293b56-ef71-4d52-80e8-1dbf69fedf52)(content(Whitespace\" \ \"))))(Tile((id \ - 083a4aba-2a8a-4bd0-a272-ac89effa0f9c)(label(e))(mold((out \ + b3b4e67e-ec31-48d0-99c8-1fd0b776e3f3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e2da86a1-b62f-4be6-ad50-bf10dfe5e93c)(content(Whitespace\" \ + 8e65f50b-e702-4a38-b590-d3a8aa14e619)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f4abddd0-6c1e-4227-beba-dc836f87d938)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dc129b5a-7dc2-4b69-8c7f-28ba0e70a587)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 6c3d599d-67f7-4278-ace2-e76739314f6d)(content(Whitespace\" \ + e2228bb4-f45a-4e38-aff2-f1a03def3d5e)(content(Whitespace\" \ \"))))(Tile((id \ - fbdd7d29-dde8-4fe5-944f-cb29f3309bf4)(label(e))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e4b8056b-10eb-4155-a896-24716bd904a9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ac689c9a-3569-4419-8081-5276776f7435)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 7359ea14-3040-402e-89dc-74daf4cb2482)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4244d236-5133-45aa-8b62-20cca6dc5a77)(content(Whitespace\" \ + 6023ad37-b805-415b-954e-30ac1380b014)(content(Whitespace\" \ \"))))(Tile((id \ - cef34e10-3604-4ce6-910b-2fa21cd6d2f2)(label(Var))(mold((out \ + 1528bbe3-9456-4d4e-92d7-43b29196f1a7)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + c2919cb1-233a-4283-8b66-cf44fc4afef9)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3cb54504-edb9-4812-be0f-bea0fdc875e0)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3e8b501d-9a2e-4a7d-833d-89a526a5fb8c)(label(n))(mold((out \ + 409eb345-2d10-4fa9-aa11-126678ce05bc)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 8a2cb8b6-9d5a-4754-8dda-8d8fe0e94e09)(content(Whitespace\" \ + \"))))(Tile((id \ + d0bd6124-c271-46ed-9371-5ff172659e12)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 191e6fef-b0be-4e08-a147-64ae2537fdf7)(content(Whitespace\" \ + 1ede3347-889a-421e-ab9f-9a76bb89b547)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1de92859-2011-4c76-866f-c882d0c1cc38)(content(Whitespace\" \ + 025702d6-85bb-4492-b77a-fcd80ce5b1d9)(content(Whitespace\" \ \"))))(Tile((id \ - d00194a9-72cc-45ca-9c73-5d46869f610a)(label(Error))(mold((out \ + 44d77c85-e077-410e-850c-ccc2c10fc818)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 22214cfb-eb83-4531-b73e-7aed1cbee876)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c0a0ce90-81d8-4b09-ba8a-98934dd238bb)(label(\"(\"\")\"))(mold((out \ + 38c3df7e-a52e-488b-8153-cc0a0e400c81)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 82ad7a3a-04a9-451b-aa97-19bc0c7ecb39)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + d315a9cd-9383-456f-a0d1-9b96b08aed99)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 17469555-3ef2-4223-81a3-3e09a59f7c61)(label(\"\\\"Free \ - Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f5ae48cd-7b58-4b89-99d0-ae90a87cfba8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 28d4ec8f-4748-49f2-8af0-aed3a76b2701)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 52fc7222-801f-4ff1-9367-4021e1a8cc1f)(content(Whitespace\" \ - \"))))(Tile((id \ - 82301ff9-b986-49ee-a14d-eed128b05b7b)(label(Lam))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 13384c5c-89b2-4e49-9c29-ff28cdb24c5f)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2e67fc4b-20fb-48fd-aec5-5c5e6a3c9cf2)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 117717d0-9155-4b0f-8082-a371cc2d3555)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 9ab8747c-aee4-46b5-855f-07d5c1188b32)(content(Whitespace\" \ + ffdcd079-0c86-4fb9-9a32-a6f10114522f)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + c343faf6-4aec-4789-a364-1c38747c0ede)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 972f8813-9085-4dcf-8f65-91f4ccfff5f6)(content(Whitespace\" \ \"))))(Tile((id \ - ce6325f6-7892-4116-acbf-aa92206a96b0)(label(body))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + ad7b36cb-7b61-4988-af73-1751a7f90e5a)(label(f))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 35f5379e-f09a-4416-8881-b3e555caa977)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 8c539c0f-b853-4aa4-98bf-874aa0d5487d)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 0d94b84a-aba2-4fdd-bbeb-c6e96990f257)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 6346a4a7-211a-4b7b-af7a-8d3980f344b6)(label(y))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 89c70863-8308-4aee-9a98-28d74dd74526)(content(Whitespace\" \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 1374a8af-7da6-432f-8448-bf31d19fa4a1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d38b5a87-d86d-4461-8ee3-e4b504aea6ac)(content(Whitespace\" \ + 4bad67e9-e3ec-4331-9db9-85eb4d51c10d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8ff64639-9a3a-4439-8dd4-a3e15280dd33)(content(Whitespace\" \ + \"))))(Secondary((id \ + 694712fd-f999-48ff-93c7-fc33b9b77094)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fef28f13-33fe-449b-8cdb-6ebfd5762e15)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + ac4c6231-9f82-4ade-b8c9-d91728bf8ad4)(content(Whitespace\" \ \"))))(Tile((id \ - c0309d83-842f-4163-ba0c-00274c4c765a)(label(Ok))(mold((out \ + 5de84be0-f611-4281-a794-7a0b0ff1118c)(label(ex3))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 3cb05235-9882-4486-b265-1cc2556c796f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 5d92ec2c-1d17-4c65-bca3-9f32260e8b3e)(content(Whitespace\" \ + \"))))(Tile((id \ + cf076596-5f1d-4628-8197-5a5fec90a125)(label(apply_both))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a168e86f-de75-4996-b05a-b76c84dc9c83)(label(\"(\"\")\"))(mold((out \ + e1f8fd16-f236-4fc9-bc9a-b9289a4112f5)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 09beab66-f457-4dad-8f46-8e195d6e5e65)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 98181850-6a50-4513-827b-4a9c90873912)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + cbf816ab-0f3a-47e0-8a6c-5d2394e0a427)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + f703fbc5-53b3-49db-8748-d10d150098c0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 37b7507b-be1a-4d12-a966-9ad509579bca)(label(Lam))(mold((out \ + 797110e6-521d-4cbb-9941-19fccd65f36a)(label(id))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ae281f5e-25e5-4970-86f2-1ddbca9b48d9)(label(\"(\"\")\"))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 51783bd8-663f-4e46-b00a-a0296c8cd7ac)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f83349a9-1cb1-445b-9d8b-0cb26cf0b432)(label(x))(mold((out \ + 8fc7176c-fa6c-4cd7-9245-83b8702a4428)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5315a959-83e9-4805-9bc4-dc227d30c63f)(label(,))(mold((out \ + 8116ef96-1cab-42f4-81de-213ecf812970)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7a01c28d-bc24-4523-af0f-a19527a9d15e)(content(Whitespace\" \ + 2f20f0f7-1675-4468-b2b6-cd7405f5aee4)(content(Whitespace\" \ \"))))(Tile((id \ - c658b71e-92ce-427a-99dd-d14e07d4b579)(label(body))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + 9f229a7b-bbad-4a9a-9e62-d9904862374c)(label(\"\\\"Hello \ + World\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 1906060c-28fe-4257-8be4-2fd05219ef29)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 63719044-8f1c-4920-ba4f-e4b2170077c4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 06d1fe4e-1834-48c0-ba2d-71886eefb57a)(content(Comment\"# (3, \ + \\\"Hello World\\\") #\"))))(Secondary((id \ + 9a45a5ec-c346-4ba0-b534-37ee71f5fdd1)(content(Whitespace\" \ + \"))))(Secondary((id \ + edef7a1c-2899-4e18-8228-c750ceff7ec8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b700ee2a-c5eb-4ee1-bbab-c4539ed9d797)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + df508fd5-afc8-4de6-8261-7425fd25105b)(content(Comment\"# \ + Finally, here is a more in-depth, yet applicable example: \ + polymorphic map #\"))))(Secondary((id \ + e354e9fe-f5ad-4c87-be05-96335dffbe31)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 202cef82-1c4d-4655-b6b6-41f9e9f7a73b)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 78570e13-c5ca-49d9-b93b-fd18ffc9a429)(content(Whitespace\" \ + \"))))(Tile((id \ + e91519e6-a65e-491f-b9a4-18b547b30d3a)(label(emptylist))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 7a1b5f10-90ae-48e0-b0f9-36ca4d2d3107)(content(Whitespace\" \ + \"))))(Tile((id \ + a72887db-4aaf-49cc-8e67-0f7541880f76)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ebfa5ee4-9fd0-4f8d-bc75-47444311729d)(content(Whitespace\" \ + \"))))(Tile((id \ + 592e5425-2459-41ff-9228-07f766f8ccf7)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 803a7b56-e0b3-4d80-ba8c-b65ff8517d93)(content(Whitespace\" \ + \"))))(Tile((id \ + 87240474-a39f-4923-85a5-2f102c7d0e32)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 2ce50808-b44c-435e-87f2-a277c5be92aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1380b225-c096-4d8e-a111-39f805c15707)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 6e4a8b34-2119-4f41-a61a-463ef0198a04)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + b1ab0026-aae9-4be9-b36d-eb3dd781adb1)(content(Whitespace\" \ + \"))))(Tile((id 8085a4f3-a54a-4666-9242-6184af5353c0)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 7559f86c-1c2c-4542-b97d-35f9fc803fe4)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + a7d1783a-03d9-4a83-a20c-224d0591481f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 8a9f101c-6584-44e7-99a3-e372048b7445)(content(Whitespace\" \ + \"))))(Tile((id \ + 68c3ed3d-f500-4bd3-bcaf-ea9bdf9451ae)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f0c7a241-6ee1-4097-bdd8-d39550de3ad8)(content(Whitespace\" \ + faa1695b-2e55-4667-8ec7-1558b3d85850)(content(Whitespace\" \ \"))))(Tile((id \ - d41bc9fb-4280-4c3a-86fe-724f87ca056c)(label(Ap))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b63a9734-7644-4072-a5bb-d8b2397a7dd8)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2aa0a5e0-c746-4ee7-af22-61de73933464)(label(e1))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b1308751-e597-4f83-8bdd-f11a6cd7c646)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - df669107-279b-4daa-a84f-0749a93573c7)(label(e2))(mold((out \ + 38b03267-319e-4664-8372-efcdd79e85f4)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 228c224a-afad-44f4-a22a-eddf73b8d974)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 5ca59d99-25f7-486d-ac51-f549cb0a91b3)(content(Whitespace\" \ + \"))))(Tile((id \ + 0981b8f1-b372-41ba-bf9d-9e13d779a5a3)(label([]))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 9c58a1b5-6df1-4868-a078-9ee9a15baa7c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e188133e-4924-4f2e-be27-fcf311628729)(content(Whitespace\" \ + \"))))(Secondary((id \ + ee875eb7-54d4-4f95-886b-c49fe80ef2be)(content(Comment\"# \ + polymorphic constant #\"))))(Secondary((id \ + dd6f9538-a844-49fd-a02a-ac3a01e89512)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + eccaa669-c774-4a4d-bfdf-fc6f85153e3c)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + aa9c739b-6bf6-49fd-bd3b-40f2f9017ae4)(content(Whitespace\" \ + \"))))(Tile((id \ + 0f2b46f6-0a6f-4c5c-8682-3f59ad4b751f)(label(map))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 37696633-3cee-49a1-b614-1f87c67e2b70)(content(Whitespace\" \ + \"))))(Tile((id \ + 0dfd3441-ca14-4837-8b6e-152899e6d301)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4215c01a-0f39-4671-8210-aff41079081d)(content(Whitespace\" \ + \"))))(Tile((id \ + 88c46e29-1562-41bb-8c58-3a70ca2b7337)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + c0d24d93-992b-40a9-8d3a-b16aa88a939c)(content(Whitespace\" \ + \"))))(Tile((id \ + 15ea1b72-ecb0-451c-91e5-e55c0283ff01)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 26880146-1ff6-4797-8c69-313cd096525b)(content(Whitespace\" \ + TPat))))))(shards(0))(children())))(Secondary((id \ + ecfd54e9-8baa-4a1c-8f98-5f8657ba550d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2fcf5303-c991-46fe-92b1-8dc91a89f05e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8067ba50-823f-4583-b983-fe007004442b)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 6fe8a5a8-f3af-4a76-b03a-7843dca9f959)(content(Whitespace\" \ + \"))))(Tile((id \ + 155d7295-5673-4c5a-87b8-68d3053df95a)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + d64b0ee3-fcce-40bb-976d-149ce33e0b05)(content(Whitespace\" \ + \"))))(Tile((id \ + 722893eb-79bf-4a75-9491-d5e696d80fe9)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 1fb2d0cc-1057-4c09-b0dc-eda66ca91edf)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + b491ae64-7e22-48fe-85f9-5c4c9fb6a864)(content(Whitespace\" \ + \"))))(Tile((id \ + 43465c96-ccf8-4251-aeb5-06f86e7a9ec0)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 8918e371-6bc8-4291-b8fc-92f0ac4afa4a)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 6164fe07-2c6f-4daf-9c3e-5ec6468e0c02)(content(Whitespace\" \ + \"))))(Tile((id \ + 8bc001b1-7710-4877-b8fd-6fb9eba7c39d)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 07510d7e-5ccc-46e7-9d96-456f01270a3e)(content(Whitespace\" \ + \"))))(Tile((id \ + a753c673-92ed-44c4-923b-8a95152174b2)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 523f8d85-4fe6-494d-8699-a5438e0b960e)(content(Whitespace\" \ + \"))))(Tile((id \ + 66564dc5-1126-45b1-96b5-6e591777773b)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a43abf64-f5d9-4b52-85ff-d962bc2408bf)(content(Whitespace\" \ + \"))))(Tile((id \ + a0be16ac-54d0-4529-b9e6-6347996157a3)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 28a5752a-c74f-432c-99b5-aa7539198b49)(label([ ]))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + f393e48d-68a3-446d-befb-87f27012a0e3)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 2e71f6dd-e285-47cf-b2a6-e1a4b9f45db3)(content(Whitespace\" \ + \"))))(Tile((id \ + e4f1cd33-3003-49be-98a4-ee4ad279b2b6)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 0950551e-141b-4a64-8297-21259177b3bb)(content(Whitespace\" \ + \"))))(Tile((id 3e01b2d4-90ac-441e-aa07-eee0abf36091)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + c72fce8d-fade-423e-965c-fec2b626373f)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ + e8f716f5-1b3f-4ee6-962e-4e078ce0bd37)(content(Whitespace\" \ + \")))))((Secondary((id \ + d067ebe8-0d92-451f-8093-5520bf5fb45d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 419f3418-e474-41c3-ad4c-3b22a8dd9a61)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0b4c829b-646e-4473-8d56-826d11fded2c)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + faaa1f96-c99c-4430-a432-32be33368118)(content(Whitespace\" \ + \"))))(Tile((id \ + 3167378f-47ff-4023-8c32-62977c64c1bc)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 9b40799d-499e-4cf0-b5e1-c77c9db980e2)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 17cd6904-a1de-419b-bc8b-551ae07e88df)(content(Whitespace\" \ + \"))))(Tile((id \ + a74f4763-dd86-4124-840a-ac14797d15fa)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 30a14f5e-ca39-4f7d-bfb0-03e3f6281c58)(content(Whitespace\" \ + \"))))(Tile((id \ + 58c4bb9f-8a30-480e-a52b-38df655f9164)(label(B))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + dfad2a33-2a2d-4df9-be18-2fe06e3548bb)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f9b87bc9-1128-4dec-bf0c-014baff77334)(content(Whitespace\" \ + \"))))(Tile((id \ + 1fde687f-dfdb-4b5a-a8cc-9e81d9e6b522)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c2900d76-5805-4b52-b24f-2f09d3078093)(content(Whitespace\" \ + dd314134-b69e-4426-b1a6-999a28f427fd)(content(Whitespace\" \ \"))))(Tile((id \ - 3b19a74d-4f02-4bb0-a68b-0f2b9459060a)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0443a8d6-3210-49a2-bd1a-43350c73bc6f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 966493b6-5a35-434e-ae30-f28eaf26ac7a)(label(e1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + ae115273-4b54-46ce-a192-10047fe9e951)(label(f))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 11aa5133-b04f-4100-a2e3-9695c08e4e09)(content(Whitespace\" \ + \"))))(Tile((id \ + 1cb85726-ab00-4149-8246-c9440cde31c3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + de0c889c-43ea-4f05-bf55-abf04c9d0d59)(content(Whitespace\" \ + \"))))(Tile((id \ + 4a5c3924-a66d-4067-8f6b-89ec8d7234ec)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + f2a159b3-e8b9-40ff-9f79-5ca041c21a77)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 2c18b0d4-9eb0-430d-b72d-6d8c6e21be1e)(content(Whitespace\" \ + \"))))(Tile((id \ + 00a6aaf9-db5a-4aa1-9c65-b0d933a7553f)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ce1cc890-5fe0-4bbc-a55e-ec4d56cc7ef7)(content(Whitespace\" \ + \"))))(Tile((id \ + 2fa7a2b3-bb79-497b-b83f-e203a3d0abe3)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 18904f6e-8219-42b7-bc23-a52869c83453)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fb1b10f7-a7aa-4b2a-b1e1-868c9cf6700d)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + ccad4dbb-bd06-4483-9828-276555d352de)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 336ec250-d844-403f-b23f-fa7753dc5068)(content(Whitespace\" \ + \"))))(Tile((id \ + 05929dbf-0f8d-4a96-83d1-3d993326c4e0)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - aef8a32d-571e-4aef-92fe-a133e61561df)(content(Whitespace\" \ + 8f63a82f-5f21-4948-8824-0346d46d1d46)(content(Whitespace\" \ \"))))(Tile((id \ - 1622c6b0-1aa1-4a9f-9ad1-0ee2f44e440c)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 53c740db-a127-4286-bbaa-fc1f6bfd897e)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 86981a7b-1855-493a-bb5b-bd50acbb393b)(label(Lam))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5e484724-9f82-4027-82b8-3b9c2201e4bf)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8b69eb6e-d632-45a7-84b8-c2f552f1cb2e)(label(x))(mold((out \ + 36ec28dd-5dfb-4745-9297-c026b99a54ed)(label(l))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 516a2ade-2d02-46f6-b79e-6f262e8774c8)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 94ecff3b-c7f6-47a8-88d5-26fbb6602902)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + ebeb2e6e-f6f2-4e00-b98a-640b41f05e5c)(content(Whitespace\" \ \"))))(Tile((id \ - 88490ba8-3f86-411b-a6e9-817f4f662690)(label(body))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + f4ad62e1-8361-4bcd-aaf7-b68fea88eac6)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 776f0b9d-1e87-45a8-b2a8-c51a6d7551f4)(content(Whitespace\" \ + \"))))(Tile((id 0f555e5d-4c58-49a6-a83f-a02000e3a9b9)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 0506c0fd-a136-45a0-9b58-8818281c6192)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ - 6ef6102d-78b5-418d-84e5-9349d627fbfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e35cd324-d16a-4d68-a97a-b6ca15cfe3f3)(label(case \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + fe663aa2-62a0-481c-8076-902ec6e80465)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + ac80020e-0679-444c-908a-664fd265d287)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0532ce74-b1fd-47cd-afd8-536a76b56eac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5cb54d04-1620-4898-b5ee-171a13a55cb2)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 446fdd16-d54b-4be9-9b0c-0d8eeafc0543)(content(Whitespace\" \ + 826841f4-cbf3-4158-a661-b7915909567d)(content(Whitespace\" \ \"))))(Tile((id \ - 2cd4a45a-528f-4945-998a-3c0b9cf9c2c6)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3c39677a-03f1-428f-b295-7a33f2fe9466)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1aec83cb-0253-4eab-8bfc-73f5c6ddc33b)(label(e2))(mold((out \ + f2738d6c-44d1-4477-9320-98664a2abebf)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b0b29140-8d63-441e-a576-1a3ab3f24521)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c15d05bf-8519-455a-b0be-d1b096b074df)(label(| =>))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0f7ec861-3dd7-48c7-bb98-1068d6018711)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 666f3305-9623-472a-a8e5-4a4821bdac0c)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4d0f5b8e-1a10-409e-b434-2bdff88856df)(content(Whitespace\" \ + d5a09c88-8fb8-4ea9-be8a-852be89e4f6c)(content(Whitespace\" \ \"))))(Tile((id \ - 136333af-71db-4b8f-bf85-bf623512b58b)(label(Error))(mold((out \ + 1417ddf8-e63c-463e-b541-e36920b01149)(label(h))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f0793b56-f2cb-4a53-823a-49dd57145a53)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9456aff2-b841-41a0-b360-ba6adf6af864)(label(err))(mold((out \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + d2e0fe19-dd90-445e-bd58-cf97d46d9b9a)(content(Whitespace\" \ + \"))))(Tile((id \ + ff3d12e2-c357-42a7-8f3e-a21c9fb9d451)(label(::))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 6))(sort \ + Pat))((shape(Concave 6))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 2a6b7167-756b-4d3d-9f07-98e53f430cca)(content(Whitespace\" \ + \"))))(Tile((id \ + ea24b8b4-1664-4b46-b9ad-c74d7bb8b2c4)(label(t))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - cb066a61-a29e-4636-9e26-a15ca426b0b5)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + dbf53a0c-d1df-4fcf-b833-2ca674b3118a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4ee95925-905e-459a-8bb5-b39ec5767d45)(content(Whitespace\" \ + e5b78a12-bf5c-41b7-a607-81db98a7709c)(content(Whitespace\" \ \"))))(Tile((id \ - 3c2afa8d-cc20-4d23-a6fc-64fc225fe1c1)(label(Error))(mold((out \ + bcb2ac89-9866-44b7-ac86-bfa367efb43e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9e259835-32b3-4d25-b557-fd1b9308b451)(label(\"(\"\")\"))(mold((out \ + 274061ca-2c5f-4cff-ab7f-e034d6165d6a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e6c214e7-1c90-4ac4-9d87-82c9c3f5f71e)(label(err))(mold((out \ + e1822bcd-8a53-428d-9568-08ce796791ba)(label(h))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e2d4aebb-8638-43d4-a0a9-b7dfaf103905)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c79c0790-1bae-4fb9-8d15-28b090a7bc01)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 9c30c747-f0e7-4cc7-a456-7dfe67178cf9)(content(Whitespace\" \ + 8261c12e-167c-4b97-b895-076b16cb8956)(content(Whitespace\" \ \"))))(Tile((id \ - 1ec5195e-9152-40f7-8116-ccc26b2c8209)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3ababe4d-2781-429f-98a9-f502d9dded33)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 49228f0b-a42b-4651-a72b-1517623527be)(label(arg))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - a42e030d-5e30-45ca-8417-58a64f6ff13c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 7b39247b-9eb3-4eae-b44f-90edd3df62f1)(content(Whitespace\" \ + 134da227-54ae-4138-bfd3-0ffd5bbb35bf)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + cde794e2-1514-4ee5-8722-b4d27751fc43)(content(Whitespace\" \ \"))))(Tile((id \ - 0595a373-e5e2-4e31-a669-95d86097e70b)(label(eval))(mold((out \ + 48901d44-b0e6-4948-90d0-99d20334c456)(label(map))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 82a478f5-4725-472b-a5dd-6cfe2e76f11c)(label(\"(\"\")\"))(mold((out \ + 5f38a51a-94ff-4f13-ba3b-312e507ab73a)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 7539694b-4e31-49a6-a32d-dbdf0a55ef35)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 7f4d954d-2861-4c11-bec6-fb759b5a0ffe)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + d67b39fa-c196-4262-9888-426de588572e)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + c51f52dc-b5ca-4bf4-a2ab-ed899b19cd24)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b6be841c-aaf7-4070-a3e5-a726db8865d9)(label(subst))(mold((out \ + af6d37cf-fc46-4007-90f3-60bce7e9157d)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 144a7fbf-4378-46bb-89ac-79cb25a98c3f)(label(\"(\"\")\"))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 3c421466-068a-48d3-8367-5e9ecffdb962)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e30e8889-ff79-4ebd-8fbb-9402f15aa19b)(label(arg))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7d914adc-3684-411e-af89-b4e8071ec029)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 1a41d8cd-22a5-40e7-844a-ab4a97c3bcfe)(content(Whitespace\" \ - \"))))(Tile((id \ - a5480aef-5c47-4ace-b998-5be13ee9629b)(label(x))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a78fb2be-cb85-4ead-af7f-55cce846673f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 6bcb096a-7abc-451c-a5a9-ab38b4af844c)(content(Whitespace\" \ - \"))))(Tile((id \ - 079f72b2-aba6-494b-9058-3e20faa9d8e2)(label(body))(mold((out \ + 33bdc742-e6a9-4f94-86c9-406c3aae5f29)(label(t))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 13b45363-8f7a-4f40-8523-60c70ae7c46c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 83893eed-46bd-447e-b7bd-83d79a38dbb4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2d63cd2a-1308-4775-a9bf-061a4d2fea11)(label(| =>))(mold((out \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + aa7f11a8-0790-4b02-8466-3a3a9aa0c628)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 977253f6-0679-49a0-a5ae-bf8804d4d272)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 401c3082-3f59-414b-be4e-a13645eb647d)(content(Whitespace\" \ + c4956a98-232b-45c1-8ba7-5730e460512e)(content(Whitespace\" \ \"))))(Tile((id \ - cb0c360a-dec4-4a40-a1aa-24869a58fc13)(label(_))(mold((out \ + 4460a1f9-8f3e-4c6e-8ef9-50d18ff587eb)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 898f50b1-2368-4f52-a9c6-cd969565f49a)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 9798505e-5af9-4e57-93c7-6f71648ff0c0)(content(Whitespace\" \ - \"))))(Tile((id \ - ef2d1259-52ef-4da0-94ec-570086258675)(label(Error))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5aada76e-7e1f-4ca7-b2c6-8dd086becf92)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 01634b4c-d027-4844-9f86-dadd64218852)(label(\"\\\"Not a \ - Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c9b5cbea-1cf6-464c-8cf4-0ed77a1e18f5)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 3d67d23c-c9c3-4c4a-b56f-a16e505ce1a6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - ff921f44-34e5-46e7-993c-6f7dff22bf38)(content(Whitespace\" \ + 762cb02f-c9a4-4913-91f6-c3e63c1cdf08)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3fc86b20-6a2b-43b4-8034-94d052a0df3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 673e832f-5fc1-4af6-bc50-4cd857d08c52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f3613090-1dfd-4946-bbfd-3d652d389e93)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 3447e25a-ee47-4222-8bb1-828d0830b231)(content(Whitespace\" \ + 44404719-7532-4ef8-a4e0-ef40b69eb8ac)(content(Whitespace\" \ \"))))(Tile((id \ - a0e96ed0-2f67-4271-904c-07744c73b7c6)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 95ba3fae-6bf1-479a-b63a-6035111e0ebe)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - d846ac6d-a212-4661-a1ed-2bf31f39fd8f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 798271d1-e065-4eb1-8e4d-908ab5f140fe)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - adb0fce9-0053-4a86-8b79-6784f476c68b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ca7069de-be87-454c-9b0c-3d643c480ed4)(label(Var))(mold((out \ + bbe24e20-53c7-49a7-83e9-65f8ba722e51)(label(emptylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ff999918-31f2-4bfa-b172-5a905e962eba)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 321a3266-20dc-4471-a74f-a95a466e7e31)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 607cbd1d-522a-40d0-bb3d-b8b45de732df)(label(\"\\\"yo\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + 6c978a1d-d8a2-4ca6-8a8f-1d35c5fd21d5)(label(B))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 6e383875-6c3a-4f2c-a401-91ec7bc58276)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - aa7b31b1-3aef-45b3-ad22-0e5d7059a49e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7b206f6-d2a5-480a-abc0-b9cacabb4689)(label(Error))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8945a9d0-81eb-4b24-966f-a818217214ef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8794ac1c-4080-48ff-8840-6e796567dd87)(label(\"\\\"Free \ - Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 70900efe-dc3a-48d5-9f91-c70edcedaa33)(content(Whitespace\" \ - \")))))))))(Tile((id \ - e3c9daf5-57f5-47ef-9b24-a7e6d6936805)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - bad9600b-50a3-4377-8ac7-da71b362083c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a6e44360-03aa-490d-9e69-7783234649f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 64a486fe-c95c-4d78-862e-b0d2cc480928)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 931264d4-b6f4-4c62-92e1-0196ed942eb2)(content(Whitespace\" \ - \"))))(Tile((id \ - 1c9eda3f-b714-4c05-9c74-506bd14f6fb5)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4cd76acd-9533-406c-ab10-13cd09fbfe12)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - afdaeff5-0984-4feb-9862-b326d63da2c0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 93745552-a939-4d1a-94a8-0b642e9da80b)(label(eval))(mold((out \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + d9bbddf3-7123-496d-ac83-8e7ceef5b6de)(content(Whitespace\" \ + \"))))(Secondary((id \ + 01684518-f444-4731-852b-69ef9a5d9b43)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 3edb8b70-1ae0-496b-ad02-eb3693fc8f56)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 36c28bc5-a5cf-4acc-985c-2c955c7d820e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 97de8089-37ac-4509-acc9-39012a0fdf3e)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 80d05981-1920-44d8-b42e-f18175935f70)(content(Whitespace\" \ + \"))))(Tile((id \ + 72ae731d-de2f-4ad8-a2d6-356bceae5577)(label(ex4))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 7028d808-2b29-4ca9-a4d3-1a5dacd93fa0)(content(Whitespace\" \ + \")))))((Secondary((id \ + 77fd1b46-bf93-4844-8f57-b111ba33d8d3)(content(Whitespace\" \ + \"))))(Tile((id \ + d18a0774-cfc4-4907-b460-b469053a3c0c)(label(map))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e0aa7d92-c7cf-416d-98c2-737ed6338a36)(label(\"(\"\")\"))(mold((out \ + 504e60fc-928d-4308-96ca-fd31df0da48a)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4f0f6316-3dd0-4479-bbd4-762b82b7c37e)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + 14993ad8-445e-45b3-b828-e4c0b43c834b)(label(@< >))(mold((out \ + Exp)(in_(Typ))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + e91f5e5f-40db-4039-86de-833746dfac39)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ + ddbda949-29b7-4b34-8f11-05ed3fcd6f01)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab486f19-c1ed-4a4b-9604-4be2afe0b0d4)(label(Ap))(mold((out \ + 6d6bee77-2fa1-478e-997c-3540a5e97174)(label(string_of_int))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b233e5b7-65d7-4be3-af87-c80e69046876)(label(\"(\"\")\"))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ + 42c0e873-c3f1-4106-80a6-a2ed60f806f5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f414241f-8fdc-40a3-a775-3d8b903ac358)(label(Var))(mold((out \ + 9cdabbd2-8198-4864-8f41-e855415362ea)(label([ ]))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 6484bcbc-b4cf-4c4c-b20f-7f554010051c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 395ceecd-3b18-4153-9800-e329c7a5598e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b9ea6977-82ae-4e10-8f43-f3ebe314826e)(label(\"\\\"no\\\"\"))(mold((out \ + 85ce0fb1-0fd5-4ec6-bd55-a32bf8920ff2)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 14))(sort \ + Exp))((shape(Concave 14))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + fc87be7f-7ae8-495d-9beb-8a214a49f71c)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - ec9c2830-8c19-4483-8b29-90f246a6067a)(label(,))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2dc60eb3-a968-4efd-9f71-36058601c0c7)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 83f58d35-a260-4168-a7c9-ac3f29f9d5af)(content(Whitespace\" \ + Exp))))))(shards(0))(children())))(Tile((id \ + 8c971b0e-ea6d-41df-b8c2-b5c3c2a4f908)(label(3))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 935f2c82-7dc7-4899-b2aa-d473ad9e1cdc)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 7d0cb752-8863-4cf3-8b39-a859475c9eb5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1e8050d0-bbc2-467e-a83e-29856cace3c4)(content(Comment\"# \ + [\\\"1\\\", \\\"2\\\", \\\"3\\\"] #\"))))(Secondary((id \ + 8abda13b-ad37-4604-8f9a-d187bfd0c494)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf822fc1-bfad-46a5-970d-79a0d86ba99d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 698e99c5-fbfc-467c-ac98-60fe4bb2ac9e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6de45367-5e16-4d4b-861c-e668d080fd94)(content(Comment\"# \ + Recursive types #\"))))(Secondary((id \ + 528d4204-ce5a-4d4d-8a65-499c165a93a6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 22c11a80-9716-4d85-8478-84acbb2bb3e2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7c21acf4-f87c-4f87-96ed-9f3ce7854bee)(content(Comment\"# We \ + can express types that are the least fixed point of \ + #\"))))(Secondary((id \ + eb66d375-5bc4-4510-9213-406754f1b3ab)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5bd07da0-2cdc-4bed-b10e-8afdf2d40ed4)(content(Comment\"# some \ + type function with the rec keyword. #\"))))(Secondary((id \ + d563fa59-b243-4ee7-87ef-3393d1850a36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0a9260b0-6cb1-4f99-bfa5-07bc929cdbc2)(label(type = \ + in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 7ad3ae39-3be4-4998-86a7-9c94d619ba34)(content(Whitespace\" \ \"))))(Tile((id \ - 7e9ce79a-243d-41bb-a607-18a5b570fc7a)(label(Lam))(mold((out \ + 49357b25-92c9-4cd3-b04c-fea7d3c2ee30)(label(MyList))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + b193ab38-767a-485a-9bda-27fe181a70fb)(content(Whitespace\" \ + \")))))((Secondary((id \ + cdadc496-6611-4ffc-b135-643b2b6e58fb)(content(Whitespace\" \ + \"))))(Tile((id \ + d8af8722-cf91-4f15-9c32-2eecdbb5d1dd)(label(rec \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 13))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 16ba3fd3-2845-490b-a056-b8379608f7c8)(content(Whitespace\" \ + \"))))(Tile((id \ + 35911a26-36a2-4755-a0d5-40663bd5e3e3)(label(A))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 32b2fb6f-0a3d-41bf-b4d7-90c0411c4a4f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + a5c9177a-1a19-4bf5-968b-79dcd8a5f1ae)(content(Whitespace\" \ + \"))))(Tile((id \ + 21645f30-7293-4698-a5ef-c03a43418311)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 2236339d-9e54-45ca-b4f0-a2adcf62fdd4)(label(Nil))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 2eda9a70-f5e3-4430-8ac3-94060fd5b62a)(content(Whitespace\" \ + \"))))(Tile((id \ + 724193cc-c749-44c9-86c9-24c6d5f02b21)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 10))(sort \ + Typ))((shape(Concave 10))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 494ef4ee-7336-4d8a-991b-843e8e09e6a4)(content(Whitespace\" \ + \"))))(Tile((id \ + 36cbd19c-bd46-418c-ac05-7ca72e3efc03)(label(Cons))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 4681bbb3-42ce-46c8-8a22-3259057a14a6)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 8213139c-073b-46ca-a434-e32ffd0d2388)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + fffa4b09-8032-4007-a8e9-c1b4c9b3e4cf)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 61db4da2-294b-4285-96e3-718cb15577c8)(content(Whitespace\" \ + \"))))(Tile((id \ + 9692e5ad-a529-43ef-a693-413e0ab21a31)(label(A))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ + 990cc418-00f2-4c98-9395-ad95bca66884)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3701484f-c796-4d38-bce7-4f25b4c3637d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 193cfb02-bcdb-47e2-80c5-4775c7f11a82)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8c0f2c04-fc2c-4fdf-8f0c-83644d1be509)(content(Comment\"# \ + Hazel does not (yet) support higher-kinded or existential \ + types, #\"))))(Secondary((id \ + 4810f7f2-213a-465d-9b61-81cf18482fa8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0eaf40c5-5a8b-4cbb-aa19-18ba099847eb)(content(Comment\"# So \ + we cannot implement our own polymorphic lists. \ + #\"))))(Secondary((id \ + 579ceeeb-258a-4089-a115-5627e2eaea58)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7bfbd599-e516-45a7-a725-cb39be5c8729)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 887616c9-6707-4e70-ab3d-62996ce73e70)(content(Comment\"# Now \ + anything that returns an element of the least fixed point \ + matches MyList. #\"))))(Secondary((id \ + 6f06209e-4913-4da3-ae91-5bd283668594)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 33ed3a5b-0867-43d7-8cc2-2c8ca4c758e7)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 0370f42e-bd6c-490a-bb7d-920d2f8a8aae)(content(Whitespace\" \ + \"))))(Tile((id \ + 5bae080b-2019-4ffd-a2a9-2a972fcda28d)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 4079c066-6ef0-4310-83c6-56fe7fd7670e)(content(Whitespace\" \ + \"))))(Tile((id \ + a0c477e1-9ef3-4b38-a67c-d5d22e96471d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 93cd7df1-2b4d-4582-acf7-2cb0d46f6313)(content(Whitespace\" \ + \"))))(Tile((id \ + e62970f7-e979-49fb-bde6-c008d8d79a70)(label(MyList))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 1b69d275-5bd5-489b-a340-7aafdfd14d12)(content(Whitespace\" \ + \")))))((Secondary((id \ + 5c867417-e06d-4873-b84d-041e25dcb2d0)(content(Whitespace\" \ + \"))))(Tile((id \ + 2cf5af86-df22-4aba-a044-17d75a3ae989)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c121d549-80c7-4b6b-aed9-f6652df7d1a9)(label(\"(\"\")\"))(mold((out \ + 7e122a6b-5f64-4a7e-90ae-0878e0d82f03)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7b74c555-9efd-4351-8d0e-d6bd96f522c5)(label(\"\\\"bro\\\"\"))(mold((out \ + 1d783d64-398f-4ad6-9eae-b3490775e34c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ed288520-0baa-4871-b514-49e06f702b9f)(label(,))(mold((out \ + df60de96-d925-4ca9-beca-a392fa9d3a33)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aa546db0-cfa4-4049-8ade-00c91c2d9a55)(content(Whitespace\" \ + a798be71-5b99-4f2e-a8e2-e923f9609370)(content(Whitespace\" \ \"))))(Tile((id \ - cd5050cd-9f89-440b-a764-46510d8a918d)(label(Var))(mold((out \ + 8565ea1f-2353-458d-9439-7f379d71cebd)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dd639cdd-c2ab-48d9-b7c1-bf7d1e5359e6)(label(\"(\"\")\"))(mold((out \ + 7ece0aa1-030f-42ec-98ef-b2628aac965c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 78ea24ff-db16-4799-941c-563b8f536566)(label(\"\\\"bro\\\"\"))(mold((out \ + e755b115-0361-453e-b274-9f9cb8a0c262)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 65acf282-5b10-4c18-9d05-ccc5b7a17286)(label(,))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4459b0c1-70f4-4101-a896-21725d8c2a4e)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bbba711a-f484-4101-9aaf-286054cc8f2e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9fcc45ca-c64f-45d4-9ff7-13acf6aaaf73)(label(Error))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a361013a-f8c8-4887-9a10-26b954165ab2)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2a3a4f6b-dc4f-47a2-abcd-10af0387e047)(label(\"\\\"Not a \ - Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 8cb6eac9-4e2a-44ea-aa95-e39f67531832)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 9bd804ee-2b9a-432d-a097-988afb9b59c2)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 18dcc81d-619c-4b42-af2e-4056040039d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bce6c1d2-113d-40e3-a191-b64c2935564d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6e8df04b-e852-4d0e-8f1d-fbc121575946)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - edcaf4e5-eb6e-4180-8a6d-0cc69001dbc3)(content(Whitespace\" \ + 9bc6d0d7-59d4-4cff-819a-6fa718e28414)(content(Whitespace\" \ \"))))(Tile((id \ - 27acf41b-ea89-4ff0-899c-8c3d9be0b3ba)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d6debeb0-6fb3-4ab0-86cb-d4bb187c8c63)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 4030662c-5407-4ffc-9c27-e4b3e8d5ccfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0ab33bc9-c61e-474c-bd64-1a4650e90b3d)(label(eval))(mold((out \ + 9bcc25fd-a616-49f1-9f53-f12a36e09354)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - be5d6f5f-2e9e-4c55-82e7-0f2950749625)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ec85bf2-374e-4ad4-82c9-9394b268f779)(label(Lam))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b618b7e5-b03e-4014-b091-604e08e9eda0)(label(\"(\"\")\"))(mold((out \ + e5ad642e-1071-4a7b-ae6f-d6c8b4b34403)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f856cd2d-583e-4b89-80e4-77bfe5bafa3b)(label(\"\\\"yo\\\"\"))(mold((out \ + fcd291b3-e052-402b-be90-a4a138f94cce)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 62e293ef-5518-40f7-8782-404f25940817)(label(,))(mold((out \ + bab8fe07-56b3-4a03-8a70-cad1d19c41ce)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 04647702-4dbf-4851-a845-ef76cea684a8)(content(Whitespace\" \ + 952bc037-e9e7-42a4-9dd8-24f64cbaedd9)(content(Whitespace\" \ + \"))))(Tile((id \ + 63e70629-8a00-4987-adcc-d9b7edb62ecc)(label(Nil))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ + 3c1a3bf1-ed31-4739-885e-ad254fc292f2)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + b75b8ab1-8759-45b5-ad5b-ed90197258da)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 935b835c-261d-47fc-bee8-068e25da32a8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fb36a038-d3c2-48ec-9310-1ccb658b327a)(content(Comment\"# Note \ + that if the sum is the top level operator, \ + #\"))))(Secondary((id \ + 3c729241-60ac-46a3-86db-92a070ffa4d5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f7670b91-4175-4a41-b92a-232fd61e8eec)(content(Comment\"# type \ + aliases are implicitly least fixed points on their own name: \ + #\"))))(Secondary((id \ + ff8533bf-ba1e-4237-8c1c-e3130b234e64)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e940b831-775d-4d20-8c4e-cf380df7c704)(label(type = \ + in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + fa4039e4-3ac6-4d02-9df8-449e895958cd)(content(Whitespace\" \ + \"))))(Tile((id \ + 05f24c94-0119-4bd5-b234-a1dbdaeab975)(label(MyList2))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + a5939fcf-4a82-49d3-a9dc-8d899ad579f6)(content(Whitespace\" \ + \")))))((Secondary((id \ + 4e843e4a-0c21-4bd3-9163-bad05c819bc8)(content(Whitespace\" \ + \"))))(Tile((id \ + 8f4764bd-552d-47b3-a75f-8177eacbfad3)(label(Nil))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 2b1728e8-6ba7-4cbb-9064-aec652c83d87)(content(Whitespace\" \ + \"))))(Tile((id \ + 6585a36d-b5e9-4a63-8d45-bca7e5c38cf0)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 10))(sort \ + Typ))((shape(Concave 10))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 77c58ade-ef24-46bd-8fad-1fe0dacbc953)(content(Whitespace\" \ + \"))))(Tile((id \ + a97829e0-ec9c-4941-affb-26a072f73fc5)(label(Cons))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 12e14808-3cec-40de-88dc-d9d030c3e0a8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + b501c4ea-e896-49a6-a03e-e15a8d8e9a51)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + e853b31d-1d90-47b0-a37c-9fbec3a18544)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 6fa80101-ad62-45fb-b1a3-ebb1a1cfb16d)(content(Whitespace\" \ + \"))))(Tile((id \ + 22588755-b59d-4f05-9905-b901a1db3f30)(label(MyList2))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + c8115f34-99e0-441c-9313-b15a577eb3eb)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 56e8a3e4-e828-44df-a3c8-e7b1f883e6fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ecf2538d-f121-418b-b6ec-ffb5c0a67f70)(label(type = \ + in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + de814c18-7e95-4f76-9ee7-d20266a3d78e)(content(Whitespace\" \ + \"))))(Tile((id \ + cd5bc989-4ae9-48fa-82fb-a5ab4e320674)(label(Broken))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 8a26bf51-7c01-4f19-b61d-3f6cf0d623e7)(content(Whitespace\" \ + \")))))((Secondary((id \ + c8f6eebf-2e02-444f-b76a-e447af05ce9b)(content(Whitespace\" \ + \"))))(Tile((id \ + 0d01d510-b89e-44f8-b5fa-51b2ae3019d9)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + b7bf4f3b-2c80-48b8-9216-3ced31d7e2e7)(content(Whitespace\" \ + \"))))(Tile((id \ + 8e13455f-e289-48c1-9c66-c1d26e2092c7)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c0577a87-5d87-4f80-861a-c1ef1406b627)(content(Whitespace\" \ + \"))))(Tile((id \ + af30d9ee-ba31-4634-aee7-8671323584d8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 8026c0f4-2334-4d9e-beec-c84c887da32c)(label(HasInt))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + e6c62de9-7dbe-4551-b683-eafeb333cbf1)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 7cfa00aa-8ac0-428c-a4d8-3e1522f514d3)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 1843b6d8-6591-45a8-b6d1-735229c0966a)(content(Whitespace\" \ + \"))))(Tile((id \ + ac02cd59-e2b2-4ddb-b3ed-34f055d805c6)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 10))(sort \ + Typ))((shape(Concave 10))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + cac41e52-5cc4-46f3-bb90-a3abaaeee9ca)(content(Whitespace\" \ + \"))))(Tile((id \ + 389c16e0-7203-4142-9eca-b4246ce61c4c)(label(HasMore))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 6624e15f-6510-40e3-b646-de90440393f8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + e1076ac2-2a95-4a69-a62c-261ab97d6dde)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 1ba0a1ea-2382-4a3c-95d2-bca9f7ba6d79)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 14))(sort \ + Typ))((shape(Concave 14))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 57b01c61-7ac0-4dfc-9ed4-6f5a6d38e57d)(content(Whitespace\" \ + \"))))(Tile((id \ + 45ddb6b3-449e-49f9-9ac7-0a65fe083166)(label(Broken))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ + 7849f81d-3ffc-45fb-8c6f-deca793f4340)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + e520d9d4-efc0-4050-9d28-9408015601f0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9d15c792-44f0-4b64-96b4-c01553f092ac)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b5ac9def-818d-4cc9-a69e-b6c48bb3cf4a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 16e84b97-6c21-457e-a9db-be37201ee08c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dcec6c2e-de60-4b66-a700-5ebe7a65b3cc)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 805fb44d-81bc-4f8e-b6d6-7fecccd366d6)(content(Whitespace\" \ + \"))))(Tile((id \ + 1b33ea74-291d-4177-a4cc-32150cc262c6)(label(list_of_mylist))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + fa5b0bfb-d0db-47f1-9248-36b4ca53105a)(content(Whitespace\" \ + \"))))(Tile((id \ + 0329d949-b67e-4f75-84c5-dac81ce19f53)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 6fafb86c-61e0-4497-9b66-088252c58d00)(content(Whitespace\" \ + \"))))(Tile((id \ + eaf6d9b9-9e6f-4399-b3e5-208475e22a8a)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 0cc9f249-f565-4923-936a-423a5c420bba)(label(MyList))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 909fa81c-98c3-4b79-8995-efb831fb05a8)(content(Whitespace\" \ + \"))))(Tile((id \ + 9e28a68b-7554-4af2-a9be-942c1110024e)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + fb0b7814-07ee-4953-95d4-f30c5d1a28df)(content(Whitespace\" \ + \"))))(Tile((id 1d502020-0204-4ae8-8192-d1967f0631c0)(label([ \ + ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ + Typ))((shape Convex)(sort Typ))))))(shards(0 \ + 1))(children(((Tile((id \ + 11378050-b326-435e-8af8-6f42f2e49778)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ + 1bf827f8-b572-4b9c-b34a-e1f5b0f0da30)(content(Whitespace\" \ + \")))))((Secondary((id \ + 66da49bf-a4d2-4e29-b778-b452a83e05e9)(content(Whitespace\" \ + \"))))(Tile((id \ + dce1d474-d747-4379-8ac6-f763c0983a91)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 197cb6d3-e061-47d2-a835-ddb8f7a2d20e)(content(Whitespace\" \ \"))))(Tile((id \ - b75e01ef-ee6c-421c-8599-991fe24e1e13)(label(Var))(mold((out \ + acca15d8-ce9c-4705-9b01-752506a181a1)(label(myl))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + c284858d-33ee-41e8-bb6b-e7a3785347d5)(content(Whitespace\" \ + \"))))(Tile((id \ + b6b34912-9e5d-46db-8e71-da92a30d8530)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 11))(sort \ + Pat))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + b6c140b8-77c7-4678-8600-86bf855f47dc)(content(Whitespace\" \ + \"))))(Tile((id \ + 335ac528-48d9-4e90-8d14-daf02bc2e744)(label(MyList))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 9b635b29-dd86-41a5-afe5-98e20f056263)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3da32ede-874a-49f7-992d-94a620f990e3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3ceacb87-72e8-4cef-8154-190452625783)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 56e4366c-41dc-4518-bfad-e088baae8ae1)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + a35555f6-5351-4d16-a0bd-d1e18d7801ce)(content(Whitespace\" \ + \"))))(Tile((id \ + b17c5c27-7cbe-454e-b611-0d90f795189b)(label(myl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 002b0979-7e4e-4e55-964d-634f97797462)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7566c730-a883-4559-aafd-36ea07e85266)(label(\"\\\"yo\\\"\"))(mold((out \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + afdb8805-7c66-4af2-873e-24813d6529ce)(content(Whitespace\" \ + \"))))(Secondary((id \ + 28d13098-67c5-4ed6-9526-099cd842b85c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 07d15b6d-f0f4-4670-820a-0fbd56a208c7)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 94141f1d-753d-4ab9-a519-f781bdda56dd)(content(Whitespace\" \ + \"))))(Tile((id \ + e4a58087-c41a-4a12-a8da-c45bd917c0a1)(label(Nil))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 00902ec1-0666-4bb6-858b-db5295b6271e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4ab05820-b00e-422a-a998-5f14b49a46a9)(content(Whitespace\" \ + \"))))(Tile((id \ + b88b20fc-86fb-48e2-badf-06f6c0ad4a87)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b55be10d-dbce-43f5-a69b-64450d2f0eae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ca06d3d8-49e0-45ae-9fa3-c369c7d63deb)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ + Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + ebc90337-9c9a-48f3-982e-78dd373c2af4)(content(Whitespace\" \ + \"))))(Tile((id \ + c94a1c23-2922-4b09-8c90-ab1859a2f652)(label(Cons))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 280a5024-fe68-4508-919b-bc6072aa320c)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + e1241ab0-e63e-46c0-bcb1-d5cf501c7d68)(label(h))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 7076e557-cff2-4587-99d8-7323b637eaa5)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 14))(sort \ + Pat))((shape(Concave 14))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + b15f353d-22a1-4f82-962b-21eeb1709a3b)(content(Whitespace\" \ + \"))))(Tile((id \ + 29908b41-4852-4fed-a2be-a8201b46b324)(label(t))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - 87489b74-6fea-4bb7-b188-cc0f293f1501)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 5f9cb66a-3c69-44fc-98f9-8d33c2242e62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 305c178a-7da5-485c-9212-97518172660b)(label(Ok))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b9c49a17-ddb8-4412-ab2d-e84a31674c1e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6d928f5a-76ba-432f-84c9-8985bdfbae21)(label(Lam))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dd04ac7f-c000-46e2-9346-68de5ccb2c37)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 09183f09-b197-4dab-9712-2ad6ec8053c1)(label(\"\\\"yo\\\"\"))(mold((out \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 282a4121-76db-46b2-92f2-c0b3bea39dab)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + d2bace67-f8aa-4fb7-b767-ff056b2db439)(content(Whitespace\" \ + \"))))(Tile((id \ + 52d40c83-e37a-4e99-a9f9-cce2a9bee532)(label(h))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2bac98eb-578c-4187-8d5d-0e428872fabe)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 726272aa-84f1-4832-bce7-abf746dd38ac)(content(Whitespace\" \ + \"))))(Tile((id \ + cdc66ee5-157b-46bd-bd7b-1f5adf1eaf00)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2f510267-53e4-441f-8c4e-164a43cb1d76)(content(Whitespace\" \ + 6a2d26fd-953a-4bd7-96af-01a5e67c5164)(content(Whitespace\" \ \"))))(Tile((id \ - 9f53f3e1-50c4-41f6-9e69-d60a4bac4562)(label(Var))(mold((out \ + 3d383ccc-98af-43c0-811c-71cf543f3560)(label(list_of_mylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 37e690bc-a872-42fb-a204-ac507f930218)(label(\"(\"\")\"))(mold((out \ + 34f0131a-6046-42b7-acc3-0e9b115598e9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bfa62c97-6b4f-485c-91a5-f28b7d3429dc)(label(\"\\\"yo\\\"\"))(mold((out \ + 7644fb73-3d7b-4647-89a1-17ac8db02acf)(label(t))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - 4c3b2e45-d2b9-42a4-9096-00e583a9d66d)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 2fe2dd64-bbdc-483d-a33c-8607a5a74f99)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - ad91ebe7-fd4d-4455-bd38-c279a70de5d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 461d55f6-6f2e-457a-b986-ba720f4d3dd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ab21e019-9c01-4fa7-a20b-de67b02612f4)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - fed3fa2c-11a4-4564-8eff-e7704b696268)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 4c34a3ca-0ad2-4452-8353-edc564632dd3)(content(Whitespace\" \ + \"))))(Secondary((id \ + b46b62aa-f261-440b-a185-d0d676172b7e)(content(Whitespace\" \ + \"))))(Secondary((id \ + a48cde36-a585-4160-9422-90e3f070e845)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + cd5ed745-ec98-409e-ac1f-234b381dce78)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 6dece3b9-a529-490e-91f2-12e76091b87f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 287d9620-78ca-4128-9b32-8f9cb6b58760)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 80255e8c-d69c-49e8-a4da-becb2c97c9a6)(content(Whitespace\" \ \"))))(Tile((id \ - 1fc38e53-5324-4b3b-8a05-04211a30616e)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e63a04ff-39de-4da8-af96-438a294a9c92)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 22edf468-f96f-4297-bae1-f1db449a5712)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dd1f6a2a-39be-4937-9dca-ea18760871ce)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3ce8a7ac-fd0d-48ae-b434-59ee497324c1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 567af97e-40c4-4b66-b5c0-c7dde61131a2)(label(Ap))(mold((out \ + 5e33ed39-557f-4503-a948-ffc0a793cd4d)(label(ex5))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 9fbd2e14-8f09-4035-8020-e8f44fba8526)(content(Whitespace\" \ + \")))))((Secondary((id \ + f767e5a7-54ab-44d3-a224-fffdadf9da4a)(content(Whitespace\" \ + \"))))(Tile((id \ + ad84dbab-bb06-43c8-8920-1b9e5e8c9cd8)(label(list_of_mylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3a8e1695-9c19-4860-be5a-b2bf92046582)(label(\"(\"\")\"))(mold((out \ + cefbaa1c-b1dc-4728-a64d-1663b18eec41)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5c422f00-d26f-46d5-92b4-849556a6cffd)(label(Lam))(mold((out \ + 8dd0ee06-28a5-424b-93b3-2c269447b2fa)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2eeb6db0-38aa-4479-bcfe-197543180463)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + c24e59ed-e80f-4816-afcc-d222b126c80a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 140a3fe3-246f-4a21-bf2d-aac3c7ea1eab)(content(Whitespace\" \ + \"))))(Secondary((id \ + d006bb40-713e-4973-9d8b-34ff0316612c)(content(Comment\"# [1, \ + 2, 3] #\"))))(Secondary((id \ + 2fff78bc-2182-4db7-bfa8-33fe02a69a5b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1096a58b-888f-47e9-9318-313d0f728a9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 26bec031-02af-4b4d-967f-a3b8fa91866b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ec44021a-5905-4176-8a43-e4b18ecee191)(content(Comment\"# All \ + output from examples: #\"))))(Secondary((id \ + a54fbe78-5b70-4bff-a1b0-f75d699e2d17)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7f3190eb-b200-4e27-b89e-64483682f7cb)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84ff238e-dcf0-4449-b9b7-8d1ecd08d65c)(label(\"\\\"yo\\\"\"))(mold((out \ + 8a74a004-7d34-4e27-8fa7-bc1464a894d7)(label(ex1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5eef209e-e9e3-46fd-a7d2-ee1d841fdfd1)(label(,))(mold((out \ + 4ecc4b06-6a0d-449d-a7a9-507babe76cf8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 627c15eb-037b-461e-a999-b5c720c0c27b)(content(Whitespace\" \ + a14aabb1-2f9e-405f-a6b1-49e947e6f8f0)(content(Whitespace\" \ \"))))(Tile((id \ - e329ba5b-ff65-4a54-bd79-11119d2456b3)(label(Var))(mold((out \ + bb8c31bc-af07-43ea-aa54-cebe3b7fe4c7)(label(ex2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e07b3d06-1fec-4d51-9424-4863f3d93d4d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f029b961-fcc9-4f8b-899a-0e7fa1cf11d1)(label(\"\\\"yo\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 729a33c6-6475-485d-a8ae-d48ac1c2bf6c)(label(,))(mold((out \ + e365c1ab-868b-419e-96e8-c11185577df8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 87f21d69-952d-449f-84d7-1ee2ab05d40b)(content(Whitespace\" \ + adc45428-7b5c-4e79-9f5d-a70170063fc5)(content(Whitespace\" \ \"))))(Tile((id \ - 075b586b-fb78-4d80-8704-b63a67e7cd3b)(label(Lam))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94246c4e-444f-4b3e-bf20-fd2a13fc27ef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 208a8991-100f-4cef-b433-eca8159ac882)(label(\"\\\"bro\\\"\"))(mold((out \ + f25fdd38-87ca-44b2-bd55-3b1c13e31c51)(label(ex3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 53653980-ea4f-40b8-9d29-d359d33fa7bf)(label(,))(mold((out \ + 848d336b-5c6a-4c2f-848d-474fdb03b8d7)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ae6269c2-ff33-4f78-83c0-cdf02b2cdc28)(content(Whitespace\" \ + 6dfa74ec-c592-42a4-a583-96e241120cef)(content(Whitespace\" \ \"))))(Tile((id \ - 5d26a17d-feb7-4d81-b23c-d80ae50d9dd6)(label(Var))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 71b62601-4be1-4205-8377-9ea8c5bd26c5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ed958ead-78f6-4f5a-bd6c-94d57f8393f7)(label(\"\\\"bro\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 15383e63-cf89-4209-a0bf-6c3d86d862d6)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - fd335c92-161b-4e37-988d-acfd90066a8e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0a5045cb-aada-489d-ab45-dbacd4fe44ed)(label(Ok))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - aa0170f4-3445-4a3c-bfd6-9dd4bc5349ff)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d68e6fef-70ce-4b20-b210-e41015a4027a)(label(Lam))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cda0a2c8-1d02-4e25-ba06-7fb9900cab81)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 36f04861-35cc-4eb9-83d0-01085dcf7656)(label(\"\\\"bro\\\"\"))(mold((out \ + 521e9214-e5ca-4c1d-995c-1d0b12a4aa20)(label(ex4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e502a97c-aa0c-4e34-a1c9-9d86454fe1c5)(label(,))(mold((out \ + 4a995d1a-3021-45dd-a4d7-13cff4af4385)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 14))(sort \ Exp))((shape(Concave 14))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 62eb476d-c91c-4c67-bd46-be123833cbdf)(content(Whitespace\" \ + f335f93b-9ff4-47f8-8043-301b1f88d1f7)(content(Whitespace\" \ \"))))(Tile((id \ - 1ff88e88-1e7c-4117-8cfa-6431b1c60b5e)(label(Var))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4e3e4ddd-946c-4afa-ad49-4dc4096d8f9d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e9180871-be73-4a92-a949-010ae5b1a3f8)(label(\"\\\"bro\\\"\"))(mold((out \ + 6d11e3ff-91bd-4a63-8233-0f2ff4c37428)(label(ex5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - 88a4c943-608e-454a-94ad-7dcc08046493)(content(Whitespace\" \ - \"))))))))))))(ancestors())))(caret Outer))"; + Exp))))))(shards(0))(children())))))))))()))(ancestors())))(caret \ + Outer))"; backup_text = - "# Lambda Calculus via evaluation by substitution #\n\n\ - # An Expression is a variable, function, or application #\n\ - type Exp =\n\ - + Var(String)\n\ - + Lam(String, Exp)\n\ - + Ap(Exp, Exp) in\n\n\ - # Syntatic Equality of Expressions #\n\ - let exp_equal: (Exp, Exp) -> Bool =\n\ - fun es ->\n\ - case es\n\ - | Var(x), Var(y) => x $== y\n\ - | Lam(x1, e1), Lam(x2, e2) =>\n\ - \ x1 $== x2 && exp_equal(e1, e2)\n\ - | Ap(e1, e2), Ap(e3, e4) =>\n\ - \ exp_equal(e1, e3) && exp_equal(e2, e4)\n\ - | _ => false end in\n\n\ - # Substitute Exp v for variable name in Exp e #\n\ - let subst: (Exp, String, Exp) -> Exp=\n\ - fun v, name, e ->\n\ - case e\n\ - | Var(n) =>\n\ - \ (if n $== name then v else e)\n\ - | Lam(x, body) =>\n\ - \ Lam(x, subst(v,name, body))\n\ - | Ap(e1,e2) =>\n\ - \ Ap(subst(v, name, e1), subst(v, name, e2)) end in\n\n\ - # Evaluation can result in either an Exp or an Error #\n\ - type Result =\n\ - + Error(String)\n\ - + Ok(Exp) \n\ - in\n\n\ - let result_equal: (Result, Result) -> Bool =\n\ - fun rs ->\n\ - case rs\n\ - | Ok(e1), Ok(e2) => exp_equal(e1, e2)\n\ - | Error(e1), Error(e2) => e1 $== e2\n\ - | _ => false end in\n\n\ - # Evaluation by substitution #\n\ - let eval: Exp -> Result =\n\ - fun e ->\n\ - case e\n\ - | Var(n) => Error(\"Free Variable\")\n\ - | Lam(x, body) => Ok(Lam(x, body))\n\ - | Ap(e1,e2) =>\n\ - case eval(e1)\n\ - | Ok(Lam(x, body))=>\n\ - case eval(e2)\n\ - | Error(err) => Error(err)\n\ - | Ok(arg) => eval(subst(arg, x, body)) end\n\ - | _ => Error(\"Not a Function\") end end in\n\n\ - test result_equal(\n\ - eval(Var(\"yo\")),\n\ - Error(\"Free Variable\")) end;\n\n\ - test result_equal(\n\ - eval(Ap(Var(\"no\"), Lam(\"bro\", Var(\"bro\")))),\n\ - Error(\"Not a Function\")) end;\n\n\ - test result_equal(\n\ - eval(Lam(\"yo\", Var(\"yo\"))),\n\ - Ok(Lam(\"yo\", Var(\"yo\")))) end;\n\n\ - test result_equal(\n\ - eval(Ap(Lam(\"yo\", Var(\"yo\")), Lam(\"bro\", Var(\"bro\")))),\n\ - Ok(Lam(\"bro\", Var(\"bro\")))) end"; + "# Polymorphism #\n\n\ + # We can take types as parameters to type functions, #\n\ + # and use them in annoatations in the body: #\n\ + let id = typfun A -> fun x : A -> x in\n\n\ + # Such functions are applied like so: #\n\ + let ex1 = id@(1) in # 1 #\n\n\ + # We can annotate the type of a type function with a forall. #\n\ + let const : forall A -> forall B -> A -> B -> A = \n\ + typfun A -> typfun B -> fun x -> fun y -> x in\n\ + let ex2 = const@@(2)(\"Hello World\") in # 2 #\n\n\ + # We can go beyond rank 1 polymorphism: #\n\ + let apply_both : forall A -> forall B -> (forall D -> D -> D) \ + -> (A , B) -> (A , B) =\n\ + typfun A -> typfun B -> fun f -> fun (x, y) -> (f@(x), \ + f@(y)) in \n\ + let ex3 = apply_both@@(id)(3, \"Hello World\") \ + in # (3, \"Hello World\") # \n\n\ + # Finally, here is a more in-depth, yet applicable example: \ + polymorphic map #\n\ + let emptylist : forall A -> [A] = typfun A -> [] in # \ + polymorphic constant #\n\ + let map : forall A -> forall B -> (A -> B) -> ([A] -> [B]) = \n\ + typfun A -> typfun B -> fun f : (A -> B) -> fun l : [A] -> \n\ + case l\n\ + | h :: t => f(h) :: map@@(f)(t)\n\ + | _ => emptylist@ \n\ + end in\n\ + let ex4 = map@@(string_of_int)([1,2,3]) in # \ + [\"1\", \"2\", \"3\"] #\n\n\n\ + # Recursive types #\n\n\ + # We can express types that are the least fixed point of #\n\ + # some type function with the rec keyword. #\n\ + type MyList = rec A -> (Nil + Cons(Int, A)) in\n\n\ + # Hazel does not (yet) support higher-kinded or existential \ + types, #\n\ + # So we cannot implement our own polymorphic lists. #\n\n\ + # Now anything that returns an element of the least fixed \ + point matches MyList. #\n\ + let x : MyList = Cons(1, Cons(2, Cons(3, Nil))) in\n\n\ + # Note that if the sum is the top level operator, #\n\ + # type aliases are implicitly least fixed points on their own \ + name: #\n\ + type MyList2 = Nil + Cons(Int, MyList2) in\n\ + type Broken = Int -> (HasInt(Int) + HasMore(Int, Broken)) in \ + \n\n\n\ + let list_of_mylist : (MyList -> [Int]) = fun myl : MyList -> \n\ + case myl \n\ + | Nil => []\n\ + | Cons(h, t) => h :: list_of_mylist(t) \n\ + end in\n\ + let ex5 = list_of_mylist(x) in # [1, 2, 3] #\n\n\n\ + # All output from examples: #\n\ + (ex1, ex2, ex3, ex4, ex5)"; } ); ( "Programming Expressively", { diff --git a/src/haz3lweb/explainthis/Example.re b/src/haz3lweb/explainthis/Example.re index 217ed04f40..aa52317ced 100644 --- a/src/haz3lweb/explainthis/Example.re +++ b/src/haz3lweb/explainthis/Example.re @@ -77,6 +77,8 @@ let mk_parens_typ = mk_tile(Form.get("parens_typ")); let mk_list_exp = mk_tile(Form.get("list_lit_exp")); let mk_list_pat = mk_tile(Form.get("list_lit_pat")); let mk_list_typ = mk_tile(Form.get("list_typ")); +let mk_forall = mk_tile(Form.get("forall")); +let mk_rec = mk_tile(Form.get("rec")); let arrow = () => mk_monotile(Form.get("type-arrow")); let unary_minus = () => mk_monotile(Form.get("unary_minus")); let unary_not = () => mk_monotile(Form.get("not")); @@ -113,7 +115,9 @@ let pipeline = () => mk_monotile(Form.get("pipeline")); let nil = () => exp("[]"); let deferral = () => exp("_"); let typeann = () => mk_monotile(Form.get("typeann")); +let mk_typfun = mk_tile(Form.get("typfun")); let mk_fun = mk_tile(Form.get("fun_")); +let mk_ap_exp_typ = mk_tile(Form.get("ap_exp_typ")); let mk_ap_exp = mk_tile(Form.get("ap_exp")); let mk_ap_pat = mk_tile(Form.get("ap_pat")); let mk_let = mk_tile(Form.get("let_")); diff --git a/src/haz3lweb/explainthis/ExplainThisForm.re b/src/haz3lweb/explainthis/ExplainThisForm.re index d6b88c3870..b0a71f68a0 100644 --- a/src/haz3lweb/explainthis/ExplainThisForm.re +++ b/src/haz3lweb/explainthis/ExplainThisForm.re @@ -11,6 +11,13 @@ type list_examples = | Cons1 | Cons2; +[@deriving (show({with_path: false}), sexp, yojson)] +type typfun_examples = + | Basic + | EmptyHole + | MultiHole /* TODO: Maybe no good examples with Multihole? */ + | Var; + [@deriving (show({with_path: false}), sexp, yojson)] type fun_examples = | Basic @@ -72,12 +79,15 @@ type numeric_bin_op_examples = [@deriving (show({with_path: false}), sexp, yojson)] type example_id = + | RecTyp | Deferral | List(list_examples) + | TypFun(typfun_examples) | Fun(fun_examples) | Tuple1 | Tuple2 | Let(let_examples) + | TypFunAp | FunAp | ConAp | DeferredAp @@ -150,11 +160,13 @@ type form_id = | ListExp | ConsExp | ListConcatExp + | TypFunctionExp | FunctionExp(pat_sub_form_id) | TupleExp | Tuple2Exp | Tuple3Exp | LetExp(pat_sub_form_id) + | TypFunApExp | FunApExp | ConApExp | DeferredApExp @@ -192,6 +204,8 @@ type form_id = | StrTyp | VarTyp | ListTyp + | ForallTyp + | RecTyp | ArrowTyp | Arrow3Typ | TupleTyp @@ -237,11 +251,13 @@ type group_id = | ListExp | ConsExp | ListConcatExp + | TypFunctionExp | FunctionExp(pat_sub_form_id) | TupleExp | Tuple2Exp | Tuple3Exp | LetExp(pat_sub_form_id) + | TypFunApExp | FunApExp | ConApExp | DeferredApExp @@ -280,6 +296,8 @@ type group_id = | StrTyp | VarTyp | ListTyp + | ForallTyp + | RecTyp | ArrowTyp | Arrow3Typ | TupleTyp diff --git a/src/haz3lweb/explainthis/data/ForallTyp.re b/src/haz3lweb/explainthis/data/ForallTyp.re new file mode 100644 index 0000000000..09eca4e576 --- /dev/null +++ b/src/haz3lweb/explainthis/data/ForallTyp.re @@ -0,0 +1,23 @@ +open Haz3lcore; +open Example; +open ExplainThisForm; + +let _tpat = tpat("t_var"); +let _typ_arg = typ("ty_arg"); +let forall_typ_coloring_ids = + (~tpat_id: Id.t, ~tbody_id: Id.t): list((Id.t, Id.t)) => [ + (Piece.id(_tpat), tpat_id), + (Piece.id(_typ_arg), tbody_id), +]; +let forall_typ: form = { + let explanation = "This forall type classifies polymorphic values varying over [*type variable*](%s) with [*instantiated type*](%s)."; + { + id: ForallTyp, + syntactic_form: [mk_forall([[space(), _tpat, space()]]), _typ_arg], + expandable_id: Some((Piece.id(_tpat), [_typ_arg])), + explanation, + examples: [], + }; +}; + +let forall: group = {id: ForallTyp, forms: [forall_typ]}; diff --git a/src/haz3lweb/explainthis/data/RecTyp.re b/src/haz3lweb/explainthis/data/RecTyp.re new file mode 100644 index 0000000000..601f081602 --- /dev/null +++ b/src/haz3lweb/explainthis/data/RecTyp.re @@ -0,0 +1,28 @@ +open Haz3lcore; +open Example; +open ExplainThisForm; + +let _tpat = tpat("t_var"); +let _typ_arg = typ("ty_arg"); +let rec_typ_coloring_ids = + (~tpat_id: Id.t, ~tbody_id: Id.t): list((Id.t, Id.t)) => [ + (Piece.id(_tpat), tpat_id), + (Piece.id(_typ_arg), tbody_id), +]; +let peano_ex = { + sub_id: RecTyp, + term: mk_example("type Peano = \n rec P -> Z + S(P) \n in S(S(S(Z)))"), + message: "The type of the Peano numbers and the representation of the number 3.", +}; +let rec_typ: form = { + let explanation = "This recursive type classifies the least fixed point of the polymorphic type over the [*type variable*](%s) of body [*instantiated type*](%s)."; + { + id: RecTyp, + syntactic_form: [mk_rec([[space(), _tpat, space()]]), _typ_arg], + expandable_id: Some((Piece.id(_tpat), [_typ_arg])), + explanation, + examples: [peano_ex], + }; +}; + +let rec_: group = {id: RecTyp, forms: [rec_typ]}; diff --git a/src/haz3lweb/explainthis/data/TypAppExp.re b/src/haz3lweb/explainthis/data/TypAppExp.re new file mode 100644 index 0000000000..5b1ad13106 --- /dev/null +++ b/src/haz3lweb/explainthis/data/TypAppExp.re @@ -0,0 +1,31 @@ +open Haz3lcore; +open ExplainThisForm; +open Example; + +let typfunapp_exp_ex = { + sub_id: TypFunAp, + term: + mk_example( + "let id : \n forall a -> (a -> a) = \n typfun a -> \n fun x : a -> x \n in id@", + ), + message: "The polymorphic identity function is instantiated at Int. The type variable a is bound to Int in the type function body and the body evaluates to the identity function on integers.", +}; +let _exp_tfun = exp("e_tfun"); +let _typ = typ("ty"); +let typfunapp_exp_coloring_ids = + (~f_id: Id.t, ~typ_id: Id.t): list((Id.t, Id.t)) => [ + (Piece.id(_exp_tfun), f_id), + (Piece.id(_typ), typ_id), +]; +let typfunapp_exp: form = { + let explanation = "Applies the [*type function*](%s) to the [*type*](%s)."; + { + id: TypFunApExp, + syntactic_form: [_exp_tfun, mk_ap_exp_typ([[_typ]])], + expandable_id: None, + explanation, + examples: [typfunapp_exp_ex], + }; +}; + +let typfunaps: group = {id: TypFunApExp, forms: [typfunapp_exp]}; diff --git a/src/haz3lweb/explainthis/data/TypFunctionExp.re b/src/haz3lweb/explainthis/data/TypFunctionExp.re new file mode 100644 index 0000000000..93b7300b18 --- /dev/null +++ b/src/haz3lweb/explainthis/data/TypFunctionExp.re @@ -0,0 +1,29 @@ +open Haz3lcore; +open ExplainThisForm; +open Example; + +let poly_id_ex = { + sub_id: TypFun(Basic), + term: + mk_example( + "let id : \n forall a -> (a -> a) = \n typfun a -> \n fun x : a -> x \n in id", + ), + message: "The polymorphic identity function. It may be instantiated at any type a, after which the function acts as type (a -> a).", +}; + +let _tp = tpat("a"); +let _exp = exp("e"); +let typfun_var: form = { + let explanation = "When applied to a type that which is bound to the [*type variable*](%s), evaluates to the type function [*body*](%s)."; + let form = [mk_typfun([[space(), _tp, space()]]), space(), _exp]; + { + id: TypFunctionExp, + syntactic_form: form, + expandable_id: + Some((Piece.id(_tp), [Grout({id: Id.mk(), shape: Convex})])), + explanation, + examples: [poly_id_ex], + }; +}; + +let type_functions_basic = {id: TypFunctionExp, forms: [typfun_var]}; diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 002d2226a5..99ed8fd0fb 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -140,14 +140,21 @@ let common_ok_view = (cls: Term.Cls.t, ok: Info.ok_pat) => { let typ_ok_view = (cls: Term.Cls.t, ok: Info.ok_typ) => switch (ok) { | Type(_) when cls == Typ(EmptyHole) => [text("Fillable by any type")] - | Type(ty) => [Type.view(ty)] + | Type(ty) => [Type.view(ty), text("is a type")] | TypeAlias(name, ty_lookup) => [ Type.view(Var(name)), text("is an alias for"), Type.view(ty_lookup), ] - | Variant(name, _sum_ty) => [Type.view(Var(name))] - | VariantIncomplete(_sum_ty) => [text("is incomplete")] + | Variant(name, sum_ty) => [ + Type.view(Var(name)), + text("is a sum type constuctor of type"), + Type.view(sum_ty), + ] + | VariantIncomplete(sum_ty) => [ + text("An incomplete sum type constuctor of type"), + Type.view(sum_ty), + ] }; let typ_err_view = (ok: Info.error_typ) => @@ -166,10 +173,21 @@ let typ_err_view = (ok: Info.error_typ) => ] }; -let exp_view = (cls: Term.Cls.t, status: Info.status_exp) => +let rec exp_view = (cls: Term.Cls.t, status: Info.status_exp) => switch (status) { | InHole(FreeVariable(name)) => div_err([code_err(name), text("not found")]) + | InHole(InexhaustiveMatch(additional_err)) => + let cls_str = Term.Cls.show(cls); + switch (additional_err) { + | None => div_err([text(cls_str ++ " is inexhaustive")]) + | Some(err) => + let cls_str = String.uncapitalize_ascii(cls_str); + div_err([ + exp_view(cls, InHole(Common(err))), + text("; " ++ cls_str ++ " is inexhaustive"), + ]); + }; | InHole(UnusedDeferral) => div_err([text("Deferral must appear as a function argument")]) | InHole(BadPartialAp(NoDeferredArgs)) => @@ -192,9 +210,15 @@ let exp_view = (cls: Term.Cls.t, status: Info.status_exp) => | NotInHole(Common(ok)) => div_ok(common_ok_view(cls, ok)) }; -let pat_view = (cls: Term.Cls.t, status: Info.status_pat) => +let rec pat_view = (cls: Term.Cls.t, status: Info.status_pat) => switch (status) { | InHole(ExpectedConstructor) => div_err([text("Expected a constructor")]) + | InHole(Redundant(additional_err)) => + switch (additional_err) { + | None => div_err([text("Pattern is redundant")]) + | Some(err) => + div_err([pat_view(cls, InHole(err)), text("; pattern is redundant")]) + } | InHole(Common(error)) => div_err(common_err_view(cls, error)) | NotInHole(ok) => div_ok(common_ok_view(cls, ok)) }; @@ -212,10 +236,15 @@ let tpat_view = (_: Term.Cls.t, status: Info.status_tpat) => | InHole(NotAVar(NotCapitalized)) => div_err([text("Must begin with a capital letter")]) | InHole(NotAVar(_)) => div_err([text("Expected an alias")]) - | InHole(ShadowsType(name)) when Form.is_base_typ(name) => + | InHole(ShadowsType(name, BaseTyp)) => div_err([text("Can't shadow base type"), Type.view(Var(name))]) - | InHole(ShadowsType(name)) => + | InHole(ShadowsType(name, TyAlias)) => div_err([text("Can't shadow existing alias"), Type.view(Var(name))]) + | InHole(ShadowsType(name, TyVar)) => + div_err([ + text("Can't shadow existing type variable"), + Type.view(Var(name)), + ]) }; let secondary_view = (cls: Term.Cls.t) => diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index c54a6dde20..3019f4516a 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -559,6 +559,30 @@ let get_doc = ), ListExp.listlits, ) + | TypFun(tpat, body) => + let basic = group_id => { + let tpat_id = List.nth(tpat.ids, 0); + let body_id = List.nth(body.ids, 0); + get_message( + ~colorings= + FunctionExp.function_exp_coloring_ids( + ~pat_id=tpat_id, + ~body_id, + ), + ~format= + Some( + msg => + Printf.sprintf( + Scanf.format_from_string(msg, "%s%s"), + Id.to_string(tpat_id), + Id.to_string(body_id), + ), + ), + group_id, + ); + }; + /* TODO: More could be done here probably for different patterns. */ + basic(TypFunctionExp.type_functions_basic); | Fun(pat, body) => let basic = group_id => { let pat_id = List.nth(pat.ids, 0); @@ -1531,6 +1555,27 @@ let get_doc = ~fn_id=Term.UExp.rep_id(fn), ), ) + | TypAp(f, typ) => + let f_id = List.nth(f.ids, 0); + let typ_id = List.nth(typ.ids, 0); + let basic = (group, format, coloring_ids) => { + get_message( + ~colorings=coloring_ids(~f_id, ~typ_id), + ~format=Some(format), + group, + ); + }; + basic( + TypAppExp.typfunaps, + msg => + Printf.sprintf( + Scanf.format_from_string(msg, "%s%s"), + Id.to_string(f_id), + Id.to_string(typ_id), + ), + TypAppExp.typfunapp_exp_coloring_ids, + ); + | Ap(x, arg) => let x_id = List.nth(x.ids, 0); let arg_id = List.nth(arg.ids, 0); @@ -2079,6 +2124,38 @@ let get_doc = ), ListTyp.list, ); + | Forall(tpat, typ) => + let tpat_id = List.nth(tpat.ids, 0); + let tbody_id = List.nth(typ.ids, 0); + get_message( + ~colorings=ForallTyp.forall_typ_coloring_ids(~tpat_id, ~tbody_id), + ~format= + Some( + msg => + Printf.sprintf( + Scanf.format_from_string(msg, "%s%s"), + Id.to_string(tpat_id), + Id.to_string(tbody_id), + ), + ), + ForallTyp.forall, + ); + | Rec(tpat, typ) => + let tpat_id = List.nth(tpat.ids, 0); + let tbody_id = List.nth(typ.ids, 0); + get_message( + ~colorings=RecTyp.rec_typ_coloring_ids(~tpat_id, ~tbody_id), + ~format= + Some( + msg => + Printf.sprintf( + Scanf.format_from_string(msg, "%s%s"), + Id.to_string(tpat_id), + Id.to_string(tbody_id), + ), + ), + RecTyp.rec_, + ); | Arrow(arg, result) => let arg_id = List.nth(arg.ids, 0); let result_id = List.nth(result.ids, 0); diff --git a/src/haz3lweb/view/Kind.re b/src/haz3lweb/view/Kind.re index f84672515c..148336e1c2 100644 --- a/src/haz3lweb/view/Kind.re +++ b/src/haz3lweb/view/Kind.re @@ -2,7 +2,7 @@ open Virtual_dom.Vdom; open Node; open Util.Web; -let view = (kind: Haz3lcore.Kind.t): Node.t => +let view = (kind: Haz3lcore.TypBase.Kind.t): Node.t => switch (kind) { | Singleton(ty) => div_c("kind-view", [Type.view(ty)]) | Abstract => div_c("kind-view", [text("Type")]) diff --git a/src/haz3lweb/view/Type.re b/src/haz3lweb/view/Type.re index ae88419f0e..b98ea1afd3 100644 --- a/src/haz3lweb/view/Type.re +++ b/src/haz3lweb/view/Type.re @@ -17,8 +17,7 @@ let prov_view: Typ.type_provenance => Node.t = | TypeHole => div(~attr=clss(["typ-mod", "type-hole"]), [text("𝜏")]) | SynSwitch => div(~attr=clss(["typ-mod", "syn-switch"]), [text("⇒")]); -let rec view_ty = (ty: Haz3lcore.Typ.t): Node.t => - //TODO: parens on ops when ambiguous +let rec view_ty = (~strip_outer_parens=false, ty: Haz3lcore.Typ.t): Node.t => switch (ty) { | Unknown(prov) => div( @@ -34,10 +33,15 @@ let rec view_ty = (ty: Haz3lcore.Typ.t): Node.t => | String => ty_view("String", "String") | Bool => ty_view("Bool", "Bool") | Var(name) => ty_view("Var", name) - | Rec(x, t) => + | Rec(name, t) => div( ~attr=clss(["typ-view", "Rec"]), - [text("Rec " ++ x ++ ". "), view_ty(t)], + [text("rec " ++ name ++ " -> "), view_ty(t)], + ) + | Forall(name, t) => + div( + ~attr=clss(["typ-view", "Forall"]), + [text("forall " ++ name ++ " -> "), view_ty(t)], ) | List(t) => div( @@ -47,7 +51,7 @@ let rec view_ty = (ty: Haz3lcore.Typ.t): Node.t => | Arrow(t1, t2) => div( ~attr=clss(["typ-view", "Arrow"]), - [view_ty(t1), text(" -> "), view_ty(t2)], + paren_view(t1) @ [text(" -> "), view_ty(t2)], ) | Prod([]) => div(~attr=clss(["typ-view", "Prod"]), [text("()")]) | Prod([_]) => @@ -55,15 +59,30 @@ let rec view_ty = (ty: Haz3lcore.Typ.t): Node.t => | Prod([t0, ...ts]) => div( ~attr=clss(["typ-view", "atom", "Prod"]), - [ - text("("), + ( + if (!strip_outer_parens) { + [text("(")]; + } else { + []; + } + ) + @ [ div( ~attr=clss(["typ-view", "Prod"]), - [view_ty(t0)] - @ (List.map(t => [text(", "), view_ty(t)], ts) |> List.flatten), + paren_view(t0) + @ ( + List.map(t => [text(", "), ...paren_view(t)], ts) + |> List.flatten + ), ), - text(")"), - ], + ] + @ ( + if (!strip_outer_parens) { + [text(")")]; + } else { + []; + } + ), ) | Sum(ts) => div( @@ -81,7 +100,17 @@ let rec view_ty = (ty: Haz3lcore.Typ.t): Node.t => and ctr_view = ((ctr, typ)) => switch (typ) { | None => [text(ctr)] - | Some(typ) => [text(ctr ++ "("), view_ty(typ), text(")")] + | Some(typ) => [ + text(ctr ++ "("), + view_ty(~strip_outer_parens=true, typ), + text(")"), + ] + } +and paren_view = typ => + if (Typ.needs_parens(typ)) { + [text("("), view_ty(~strip_outer_parens=true, typ), text(")")]; + } else { + [view_ty(typ)]; }; let view = (ty: Haz3lcore.Typ.t): Node.t => diff --git a/src/haz3lweb/view/dhcode/layout/DHDoc_Exp.re b/src/haz3lweb/view/dhcode/layout/DHDoc_Exp.re index 4a6d41a38f..f193508bf0 100644 --- a/src/haz3lweb/view/dhcode/layout/DHDoc_Exp.re +++ b/src/haz3lweb/view/dhcode/layout/DHDoc_Exp.re @@ -48,7 +48,6 @@ let rec precedence = (~show_casts: bool, d: DHExp.t) => { | BoundVar(_) | FreeVar(_) | InvalidText(_) - | ExpandingKeyword(_) | BoolLit(_) | IntLit(_) | Sequence(_) @@ -62,16 +61,18 @@ let rec precedence = (~show_casts: bool, d: DHExp.t) => { | FailedCast(_) | InvalidOperation(_) | IfThenElse(_) - | Closure(_) | BuiltinFun(_) - | Filter(_) => DHDoc_common.precedence_const + | Filter(_) + | Closure(_) => DHDoc_common.precedence_const | Cast(d1, _, _) => show_casts ? DHDoc_common.precedence_const : precedence'(d1) - | Ap(_) => DHDoc_common.precedence_Ap + | Ap(_) + | TypAp(_) => DHDoc_common.precedence_Ap | ApBuiltin(_) => DHDoc_common.precedence_Ap | Cons(_) => DHDoc_common.precedence_Cons | ListConcat(_) => DHDoc_common.precedence_Plus | Tuple(_) => DHDoc_common.precedence_Comma + | TypFun(_) | Fun(_) => DHDoc_common.precedence_max | Let(_) | FixF(_) @@ -137,12 +138,14 @@ let mk = | (LetBind, _) => [] | (FixUnwrap, FixF(f, _, _)) => [f] | (FixUnwrap, _) => [] + | (TypFunAp, _) // TODO: Could also do something here for type variable substitution like in FunAp? | (InvalidStep, _) | (VarLookup, _) | (Sequence, _) | (FunClosure, _) | (FixClosure, _) | (UpdateTest, _) + | (CastTypAp, _) | (CastAp, _) | (BuiltinWrap, _) | (BuiltinAp(_), _) @@ -322,8 +325,6 @@ let mk = | NonEmptyHole(reason, u, i, d') => go'(d', NonEmptyHole) |> annot(DHAnnot.NonEmptyHole(reason, (u, i))) - | ExpandingKeyword(u, i, k) => - DHDoc_common.mk_ExpandingKeyword((u, i), k) | FreeVar(u, i, x) => text(x) |> annot(DHAnnot.VarHole(Free, (u, i))) | InvalidText(u, i, t) => DHDoc_common.mk_InvalidText(t, (u, i)) @@ -363,6 +364,7 @@ let mk = | ListLit(_, _, _, d_list) => let ol = d_list |> List.mapi((i, d) => go'(d, ListLit(i))); DHDoc_common.mk_ListLit(ol); + | Ap(d1, d2) => let (doc1, doc2) = ( go_formattable(d1, Ap1) @@ -370,6 +372,10 @@ let mk = go'(d2, Ap2), ); DHDoc_common.mk_Ap(doc1, doc2); + | TypAp(d1, ty) => + let doc1 = go'(d1, TypAp); + let doc2 = DHDoc_Typ.mk(~enforce_inline=true, ty); + DHDoc_common.mk_TypAp(doc1, doc2); | ApBuiltin(ident, d) => DHDoc_common.mk_Ap( text(ident), @@ -590,6 +596,19 @@ let mk = | Some(name) => name }; annot(DHAnnot.Collapsed, text("<" ++ name ++ ">")); + | TypFun(_tpat, _dbody, s) => + /* same display as with Fun but with anon typfn in the nameless case. */ + let name = + switch (s) { + | None => "anon typfn" + | Some(name) + when + !settings.show_fixpoints + && String.ends_with(~suffix="+", name) => + String.sub(name, 0, String.length(name) - 1) + | Some(name) => name + }; + annot(DHAnnot.Collapsed, text("<" ++ name ++ ">")); | FixF(x, ty, dbody) when settings.show_fn_bodies && settings.show_fixpoints => let doc_body = @@ -606,7 +625,6 @@ let mk = DHDoc_common.Delim.colon_Fun, space(), DHDoc_Typ.mk(~enforce_inline=true, ty), - space(), ] : [] ) diff --git a/src/haz3lweb/view/dhcode/layout/DHDoc_Pat.re b/src/haz3lweb/view/dhcode/layout/DHDoc_Pat.re index 2544e86d53..5c6be4a6e1 100644 --- a/src/haz3lweb/view/dhcode/layout/DHDoc_Pat.re +++ b/src/haz3lweb/view/dhcode/layout/DHDoc_Pat.re @@ -6,7 +6,6 @@ let precedence = (dp: DHPat.t) => | EmptyHole(_) | NonEmptyHole(_) | Wild - | ExpandingKeyword(_) | InvalidText(_) | BadConstructor(_) | Var(_) @@ -37,8 +36,6 @@ let rec mk = | EmptyHole(u, i) => DHDoc_common.mk_EmptyHole((u, i)) | NonEmptyHole(reason, u, i, dp) => mk'(dp) |> Doc.annot(DHAnnot.NonEmptyHole(reason, (u, i))) - | ExpandingKeyword(u, i, k) => - DHDoc_common.mk_ExpandingKeyword((u, i), k) | InvalidText(u, i, t) => DHDoc_common.mk_InvalidText(t, (u, i)) | BadConstructor(u, i, t) => DHDoc_common.mk_InvalidText(t, (u, i)) | Var(x) => Doc.text(x) diff --git a/src/haz3lweb/view/dhcode/layout/DHDoc_Util.re b/src/haz3lweb/view/dhcode/layout/DHDoc_Util.re index cf69aa856d..f127804400 100644 --- a/src/haz3lweb/view/dhcode/layout/DHDoc_Util.re +++ b/src/haz3lweb/view/dhcode/layout/DHDoc_Util.re @@ -89,10 +89,6 @@ let mk_EmptyHole = (~selected=false, (u, i)) => Delim.empty_hole((u, i)) |> Doc.annot(DHAnnot.EmptyHole(selected, (u, i))); -let mk_Keyword = (u, i, k) => - Doc.text(ExpandingKeyword.to_string(k)) - |> Doc.annot(DHAnnot.VarHole(ExpandingKeyword(k), (u, i))); - let mk_IntLit = n => Doc.text(string_of_int(n)); let mk_FloatLit = (f: float) => diff --git a/src/haz3lweb/view/dhcode/layout/DHDoc_common.re b/src/haz3lweb/view/dhcode/layout/DHDoc_common.re index 4ccc57da62..22f4283c89 100644 --- a/src/haz3lweb/view/dhcode/layout/DHDoc_common.re +++ b/src/haz3lweb/view/dhcode/layout/DHDoc_common.re @@ -91,10 +91,6 @@ module Delim = { let mk_EmptyHole = (~selected=false, hc: HoleInstance.t) => Delim.empty_hole(hc) |> Doc.annot(DHAnnot.EmptyHole(selected, hc)); -let mk_ExpandingKeyword = (hc, k) => - Doc.text(ExpandingKeyword.to_string(k)) - |> Doc.annot(DHAnnot.VarHole(ExpandingKeyword(k), hc)); - let mk_InvalidText = (t, hc) => Doc.text(t) |> Doc.annot(DHAnnot.Invalid(hc)); @@ -134,7 +130,10 @@ let mk_comma_seq = (ld, rd, l) => { let mk_ListLit = l => mk_comma_seq("[", "]", l); -let mk_Tuple = elts => mk_comma_seq("", "", elts); +let mk_Tuple = elts => mk_comma_seq("(", ")", elts); + +let mk_TypAp = (doc1, doc2) => + Doc.(hcats([doc1, text("@<"), doc2, text(">")])); let mk_Ap = (doc1, doc2) => Doc.(hcats([doc1, text("("), doc2, text(")")])); diff --git a/src/haz3lweb/view/dhcode/layout/DHDoc_common.rei b/src/haz3lweb/view/dhcode/layout/DHDoc_common.rei index b3b9e2e264..098b108b90 100644 --- a/src/haz3lweb/view/dhcode/layout/DHDoc_common.rei +++ b/src/haz3lweb/view/dhcode/layout/DHDoc_common.rei @@ -64,9 +64,6 @@ module Delim: { let mk_EmptyHole: (~selected: bool=?, HoleInstance.t) => Pretty.Doc.t(DHAnnot.t); -let mk_ExpandingKeyword: - (HoleInstance.t, ExpandingKeyword.t) => Pretty.Doc.t(DHAnnot.t); - let mk_InvalidText: (string, HoleInstance.t) => Pretty.Doc.t(DHAnnot.t); let mk_Sequence: (Pretty.Doc.t('a), Pretty.Doc.t('a)) => Pretty.Doc.t('a); @@ -91,6 +88,8 @@ let mk_ListLit: list(Pretty.Doc.t('a)) => Pretty.Doc.t('a); let mk_Tuple: list(Pretty.Doc.t('a)) => Pretty.Doc.t('a); +let mk_TypAp: (Pretty.Doc.t('a), Pretty.Doc.t('a)) => Pretty.Doc.t('a); + let mk_Ap: (Pretty.Doc.t('a), Pretty.Doc.t('a)) => Pretty.Doc.t('a); let mk_Prj: (Pretty.Doc.t(DHAnnot.t), int) => Pretty.Doc.t(DHAnnot.t); diff --git a/src/haz3lweb/view/dhcode/layout/HTypDoc.re b/src/haz3lweb/view/dhcode/layout/HTypDoc.re index 8acbc0455f..c1ffa32652 100644 --- a/src/haz3lweb/view/dhcode/layout/HTypDoc.re +++ b/src/haz3lweb/view/dhcode/layout/HTypDoc.re @@ -106,9 +106,21 @@ let rec mk = (~parenthesize=false, ~enforce_inline: bool, ty: Typ.t): t => { ) |> hcats; (center, true); - | Rec(x, ty) => ( + | Rec(name, ty) => ( hcats([ - text("Rec " ++ x ++ ".{"), + text("rec " ++ name ++ "->{"), + ( + (~enforce_inline) => + annot(HTypAnnot.Step(0), mk(~enforce_inline, ty)) + ) + |> pad_child(~enforce_inline), + mk_delim("}"), + ]), + parenthesize, + ) + | Forall(name, ty) => ( + hcats([ + text("forall " ++ name ++ "->{"), ( (~enforce_inline) => annot(HTypAnnot.Step(0), mk(~enforce_inline, ty))