packages feed

phino 0.0.158 → 0.0.159

raw patch · 72 files changed

+2277/−1295 lines, 72 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ CLI.Helpers: filteredAt :: Expression -> Expression -> [Expression] -> [Expression] -> Expression -> IO Expression
+ CLI.Helpers: headerOf :: [String] -> Maybe FilePath -> String -> Expression -> Maybe FilePath -> Lambdas -> IO Header
+ Deps: EvHeader :: Header -> Expression -> Expression -> Evaluation
+ Deps: EvUndressed :: Int -> Expression -> Evaluation
+ Deps: Header :: String -> Maybe String -> ZonedTime -> [String] -> World -> Maybe (FilePath, Int) -> Header
+ Deps: World :: Maybe FilePath -> Int -> Int -> Int -> Int -> World
+ Deps: commanded :: [String] -> String
+ Deps: data Header
+ Deps: data World
+ Lambdas: Undressed :: Meta -> Meta -> Line
+ Lambdas: [_undressed] :: Lambda -> [(Meta, Expression)]
+ Lambdas: sized :: Lambdas -> Int
+ XMIR: gitRevision :: String
- CLI.Helpers: aimed :: PrintContext -> Judgment -> Maybe String -> Expression -> ReduceContext -> IO (Expression, ReduceContext)
+ CLI.Helpers: aimed :: PrintContext -> Judgment -> Header -> Maybe String -> Expression -> ReduceContext -> IO (Expression, ReduceContext)
- CLI.Runners: runDataize :: OptsDataize -> IO ()
+ CLI.Runners: runDataize :: [String] -> OptsDataize -> IO ()
- CLI.Runners: runMorph :: OptsMorph -> IO ()
+ CLI.Runners: runMorph :: [String] -> OptsMorph -> IO ()
- Lambdas: Lambda :: Text -> [(Meta, Expression)] -> [(Meta, Expression)] -> [Line] -> Ending -> Lambda
+ Lambdas: Lambda :: Text -> [(Meta, Expression)] -> [(Meta, Expression)] -> [(Meta, Expression)] -> [Line] -> Ending -> Lambda

Files

README.md view
@@ -34,7 +34,7 @@  ```bash cabal update-cabal install --overwrite-policy=always phino-0.0.157+cabal install --overwrite-policy=always phino-0.0.158 phino --version ``` @@ -59,7 +59,7 @@ for the runner and puts it on the `PATH`:  ```yaml-- uses: objectionary/phino@0.0.157+- uses: objectionary/phino@0.0.158   with:     version-file: phino-version.txt - run: phino --version@@ -143,6 +143,8 @@   morphing, 𝕄.   The term is a path from `$`, as in `𝑛1: $.x`, or a meta another line binds,   as in `𝑛4: 𝑛3`.+* `undress` binds a term meta as `morph` does, and then, while the term is a+  formation binding `φ` alone beside its `ρ`, takes its `φ` and morphs that. * `evaluate` binds a term meta to the answer of firing the formation another   meta holds, through evaluation, 𝔼, as in `𝑛2: 𝑛1`. * `defer` binds a term meta to a fresh symbol when another meta holds a copy@@ -297,6 +299,7 @@ $ cat down.txt 𝕄(Φ.y):   𝑛·0·1 := Φ.down( x ↦ 𝜎1:λ )+  𝑛·0·2 := ⟦ x ↦ 𝜎1:λ, λ ⤍ L_down ⟧   𝔼(L_down):     𝔻(ξ.x):       𝛿·1·1 := 𝔻(𝜎1:λ)@@ -304,9 +307,10 @@     𝑛·1·1 := Φ.down( x ↦ 𝜎2:λ )  # 𝑛     𝕄(𝑛·1·1):       𝑛·1·2 := Φ.down( x ↦ 𝜎2:λ )-      morphed 𝑛·1·3 := 𝑛·1·2-    𝑛·1·4 := 𝑛·1·2  # 𝕄(𝑛·1·1)-  looped 𝑛·0·1  # proven+      𝑛·1·3 := ⟦ x ↦ 𝜎2:λ, λ ⤍ L_down ⟧+      morphed 𝑛·1·4 := 𝑛·1·3+    𝑛·1·5 := 𝑛·1·3  # 𝕄(𝑛·1·1)+  looped 𝑛·0·2  # proven ```  In a name such as `𝑛·1·2`, the first number counts the firings, `0` outside@@ -314,15 +318,19 @@ The name `𝛿1·1` is the meta `𝛿1` of the first firing. A protocol may hold these lines: +* `# …` lines open the file with the phino that wrote it, the command, the+  world, the λ functions, the locator, and the expression it points at. * `𝔻(…):` and `𝕄(…):` open a block where dataization or morphing starts at a   new site, and what it does stands under it. * `𝔼(…):` opens one firing, named by its λ function.-* `𝑛·0·1 := …` names an object an application made.+* `𝑛·0·1 := …` names an application, and the line after it names the+  object the application made. * `𝛿1·1 := …` binds a meta of the entry, and the comment names the judgment   and the term it came from. * `𝑛·1·1 := …  # 𝑛` is the term the entry answered with, and the line   commented with `𝕄(𝑛·1·1)` is its normal form. * `boxed …` is dataization stepping into the `φ` of a formation.+* `undressed …` is an `undress` line taking the `φ` of a formation. * `𝛿·1·1 := …` closes a `𝔻` block with the data it found, or with   `𝔻(𝜎1:λ)` where it came down to a symbol. * `morphed …` closes a `𝕄` block with the term it came to.@@ -337,7 +345,7 @@ * `starved …`, `spent …` and `timeout …` are where `--max-steps`,   `--max-firings` and `--max-seconds` ran out. * `msec …`, `firings …` and `fps …` close the file, and the listing above-  leaves them out, since they differ from run to run.+  leaves them and the `# …` lines out, since they differ from run to run.  The `--abridged` option folds every formation longer than sixty-four characters, or than `--abridged=WIDTH`, into its `φ`, `Δ` and `λ` and a count
compiled/generated/Compiled.hs view
@@ -50,7 +50,7 @@  -- The texts of the built-in rules of all four judgments this module is made of. sources :: [String]-sources = ["Rule {name = \"alpha\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArAlpha \945!i1 (ExMeta \"e1\")), result = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"e1\")), when = Just (And [Eq (CmpNum (MetaIndex \"i1\")) (CmpNum (Domain (BiMeta \"B1\"))),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"amiss\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArAlpha \945!i1 (ExAny (Slot \"e\" 11))), result = ExTermination, when = Just (Not (Gt (CmpNum (Domain (BiMeta \"B1\"))) (CmpNum (MetaIndex \"i1\")))), where_ = Nothing, having = Nothing}", "Rule {name = \"copy\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"k1\")), result = ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"k1\"),BiMeta \"B2\"], when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dc\", label = Nothing, description = Nothing, pattern = ExApplication ExTermination (ArTau !t (ExAny (Slot \"e\" 6))), result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dca\", label = Nothing, description = Nothing, pattern = ExApplication ExTermination (ArAlpha \945!i (ExAny (Slot \"e\" 7))), result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dd\", label = Nothing, description = Nothing, pattern = ExDispatch ExTermination !t, result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dl\", label = Nothing, description = Nothing, pattern = ExFormation [BiMeta \"B1\",BiLambda (FnAny (Slot \"F\" 9)),BiMeta \"B2\"], result = ExTermination, when = Just (In [\916] [BiMeta \"B1\",BiMeta \"B2\"]), where_ = Nothing, having = Nothing}", "Rule {name = \"dot\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"n1\"),BiMeta \"B2\"]) !t1, result = ExApplication (ExMeta \"e1\") (ArTau \961 (ExMeta \"e2\")), when = Just (Not (In [\916,\955] [BiMeta \"B1\",BiMeta \"B2\"])), where_ = Just [Extra {meta = ArgExpression (ExMeta \"e1\"), function = \"contextualize\", args = [ArgExpression (ExMeta \"n1\"),ArgExpression (ExFormation [BiMeta \"B1\",BiMeta \"B2\"])]},Extra {meta = ArgExpression (ExMeta \"e2\"), function = \"named\", args = [ArgExpression (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"n1\"),BiMeta \"B2\"])]}], having = Nothing}", "Rule {name = \"miss\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArTau !t1 (ExAny (Slot \"e\" 10))), result = ExTermination, when = Just (And [Not (In [!t1] [BiMeta \"B1\"]),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"norho\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\"]) \961, result = ExTermination, when = Just (Not (In [\961] [BiMeta \"B1\"])), where_ = Nothing, having = Nothing}", "Rule {name = \"null\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) !t1, result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"over\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"e2\")), result = ExTermination, when = Just (Not (Eq (CmpAttr !t1) (CmpAttr \961))), where_ = Nothing, having = Nothing}", "Rule {name = \"overa\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArAlpha \945!i1 (ExMeta \"e2\")), result = ExTermination, when = Just (And [Eq (CmpNum (MetaIndex \"i1\")) (CmpNum (Domain (BiMeta \"B1\"))),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"skip\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArTau \961 (ExMeta \"e1\")), result = ExFormation [BiMeta \"B1\"], when = Just (Not (In [\961] [BiMeta \"B1\"])), where_ = Nothing, having = Nothing}", "Rule {name = \"stay\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau \961 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArTau \961 (ExMeta \"e2\")), result = ExFormation [BiMeta \"B1\",BiTau \961 (ExMeta \"e1\"),BiMeta \"B2\"], when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"stop\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\"]) !t1, result = ExTermination, when = Just (Disjoint [!t1,\966,\955] [BiMeta \"B1\"]), where_ = Nothing, having = Nothing}", "ContextualizeRule {name = \"ca\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArTau !t1 (ExMeta \"e1\")), cmatch = ExMeta \"k1\", cresult = ExApplication (ExMeta \"n2\") (ArTau !t1 (ExMeta \"n3\")), premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")},Premise {result = \"n3\", operation = OpContextualize (ExMeta \"e1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"caa\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArAlpha \945!i1 (ExMeta \"e1\")), cmatch = ExMeta \"k1\", cresult = ExApplication (ExMeta \"n2\") (ArAlpha \945!i1 (ExMeta \"n3\")), premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")},Premise {result = \"n3\", operation = OpContextualize (ExMeta \"e1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"cd\", label = Nothing, match = ExDispatch (ExMeta \"n1\") !t1, cmatch = ExMeta \"k1\", cresult = ExDispatch (ExMeta \"n2\") !t1, premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"cf\", label = Nothing, match = ExFormation [BiMeta \"B1\"], cmatch = ExMeta \"k1\", cresult = ExFormation [BiMeta \"B1\"], premises = []}", "ContextualizeRule {name = \"cg\", label = Nothing, match = ExRoot, cmatch = ExMeta \"k1\", cresult = ExRoot, premises = []}", "ContextualizeRule {name = \"ct\", label = Nothing, match = ExTermination, cmatch = ExMeta \"k1\", cresult = ExTermination, premises = []}", "ContextualizeRule {name = \"cxi\", label = Nothing, match = ExXi, cmatch = ExMeta \"k1\", cresult = ExMeta \"k1\", premises = []}", "MorphRule {name = \"dead\", label = Nothing, match = ExTermination, ematch = ExMeta \"e1\", nresult = ExTermination, when = Nothing, premises = []}", "MorphRule {name = \"ma\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArTau !t1 (ExMeta \"k1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Nothing, premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExApplication (ExMeta \"n2\") (ArTau !t1 (ExMeta \"k1\")))},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"maa\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArAlpha \945!i1 (ExMeta \"k1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Nothing, premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExApplication (ExMeta \"n2\") (ArAlpha \945!i1 (ExMeta \"k1\")))},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"maad\", label = Nothing, match = ExApplication (ExAny (Slot \"n\" 0)) (ArAlpha \945!i (ExMeta \"n1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Absolute (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "MorphRule {name = \"mad\", label = Nothing, match = ExApplication (ExAny (Slot \"n\" 0)) (ArTau !t (ExMeta \"n1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Absolute (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "MorphRule {name = \"md\", label = Nothing, match = ExDispatch (ExMeta \"n1\") !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Just (Not (IsFormation (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExDispatch (ExMeta \"n2\") !t1)},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"mf\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", nresult = ExFormation [BiMeta \"B1\"], when = Nothing, premises = []}", "MorphRule {name = \"mg\", label = Nothing, match = ExRoot, ematch = ExRoot, nresult = ExMeta \"n1\", when = Nothing, premises = [Premise {result = \"n1\", operation = OpMorph ExTermination ExRoot}]}", "MorphRule {name = \"ml\", label = Just \"\\\\uplambda\", match = ExDispatch (ExFormation [BiMeta \"B1\",BiLambda (FnMeta \"F1\"),BiMeta \"B2\"]) !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n3\", when = Nothing, premises = [Premise {result = \"n1\", operation = OpEvaluate (ExFormation [BiMeta \"B1\",BiLambda (FnMeta \"F1\"),BiMeta \"B2\"]) (ExMeta \"e1\")},Premise {result = \"n2\", operation = OpNormalize (ExDispatch (ExMeta \"n1\") !t1)},Premise {result = \"n3\", operation = OpMorph (ExMeta \"n2\") (ExMeta \"e1\")}]}", "MorphRule {name = \"mphi\", label = Just \"\\\\upvarphi\", match = ExDispatch (ExFormation [BiMeta \"B1\"]) !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (And [In [\966] [BiMeta \"B1\"],Disjoint [!t1,\955] [BiMeta \"B1\"]]), premises = [Premise {result = \"n1\", operation = OpNormalize (ExDispatch (ExDispatch (ExFormation [BiMeta \"B1\"]) \966) !t1)},Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")}]}", "MorphRule {name = \"universe\", label = Just \"\\\\Phi\", match = ExRoot, ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Eq (CmpExpr (ExMeta \"e1\")) (CmpExpr ExRoot))), premises = [Premise {result = \"n1\", operation = OpNormalize (ExMeta \"e1\")},Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")}]}", "MorphRule {name = \"xi\", label = Just \"\\\\upxi\", match = ExXi, ematch = ExMeta \"e1\", nresult = ExMeta \"n1\", when = Nothing, premises = [Premise {result = \"n1\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "DataizeRule {name = \"box\", label = Nothing, match = ExFormation [BiMeta \"B1\",BiTau \966 (ExMeta \"e2\"),BiMeta \"B2\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\916,\955] [BiMeta \"B1\",BiMeta \"B2\"]), premises = [Premise {result = \"n1\", operation = OpNormalize (ExDispatch (ExFormation [BiMeta \"B1\",BiTau \966 (ExMeta \"e2\"),BiMeta \"B2\"]) \966)},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n1\") (ExMeta \"e1\")}]}", "DataizeRule {name = \"delta\", label = Just \"\\\\Delta\", match = ExFormation [BiMeta \"B1\",BiDelta (BtMeta \"d1\"),BiMeta \"B2\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\955] [BiMeta \"B1\",BiMeta \"B2\"]), premises = []}", "DataizeRule {name = \"fire\", label = Nothing, match = ExFormation [BiMeta \"B1\",BiLambda (FnMeta \"F1\"),BiMeta \"B2\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\916] [BiMeta \"B1\",BiMeta \"B2\"]), premises = [Premise {result = \"n1\", operation = OpEvaluate (ExFormation [BiMeta \"B1\",BiLambda (FnMeta \"F1\"),BiMeta \"B2\"]) (ExMeta \"e1\")},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n1\") (ExMeta \"e1\")}]}", "DataizeRule {name = \"none\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\916,\955,\966] [BiMeta \"B1\"]), premises = [Premise {result = \"d1\", operation = OpDataize ExTermination (ExMeta \"e1\")}]}", "DataizeRule {name = \"norm\", label = Nothing, match = ExMeta \"n1\", ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (And [Not (IsFormation (ExMeta \"n1\")),Not (Eq (CmpExpr (ExMeta \"n1\")) (CmpExpr ExTermination))]), premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n2\") (ExMeta \"e1\")}]}"]+sources = ["Rule {name = \"alpha\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArAlpha \945!i1 (ExMeta \"e1\")), result = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"e1\")), when = Just (And [Eq (CmpNum (MetaIndex \"i1\")) (CmpNum (Domain (BiMeta \"B1\"))),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"amiss\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArAlpha \945!i1 (ExAny (Slot \"e\" 11))), result = ExTermination, when = Just (Not (Gt (CmpNum (Domain (BiMeta \"B1\"))) (CmpNum (MetaIndex \"i1\")))), where_ = Nothing, having = Nothing}", "Rule {name = \"copy\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"k1\")), result = ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"k1\"),BiMeta \"B2\"], when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dc\", label = Nothing, description = Nothing, pattern = ExApplication ExTermination (ArTau !t (ExAny (Slot \"e\" 6))), result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dca\", label = Nothing, description = Nothing, pattern = ExApplication ExTermination (ArAlpha \945!i (ExAny (Slot \"e\" 7))), result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dd\", label = Nothing, description = Nothing, pattern = ExDispatch ExTermination !t, result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"dl\", label = Nothing, description = Nothing, pattern = ExFormation [BiMeta \"B1\",BiLambda (FnAny (Slot \"F\" 9)),BiMeta \"B2\"], result = ExTermination, when = Just (In [\916] [BiMeta \"B1\",BiMeta \"B2\"]), where_ = Nothing, having = Nothing}", "Rule {name = \"dot\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"n1\"),BiMeta \"B2\"]) !t1, result = ExApplication (ExMeta \"e1\") (ArTau \961 (ExMeta \"e2\")), when = Just (Not (In [\916,\955] [BiMeta \"B1\",BiMeta \"B2\"])), where_ = Just [Extra {meta = ArgExpression (ExMeta \"e1\"), function = \"contextualize\", args = [ArgExpression (ExMeta \"n1\"),ArgExpression (ExFormation [BiMeta \"B1\",BiMeta \"B2\"])]},Extra {meta = ArgExpression (ExMeta \"e2\"), function = \"named\", args = [ArgExpression (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"n1\"),BiMeta \"B2\"])]}], having = Nothing}", "Rule {name = \"miss\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArTau !t1 (ExAny (Slot \"e\" 10))), result = ExTermination, when = Just (And [Not (In [!t1] [BiMeta \"B1\"]),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"norho\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\"]) \961, result = ExTermination, when = Just (Not (In [\961] [BiMeta \"B1\"])), where_ = Nothing, having = Nothing}", "Rule {name = \"null\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\",BiVoid !t1,BiMeta \"B2\"]) !t1, result = ExTermination, when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"over\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArTau !t1 (ExMeta \"e2\")), result = ExTermination, when = Just (Not (Eq (CmpAttr !t1) (CmpAttr \961))), where_ = Nothing, having = Nothing}", "Rule {name = \"overa\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau !t1 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArAlpha \945!i1 (ExMeta \"e2\")), result = ExTermination, when = Just (And [Eq (CmpNum (MetaIndex \"i1\")) (CmpNum (Domain (BiMeta \"B1\"))),Not (Eq (CmpAttr !t1) (CmpAttr \961))]), where_ = Nothing, having = Nothing}", "Rule {name = \"skip\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\"]) (ArTau \961 (ExMeta \"e1\")), result = ExFormation [BiMeta \"B1\"], when = Just (Not (In [\961] [BiMeta \"B1\"])), where_ = Nothing, having = Nothing}", "Rule {name = \"stay\", label = Nothing, description = Nothing, pattern = ExApplication (ExFormation [BiMeta \"B1\",BiTau \961 (ExMeta \"e1\"),BiMeta \"B2\"]) (ArTau \961 (ExMeta \"e2\")), result = ExFormation [BiMeta \"B1\",BiTau \961 (ExMeta \"e1\"),BiMeta \"B2\"], when = Nothing, where_ = Nothing, having = Nothing}", "Rule {name = \"stop\", label = Nothing, description = Nothing, pattern = ExDispatch (ExFormation [BiMeta \"B1\"]) !t1, result = ExTermination, when = Just (Disjoint [!t1,\966,\955] [BiMeta \"B1\"]), where_ = Nothing, having = Nothing}", "ContextualizeRule {name = \"ca\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArTau !t1 (ExMeta \"e1\")), cmatch = ExMeta \"k1\", cresult = ExApplication (ExMeta \"n2\") (ArTau !t1 (ExMeta \"n3\")), premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")},Premise {result = \"n3\", operation = OpContextualize (ExMeta \"e1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"caa\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArAlpha \945!i1 (ExMeta \"e1\")), cmatch = ExMeta \"k1\", cresult = ExApplication (ExMeta \"n2\") (ArAlpha \945!i1 (ExMeta \"n3\")), premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")},Premise {result = \"n3\", operation = OpContextualize (ExMeta \"e1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"cd\", label = Nothing, match = ExDispatch (ExMeta \"n1\") !t1, cmatch = ExMeta \"k1\", cresult = ExDispatch (ExMeta \"n2\") !t1, premises = [Premise {result = \"n2\", operation = OpContextualize (ExMeta \"n1\") (ExMeta \"k1\")}]}", "ContextualizeRule {name = \"cf\", label = Nothing, match = ExFormation [BiMeta \"B1\"], cmatch = ExMeta \"k1\", cresult = ExFormation [BiMeta \"B1\"], premises = []}", "ContextualizeRule {name = \"cg\", label = Nothing, match = ExRoot, cmatch = ExMeta \"k1\", cresult = ExRoot, premises = []}", "ContextualizeRule {name = \"ct\", label = Nothing, match = ExTermination, cmatch = ExMeta \"k1\", cresult = ExTermination, premises = []}", "ContextualizeRule {name = \"cxi\", label = Nothing, match = ExXi, cmatch = ExMeta \"k1\", cresult = ExMeta \"k1\", premises = []}", "MorphRule {name = \"dead\", label = Nothing, match = ExTermination, ematch = ExMeta \"e1\", nresult = ExTermination, when = Nothing, premises = []}", "MorphRule {name = \"ma\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArTau !t1 (ExMeta \"k1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Nothing, premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExApplication (ExMeta \"n2\") (ArTau !t1 (ExMeta \"k1\")))},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"maa\", label = Nothing, match = ExApplication (ExMeta \"n1\") (ArAlpha \945!i1 (ExMeta \"k1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Nothing, premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExApplication (ExMeta \"n2\") (ArAlpha \945!i1 (ExMeta \"k1\")))},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"maad\", label = Nothing, match = ExApplication (ExAny (Slot \"n\" 0)) (ArAlpha \945!i (ExMeta \"n1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Absolute (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "MorphRule {name = \"mad\", label = Nothing, match = ExApplication (ExAny (Slot \"n\" 0)) (ArTau !t (ExMeta \"n1\")), ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Absolute (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "MorphRule {name = \"md\", label = Nothing, match = ExDispatch (ExMeta \"n1\") !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n4\", when = Just (Not (IsFormation (ExMeta \"n1\"))), premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"n3\", operation = OpNormalize (ExDispatch (ExMeta \"n2\") !t1)},Premise {result = \"n4\", operation = OpMorph (ExMeta \"n3\") (ExMeta \"e1\")}]}", "MorphRule {name = \"mf\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", nresult = ExFormation [BiMeta \"B1\"], when = Nothing, premises = []}", "MorphRule {name = \"mg\", label = Nothing, match = ExRoot, ematch = ExRoot, nresult = ExMeta \"n1\", when = Nothing, premises = [Premise {result = \"n1\", operation = OpMorph ExTermination ExRoot}]}", "MorphRule {name = \"ml\", label = Just \"\\\\uplambda\", match = ExDispatch (ExFormation [BiMeta \"B1\"]) !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n3\", when = Just (In [\955] [BiMeta \"B1\"]), premises = [Premise {result = \"n1\", operation = OpEvaluate (ExFormation [BiMeta \"B1\"]) (ExMeta \"e1\")},Premise {result = \"n2\", operation = OpNormalize (ExDispatch (ExMeta \"n1\") !t1)},Premise {result = \"n3\", operation = OpMorph (ExMeta \"n2\") (ExMeta \"e1\")}]}", "MorphRule {name = \"mphi\", label = Just \"\\\\upvarphi\", match = ExDispatch (ExFormation [BiMeta \"B1\"]) !t1, ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (And [In [\966] [BiMeta \"B1\"],Disjoint [!t1,\955] [BiMeta \"B1\"]]), premises = [Premise {result = \"n1\", operation = OpNormalize (ExDispatch (ExDispatch (ExFormation [BiMeta \"B1\"]) \966) !t1)},Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")}]}", "MorphRule {name = \"universe\", label = Just \"\\\\Phi\", match = ExRoot, ematch = ExMeta \"e1\", nresult = ExMeta \"n2\", when = Just (Not (Eq (CmpExpr (ExMeta \"e1\")) (CmpExpr ExRoot))), premises = [Premise {result = \"n1\", operation = OpNormalize (ExMeta \"e1\")},Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")}]}", "MorphRule {name = \"xi\", label = Just \"\\\\upxi\", match = ExXi, ematch = ExMeta \"e1\", nresult = ExMeta \"n1\", when = Nothing, premises = [Premise {result = \"n1\", operation = OpMorph ExTermination (ExMeta \"e1\")}]}", "DataizeRule {name = \"box\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (And [In [\966] [BiMeta \"B1\"],Disjoint [\916,\955] [BiMeta \"B1\"]]), premises = [Premise {result = \"n1\", operation = OpNormalize (ExDispatch (ExFormation [BiMeta \"B1\"]) \966)},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n1\") (ExMeta \"e1\")}]}", "DataizeRule {name = \"delta\", label = Just \"\\\\Delta\", match = ExFormation [BiMeta \"B1\",BiDelta (BtMeta \"d1\"),BiMeta \"B2\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\955] [BiMeta \"B1\",BiMeta \"B2\"]), premises = []}", "DataizeRule {name = \"fire\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (And [In [\955] [BiMeta \"B1\"],Disjoint [\916] [BiMeta \"B1\"]]), premises = [Premise {result = \"n1\", operation = OpEvaluate (ExFormation [BiMeta \"B1\"]) (ExMeta \"e1\")},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n1\") (ExMeta \"e1\")}]}", "DataizeRule {name = \"none\", label = Nothing, match = ExFormation [BiMeta \"B1\"], ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (Disjoint [\916,\955,\966] [BiMeta \"B1\"]), premises = [Premise {result = \"d1\", operation = OpDataize ExTermination (ExMeta \"e1\")}]}", "DataizeRule {name = \"norm\", label = Nothing, match = ExMeta \"n1\", ematch = ExMeta \"e1\", dresult = BtMeta \"d1\", when = Just (And [Not (IsFormation (ExMeta \"n1\")),Not (Eq (CmpExpr (ExMeta \"n1\")) (CmpExpr ExTermination))]), premises = [Premise {result = \"n2\", operation = OpMorph (ExMeta \"n1\") (ExMeta \"e1\")},Premise {result = \"d1\", operation = OpDataize (ExMeta \"n2\") (ExMeta \"e1\")}]}"]  -- Whether the term is a normal form: no built-in rule of normalization -- matches anywhere inside it.@@ -451,13 +451,10 @@ -- The morphing rule 'ml'. morphingMl :: Expression -> Expression -> [In.Premises Expression] morphingMl term universe =-  [ In.Evaluates (B.formed (concat [x4, [BiLambda x8], x7])) universe (\n1 -> pure (In.Concludes (In.Onward (In.Normalized (D.Morphing, "ml")) (ExDispatch n1 x2) universe)))+  [ In.Evaluates (B.formed x3) universe (\n1 -> pure (In.Concludes (In.Onward (In.Normalized (D.Morphing, "ml")) (ExDispatch n1 x2) universe)))   | ExDispatch x1 x2 <- [term]   , ExFormation x3 <- [x1]-  , (x4, x5) <- M.splits x3-  , (x6 : x7) <- [x5]-  , BiLambda x8 <- [x6]-  , M.named x8+  , all (`Ru.presentIn` concat [x3]) [AtLambda]   ]  -- The morphing rule 'mphi'.@@ -487,13 +484,9 @@ -- The dataization rule 'box'. dataizationBox :: Expression -> Expression -> [In.Premises Bytes] dataizationBox term universe =-  [ In.Concludes (In.Onward (In.Normalized (D.Dataization, "box")) (ExDispatch (B.formed (concat [x2, [BiTau AtPhi x7], x5])) AtPhi) universe)+  [ In.Concludes (In.Onward (In.Normalized (D.Dataization, "box")) (ExDispatch (B.formed x1) AtPhi) universe)   | ExFormation x1 <- [term]-  , (x2, x3) <- M.splits x1-  , (x4 : x5) <- [x3]-  , BiTau x6 x7 <- [x4]-  , x6 == AtPhi-  , not (any (`Ru.presentIn` concat [x2, x5]) [AtDelta, AtLambda])+  , (all (`Ru.presentIn` concat [x1]) [AtPhi] && not (any (`Ru.presentIn` concat [x1]) [AtDelta, AtLambda]))   ]  -- The dataization rule 'delta'.@@ -510,13 +503,9 @@ -- The dataization rule 'fire'. dataizationFire :: Expression -> Expression -> [In.Premises Bytes] dataizationFire term universe =-  [ In.Evaluates (B.formed (concat [x2, [BiLambda x6], x5])) universe (\n1 -> pure (In.Concludes (In.Onward (In.Taken (D.Evaluation, "evaluate")) n1 universe)))+  [ In.Evaluates (B.formed x1) universe (\n1 -> pure (In.Concludes (In.Onward (In.Taken (D.Evaluation, "evaluate")) n1 universe)))   | ExFormation x1 <- [term]-  , (x2, x3) <- M.splits x1-  , (x4 : x5) <- [x3]-  , BiLambda x6 <- [x4]-  , M.named x6-  , not (any (`Ru.presentIn` concat [x2, x5]) [AtDelta])+  , (all (`Ru.presentIn` concat [x1]) [AtLambda] && not (any (`Ru.presentIn` concat [x1]) [AtDelta]))   ]  -- The dataization rule 'none'.
phino.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: phino-version: 0.0.158+version: 0.0.159 license: MIT synopsis: Command-Line Manipulator of 𝜑-Calculus Expressions description: Please see the README on GitHub at <https://github.com/objectionary/phino#readme>
resources/dataization/box.yaml view
@@ -2,16 +2,20 @@ # SPDX-License-Identifier: MIT --- name: box-match: ⟦𝐵1, φ ↦ 𝑒2, 𝐵2⟧+match: ⟦𝐵1⟧ universe: 𝑒1 conclusion: 𝛿1 when:-  disjoint:-    - [Δ, λ]-    - [𝐵1, 𝐵2]+  and:+    - in:+        - φ+        - 𝐵1+    - disjoint:+        - [Δ, λ]+        - [𝐵1] premises:   - n-result: 𝑛1-    normalize: ⟦𝐵1, φ ↦ 𝑒2, 𝐵2⟧.φ+    normalize: ⟦𝐵1⟧.φ   - d-result: 𝛿1     dataize:       - 𝑛1
resources/dataization/fire.yaml view
@@ -2,17 +2,21 @@ # SPDX-License-Identifier: MIT --- name: fire-match: ⟦𝐵1, λ ⤍ 𝑓1, 𝐵2⟧+match: ⟦𝐵1⟧ universe: 𝑒1 conclusion: 𝛿1 when:-  disjoint:-    - [Δ]-    - [𝐵1, 𝐵2]+  and:+    - in:+        - λ+        - 𝐵1+    - disjoint:+        - [Δ]+        - [𝐵1] premises:   - n-result: 𝑛1     evaluate:-      - ⟦𝐵1, λ ⤍ 𝑓1, 𝐵2⟧+      - ⟦𝐵1⟧       - 𝑒1   - d-result: 𝛿1     dataize:
resources/morphing/ml.yaml view
@@ -3,13 +3,17 @@ --- name: ml label: \uplambda-match: '⟦𝐵1, λ ⤍ 𝑓1, 𝐵2⟧.𝜏1'+match: ⟦𝐵1⟧.𝜏1 universe: 𝑒1 conclusion: 𝑛3+when:+  in:+    - λ+    - 𝐵1 premises:   - n-result: 𝑛1     evaluate:-      - '⟦𝐵1, λ ⤍ 𝑓1, 𝐵2⟧'+      - ⟦𝐵1⟧       - 𝑒1   - n-result: 𝑛2     normalize: '𝑛1.𝜏1'
src/Abridge.hs view
@@ -75,6 +75,7 @@     salient :: PAIR -> Bool     salient PA_TAU{attr = AT_PHI{}} = True     salient PA_FORMATION{attr = AT_PHI{}} = True+    salient PA_VOID{attr = AT_PHI{}} = True     salient PA_LAMBDA{} = True     salient PA_META_LAMBDA{} = True     salient PA_DELTA{} = True
src/CLI.hs view
@@ -42,8 +42,8 @@   setLogger _command   case _command of     CmdRewrite opts -> runRewrite opts-    CmdDataize opts -> runDataize opts-    CmdMorph opts -> runMorph opts+    CmdDataize opts -> runDataize args opts+    CmdMorph opts -> runMorph args opts     CmdExplain opts -> runExplain opts     CmdMerge opts -> runMerge opts     CmdMatch opts -> runMatch opts
src/CLI/Helpers.hs view
@@ -15,7 +15,8 @@ import Canonizer (canonizeExpr, lambdaNames) import Compiled (compiled) import Control.Exception-import Control.Monad (when, (>=>))+import Control.Monad (mfilter, when, (>=>))+import qualified Data.ByteString as BS import Data.Char (isDigit, toLower) import Data.Functor ((<&>)) import Data.IORef@@ -23,8 +24,11 @@ import qualified Data.Map.Strict as M import Data.Maybe import qualified Data.Text as T+import Data.Text.Encoding (encodeUtf8)+import Data.Time (getZonedTime)+import Data.Version (showVersion) import qualified Data.Yaml as Yaml-import Deps (Evaluation (EvRun), Judgment, SaveEvalFunc, SaveStepFunc, dontSaveEval, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, progressed, resited, saveEval, saveEvalXml, saveStep)+import Deps (Evaluation (EvHeader, EvRun), Header (Header), Judgment, SaveEvalFunc, SaveStepFunc, World (World), dontSaveEval, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, progressed, resited, saveEval, saveEvalXml, saveStep) import Encoding import Engine (Engine, fresh, yaml) import Files (ensuredFile, overwrite)@@ -32,12 +36,13 @@ import Functions (buildFunctions, execFunctions) import GHC.Clock (getMonotonicTime) import LaTeX (LatexContext (LatexContext), defaultMeetLength, defaultMeetPopularity, expressionToLaTeX, rewrittensToLatex)-import Lambdas (Lambdas, emptyLambdas, readLambdas, taken)+import Lambdas (Lambdas, emptyLambdas, readLambdas, sized, taken) import Lining (LineFormat (SINGLELINE))-import Locator (locatedExpression)+import Locator (locatedExpression, withLocatedExpression) import Logger import Morph (ReduceContext (..), insideUniverse) import Parser (Form, parseExpressionThrows, parseExpressionThrows')+import Paths_phino (version) import qualified Printer as P import qualified Random as R import Rewriter (Rewrittens', stepHeaders)@@ -46,7 +51,7 @@ import System.FilePath (splitExtension, takeDirectory, takeExtension, (</>)) import System.IO (Handle, IOMode (WriteMode), getContents', hClose, hSetEncoding, openFile, utf8) import Text.Printf (printf)-import XMIR (Atoms, expressionToXMIR, parseXMIRThrows, printXMIR, renameAtoms, xmirAtoms, xmirToPhi)+import XMIR (Atoms, expressionToXMIR, gitRevision, parseXMIRThrows, printXMIR, renameAtoms, xmirAtoms, xmirToPhi) import Yaml (normalizationRules) import qualified Yaml as Y @@ -155,19 +160,46 @@ salted :: PrintContext -> Expression -> IO String salted ctx = flattened ctx{_sugar = SALTY} -aimed :: PrintContext -> Judgment -> Maybe String -> Expression -> ReduceContext -> IO (Expression, ReduceContext)-aimed printCtx judgment Nothing expr ctx = do+headerOf :: [String] -> Maybe FilePath -> String -> Expression -> Maybe FilePath -> Lambdas -> IO Header+headerOf args file input expr table lambdas = do+  now <- getZonedTime+  pure+    ( Header+        (showVersion version)+        (mfilter (/= "UNKNOWN") (Just gitRevision))+        now+        args+        (World file (length (lines input)) (BS.length (encodeUtf8 (T.pack input))) (tops expr) (bindings expr))+        ((,sized lambdas) <$> table)+    )+  where+    tops :: Expression -> Int+    tops (ExFormation bds) = length [attr | BiTau attr _ <- bds]+    tops _ = 0+    bindings :: Expression -> Int+    bindings (ExFormation bds) = length bds + sum [bindings inner | BiTau _ inner <- bds]+    bindings (ExApplication inner (ArTau _ arg)) = bindings inner + bindings arg+    bindings (ExApplication inner (ArAlpha _ arg)) = bindings inner + bindings arg+    bindings (ExDispatch inner _) = bindings inner+    bindings (ExPhiMeet _ _ inner) = bindings inner+    bindings (ExPhiAgain _ _ inner) = bindings inner+    bindings _ = 0++aimed :: PrintContext -> Judgment -> Header -> Maybe String -> Expression -> ReduceContext -> IO (Expression, ReduceContext)+aimed printCtx judgment header Nothing expr ctx = do+  ctx._saveEval . EvHeader header ctx._locator =<< locatedExpression ctx._locator expr   heading ctx._saveEval printCtx judgment ctx._locator   pure (expr, ctx)-aimed printCtx judgment (Just src) expr@(ExFormation _) ctx = do+aimed printCtx judgment header (Just src) expr@(ExFormation _) ctx = do   target <- parseExpressionThrows src   logDebug (printf "The option '--inside' is specified, reducing '%s' inside the given universe" (P.printExpression target))   held <- newIORef []   (universe, aiming) <- insideUniverse target expr ctx{_saveEval = \record -> modifyIORef' held (record :)}+  ctx._saveEval (EvHeader header aiming._locator target)   heading ctx._saveEval printCtx judgment aiming._locator   mapM_ (ctx._saveEval . resited ctx._site aiming._locator) . reverse =<< readIORef held   pure (universe, aiming{_site = aiming._locator, _saveEval = ctx._saveEval})-aimed _ _ (Just _) expr _ =+aimed _ _ _ (Just _) expr _ =   invalidCLIArguments     (printf "The option --inside requires the input expression to be a formation, but given: %s" (P.printExpression expr)) @@ -221,6 +253,12 @@ printFocused ctx@PrintCtx{..} expr   | _focus == ExRoot = printInFormat ctx expr   | otherwise = locatedExpression _focus expr >>= printExpression ctx++filteredAt :: Expression -> Expression -> [Expression] -> [Expression] -> Expression -> IO Expression+filteredAt locator universe excluded included answer = do+  placed <- withLocatedExpression locator answer universe+  shown <- F.exclude' placed excluded >>= (`F.include'` included)+  locatedExpression locator shown  printExpression :: PrintContext -> Expression -> IO String printExpression ctx@PrintCtx{..} ex = case _outputFormat of
src/CLI/Parsers.hs view
@@ -257,7 +257,9 @@             <> help               "Path to the YAML file of λ functions this run may fire, each entry keyed by a regular expression \               \over λ names under \"λ\", naming the operands it brings down to data under \"dataize\", the ones \-              \it reduces to a normal form under \"morph\", the terms it fires through 𝔼 under \"evaluate\", \+              \it reduces to a normal form under \"morph\", the ones it reduces to a normal form and takes the \+              \φ of while it is a formation binding φ alone under \"undress\", the terms it fires through 𝔼 \+              \under \"evaluate\", \               \the copies one of whose arguments reads to a bare symbol it answers with a fresh symbol under \               \\"defer\", the terms it keeps with every ρ applied to a dispatch dropped under \"stay\", the terms \               \it rewrites with rules spelled as in a rule file under \"rewrite\", the terms it keeps with \
src/CLI/Runners.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TupleSections #-}  -- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com -- SPDX-License-Identifier: MIT@@ -161,8 +162,8 @@         _meetPrefix         _outputFormat -runDataize :: OptsDataize -> IO ()-runDataize OptsDataize{..} = do+runDataize :: [String] -> OptsDataize -> IO ()+runDataize args OptsDataize{..} = do   validateOpts   deadline <- timed _maxSeconds   lambdas <- lambdasOf _symbolic@@ -183,18 +184,19 @@   minted <- newIORef 0   memo <- memoized _acyclic   linked <- engine-  (outcome, chain, _) <-+  header <- headerOf args _inputFile input expr _symbolic lambdas+  ((outcome, chain, _), universe, aim) <-     withEvalFunc       _protocol       printCtx       ( \record -> do           let ctx = ReduceContext loc loc Nothing _maxDepth _maxCycles (Steps _maxSteps 0) tally minted deadline memo 1 (Just (1, Dataization, loc)) _depthSensitive _shuffle _partial _acyclic _maxLoops Dataization [] Map.empty lambdas (building linked) reduction evaluation save record linked-          (universe, aiming) <- aimed printCtx Dataization _inside expr ctx+          (universe, aiming) <- aimed printCtx Dataization header _inside expr ctx           started universe aiming-          dataize universe emptyState aiming+          (,universe,aiming._locator) <$> dataize universe emptyState aiming       )   when _sequence (exclude chain >>= include >>= \shown -> printRewrittens printCtx (shown, False) >>= putStrLn)-  unless _quiet (printOutcome printCtx (\residue -> F.exclude' residue excluded >>= (`F.include'` included)) outcome >>= putStrLn)+  unless _quiet (printOutcome printCtx (filteredAt aim universe excluded included) outcome >>= putStrLn)   where     printOutcome :: PrintContext -> (Expression -> IO Expression) -> Outcome -> IO String     printOutcome _ _ (Dataized bytes) = pure (P.printBytes bytes)@@ -245,8 +247,8 @@     listing :: Expression -> String     listing e = escapeXMLText (P.printExpression' e (_sugarType, UNICODE, _flat, _margin)) -runMorph :: OptsMorph -> IO ()-runMorph OptsMorph{..} = do+runMorph :: [String] -> OptsMorph -> IO ()+runMorph args OptsMorph{..} = do   validateOpts   deadline <- timed _maxSeconds   lambdas <- lambdasOf _symbolic@@ -267,21 +269,25 @@   minted <- newIORef 0   memo <- memoized _acyclic   linked <- engine-  (morphed, chain, _) <-+  header <- headerOf args _inputFile input expr _symbolic lambdas+  ((morphed, chain, _), universe, aim) <-     withEvalFunc       _protocol       printCtx       ( \record -> do           let ctx = ReduceContext loc loc Nothing _maxDepth _maxCycles (Steps _maxSteps 0) tally minted deadline memo 1 (Just (1, Morphing, loc)) _depthSensitive _shuffle _partial _acyclic _maxLoops Morphing [] Map.empty lambdas (building linked) reduction evaluation save record linked-          (universe, aiming) <- aimed printCtx Morphing _inside expr ctx+          (universe, aiming) <- aimed printCtx Morphing header _inside expr ctx           started universe aiming-          morph universe emptyState aiming+          (,universe,aiming._locator) <$> morph universe emptyState aiming       )   printed <-     if _quiet       then pure Nothing       else do-        answer <- F.exclude' (if foc == ExRoot then morphed else maybe morphed fst (lastMaybe chain)) excluded >>= (`F.include'` included)+        answer <-+          if foc == ExRoot+            then filteredAt aim universe excluded included morphed+            else F.exclude' (maybe morphed fst (lastMaybe chain)) excluded >>= (`F.include'` included)         validateXmirTopLevel _outputFormat answer         Just <$> printAnswer printCtx answer   when _sequence (exclude chain >>= include >>= \shown -> printRewrittens printCtx (shown, False) >>= putStrLn)
src/Deps.hs view
@@ -14,12 +14,14 @@ import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.State.Strict (StateT, get, modify, put, runStateT) import Data.Bifunctor (bimap, first, second)+import Data.Char (isAlphaNum) import Data.Either (lefts, rights) import Data.IORef (IORef, readIORef, writeIORef) import Data.List (intercalate, sortOn) import qualified Data.Map.Strict as Map import Data.Maybe (fromMaybe, listToMaybe, mapMaybe) import qualified Data.Text as T+import Data.Time (ZonedTime, defaultTimeLocale, formatTime) import Files (overwrite) import Forks (Refusal (..), Side (..)) import GHC.Clock (getMonotonicTime)@@ -120,6 +122,7 @@   | EvDelta Int Bytes   | EvManufactured Int Int   | EvBoxed Int Expression+  | EvUndressed Int Expression   | EvLooped Int Judgment Acyclic Expression Expression   | EvStuck Int T.Text Judgment Expression   | EvStall Int T.Text@@ -143,7 +146,12 @@   | EvFabricated Int (Expression, Expression) (Expression, Expression) Expression   | EvTaken Int [Expression] Expression   | EvWorld Expression+  | EvHeader Header Expression Expression +data Header = Header String (Maybe String) ZonedTime [String] World (Maybe (FilePath, Int))++data World = World (Maybe FilePath) Int Int Int Int+ type SaveEvalFunc = Evaluation -> IO ()  resited :: Expression -> Expression -> Evaluation -> Evaluation@@ -176,6 +184,7 @@ tier (EvDelta depth _) = depth tier (EvManufactured depth _) = depth tier (EvBoxed depth _) = depth+tier (EvUndressed depth _) = depth tier (EvLooped depth _ _ _ _) = depth tier (EvStuck depth _ _ _) = depth tier (EvStall depth _) = depth@@ -199,6 +208,7 @@ tier (EvFabricated depth _ _ _) = depth tier (EvTaken depth _ _) = depth tier EvWorld{} = maxBound+tier EvHeader{} = 0  type Named a = Map.Map Int [(Expression, a)] @@ -353,10 +363,8 @@       datum <- spelt (Left symbol)       let (naming, protocol') = stored (Left symbol) protocol       pure (protocol', Just (indented at (printf "%s := %s" naming datum)))-    written at (EvBoxed _ term) protocol = do-      let (index, counted) = numbered protocol-      taken <- printed (abbreviatedInside protocol._made term)-      pure (counted{_made = namedInsert term (alias (opener protocol) index) counted._made}, Just (indented at (printf "boxed %s·%d := %s" (labelled protocol answer) index taken)))+    written at (EvBoxed _ term) protocol = taking at "boxed" term protocol+    written at (EvUndressed _ term) protocol = taking at "undressed" term protocol     written at (EvLooped _ judgment mode self site) protocol = do       form <- render self       remarks <- context protocol judgment site@@ -406,11 +414,16 @@       pure (protocol, Just (indented at (remarked (printf "deferred %s := %s" (printFunction (FnSymbol symbol)) form) remarks)))     written at (EvApplied _ judgment call object site) protocol = do       let (index, counted) = numbered protocol-          aliased :: Expression-          aliased = alias (opener protocol) index+          (index', counted') = numbered counted+          stem :: String+          stem = labelled protocol answer       form <- printed (abbreviatedInside protocol._made call)+      body <- printed (abbreviatedInside protocol._made object)       remarks <- context protocol judgment site-      pure (counted{_made = namedInsert call aliased (namedInsert object aliased counted._made)}, Just (indented at (remarked (printf "%s·%d := %s" (labelled protocol answer) index form) remarks)))+      pure+        ( counted'{_made = namedInsert call (alias (opener protocol) index) (namedInsert object (alias (opener protocol) index') counted'._made)}+        , Just (unlines [indented at (remarked (printf "%s·%d := %s" stem index form) remarks), indented at (printf "%s·%d := %s" stem index' body)])+        )     written at (EvBuilt depth term) protocol = do       let (index, counted) = numbered protocol       value <- borrowed protocol term@@ -453,6 +466,21 @@       remarks <- mapM sourced sides       pure (protocol'{_made = namedFormation term (alias (opener protocol) index) protocol'._made}, Just (indented at (remarked (printf "%s := %s" naming value) remarks)))     written _ (EvWorld world) protocol = pure (protocol{_made = namedInsert world ExRoot protocol._made}, Nothing)+    written _ (EvHeader (Header release revision dated command (World file count size tops bindings) table) locator expression) protocol = do+      place <- printed locator+      body <- printed expression+      pure (protocol, Just (unlines (map ("# " ++) (told ++ ["Locator: " ++ place, "Expression: " ++ body]) ++ [""])))+      where+        told :: [String]+        told =+          [ printf "Written by phino %s on %s" (maybe release (printf "%s (%s)" release) revision) (formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S %Ez" dated)+          , "Command: " ++ commanded command+          , printf "World: %s, %s" (fromMaybe "stdin" file) (intercalate ", " [amount count "line" "lines", amount size "byte" "bytes", amount tops "object" "objects" ++ " at the top", amount bindings "binding" "bindings"])+          ]+            ++ ["Symbolic: " ++ path ++ ", " ++ amount entries "entry" "entries" | Just (path, entries) <- [table]]+        amount :: Int -> String -> String -> String+        amount 1 one _ = "1 " ++ one+        amount many _ several = show many ++ " " ++ several     spelt :: Either Int Bytes -> IO String     spelt (Left symbol) = printf "𝔻(%s)" <$> render (standing symbol)     spelt (Right bytes) = render (ExBytes bytes)@@ -498,6 +526,11 @@       where         index :: Int         index = maybe 1 (+ 1) (Map.lookup (opener protocol) protocol._counted)+    taking :: Int -> String -> Expression -> Protocol -> IO (Protocol, Maybe String)+    taking at word term protocol = do+      let (index, counted) = numbered protocol+      taken <- printed (abbreviatedInside protocol._made term)+      pure (counted{_made = namedInsert term (alias (opener protocol) index) counted._made}, Just (indented at (printf "%s %s·%d := %s" word (labelled protocol answer) index taken)))  endEval :: Handle -> IORef Protocol -> Double -> IO () endEval handle cursor began = do@@ -554,16 +587,28 @@     elements :: Int -> Evaluation -> Nesting -> IO (Nesting, [String])     elements _ (EvRun judgment locator) nesting =       pure-        ( nesting{_closing = (0, opened judgment) : (if null nesting._closing then [(-1, "protocol")] else kept)}-        , ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>" | null nesting._closing]-            ++ ["<protocol>" | null nesting._closing]-            ++ closers-            ++ [run]+        ( nesting{_closing = (0, opened judgment) : rooted kept}+        , prologue nesting ++ closers ++ [run]         )       where         (kept, closers) = closed 0 nesting._closing         run :: String         run = indentedXml 0 (printf "<%s at=\"%s\">" (opened judgment) (quoted locator))+    elements _ (EvHeader (Header release revision dated command (World file count size tops bindings) table) locator _) nesting = do+      place <- printed locator+      pure+        ( nesting{_closing = rooted nesting._closing}+        , prologue nesting+            ++ map+              (indentedXml 0)+              ( [ printf "<written by=\"phino\" version=\"%s\"%s on=\"%s\"/>" (escapeXML release) (maybe "" (printf " revision=\"%s\"" . escapeXML) revision :: String) (formatTime defaultTimeLocale "%Y-%m-%dT%H:%M:%S%Ez" dated)+                , printf "<command>%s</command>" (escapeXMLText (commanded command))+                , printf "<world%s lines=\"%d\" bytes=\"%d\" objects=\"%d\" bindings=\"%d\"/>" (maybe "" (printf " file=\"%s\"" . escapeXML) file :: String) count size tops bindings+                ]+                  ++ [printf "<symbolic file=\"%s\" entries=\"%d\"/>" (escapeXML path) entries | Just (path, entries) <- [table]]+                  ++ [printf "<locator>%s</locator>" (escapeXMLText place)]+              )+        )     elements at (EvFiring depth key judgment site) nesting = do       (fired, lines') <- placed at nesting (printf "<evaluate λ=\"%s\" by=\"%s\" at=\"%s\">" (quoted key) (opened judgment) . escapeXML <$> located depth site)       pure (fired{_fires = fired._fires + 1, _openedAt = (depth, fired._fires + 1) : fired._openedAt, _closing = (at, "evaluate") : fired._closing}, lines')@@ -601,12 +646,8 @@     elements at (EvManufactured _ symbol) nesting = placed at nesting' (pure (printf "<manufactured meta=\"%s\">%s</manufactured>" (escapeXML naming) (sigma symbol)))       where         (naming, nesting') = stored (Left symbol) nesting-    elements at (EvBoxed depth term) nesting =-      placed at nesting $ do-        taken <- coined depth term >>= lift . spelled-        (naming, aliased) <- counted-        modify (first (\nesting' -> nesting'{_objects = namedInsert term aliased nesting'._objects}))-        pure (printf "<boxed meta=\"%s\">%s</boxed>" (escapeXML naming) (escapeXMLText taken))+    elements at (EvBoxed depth term) nesting = taken at "boxed" depth term nesting+    elements at (EvUndressed depth term) nesting = taken at "undressed" depth term nesting     elements at (EvData _ spelling _ value) nesting =       placed at nesting $ case (found value nesting._held, value) of         (Just naming, _) -> pure (bound (escapeXMLText naming))@@ -641,8 +682,11 @@         locator <- located depth site         (origin, given) <- parted depth call         (naming, aliased) <- counted-        modify (first (\nesting' -> nesting'{_objects = namedInsert call aliased (namedInsert object aliased nesting'._objects)}))-        pure (printf "<applied meta=\"%s\" by=\"%s\" at=\"%s\" of=\"%s\">%s</applied>" (escapeXML naming) (opened judgment) (escapeXML locator) (escapeXML origin) given)+        modify (bimap (\nesting' -> nesting'{_objects = namedInsert call aliased nesting'._objects}) (printf "<applied meta=\"%s\" by=\"%s\" at=\"%s\" of=\"%s\">%s</applied>" (escapeXML naming) (opened judgment) (escapeXML locator) (escapeXML origin) given :))+        element <- made depth object+        (naming', aliased') <- counted+        modify (first (\nesting' -> nesting'{_objects = namedInsert object aliased' nesting'._objects}))+        pure (element (escapeXML naming'))     elements at (EvBuilt depth term) nesting =       placed at nesting $ do         body <- leaf depth term@@ -669,6 +713,13 @@         pure (printf "<fabricated meta=\"%s\" left=\"%s\" right=\"%s\">%s</fabricated>" (escapeXML naming) (escapeXML one) (escapeXML two) (escapeXMLText body))     elements at (EvTaken depth _ term) nesting = placed at nesting (concluded "answered" depth term)     elements _ (EvWorld world) nesting = pure (known world nesting, [])+    prologue :: Nesting -> [String]+    prologue nesting+      | null nesting._closing = ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<protocol>"]+      | otherwise = []+    rooted :: [(Int, String)] -> [(Int, String)]+    rooted [] = [(-1, "protocol")]+    rooted open = open     sided :: Int -> Nesting -> (Expression, Expression) -> Naming String     sided depth _ (_, term@(ExFormation [BiLambda (FnSymbol _)])) = leaf depth term     sided _ nesting (side@(ExMeta _), _) = labelled nesting . T.pack <$> lift (spelled side)@@ -714,6 +765,13 @@     located depth site = do       (nesting, _) <- get       maybe (titled depth site >>= lift . traced) pure (listToMaybe [naming | (_, built, naming) <- nesting._sources, built == site])+    taken :: Int -> String -> Int -> Expression -> Nesting -> IO (Nesting, [String])+    taken at tag depth term nesting =+      placed at nesting $ do+        body <- coined depth term >>= lift . spelled+        (naming, aliased) <- counted+        modify (first (\nesting' -> nesting'{_objects = namedInsert term aliased nesting'._objects}))+        pure (printf "<%s meta=\"%s\">%s</%s>" tag (escapeXML naming) (escapeXMLText body) tag)     concluded :: String -> Int -> Expression -> Naming String     concluded tag depth term = do       body <- leaf depth term@@ -733,7 +791,12 @@     coined _ term@(ExFormation [BiDelta _]) = pure term     coined depth term@(ExFormation bds) = do       (nesting, _) <- get-      maybe (anonymous depth term bds) (cloned depth term) (copied nesting bds)+      case copied nesting bds of+        Just (origin, []) -> do+          path <- titled depth origin+          modify (first (\nesting' -> nesting'{_objects = namedInsert term path nesting'._objects}))+          pure path+        copy -> maybe (anonymous depth bds) (cloned depth) copy >>= recorded term     coined depth term@(ExDispatch inner attr) = do       head' <- titled depth inner       if pathed head' then pure (ExDispatch head' attr) else opaque term@@ -746,21 +809,22 @@     coined _ term       | plain term = pure term       | otherwise = opaque term-    cloned :: Int -> Expression -> (Expression, [(Attribute, Expression)]) -> Naming Expression-    cloned depth term (origin, []) = do-      path <- titled depth origin-      modify (first (\nesting -> nesting{_objects = namedInsert term path nesting._objects}))-      pure path-    cloned depth term (origin, bound) = do+    made :: Int -> Expression -> Naming (String -> String)+    made depth (ExFormation bds) = do+      (nesting, _) <- get+      maybe (anonymous depth bds) (cloned depth) (copied nesting bds)+    made depth term = cloned depth (term, [])+    cloned :: Int -> (Expression, [(Attribute, Expression)]) -> Naming (String -> String)+    cloned depth (origin, bound) = do       path <- leaf depth origin       given <- mapM (\(attr, value) -> titled depth value >>= lift . attributed (printAttribute attr)) bound-      recorded term (\naming -> printf "<formed meta=\"%s\" of=\"%s\">%s</formed>" naming (escapeXML path) (concat given))-    anonymous :: Int -> Expression -> [Binding] -> Naming Expression-    anonymous depth term bds = do+      pure (\naming -> enclosed "formed" (printf "<formed meta=\"%s\"" naming) (path, concat given))+    anonymous :: Int -> [Binding] -> Naming (String -> String)+    anonymous depth bds = do       parts <- mapM (part depth) bds       let marks = concat (lefts parts)           inner = concat (rights parts)-      recorded term (\naming -> if null inner then printf "<formed meta=\"%s\"%s/>" naming marks else printf "<formed meta=\"%s\"%s>%s</formed>" naming marks inner)+      pure (\naming -> if null inner then printf "<formed meta=\"%s\"%s/>" naming marks else printf "<formed meta=\"%s\"%s>%s</formed>" naming marks inner)     part :: Int -> Binding -> Naming (Either String String)     part depth (BiTau attr value) = Right <$> (titled depth value >>= lift . attributed (printAttribute attr))     part _ (BiVoid attr) = pure (Right (printf "<void attr=\"%s\"/>" (escapeXML (printAttribute attr))))@@ -918,6 +982,19 @@     hPutStrLn handle (indentedXml 0 (printf "<fps>%d</fps>" (perSecond nesting._fires taken)))     hPutStrLn handle "</protocol>"   writeIORef cursor nesting{_closing = []}++commanded :: [String] -> String+commanded command = unwords (map shelled ("phino" : command))+  where+    shelled :: String -> String+    shelled word+      | not (null word) && all safe word = word+      | otherwise = "'" ++ concatMap escaped word ++ "'"+    safe :: Char -> Bool+    safe char = isAlphaNum char || char `elem` ("-_./=:,+@%" :: String)+    escaped :: Char -> String+    escaped '\'' = "'\\''"+    escaped char = [char]  closed :: Int -> [(Int, String)] -> ([(Int, String)], [String]) closed depth open = (kept, [indentedXml level (printf "</%s>" element) | (level, element) <- shut])
src/Evaluate.hs view
@@ -71,10 +71,11 @@       let ctx = caller{_nesting = caller._nesting + 1}       outcome <- try $ do         (bound, dataized, conditions) <- foldM (down ctx) (substEmpty, state, []) entry._dataized-        (bound', morphed, normals) <- foldM (through ctx) (bound, dataized, []) entry._morphed-        firing <- Firing func (reverse conditions) . (reverse normals ++) <$> sides entry._ending+        (bound', morphed, normals) <- foldM (through ctx "morph" (still pure)) (bound, dataized, []) entry._morphed+        (bound'', undressed, normals') <- foldM (through ctx "undress" (peeled ctx)) (bound', morphed, normals) entry._undressed+        firing <- Firing func (reverse conditions) . (reverse normals' ++) <$> sides entry._ending         known <- remembered caller._memo firing-        maybe (worked ctx entry firing bound' morphed) (\answer -> (answer, morphed) <$ shown ctx._nesting answer) known+        maybe (worked ctx entry firing bound'' undressed) (\answer -> (answer, undressed) <$ shown ctx._nesting answer) known       case outcome of         Right (answer, state') -> do           retained caller._memo form stamp (Answered answer)@@ -101,9 +102,10 @@     line ctx _ held (Morphed meta source) = reduced ctx held meta source     line ctx ending held (Evaluated meta source) = evaluated ctx ending held meta source     line ctx _ (bound, state') (Deferred meta source) = (,state') <$> deferred ctx state' meta source bound-    line ctx _ (bound, state') (Stayed meta source) = (,state') <$> reshaped ctx (EvReshaped ctx._nesting meta._spelling "stay") (pure . stayed) meta source bound-    line ctx _ (bound, state') (Rewritten meta source rules) = (,state') <$> reshaped ctx (EvReshaped ctx._nesting meta._spelling "rewrite") (rewritten (RuleContext ctx._buildTerm ctx._universe ctx._engine._normal) rules) meta source bound-    line ctx _ (bound, state') (Symbolized meta source) = (,state') <$> reshaped ctx (EvReshaped ctx._nesting meta._spelling "symbolize") (masked ctx) meta source bound+    line ctx _ held (Stayed meta source) = reshaped ctx "stay" (still (pure . stayed)) meta source held+    line ctx _ held (Rewritten meta source rules) = reshaped ctx "rewrite" (still (rewritten (RuleContext ctx._buildTerm ctx._universe ctx._engine._normal) rules)) meta source held+    line ctx _ held (Symbolized meta source) = reshaped ctx "symbolize" (still (masked ctx)) meta source held+    line ctx _ held (Undressed meta source) = reshaped ctx "undress" (peeled ctx) meta source held     shown :: Int -> Answer -> IO ()     shown depth (Answer built normal) = do       caller._saveEval (EvBuilt depth built)@@ -156,13 +158,18 @@           ctx._saveEval (EvData ctx._nesting meta._spelling origin datum)           bound' <- bind meta (MvBytes bytes) bound           pure (datum, bound', state'')-    through :: ReduceContext -> (Subst, State, [Expression]) -> (Meta, Expression) -> IO (Subst, State, [Expression])-    through ctx (bound, state', normals) (meta, term) = do+    through :: ReduceContext -> T.Text -> (State -> Expression -> IO (Expression, State)) -> (Subst, State, [Expression]) -> (Meta, Expression) -> IO (Subst, State, [Expression])+    through ctx block change (bound, state', normals) (meta, term) = do       placed <- operand term       (normal, state'') <- morphing univ ctx{_site = term} placed state'-      ctx._saveEval (EvTerm ctx._nesting meta._spelling Morphing term normal)-      bound' <- bind meta (MvExpression normal) bound-      pure (bound', state'', normal : normals)+      (shaped, state''') <- change state'' normal+      ctx._saveEval+        ( if shaped == normal+            then EvTerm ctx._nesting meta._spelling Morphing term normal+            else EvReshaped ctx._nesting meta._spelling block term shaped+        )+      bound' <- bind meta (MvExpression shaped) bound+      pure (bound', state''', shaped : normals)     reduced :: ReduceContext -> (Subst, State) -> Meta -> Meta -> IO (Subst, State)     reduced ctx (bound, state') meta source = do       term <- buildExpressionThrows (ExMeta source._name) bound@@ -170,16 +177,31 @@       ctx._saveEval (EvTerm ctx._nesting meta._spelling Morphing (ExMeta source._name) normal)       bound' <- bind meta (MvExpression normal) bound       pure (bound', state'')-    reshaped :: ReduceContext -> (Expression -> Expression -> Evaluation) -> (Expression -> IO Expression) -> Meta -> Meta -> Subst -> IO Subst-    reshaped ctx record change meta source bound = do+    reshaped :: ReduceContext -> T.Text -> (State -> Expression -> IO (Expression, State)) -> Meta -> Meta -> (Subst, State) -> IO (Subst, State)+    reshaped ctx block change meta source (bound, state') = do       kept <- buildExpressionThrows (ExMeta source._name) bound-      term <- change kept+      (term, state'') <- change state' kept       ctx._saveEval         ( if term == kept             then EvBound ctx._nesting meta._spelling (ExMeta source._name) term-            else record (ExMeta source._name) term+            else EvReshaped ctx._nesting meta._spelling block (ExMeta source._name) term         )-      bind meta (MvExpression term) bound+      (,state'') <$> bind meta (MvExpression term) bound+    still :: (Expression -> IO Expression) -> State -> Expression -> IO (Expression, State)+    still change state' term = (,state') <$> change term+    peeled :: ReduceContext -> State -> Expression -> IO (Expression, State)+    peeled ctx state' term@(ExFormation bds)+      | dressed bds = do+          let taken = ExDispatch term AtPhi+          ctx._saveEval (EvUndressed ctx._nesting taken)+          deep <- deeper ctx{_judgment = Morphing, _site = taken}+          (normal, state'') <- morphing univ deep taken state'+          peeled deep state'' normal+    peeled _ state' term = pure (term, state')+    dressed :: [Binding] -> Bool+    dressed bds = case filter ((/= Just AtRho) . attributeFromBinding) bds of+      [BiTau AtPhi _] -> True+      _ -> False     masked :: ReduceContext -> Expression -> IO Expression     masked ctx term = do       (stood, known, spent) <- symbolized term <$> readIORef ctx._minted
src/Lambdas.hs view
@@ -18,6 +18,7 @@   , minted   , readLambdas   , rewritten+  , sized   , stayed   , symbolized   , taken@@ -63,6 +64,7 @@ data Line   = Dataized Meta Meta   | Morphed Meta Meta+  | Undressed Meta Meta   | Evaluated Meta Meta   | Deferred Meta Meta   | Stayed Meta Meta@@ -77,6 +79,7 @@   { _key :: Text   , _dataized :: [(Meta, Expression)]   , _morphed :: [(Meta, Expression)]+  , _undressed :: [(Meta, Expression)]   , _lines :: [Line]   , _ending :: Ending   }@@ -98,13 +101,15 @@     (dataized, weighing) <- partitionEithers <$> reductions key bytesMeta Dataized entry "dataize"     ending <- concluded (T.unpack key) dataized entry     (morphed, reading) <- partitionEithers <$> reductions key expressionMeta Morphed entry "morph"+    (undressed, peeling) <- partitionEithers <$> reductions key expressionMeta Undressed entry "undress"     lambda <--      Lambda key dataized morphed-        <$> (written (T.unpack key) entry >>= ordered (T.unpack key) (map (_name . fst) morphed) . ((weighing ++ reading) ++))+      Lambda key dataized morphed undressed+        <$> (written (T.unpack key) entry >>= ordered (T.unpack key) (map (_name . fst) (morphed ++ undressed)) . ((weighing ++ reading ++ peeling) ++))         <*> pure ending     once (T.unpack key) lambda     mapM_ (metaless (T.unpack key) "dataize" "a path from '$' or a meta alone") lambda._dataized     mapM_ (metaless (T.unpack key) "morph" "a path from '$' or a meta alone") lambda._morphed+    mapM_ (metaless (T.unpack key) "undress" "a path from '$' or a meta alone") lambda._undressed     answered (T.unpack key) lambda     pure lambda     where@@ -114,7 +119,7 @@         name : _ -> fail (printf "The key '%s' of λ function '%s' is none of the keys an entry reads: %s" (T.unpack name) key (T.unpack (T.intercalate ", " known)))         where           known :: [Text]-          known = ["λ", "dataize", "morph", "evaluate", "defer", "stay", "rewrite", "symbolize", "join", "𝑛"]+          known = ["λ", "dataize", "morph", "undress", "evaluate", "defer", "stay", "rewrite", "symbolize", "join", "𝑛"]       concluded :: String -> [(Meta, Expression)] -> Object -> Yaml.Parser Ending       concluded key dataized entry = do         answer <- entry .:? "𝑛"@@ -230,6 +235,7 @@           source :: Line -> Meta           source (Dataized _ meta) = meta           source (Morphed _ meta) = meta+          source (Undressed _ meta) = meta           source (Evaluated _ meta) = meta           source (Deferred _ meta) = meta           source (Stayed _ meta) = meta@@ -238,6 +244,7 @@       binding :: Line -> Meta       binding (Dataized meta _) = meta       binding (Morphed meta _) = meta+      binding (Undressed meta _) = meta       binding (Evaluated meta _) = meta       binding (Deferred meta _) = meta       binding (Stayed meta _) = meta@@ -254,7 +261,7 @@         Just meta -> fail (printf "The meta '%s' of λ function '%s' is bound by more than one line, while each meta may be bound once" (T.unpack meta._spelling) key)         where           bound :: [Meta]-          bound = map fst lambda._morphed ++ map binding lambda._lines+          bound = map fst (lambda._morphed ++ lambda._undressed) ++ map binding lambda._lines           twice :: [Text] -> [Meta] -> Maybe Meta           twice _ [] = Nothing           twice seen (meta : rest)@@ -283,11 +290,11 @@           known :: [Text]           known = map (_name . fst) lambda._dataized ++ reduced           reduced :: [Text]-          reduced = map (_name . fst) lambda._morphed ++ map (_name . binding) lambda._lines+          reduced = map (_name . fst) (lambda._morphed ++ lambda._undressed) ++ map (_name . binding) lambda._lines           sided :: String -> Expression -> Yaml.Parser ()           sided name side = case filter (`notElem` reduced) (metas side) of             [] -> pure ()-            meta : _ -> fail (printf "The side '%s' of the 'join' block of λ function '%s' reads the meta '%s' that none of 'morph', 'evaluate', 'stay', 'rewrite', 'symbolize' and 'defer' binds" name key (T.unpack meta))+            meta : _ -> fail (printf "The side '%s' of the 'join' block of λ function '%s' reads the meta '%s' that none of 'morph', 'undress', 'evaluate', 'stay', 'rewrite', 'symbolize' and 'defer' binds" name key (T.unpack meta))       dataless :: String -> Expression -> Yaml.Parser ()       dataless key answer         | computes answer = fail (printf "The '𝑛' of λ function '%s' reads data, while a symbolic answer may mention nothing but 𝜎" key)@@ -326,6 +333,9 @@  emptyLambdas :: Lambdas emptyLambdas = Lambdas []++sized :: Lambdas -> Int+sized (Lambdas registered) = length registered  readLambdas :: FilePath -> IO Lambdas readLambdas path = do
src/Parser.hs view
@@ -160,7 +160,7 @@     lambdaOf = whiteSpace >> char ':' >> whiteSpace >> oneOf ['L', 'λ']  metaSuffix :: Parser String-metaSuffix = lexeme (many (oneOf ('_' : '-' : ['0' .. '9'] ++ ['a' .. 'z'] ++ ['A' .. 'Z']) <?> "meta suffix"))+metaSuffix = lexeme (many (choice [try (char '-' <* notFollowedBy (char '>')), oneOf ('_' : ['0' .. '9'] ++ ['a' .. 'z'] ++ ['A' .. 'Z'])] <?> "meta suffix"))  metaVar :: Char -> String -> Parser (Either Slot T.Text) metaVar ch uni = do
src/XMIR.hs view
@@ -20,6 +20,7 @@   , defaultXmirContext   , escapeXML   , escapeXMLText+  , gitRevision   , xmirTime   , XmirContext (XmirContext)   )
test-resources/evaluate-packs/answers-a-symbol-nobody-has-worked-out.yaml view
@@ -21,33 +21,40 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    morphed 𝑛·0·3 := 𝜎1:λ+      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    morphed 𝑛·0·5 := 𝜎1:λ
test-resources/evaluate-packs/answers-a-whole-family-of-names-with-one-entry.yaml view
@@ -21,58 +21,70 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.times( x ↦ 7.0 )+      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.times( x ↦ 7.0 )+    𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧     𝔼(L_number_times):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·2·4 := 7.0-          morphed 𝑛·2·5 := 𝑛·2·4-        boxed 𝑛·2·6 := 𝑛·2·5.φ-        𝕄(𝑛·2·6):-          𝑛·2·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )-          morphed 𝑛·2·8 := 𝑛·2·7-        boxed 𝑛·2·9 := 𝑛·2·8.φ+          𝑛·2·5 := 7.0+          𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+          morphed 𝑛·2·7 := 𝑛·2·6+        boxed 𝑛·2·8 := 𝑛·2·7.φ+        𝕄(𝑛·2·8):+          𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+          𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·2·11 := 𝑛·2·10+        boxed 𝑛·2·12 := 𝑛·2·11.φ         𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0       𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)-      𝑛·2·10 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-      𝕄(𝑛·2·10):-        𝑛·2·11 := Φ.number( φ ↦ 𝜎2:λ )-        morphed 𝑛·2·12 := 𝑛·2·11-      𝑛·2·13 := 𝑛·2·12  # 𝕄(𝑛·2·10)-    morphed 𝑛·0·4 := 𝜎2:λ+      𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+      𝕄(𝑛·2·13):+        𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )+        𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧+        morphed 𝑛·2·16 := 𝑛·2·15+      𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)+    morphed 𝑛·0·7 := 𝜎2:λ
test-resources/evaluate-packs/answers-its-own-sides-on-a-condition-another-join-read.yaml view
@@ -40,94 +40,117 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := Φ.pick( x ↦ 5.0.gt( 0.0 ).if( 7.0, 7.0 ) )-    𝑛·0·2 := 𝑛·0·1( y ↦ 5.0.gt( 0.0 ).if( 70.0, 70.0 ) )+    𝑛·0·2 := ⟦ x ↦ 5.0.gt( 0.0 ).if( 7.0, 7.0 ), y ↦ ∅, λ ⤍ L_pick ⟧+    𝑛·0·3 := 𝑛·0·1( y ↦ 5.0.gt( 0.0 ).if( 70.0, 70.0 ) )+    𝑛·0·4 := ⟦ x ↦ 5.0.gt( 0.0 ).if( 7.0, 7.0 ), y ↦ 5.0.gt( 0.0 ).if( 70.0, 70.0 ), λ ⤍ L_pick ⟧     𝔼(L_pick):       𝔻(ξ.x):         𝕄(ξ.x):           𝑛·1·1 := 5.0-          𝑛·1·2 := 𝑛·1·1.gt( x ↦ 0.0 )+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧+          𝑛·1·3 := 𝑛·1·1.gt( x ↦ 0.0 )+          𝑛·1·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧           𝔼(L_number_gt):             𝔻(ξ.ρ):               𝕄(ξ.ρ):                 𝑛·2·1 := 5.0-                morphed 𝑛·2·2 := 𝑛·2·1-              boxed 𝑛·2·3 := 𝑛·2·2.φ-              𝕄(𝑛·2·3):-                𝑛·2·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-                morphed 𝑛·2·5 := 𝑛·2·4-              boxed 𝑛·2·6 := 𝑛·2·5.φ+                𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧+                morphed 𝑛·2·3 := 𝑛·2·2+              boxed 𝑛·2·4 := 𝑛·2·3.φ+              𝕄(𝑛·2·4):+                𝑛·2·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+                𝑛·2·6 := 40-14-00-00-00-00-00-00:Δ:φ+                morphed 𝑛·2·7 := 𝑛·2·6+              boxed 𝑛·2·8 := 𝑛·2·7.φ               𝛿·2·1 := 40-14-00-00-00-00-00-00  # 5.0             𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)             𝔻(ξ.x):               𝕄(ξ.x):-                𝑛·2·7 := 0.0-                morphed 𝑛·2·8 := 𝑛·2·7-              boxed 𝑛·2·9 := 𝑛·2·8.φ-              𝕄(𝑛·2·9):-                𝑛·2·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+                𝑛·2·9 := 0.0+                𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧                 morphed 𝑛·2·11 := 𝑛·2·10               boxed 𝑛·2·12 := 𝑛·2·11.φ+              𝕄(𝑛·2·12):+                𝑛·2·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+                𝑛·2·14 := 00-00-00-00-00-00-00-00:Δ:φ+                morphed 𝑛·2·15 := 𝑛·2·14+              boxed 𝑛·2·16 := 𝑛·2·15.φ               𝛿·2·2 := 00-00-00-00-00-00-00-00  # 0.0             𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)-            𝑛·2·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-            𝕄(𝑛·2·13):-              𝑛·2·14 := Φ.bool( φ ↦ 𝜎1:λ )-              morphed 𝑛·2·15 := 𝑛·2·14-            𝑛·2·16 := 𝑛·2·15  # 𝕄(𝑛·2·13)-          𝑛·1·3 := 𝑛·2·14.if( then ↦ 7.0 )-          𝑛·1·4 := 𝑛·1·3( else ↦ 7.0 )-          morphed 𝑛·1·5 := 𝑛·1·4+            𝑛·2·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+            𝕄(𝑛·2·17):+              𝑛·2·18 := Φ.bool( φ ↦ 𝜎1:λ )+              𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+              morphed 𝑛·2·20 := 𝑛·2·19+            𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)+          𝑛·1·5 := 𝑛·2·18.if( then ↦ 7.0 )+          𝑛·1·6 := ⟦ then ↦ 7.0, else ↦ ∅, λ ⤍ L_fork ⟧+          𝑛·1·7 := 𝑛·1·5( else ↦ 7.0 )+          𝑛·1·8 := ⟦ then ↦ 7.0, else ↦ 7.0, λ ⤍ L_fork ⟧+          morphed 𝑛·1·9 := 𝑛·1·8         𝔼(L_fork):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·3·1 := Φ.bool( φ ↦ 𝜎1:λ )-              morphed 𝑛·3·2 := 𝑛·2·16-            boxed 𝑛·3·3 := 𝑛·3·2.φ+              𝑛·3·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+              morphed 𝑛·3·3 := 𝑛·2·21+            boxed 𝑛·3·4 := 𝑛·3·3.φ             𝛿·3·1 := 𝔻(𝜎1:λ)           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)           𝕄(ξ.then):-            𝑛·3·4 := 7.0-            morphed 𝑛·3·5 := 𝑛·3·4-          𝕄(ξ.else):-            𝑛·3·6 := 7.0+            𝑛·3·5 := 7.0+            𝑛·3·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧             morphed 𝑛·3·7 := 𝑛·3·6-          𝑛·3·8 := 𝑛·3·7  # 𝕄(ξ.then), 𝕄(ξ.else)-        boxed 𝑛·1·6 := 𝑛·3·8.φ-        𝕄(𝑛·1·6):-          𝑛·1·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ+          𝕄(ξ.else):+            𝑛·3·8 := 7.0+            𝑛·3·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧+            morphed 𝑛·3·10 := 𝑛·3·9+          𝑛·3·11 := 𝑛·3·10  # 𝕄(ξ.then), 𝕄(ξ.else)+        boxed 𝑛·1·10 := 𝑛·3·11.φ+        𝕄(𝑛·1·10):+          𝑛·1·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+          𝑛·1·12 := 40-1C-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·13 := 𝑛·1·12+        boxed 𝑛·1·14 := 𝑛·1·13.φ         𝛿·1·1 := 40-1C-00-00-00-00-00-00  # 7.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)       𝕄(ξ.y):-        𝑛·1·10 := Φ.number( φ ↦ 𝑛·2·4 )-        𝑛·1·11 := 𝑛·1·10.gt( x ↦ 𝑛·2·7 )+        𝑛·1·15 := Φ.number( φ ↦ 𝑛·2·5 )+        𝑛·1·16 := ⟦ φ ↦ 𝑛·2·5, gt(x) ↦ L_number_gt:λ ⟧+        𝑛·1·17 := 𝑛·1·15.gt( x ↦ 𝑛·2·9 )+        𝑛·1·18 := ⟦ x ↦ 𝑛·2·9, λ ⤍ L_number_gt ⟧         𝔼(L_number_gt):           𝑛·4·1 := 𝑛·3·1  # 𝑛-          𝑛·4·2 := 𝑛·2·16  # 𝕄(𝑛·4·1)-        𝑛·1·12 := 𝑛·3·1.if( then ↦ 70.0 )-        𝑛·1·13 := 𝑛·1·12( else ↦ 70.0 )-        morphed 𝑛·1·14 := 𝑛·1·13-      𝑛1·1 := 𝑛·1·13  # 𝕄(ξ.y)+          𝑛·4·2 := 𝑛·2·21  # 𝕄(𝑛·4·1)+        𝑛·1·19 := 𝑛·3·1.if( then ↦ 70.0 )+        𝑛·1·20 := ⟦ then ↦ 70.0, else ↦ ∅, λ ⤍ L_fork ⟧+        𝑛·1·21 := 𝑛·1·19( else ↦ 70.0 )+        𝑛·1·22 := ⟦ then ↦ 70.0, else ↦ 70.0, λ ⤍ L_fork ⟧+        morphed 𝑛·1·23 := 𝑛·1·22+      𝑛1·1 := 𝑛·1·22  # 𝕄(ξ.y)       𝔼(L_fork):  # 𝔼(𝑛1)         𝔻(ξ.ρ):           𝕄(ξ.ρ):             𝑛·5·1 := Φ.bool( φ ↦ 𝜎1:λ )-            morphed 𝑛·5·2 := 𝑛·4·2-          boxed 𝑛·5·3 := 𝑛·5·2.φ+            𝑛·5·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+            morphed 𝑛·5·3 := 𝑛·4·2+          boxed 𝑛·5·4 := 𝑛·5·3.φ           𝛿·5·1 := 𝔻(𝜎1:λ)         𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)         𝕄(ξ.then):-          𝑛·5·4 := 70.0-          morphed 𝑛·5·5 := 𝑛·5·4-        𝕄(ξ.else):-          𝑛·5·6 := 70.0+          𝑛·5·5 := 70.0+          𝑛·5·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧           morphed 𝑛·5·7 := 𝑛·5·6-        𝑛·5·8 := 𝑛·5·7  # 𝕄(ξ.then), 𝕄(ξ.else)-      𝑛2·1 := 𝑛·5·8  # 𝔼(𝑛1)-      𝑛·1·15 := 𝑛·5·8  # 𝑛-      𝕄(𝑛·1·15):-        morphed 𝑛·1·16 := 𝑛·5·8-      𝑛·1·17 := 𝑛·1·16  # 𝕄(𝑛·1·15)-    𝑛·0·3 := Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ )-    morphed 𝑛·0·4 := 𝑛·0·3+        𝕄(ξ.else):+          𝑛·5·8 := 70.0+          𝑛·5·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧+          morphed 𝑛·5·10 := 𝑛·5·9+        𝑛·5·11 := 𝑛·5·10  # 𝕄(ξ.then), 𝕄(ξ.else)+      𝑛2·1 := 𝑛·5·11  # 𝔼(𝑛1)+      𝑛·1·24 := 𝑛·5·11  # 𝑛+      𝕄(𝑛·1·24):+        morphed 𝑛·1·25 := 𝑛·5·11+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·24)+    𝑛·0·5 := Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ )+    𝑛·0·6 := 40-51-80-00-00-00-00-00:Δ:φ+    morphed 𝑛·0·7 := 𝑛·0·6
test-resources/evaluate-packs/answers-the-same-under-acyclic.yaml view
@@ -22,33 +22,40 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    morphed 𝑛·0·3 := 𝜎1:λ+      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    morphed 𝑛·0·5 := 𝜎1:λ
test-resources/evaluate-packs/binds-a-copy-over-no-bare-symbol-as-it-is.yaml view
@@ -21,11 +21,12 @@     𝔼(L_hold):       𝕄(ξ.b):         𝑛·1·1 := Φ.step( tup ↦ Φ.items.tail )-        morphed 𝑛·1·2 := 𝑛·1·1-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.b)-      𝑛2·1 := 𝑛·1·2  # 𝑛1-      𝑛·1·3 := 𝑛·1·2:φ  # 𝑛-      𝕄(𝑛·1·3):-        morphed 𝑛·1·4 := 𝑛·1·2:φ-      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·3)-    morphed 𝑛·0·1 := 𝑛·1·2+        𝑛·1·2 := ⟦ tup ↦ Φ.items.tail, φ ↦ tup.next ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.b)+      𝑛2·1 := 𝑛·1·3  # 𝑛1+      𝑛·1·4 := 𝑛·1·3:φ  # 𝑛+      𝕄(𝑛·1·4):+        morphed 𝑛·1·5 := 𝑛·1·3:φ+      𝑛·1·6 := 𝑛·1·5  # 𝕄(𝑛·1·4)+    morphed 𝑛·0·1 := 𝑛·1·3
test-resources/evaluate-packs/cuts-a-recursion-that-differs-by-symbols-only.yaml view
@@ -24,6 +24,7 @@ protocol: |   𝕄(Φ.y):     𝑛·0·1 := Φ.down( x ↦ 𝜎1:λ )+    𝑛·0·2 := ⟦ x ↦ 𝜎1:λ, λ ⤍ L_down ⟧     𝔼(L_down):       𝔻(ξ.x):         𝛿·1·1 := 𝔻(𝜎1:λ)@@ -31,6 +32,7 @@       𝑛·1·1 := Φ.down( x ↦ 𝜎2:λ )  # 𝑛       𝕄(𝑛·1·1):         𝑛·1·2 := Φ.down( x ↦ 𝜎2:λ )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛·1·4 := 𝑛·1·2  # 𝕄(𝑛·1·1)-    looped 𝑛·0·1  # proven+        𝑛·1·3 := ⟦ x ↦ 𝜎2:λ, λ ⤍ L_down ⟧+        morphed 𝑛·1·4 := 𝑛·1·3+      𝑛·1·5 := 𝑛·1·3  # 𝕄(𝑛·1·1)+    looped 𝑛·0·2  # proven
test-resources/evaluate-packs/defers-a-copy-a-join-passed-through-stay-and-symbolize.yaml view
@@ -51,22 +51,24 @@           𝑛1·2 := 01-:Δ  # 𝕄(ξ.a)           𝕄(ξ.b):             𝑛·2·2 := Φ.step( tup ↦ Φ.items.tail )-            morphed 𝑛·2·3 := 𝑛·2·2-          𝑛2·2 := 𝑛·2·3  # 𝕄(ξ.b)+            𝑛·2·3 := ⟦ tup ↦ Φ.items.tail, φ ↦ tup.next ⟧+            morphed 𝑛·2·4 := 𝑛·2·3+          𝑛2·2 := 𝑛·2·4  # 𝕄(ξ.b)           𝑛3·2 := 01-:Δ  # 𝑛1-          𝑛4·2 := 𝑛·2·3  # 𝑛2+          𝑛4·2 := 𝑛·2·4  # 𝑛2           symbolized 𝜎3 := 01-           𝑛5·2 := 𝜎3:λ  # symbolize(𝑛3)           𝑛7·2 := 𝑛5·2  # 𝑛5-          𝑛6·2 := 𝑛·2·3  # 𝑛4+          𝑛6·2 := 𝑛·2·4  # 𝑛4           deferred 𝜎4 := Φ.step( tup ↦ 𝜎1:λ )  # 𝕄(𝑛6.φ)           joined 𝜎5 := 𝛿1·2 ? 𝜎3 : 𝜎4-          𝑛·2·4 := 𝜎5:λ  # 𝑛7, 𝑛8+          𝑛·2·5 := 𝜎5:λ  # 𝑛7, 𝑛8         𝛿·1·1 := 𝔻(𝜎5:λ)       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)       𝑛·1·1 := Φ.num( φ ↦ 𝜎6:λ )  # 𝑛       𝕄(𝑛·1·1):         𝑛·1·2 := Φ.num( φ ↦ 𝜎6:λ )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛·1·4 := 𝑛·1·3  # 𝕄(𝑛·1·1)+        𝑛·1·3 := 𝜎6:λ:φ+        morphed 𝑛·1·4 := 𝑛·1·3+      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·1)     morphed 𝑛·0·1 := 𝜎6:λ
test-resources/evaluate-packs/defers-a-copy-whose-phi-reads-nothing-of-its-own.yaml view
@@ -22,11 +22,12 @@     𝔼(L_hold):       𝕄(ξ.b):         𝑛·1·1 := Φ.step( tup ↦ Φ.items.tail )-        morphed 𝑛·1·2 := 𝑛·1·1-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.b)+        𝑛·1·2 := ⟦ tup ↦ Φ.items.tail, φ ↦ Φ.done ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.b)       deferred 𝜎2 := Φ.step( tup ↦ 𝜎1:λ )  # 𝕄(𝑛1.φ)-      𝑛·1·3 := 𝜎2:λ:φ  # 𝑛-      𝕄(𝑛·1·3):-        morphed 𝑛·1·4 := 𝜎2:λ:φ-      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·3)+      𝑛·1·4 := 𝜎2:λ:φ  # 𝑛+      𝕄(𝑛·1·4):+        morphed 𝑛·1·5 := 𝜎2:λ:φ+      𝑛·1·6 := 𝑛·1·5  # 𝕄(𝑛·1·4)     morphed 𝑛·0·1 := 𝜎2:λ
test-resources/evaluate-packs/diverges-on-two-sides-that-do-not-join.yaml view
@@ -6,8 +6,8 @@ # and answers a symbol nobody has decided. The join brings both sides to a # normal form through 𝕄 first, each a call of 'plus' nobody has fired # (#1954). The calls add other numbers, so no join makes one term of them,-# and the firing writes 'diverged' with the metas of the applications that-# made the two sides, instead of splitting the run (#1996). Its comment tells+# and the firing writes 'diverged' with the metas of the formations the two+# applications made, instead of splitting the run (#1996). Its comment tells # that the two copies of 'plus' first differ at the ρ the protocol hides, and # that the join names no function to fabricate a formation with (#2043). symbolic: |@@ -40,51 +40,65 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧     𝔼(L_number_gt):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 0.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 0.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.bool( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.if( then ↦ 1.0.plus( 2.0 ) )-    𝑛·0·4 := 𝑛·0·3( else ↦ 3.0.plus( 4.0 ) )+      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ) )+    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧+    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ) )+    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 3.0.plus( 4.0 ), λ ⤍ L_fork ⟧     𝔼(L_fork):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝕄(ξ.then):-        𝑛·2·4 := 1.0-        𝑛·2·5 := 𝑛·2·4.plus( x ↦ 2.0 )-        morphed 𝑛·2·6 := 𝑛·2·5-      𝕄(ξ.else):-        𝑛·2·7 := 3.0-        𝑛·2·8 := 𝑛·2·7.plus( x ↦ 4.0 )+        𝑛·2·5 := 1.0+        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )+        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧         morphed 𝑛·2·9 := 𝑛·2·8-      diverged 𝑛·2·5 vs 𝑛·2·8  # they differ at .ρ, and the join names no otherwise+      𝕄(ξ.else):+        𝑛·2·10 := 3.0+        𝑛·2·11 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·12 := 𝑛·2·10.plus( x ↦ 4.0 )+        𝑛·2·13 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·14 := 𝑛·2·13+      diverged 𝑛·2·8 vs 𝑛·2·13  # they differ at .ρ, and the join names no otherwise
test-resources/evaluate-packs/fails-on-an-operand-that-reaches-the-terminator.yaml view
@@ -37,20 +37,26 @@ protocol: |   𝕄(Φ.l🌵.e1):     𝑛·0·1 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )-    𝑛·0·2 := 𝑛·0·1( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )+    𝑛·0·2 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧+    𝑛·0·3 := 𝑛·0·2( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )+    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧     𝔼(L_entry):       𝔻(ξ.n):         𝕄(ξ.n):           𝑛·1·1 := 1.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+          𝑛·1·6 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 3F-F0-00-00-00-00-00-00  # 1.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.n)       𝕄(ξ.v.φ):-        𝑛·1·7 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )-        𝑛·1·8 := Φ.dataized( target ↦ ⊥ )+        𝑛·1·9 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )+        𝑛·1·10 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧+        𝑛·1·11 := Φ.dataized( target ↦ ⊥ )+        𝑛·1·12 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧         𝔼(L_dataized):
test-resources/evaluate-packs/fires-a-formation-once-however-often-it-is-met.yaml view
@@ -43,74 +43,88 @@     𝔼(L_pair):       𝕄(ξ.a):         𝑛·1·1 := 7.0-        𝑛·1·2 := 𝑛·1·1.plus( x ↦ 5.0.plus( 6.0 ) )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.a)+        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+        𝑛·1·3 := 𝑛·1·1.plus( x ↦ 5.0.plus( 6.0 ) )+        𝑛·1·4 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧+        morphed 𝑛·1·5 := 𝑛·1·4+      𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.a)       𝕄(ξ.b):-        𝑛·1·4 := 7.0-        𝑛·1·5 := 𝑛·1·4.plus( x ↦ 5.0.plus( 6.0 ) )-        morphed 𝑛·1·6 := 𝑛·1·5-      𝑛2·1 := 𝑛·1·5  # 𝕄(ξ.b)+        𝑛·1·6 := 7.0+        𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+        𝑛·1·8 := 𝑛·1·6.plus( x ↦ 5.0.plus( 6.0 ) )+        𝑛·1·9 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧+        morphed 𝑛·1·10 := 𝑛·1·9+      𝑛2·1 := 𝑛·1·9  # 𝕄(ξ.b)       𝔼(L_number_plus):  # 𝔼(𝑛1)         𝔻(ξ.ρ):           𝕄(ξ.ρ):             𝑛·2·1 := 7.0-            morphed 𝑛·2·2 := 𝑛·2·1-          boxed 𝑛·2·3 := 𝑛·2·2.φ-          𝕄(𝑛·2·3):-            𝑛·2·4 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )-            morphed 𝑛·2·5 := 𝑛·2·4-          boxed 𝑛·2·6 := 𝑛·2·5.φ+            𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·2·3 := 𝑛·2·2+          boxed 𝑛·2·4 := 𝑛·2·3.φ+          𝕄(𝑛·2·4):+            𝑛·2·5 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+            𝑛·2·6 := 40-1C-00-00-00-00-00-00:Δ:φ+            morphed 𝑛·2·7 := 𝑛·2·6+          boxed 𝑛·2·8 := 𝑛·2·7.φ           𝛿·2·1 := 40-1C-00-00-00-00-00-00  # 7.0         𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)         𝔻(ξ.x):           𝕄(ξ.x):-            𝑛·2·7 := 5.0-            𝑛·2·8 := 𝑛·2·7.plus( x ↦ 6.0 )-            morphed 𝑛·2·9 := 𝑛·2·8+            𝑛·2·9 := 5.0+            𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+            𝑛·2·11 := 𝑛·2·9.plus( x ↦ 6.0 )+            𝑛·2·12 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧+            morphed 𝑛·2·13 := 𝑛·2·12           𝔼(L_number_plus):             𝔻(ξ.ρ):               𝕄(ξ.ρ):                 𝑛·3·1 := 5.0-                morphed 𝑛·3·2 := 𝑛·3·1-              boxed 𝑛·3·3 := 𝑛·3·2.φ-              𝕄(𝑛·3·3):-                𝑛·3·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-                morphed 𝑛·3·5 := 𝑛·3·4-              boxed 𝑛·3·6 := 𝑛·3·5.φ+                𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+                morphed 𝑛·3·3 := 𝑛·3·2+              boxed 𝑛·3·4 := 𝑛·3·3.φ+              𝕄(𝑛·3·4):+                𝑛·3·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+                𝑛·3·6 := 40-14-00-00-00-00-00-00:Δ:φ+                morphed 𝑛·3·7 := 𝑛·3·6+              boxed 𝑛·3·8 := 𝑛·3·7.φ               𝛿·3·1 := 40-14-00-00-00-00-00-00  # 5.0             𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)             𝔻(ξ.x):               𝕄(ξ.x):-                𝑛·3·7 := 6.0-                morphed 𝑛·3·8 := 𝑛·3·7-              boxed 𝑛·3·9 := 𝑛·3·8.φ-              𝕄(𝑛·3·9):-                𝑛·3·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+                𝑛·3·9 := 6.0+                𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧                 morphed 𝑛·3·11 := 𝑛·3·10               boxed 𝑛·3·12 := 𝑛·3·11.φ+              𝕄(𝑛·3·12):+                𝑛·3·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+                𝑛·3·14 := 40-18-00-00-00-00-00-00:Δ:φ+                morphed 𝑛·3·15 := 𝑛·3·14+              boxed 𝑛·3·16 := 𝑛·3·15.φ               𝛿·3·2 := 40-18-00-00-00-00-00-00  # 6.0             𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)-            𝑛·3·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-            𝕄(𝑛·3·13):-              𝑛·3·14 := Φ.number( φ ↦ 𝜎1:λ )-              morphed 𝑛·3·15 := 𝑛·3·14-            𝑛·3·16 := 𝑛·3·15  # 𝕄(𝑛·3·13)-          boxed 𝑛·2·10 := 𝑛·3·16.φ+            𝑛·3·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+            𝕄(𝑛·3·17):+              𝑛·3·18 := Φ.number( φ ↦ 𝜎1:λ )+              𝑛·3·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·3·20 := 𝑛·3·19+            𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)+          boxed 𝑛·2·14 := 𝑛·3·21.φ           𝛿·2·2 := 𝔻(𝜎1:λ)         𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)-        𝑛·2·11 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-        𝕄(𝑛·2·11):-          𝑛·2·12 := Φ.number( φ ↦ 𝜎2:λ )-          morphed 𝑛·2·13 := 𝑛·2·12-        𝑛·2·14 := 𝑛·2·13  # 𝕄(𝑛·2·11)-      𝑛3·1 := 𝑛·2·14  # 𝔼(𝑛1)+        𝑛·2·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+        𝕄(𝑛·2·15):+          𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )+          𝑛·2·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·2·18 := 𝑛·2·17+        𝑛·2·19 := 𝑛·2·18  # 𝕄(𝑛·2·15)+      𝑛3·1 := 𝑛·2·19  # 𝔼(𝑛1)       𝔼(L_number_plus):  # 𝔼(𝑛2)-        𝑛·4·1 := 𝑛·2·12  # 𝑛+        𝑛·4·1 := 𝑛·2·16  # 𝑛         𝑛·4·2 := 𝑛3·1  # 𝕄(𝑛·4·1)       𝑛4·1 := 𝑛·4·2  # 𝔼(𝑛2)-      𝑛·1·7 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ  # 𝑛-      𝕄(𝑛·1·7):-        morphed 𝑛·1·8 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ-      𝑛·1·9 := 𝑛·1·8  # 𝕄(𝑛·1·7)+      𝑛·1·11 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ  # 𝑛+      𝕄(𝑛·1·11):+        morphed 𝑛·1·12 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ+      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·11)     morphed 𝑛·0·1 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧
test-resources/evaluate-packs/fires-the-arguments-of-a-copy-a-defer-line-defers.yaml view
@@ -44,13 +44,16 @@           𝑛1·2 := 𝑛·2·1  # 𝕄(ξ.a)           𝕄(ξ.b):             𝑛·2·2 := Φ.box( x ↦ Φ.items.tail )-            𝑛·2·3 := 𝑛·2·2( w ↦ Φ.inc( 2A-:Δ ) )-            morphed 𝑛·2·4 := 𝑛·2·3-          𝑛2·2 := 𝑛·2·4  # 𝕄(ξ.b)+            𝑛·2·3 := ⟦ x ↦ Φ.items.tail, w ↦ ∅, φ ↦ x.next ⟧+            𝑛·2·4 := 𝑛·2·2( w ↦ Φ.inc( 2A-:Δ ) )+            𝑛·2·5 := ⟦ x ↦ Φ.items.tail, w ↦ Φ.inc( 2A-:Δ ), φ ↦ x.next ⟧+            morphed 𝑛·2·6 := 𝑛·2·5+          𝑛2·2 := 𝑛·2·6  # 𝕄(ξ.b)           𝑛3·2 := 𝑛1·2  # 𝑛1           𝕄(𝑛2.w):-            𝑛·2·5 := Φ.inc( x ↦ 2A-:Δ )-            morphed 𝑛·2·6 := 𝑛·2·5+            𝑛·2·7 := Φ.inc( x ↦ 2A-:Δ )+            𝑛·2·8 := ⟦ x ↦ 2A-:Δ, λ ⤍ L_inc ⟧+            morphed 𝑛·2·9 := 𝑛·2·8           𝔼(L_inc):  # 𝔼(𝑛2.w)             𝔻(ξ.x):               𝛿·3·1 := 2A-@@ -58,16 +61,18 @@             𝑛·3·1 := Φ.num( φ ↦ 𝜎4:λ )  # 𝑛             𝕄(𝑛·3·1):               𝑛·3·2 := Φ.num( φ ↦ 𝜎4:λ )-              morphed 𝑛·3·3 := 𝑛·3·2-            𝑛·3·4 := 𝑛·3·3  # 𝕄(𝑛·3·1)-          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·3·4 )  # 𝕄(𝑛2.φ)+              𝑛·3·3 := 𝜎4:λ:φ+              morphed 𝑛·3·4 := 𝑛·3·3+            𝑛·3·5 := 𝑛·3·4  # 𝕄(𝑛·3·1)+          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·3·5 )  # 𝕄(𝑛2.φ)           joined 𝜎6 := 𝛿1·2 ? 𝜎3 : 𝜎5-          𝑛·2·7 := 𝜎6:λ  # 𝑛3, 𝑛4+          𝑛·2·10 := 𝜎6:λ  # 𝑛3, 𝑛4         𝛿·1·1 := 𝔻(𝜎6:λ)       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)       𝑛·1·1 := Φ.num( φ ↦ 𝜎7:λ )  # 𝑛       𝕄(𝑛·1·1):         𝑛·1·2 := Φ.num( φ ↦ 𝜎7:λ )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛·1·4 := 𝑛·1·3  # 𝕄(𝑛·1·1)+        𝑛·1·3 := 𝜎7:λ:φ+        morphed 𝑛·1·4 := 𝑛·1·3+      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·1)     morphed 𝑛·0·1 := 𝜎7:λ
test-resources/evaluate-packs/hands-a-named-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml view
@@ -38,12 +38,15 @@         morphed 𝑛·1·2 := ⟦ ke(x) ↦ x:k ⟧       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧ ⟧     𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧     𝔼(L_join):       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.left🌵)+      𝑛·2·2 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧       𝕄(ξ.left🌵):-        morphed 𝑛·2·2 := 𝑛·2·1-      𝑛·2·3 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.right🌵)+        morphed 𝑛·2·3 := 𝑛·2·2+      𝑛·2·4 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.right🌵)+      𝑛·2·5 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧       𝕄(ξ.right🌵):-        morphed 𝑛·2·4 := 𝑛·2·3-      𝑛·2·5 := 𝑛·2·4  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)-    morphed 𝑛·0·2 := 𝜎2:λ+        morphed 𝑛·2·6 := 𝑛·2·5+      𝑛·2·7 := 𝑛·2·6  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)+    morphed 𝑛·0·3 := 𝜎2:λ
test-resources/evaluate-packs/hands-a-positional-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml view
@@ -38,12 +38,15 @@         morphed 𝑛·1·2 := ⟦ ke(x) ↦ x:k ⟧       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧ ⟧     𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧     𝔼(L_join):       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.left🌵)+      𝑛·2·2 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧       𝕄(ξ.left🌵):-        morphed 𝑛·2·2 := 𝑛·2·1-      𝑛·2·3 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.right🌵)+        morphed 𝑛·2·3 := 𝑛·2·2+      𝑛·2·4 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.right🌵)+      𝑛·2·5 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧       𝕄(ξ.right🌵):-        morphed 𝑛·2·4 := 𝑛·2·3-      𝑛·2·5 := 𝑛·2·4  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)-    morphed 𝑛·0·2 := 𝜎2:λ+        morphed 𝑛·2·6 := 𝑛·2·5+      𝑛·2·7 := 𝑛·2·6  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)+    morphed 𝑛·0·3 := 𝜎2:λ
test-resources/evaluate-packs/hands-a-side-of-a-fabricated-formation-only-the-voids-its-attribute-leaves.yaml view
@@ -40,19 +40,23 @@         morphed 𝑛·1·2 := ⟦ ke(x, w) ↦ x:k ⟧       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x, w) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧ ⟧     𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧( x ↦ 𝜎2:λ:φ )+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ:φ, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧     𝔼(L_join):       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ:φ )  # 𝕄(ξ.left🌵)+      𝑛·2·2 := ⟦ x ↦ 𝜎2:λ:φ, k ↦ x ⟧       𝕄(ξ.left🌵):-        morphed 𝑛·2·2 := 𝑛·2·1-      𝑛·2·3 := ⟦ x ↦ ∅, w ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ:φ )  # 𝕄(ξ.right🌵)-      𝑛·2·4 := 𝑛·2·3( w ↦ ⊥ )  # 𝕄(ξ.right🌵)+        morphed 𝑛·2·3 := 𝑛·2·2+      𝑛·2·4 := ⟦ x ↦ ∅, w ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ:φ )  # 𝕄(ξ.right🌵)+      𝑛·2·5 := ⟦ x ↦ 𝜎2:λ:φ, w ↦ ∅, k ↦ x ⟧+      𝑛·2·6 := 𝑛·2·5( w ↦ ⊥ )  # 𝕄(ξ.right🌵)+      𝑛·2·7 := ⟦ x ↦ 𝜎2:λ:φ, w ↦ ⊥, k ↦ x ⟧       𝕄(ξ.right🌵):-        morphed 𝑛·2·5 := 𝑛·2·4-      fabricated 𝑛·2·6 := 𝑛·2·2 and 𝑛·2·5  # ⟦ left🌵 ↦ 𝑛·2·2, right🌵 ↦ 𝑛·2·5, x ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.x, right🌵 ↦ ρ.right🌵.x ⟧, k ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧, w ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.w, right🌵 ↦ ρ.right🌵.w ⟧ ⟧+        morphed 𝑛·2·8 := 𝑛·2·7+      fabricated 𝑛·2·9 := 𝑛·2·3 and 𝑛·2·8  # ⟦ left🌵 ↦ 𝑛·2·3, right🌵 ↦ 𝑛·2·8, x ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.x, right🌵 ↦ ρ.right🌵.x ⟧, k ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧, w ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.w, right🌵 ↦ ρ.right🌵.w ⟧ ⟧     𝔼(L_join):       𝕄(ξ.left🌵):         morphed 𝑛·3·1 := 𝜎2:λ:φ       𝕄(ξ.right🌵):         morphed 𝑛·3·2 := 𝑛·3·1       𝑛·3·3 := 𝑛·3·1  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)-    morphed 𝑛·0·2 := 𝜎2:λ+    morphed 𝑛·0·3 := 𝜎2:λ
test-resources/evaluate-packs/heads-the-block-of-a-dataize-operand-with-the-operand.yaml view
@@ -21,33 +21,40 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    morphed 𝑛·0·3 := 𝜎1:λ+      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    morphed 𝑛·0·5 := 𝜎1:λ
test-resources/evaluate-packs/heads-the-block-of-a-morph-operand-with-the-operand.yaml view
@@ -19,10 +19,11 @@     𝔼(L_kept):       𝕄(ξ.x):         𝑛·1·1 := 5.0-        morphed 𝑛·1·2 := 𝑛·1·1-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.x)-      𝑛·1·3 := 𝜎1:λ:φ  # 𝑛-      𝕄(𝑛·1·3):-        morphed 𝑛·1·4 := 𝜎1:λ:φ-      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·3)+        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), neg ↦ ⟦⟧ ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.x)+      𝑛·1·4 := 𝜎1:λ:φ  # 𝑛+      𝕄(𝑛·1·4):+        morphed 𝑛·1·5 := 𝜎1:λ:φ+      𝑛·1·6 := 𝑛·1·5  # 𝕄(𝑛·1·4)     morphed 𝑛·0·1 := 𝜎1:λ
+ test-resources/evaluate-packs/joins-a-number-with-a-formation-an-undress-took-the-number-out-of.yaml view
@@ -0,0 +1,58 @@+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com+# SPDX-License-Identifier: MIT+---+# yamllint disable rule:line-length+# The left side is a number and the right side a formation binding that number+# in φ alone, so 𝕄 brings the left side to a number and stops at the right side+# one φ short of it, and the join could never make one term of the two (#2174).+# An operand of 'undress' morphs a path from '$' where it stands, as an operand+# of 'morph' does, and then, while the term is a formation binding φ alone+# beside its ρ, dispatches φ off it and morphs that, so both sides come to a+# number. The protocol writes each such pass as an 'undressed' line naming the+# φ it took and the 𝕄 block named after it, and comments the line of the meta+# with 'undress' only where a pass took place.+symbolic: |+  - λ: L_fork+    dataize:+      𝛿1: $.on🌵+    undress:+      𝑛1: $.left🌵+      𝑛2: $.right🌵+    symbolize:+      𝑛3: 𝑛1+      𝑛4: 𝑛2+    join:+      on: 𝛿1+      left: 𝑛3+      right: 𝑛4+location: 'Q.y'+input: '⟦ bytes(φ) ↦ ⟦⟧, number(φ) ↦ ⟦ neg ↦ ⟦ φ ↦ ρ ⟧ ⟧, y ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎1 ⟧, left🌵 ↦ 42, right🌵 ↦ ⟦ φ ↦ 7 ⟧ ⟧.φ ⟧'+result: '𝜎4:λ:φ'+protocol: |+  𝕄(Φ.y):+    𝔼(L_fork):+      𝔻(ξ.on🌵):+        𝛿·1·1 := 𝔻(𝜎1:λ)+      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.on🌵)+      𝕄(ξ.left🌵):+        𝑛·1·1 := 42.0+        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.left🌵)+      𝕄(ξ.right🌵):+        morphed 𝑛·1·4 := 7.0:φ+      undressed 𝑛·1·5 := 𝑛·1·4.φ+      𝕄(𝑛·1·5):+        𝑛·1·6 := 7.0+        𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧+        morphed 𝑛·1·8 := 𝑛·1·7+      𝑛2·1 := 𝑛·1·8  # undress(ξ.right🌵)+      symbolized 𝜎2 := 40-45-00-00-00-00-00-00  # 42.0+      𝑛3·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ), neg ↦ ρ:φ ⟧  # symbolize(𝑛1)+      symbolized 𝜎3 := 40-1C-00-00-00-00-00-00  # 7.0+      𝑛4·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎3:λ ), neg ↦ ρ:φ ⟧  # symbolize(𝑛2)+      joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3+      𝑛·1·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), neg ↦ ρ:φ ⟧  # 𝑛3, 𝑛4+    𝑛·0·1 := Φ.bytes( φ ↦ 𝜎4:λ )+    𝑛·0·2 := 𝜎4:λ:φ+    morphed 𝑛·0·3 := 𝑛·0·2
test-resources/evaluate-packs/joins-a-side-an-evaluate-line-fired-with-a-bool-it-left-as-it-is.yaml view
@@ -38,16 +38,18 @@       𝑛1·1 := L_eq:λ  # 𝕄(ξ.a)       𝕄(ξ.b):         𝑛·1·2 := Φ.bool( φ ↦ 𝜎2:λ )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛2·1 := 𝑛·1·3  # 𝕄(ξ.b)+        𝑛·1·3 := 𝜎2:λ:φ+        morphed 𝑛·1·4 := 𝑛·1·3+      𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.b)       𝔼(L_eq):  # 𝔼(𝑛1)         𝑛·2·1 := Φ.bool( φ ↦ 𝜎3:λ )  # 𝑛         𝕄(𝑛·2·1):           𝑛·2·2 := Φ.bool( φ ↦ 𝜎3:λ )-          morphed 𝑛·2·3 := 𝑛·2·2-        𝑛·2·4 := 𝑛·2·3  # 𝕄(𝑛·2·1)-      𝑛3·1 := 𝑛·2·4  # 𝔼(𝑛1)+          𝑛·2·3 := 𝜎3:λ:φ+          morphed 𝑛·2·4 := 𝑛·2·3+        𝑛·2·5 := 𝑛·2·4  # 𝕄(𝑛·2·1)+      𝑛3·1 := 𝑛·2·5  # 𝔼(𝑛1)       𝑛4·1 := 𝑛2·1  # 𝔼(𝑛2)       joined 𝜎4 := 𝛿1·1 ? 𝜎3 : 𝜎2-      𝑛·1·4 := 𝜎4:λ:φ  # 𝑛3, 𝑛4+      𝑛·1·5 := 𝜎4:λ:φ  # 𝑛3, 𝑛4     morphed 𝑛·0·1 := 𝜎4:λ
test-resources/evaluate-packs/joins-a-side-holding-a-datum-a-symbolize-turned-into-a-symbol.yaml view
@@ -46,4 +46,5 @@       joined 𝜎5 := 𝛿1·1 ? 𝜎4 : 𝜎2       𝑛·1·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) ):φ  # 𝑛3, 𝑛4     𝑛·0·1 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) )-    morphed 𝑛·0·2 := 𝑛·0·1+    𝑛·0·2 := Φ.bytes( φ ↦ 𝜎5:λ ):φ+    morphed 𝑛·0·3 := 𝑛·0·2
test-resources/evaluate-packs/joins-a-side-reading-the-rho-it-binds-in-a-fabricated-formation.yaml view
@@ -40,10 +40,11 @@       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ tu ↦ ∅, left🌵 ↦ 𝑛·1·1( tu ↦ tu ), right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧     𝔼(L_join):       𝑛·2·1 := Φ.t( tu ↦ ⊥ )  # 𝕄(ξ.left🌵)+      𝑛·2·2 := ⟦ tu ↦ ⊥, φ ↦ ρ.s ⟧       𝕄(ξ.left🌵):-        morphed 𝑛·2·2 := 𝜎2:λ:k+        morphed 𝑛·2·3 := 𝜎2:λ:k       𝕄(ξ.right🌵):-        morphed 𝑛·2·3 := 𝜎3:λ:k+        morphed 𝑛·2·4 := 𝜎3:λ:k       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3-      𝑛·2·4 := 𝜎4:λ:k  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)+      𝑛·2·5 := 𝜎4:λ:k  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)     morphed 𝑛·0·1 := 𝜎4:λ
test-resources/evaluate-packs/joins-a-side-whose-void-the-fabricated-formation-holds.yaml view
@@ -41,10 +41,11 @@       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ tu ↦ ∅, left🌵 ↦ 𝑛·1·1( tu ↦ tu ), right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧     𝔼(L_join):       𝑛·2·1 := 𝑛·1·1( tu ↦ ⊥ )  # 𝕄(ξ.left🌵)+      𝑛·2·2 := ⟦ φ ↦ 𝜎2:λ:k, tu ↦ ⊥ ⟧       𝕄(ξ.left🌵):-        morphed 𝑛·2·2 := 𝜎2:λ:k+        morphed 𝑛·2·3 := 𝜎2:λ:k       𝕄(ξ.right🌵):-        morphed 𝑛·2·3 := 𝜎3:λ:k+        morphed 𝑛·2·4 := 𝜎3:λ:k       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3-      𝑛·2·4 := 𝜎4:λ:k  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)+      𝑛·2·5 := 𝜎4:λ:k  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)     morphed 𝑛·0·1 := 𝜎4:λ
test-resources/evaluate-packs/joins-again-the-attribute-of-a-fabricated-formation.yaml view
@@ -41,10 +41,12 @@     𝔼(L_join):       𝕄(ξ.left🌵):         𝑛·2·1 := Φ.hx( ke ↦ 𝜎2:λ )-        morphed 𝑛·2·2 := 𝑛·2·1+        𝑛·2·2 := ⟦ ke ↦ 𝜎2:λ, φ ↦ ke ⟧+        morphed 𝑛·2·3 := 𝑛·2·2       𝕄(ξ.right🌵):-        𝑛·2·3 := Φ.hx( ke ↦ 𝜎3:λ )-        morphed 𝑛·2·4 := 𝑛·2·3+        𝑛·2·4 := Φ.hx( ke ↦ 𝜎3:λ )+        𝑛·2·5 := ⟦ ke ↦ 𝜎3:λ, φ ↦ ke ⟧+        morphed 𝑛·2·6 := 𝑛·2·5       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3-      𝑛·2·5 := ⟦ ke ↦ 𝜎4:λ, φ ↦ ke ⟧  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)+      𝑛·2·7 := ⟦ ke ↦ 𝜎4:λ, φ ↦ ke ⟧  # 𝕄(ξ.left🌵), 𝕄(ξ.right🌵)     morphed 𝑛·0·1 := 𝜎4:λ
test-resources/evaluate-packs/joins-two-numbers-into-one-symbol-keeping-the-constant-a-method-holds.yaml view
@@ -35,16 +35,19 @@       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.c)       𝕄(ξ.a):         𝑛·1·1 := 42.0-        morphed 𝑛·1·2 := 𝑛·1·1-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.a)+        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.a)       𝕄(ξ.b):-        𝑛·1·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )-        morphed 𝑛·1·4 := 𝑛·1·3-      𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.b)+        𝑛·1·4 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )+        𝑛·1·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧+        morphed 𝑛·1·6 := 𝑛·1·5+      𝑛2·1 := 𝑛·1·6  # 𝕄(ξ.b)       symbolized 𝜎4 := 40-45-00-00-00-00-00-00  # 42.0       𝑛3·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧  # symbolize(𝑛1)       𝑛4·1 := 𝑛2·1  # 𝑛2       joined 𝜎5 := 𝛿1·1 ? 𝜎4 : 𝜎2-      𝑛·1·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧  # 𝑛3, 𝑛4+      𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧  # 𝑛3, 𝑛4     𝑛·0·1 := Φ.bytes( φ ↦ 𝜎5:λ )-    morphed 𝑛·0·2 := 𝑛·0·1+    𝑛·0·2 := 𝜎5:λ:φ+    morphed 𝑛·0·3 := 𝑛·0·2
test-resources/evaluate-packs/joins-two-sides-a-stay-brought-to-one-shape.yaml view
@@ -48,4 +48,5 @@       joined 𝜎4 := 𝛿1·1 ? 𝜎1 : 𝜎2       𝑛·1·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) ):φ  # 𝑛3, 𝑛4     𝑛·0·1 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) )-    morphed 𝑛·0·2 := 𝑛·0·1+    𝑛·0·2 := Φ.bytes( φ ↦ 𝜎4:λ ):φ+    morphed 𝑛·0·3 := 𝑛·0·2
test-resources/evaluate-packs/joins-two-sides-differing-in-a-datum-a-symbolize-found-off-the-phi-chain.yaml view
@@ -46,4 +46,5 @@       joined 𝜎4 := 𝛿1·1 ? 𝜎3 : 𝜎2       𝑛·1·3 := Φ.bool( if ↦ 𝜎4:λ:φ ):φ  # 𝑛3, 𝑛4     𝑛·0·1 := Φ.bool( if ↦ 𝜎4:λ:φ )-    morphed 𝑛·0·2 := 𝑛·0·1+    𝑛·0·2 := ⟦ if ↦ 𝜎4:λ:φ, φ ↦ if ⟧+    morphed 𝑛·0·3 := 𝑛·0·2
test-resources/evaluate-packs/joins-two-sides-that-differ-only-in-symbols.yaml view
@@ -38,135 +38,165 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧     𝔼(L_number_gt):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 0.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 0.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.bool( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·7 ) )-    𝑛·0·4 := 𝑛·0·3( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·7 ) )+      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ) )+    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ ∅, λ ⤍ L_fork ⟧+    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ) )+    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ), λ ⤍ L_fork ⟧     𝔼(L_fork):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝕄(ξ.then):-        𝑛·2·4 := 1.0-        𝑛·2·5 := 𝑛·2·4.plus( x ↦ 2.0 )+        𝑛·2·5 := 1.0+        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )+        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·3·1 := 1.0-              morphed 𝑛·3·2 := 𝑛·3·1-            boxed 𝑛·3·3 := 𝑛·3·2.φ-            𝕄(𝑛·3·3):-              𝑛·3·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-              morphed 𝑛·3·5 := 𝑛·3·4-            boxed 𝑛·3·6 := 𝑛·3·5.φ+              𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·3·3 := 𝑛·3·2+            boxed 𝑛·3·4 := 𝑛·3·3.φ+            𝕄(𝑛·3·4):+              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·7 := 𝑛·3·6+            boxed 𝑛·3·8 := 𝑛·3·7.φ             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·3·7 := 2.0-              morphed 𝑛·3·8 := 𝑛·3·7-            boxed 𝑛·3·9 := 𝑛·3·8.φ-            𝕄(𝑛·3·9):-              𝑛·3·10 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·9 := 2.0+              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·3·11 := 𝑛·3·10             boxed 𝑛·3·12 := 𝑛·3·11.φ+            𝕄(𝑛·3·12):+              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·15 := 𝑛·3·14+            boxed 𝑛·3·16 := 𝑛·3·15.φ             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)-          𝑛·3·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-          𝕄(𝑛·3·13):-            𝑛·3·14 := Φ.number( φ ↦ 𝜎2:λ )-            morphed 𝑛·3·15 := 𝑛·3·14-          𝑛·3·16 := 𝑛·3·15  # 𝕄(𝑛·3·13)-        𝑛·2·6 := 𝑛·3·14.plus( x ↦ 𝑛·1·7 )-        morphed 𝑛·2·7 := 𝑛·2·6+          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+          𝕄(𝑛·3·17):+            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )+            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·3·20 := 𝑛·3·19+          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)+        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 𝑛·1·9 )+        𝑛·2·10 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·11 := 𝑛·2·10       𝕄(ξ.else):-        𝑛·2·8 := 3.0-        𝑛·2·9 := 𝑛·2·8.plus( x ↦ 4.0 )+        𝑛·2·12 := 3.0+        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 4.0 )+        𝑛·2·15 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·4·1 := 3.0-              morphed 𝑛·4·2 := 𝑛·4·1-            boxed 𝑛·4·3 := 𝑛·4·2.φ-            𝕄(𝑛·4·3):-              𝑛·4·4 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )-              morphed 𝑛·4·5 := 𝑛·4·4-            boxed 𝑛·4·6 := 𝑛·4·5.φ+              𝑛·4·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·4·3 := 𝑛·4·2+            boxed 𝑛·4·4 := 𝑛·4·3.φ+            𝕄(𝑛·4·4):+              𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )+              𝑛·4·6 := 40-08-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·4·7 := 𝑛·4·6+            boxed 𝑛·4·8 := 𝑛·4·7.φ             𝛿·4·1 := 40-08-00-00-00-00-00-00  # 3.0           𝛿1·4 := 𝛿·4·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·4·7 := 4.0-              morphed 𝑛·4·8 := 𝑛·4·7-            boxed 𝑛·4·9 := 𝑛·4·8.φ-            𝕄(𝑛·4·9):-              𝑛·4·10 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )+              𝑛·4·9 := 4.0+              𝑛·4·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·4·11 := 𝑛·4·10             boxed 𝑛·4·12 := 𝑛·4·11.φ+            𝕄(𝑛·4·12):+              𝑛·4·13 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )+              𝑛·4·14 := 40-10-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·4·15 := 𝑛·4·14+            boxed 𝑛·4·16 := 𝑛·4·15.φ             𝛿·4·2 := 40-10-00-00-00-00-00-00  # 4.0           𝛿2·4 := 𝛿·4·2  # 𝔻(ξ.x)-          𝑛·4·13 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛-          𝕄(𝑛·4·13):-            𝑛·4·14 := Φ.number( φ ↦ 𝜎3:λ )-            morphed 𝑛·4·15 := 𝑛·4·14-          𝑛·4·16 := 𝑛·4·15  # 𝕄(𝑛·4·13)-        𝑛·2·10 := 𝑛·4·14.plus( x ↦ 𝑛·1·7 )-        morphed 𝑛·2·11 := 𝑛·2·10+          𝑛·4·17 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛+          𝕄(𝑛·4·17):+            𝑛·4·18 := Φ.number( φ ↦ 𝜎3:λ )+            𝑛·4·19 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·4·20 := 𝑛·4·19+          𝑛·4·21 := 𝑛·4·20  # 𝕄(𝑛·4·17)+        𝑛·2·16 := 𝑛·4·18.plus( x ↦ 𝑛·1·9 )+        𝑛·2·17 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·18 := 𝑛·2·17       joined 𝜎4 := 𝛿1·2 ? 𝜎2 : 𝜎3-      𝑛·2·12 := ⟦ x ↦ 𝑛·1·7, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)+      𝑛·2·19 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·5·1 := Φ.number( φ ↦ 𝜎4:λ )-          morphed 𝑛·5·2 := 𝑛·5·1-        boxed 𝑛·5·3 := 𝑛·5·2.φ+          𝑛·5·2 := ⟦ φ ↦ 𝜎4:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·3 := 𝑛·5·2+        boxed 𝑛·5·4 := 𝑛·5·3.φ         𝛿·5·1 := 𝔻(𝜎4:λ)       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·5·4 := Φ.number( φ ↦ 𝑛·1·10 )-          morphed 𝑛·5·5 := 𝑛·5·4-        boxed 𝑛·5·6 := 𝑛·5·5.φ-        𝕄(𝑛·5·6):-          𝑛·5·7 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )-          morphed 𝑛·5·8 := 𝑛·5·7-        boxed 𝑛·5·9 := 𝑛·5·8.φ+          𝑛·5·5 := Φ.number( φ ↦ 𝑛·1·13 )+          𝑛·5·6 := ⟦ φ ↦ 𝑛·1·13, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·7 := 𝑛·5·6+        boxed 𝑛·5·8 := 𝑛·5·7.φ+        𝕄(𝑛·5·8):+          𝑛·5·9 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·5·10 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·5·11 := 𝑛·5·10+        boxed 𝑛·5·12 := 𝑛·5·11.φ         𝛿·5·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)-      𝑛·5·10 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛-      𝕄(𝑛·5·10):-        𝑛·5·11 := Φ.number( φ ↦ 𝜎5:λ )-        morphed 𝑛·5·12 := 𝑛·5·11-      𝑛·5·13 := 𝑛·5·12  # 𝕄(𝑛·5·10)-    morphed 𝑛·0·5 := 𝜎5:λ+      𝑛·5·13 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛+      𝕄(𝑛·5·13):+        𝑛·5·14 := Φ.number( φ ↦ 𝜎5:λ )+        𝑛·5·15 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·5·16 := 𝑛·5·15+      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)+    morphed 𝑛·0·9 := 𝜎5:λ
test-resources/evaluate-packs/mints-a-fresh-symbol-for-every-firing.yaml view
@@ -21,58 +21,70 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.plus( x ↦ 7.0 )+      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.plus( x ↦ 7.0 )+    𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·2·4 := 7.0-          morphed 𝑛·2·5 := 𝑛·2·4-        boxed 𝑛·2·6 := 𝑛·2·5.φ-        𝕄(𝑛·2·6):-          𝑛·2·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )-          morphed 𝑛·2·8 := 𝑛·2·7-        boxed 𝑛·2·9 := 𝑛·2·8.φ+          𝑛·2·5 := 7.0+          𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·2·7 := 𝑛·2·6+        boxed 𝑛·2·8 := 𝑛·2·7.φ+        𝕄(𝑛·2·8):+          𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+          𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·2·11 := 𝑛·2·10+        boxed 𝑛·2·12 := 𝑛·2·11.φ         𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0       𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)-      𝑛·2·10 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-      𝕄(𝑛·2·10):-        𝑛·2·11 := Φ.number( φ ↦ 𝜎2:λ )-        morphed 𝑛·2·12 := 𝑛·2·11-      𝑛·2·13 := 𝑛·2·12  # 𝕄(𝑛·2·10)-    morphed 𝑛·0·4 := 𝜎2:λ+      𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+      𝕄(𝑛·2·13):+        𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )+        𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·2·16 := 𝑛·2·15+      𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)+    morphed 𝑛·0·7 := 𝜎2:λ
test-resources/evaluate-packs/morphs-a-program-that-already-carries-a-symbol.yaml view
@@ -21,29 +21,35 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := Φ.number( φ ↦ 𝜎1:λ )-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 7.0 )+    𝑛·0·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 7.0 )+    𝑛·0·4 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := Φ.number( φ ↦ 𝜎1:λ )-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ+          𝑛·1·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ         𝛿·1·1 := 𝔻(𝜎1:λ)       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·4 := 7.0-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ-        𝕄(𝑛·1·6):-          𝑛·1·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ+          𝑛·1·5 := 7.0+          𝑛·1·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ+        𝕄(𝑛·1·8):+          𝑛·1·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+          𝑛·1·10 := 40-1C-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·11 := 𝑛·1·10+        boxed 𝑛·1·12 := 𝑛·1·11.φ         𝛿·1·2 := 40-1C-00-00-00-00-00-00  # 7.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·10 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-      𝕄(𝑛·1·10):-        𝑛·1·11 := Φ.number( φ ↦ 𝜎2:λ )-        morphed 𝑛·1·12 := 𝑛·1·11-      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·10)-    morphed 𝑛·0·3 := 𝜎2:λ+      𝑛·1·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+      𝕄(𝑛·1·13):+        𝑛·1·14 := Φ.number( φ ↦ 𝜎2:λ )+        𝑛·1·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·16 := 𝑛·1·15+      𝑛·1·17 := 𝑛·1·16  # 𝕄(𝑛·1·13)+    morphed 𝑛·0·5 := 𝜎2:λ
test-resources/evaluate-packs/morphs-two-branches-spelling-one-term-through-one-firing.yaml view
@@ -41,115 +41,141 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧     𝔼(L_number_gt):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 0.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 0.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.bool( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.if( then ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )-    𝑛·0·4 := 𝑛·0·3( else ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )+      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )+    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ ∅, λ ⤍ L_fork ⟧+    𝑛·0·7 := 𝑛·0·5( else ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )+    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ 1.0.plus( 2.0 ).plus( 3.0 ), λ ⤍ L_fork ⟧     𝔼(L_fork):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝕄(ξ.then):-        𝑛·2·4 := 1.0-        𝑛·2·5 := 𝑛·2·4.plus( x ↦ 2.0 )+        𝑛·2·5 := 1.0+        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )+        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·3·1 := 1.0-              morphed 𝑛·3·2 := 𝑛·3·1-            boxed 𝑛·3·3 := 𝑛·3·2.φ-            𝕄(𝑛·3·3):-              𝑛·3·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-              morphed 𝑛·3·5 := 𝑛·3·4-            boxed 𝑛·3·6 := 𝑛·3·5.φ+              𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·3·3 := 𝑛·3·2+            boxed 𝑛·3·4 := 𝑛·3·3.φ+            𝕄(𝑛·3·4):+              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·7 := 𝑛·3·6+            boxed 𝑛·3·8 := 𝑛·3·7.φ             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·3·7 := 2.0-              morphed 𝑛·3·8 := 𝑛·3·7-            boxed 𝑛·3·9 := 𝑛·3·8.φ-            𝕄(𝑛·3·9):-              𝑛·3·10 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·9 := 2.0+              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·3·11 := 𝑛·3·10             boxed 𝑛·3·12 := 𝑛·3·11.φ+            𝕄(𝑛·3·12):+              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·15 := 𝑛·3·14+            boxed 𝑛·3·16 := 𝑛·3·15.φ             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)-          𝑛·3·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-          𝕄(𝑛·3·13):-            𝑛·3·14 := Φ.number( φ ↦ 𝜎2:λ )-            morphed 𝑛·3·15 := 𝑛·3·14-          𝑛·3·16 := 𝑛·3·15  # 𝕄(𝑛·3·13)-        𝑛·2·6 := 𝑛·3·14.plus( x ↦ 3.0 )-        morphed 𝑛·2·7 := 𝑛·2·6-      𝑛1·2 := 𝑛·2·6  # 𝕄(ξ.then)+          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+          𝕄(𝑛·3·17):+            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )+            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·3·20 := 𝑛·3·19+          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)+        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 3.0 )+        𝑛·2·10 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·11 := 𝑛·2·10+      𝑛1·2 := 𝑛·2·10  # 𝕄(ξ.then)       𝕄(ξ.else):-        𝑛·2·8 := Φ.number( φ ↦ 𝑛·3·4 )-        𝑛·2·9 := 𝑛·2·8.plus( x ↦ 𝑛·3·7 )+        𝑛·2·12 := Φ.number( φ ↦ 𝑛·3·5 )+        𝑛·2·13 := ⟦ φ ↦ 𝑛·3·5, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 𝑛·3·9 )+        𝑛·2·15 := ⟦ x ↦ 𝑛·3·9, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):-          𝑛·4·1 := 𝑛·3·14  # 𝑛-          𝑛·4·2 := 𝑛·3·16  # 𝕄(𝑛·4·1)-        𝑛·2·10 := 𝑛·3·14.plus( x ↦ 3.0 )-        morphed 𝑛·2·11 := 𝑛·2·10-      𝑛2·2 := 𝑛·2·10  # 𝕄(ξ.else)-      𝑛·2·12 := 𝑛·2·10  # 𝑛-      𝕄(𝑛·2·12):-        morphed 𝑛·2·13 := 𝑛·2·10-      𝑛·2·14 := 𝑛·2·10  # 𝕄(𝑛·2·12)+          𝑛·4·1 := 𝑛·3·18  # 𝑛+          𝑛·4·2 := 𝑛·3·21  # 𝕄(𝑛·4·1)+        𝑛·2·16 := 𝑛·3·18.plus( x ↦ 3.0 )+        𝑛·2·17 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·18 := 𝑛·2·17+      𝑛2·2 := 𝑛·2·17  # 𝕄(ξ.else)+      𝑛·2·19 := 𝑛·2·17  # 𝑛+      𝕄(𝑛·2·19):+        morphed 𝑛·2·20 := 𝑛·2·17+      𝑛·2·21 := 𝑛·2·17  # 𝕄(𝑛·2·19)     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·5·1 := Φ.number( φ ↦ 𝜎2:λ )-          morphed 𝑛·5·2 := 𝑛·4·2-        boxed 𝑛·5·3 := 𝑛·5·2.φ+          𝑛·5·2 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·3 := 𝑛·4·2+        boxed 𝑛·5·4 := 𝑛·5·3.φ         𝛿·5·1 := 𝔻(𝜎2:λ)       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·5·4 := 3.0-          morphed 𝑛·5·5 := 𝑛·5·4-        boxed 𝑛·5·6 := 𝑛·5·5.φ-        𝕄(𝑛·5·6):-          𝑛·5·7 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )-          morphed 𝑛·5·8 := 𝑛·5·7-        boxed 𝑛·5·9 := 𝑛·5·8.φ+          𝑛·5·5 := 3.0+          𝑛·5·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·7 := 𝑛·5·6+        boxed 𝑛·5·8 := 𝑛·5·7.φ+        𝕄(𝑛·5·8):+          𝑛·5·9 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )+          𝑛·5·10 := 40-08-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·5·11 := 𝑛·5·10+        boxed 𝑛·5·12 := 𝑛·5·11.φ         𝛿·5·2 := 40-08-00-00-00-00-00-00  # 3.0       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)-      𝑛·5·10 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛-      𝕄(𝑛·5·10):-        𝑛·5·11 := Φ.number( φ ↦ 𝜎3:λ )-        morphed 𝑛·5·12 := 𝑛·5·11-      𝑛·5·13 := 𝑛·5·12  # 𝕄(𝑛·5·10)-    𝑛·0·5 := 𝑛·5·11.plus( x ↦ 9.0 )-    morphed 𝑛·0·6 := 𝑛·0·5+      𝑛·5·13 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛+      𝕄(𝑛·5·13):+        𝑛·5·14 := Φ.number( φ ↦ 𝜎3:λ )+        𝑛·5·15 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·5·16 := 𝑛·5·15+      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)+    𝑛·0·9 := 𝑛·5·14.plus( x ↦ 9.0 )+    𝑛·0·10 := ⟦ x ↦ 9.0, λ ⤍ L_number_plus ⟧+    morphed 𝑛·0·11 := 𝑛·0·10
test-resources/evaluate-packs/nests-the-firing-an-operand-brought-down.yaml view
@@ -22,59 +22,72 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0.plus( 7.0 ) )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0.plus( 7.0 ) )+    𝑛·0·4 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          𝑛·1·8 := 𝑛·1·7.plus( x ↦ 7.0 )-          morphed 𝑛·1·9 := 𝑛·1·8+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          𝑛·1·11 := 𝑛·1·9.plus( x ↦ 7.0 )+          𝑛·1·12 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧+          morphed 𝑛·1·13 := 𝑛·1·12         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·2·1 := 6.0-              morphed 𝑛·2·2 := 𝑛·2·1-            boxed 𝑛·2·3 := 𝑛·2·2.φ-            𝕄(𝑛·2·3):-              𝑛·2·4 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )-              morphed 𝑛·2·5 := 𝑛·2·4-            boxed 𝑛·2·6 := 𝑛·2·5.φ+              𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·2·3 := 𝑛·2·2+            boxed 𝑛·2·4 := 𝑛·2·3.φ+            𝕄(𝑛·2·4):+              𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+              𝑛·2·6 := 40-18-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·2·7 := 𝑛·2·6+            boxed 𝑛·2·8 := 𝑛·2·7.φ             𝛿·2·1 := 40-18-00-00-00-00-00-00  # 6.0           𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·2·7 := 7.0-              morphed 𝑛·2·8 := 𝑛·2·7-            boxed 𝑛·2·9 := 𝑛·2·8.φ-            𝕄(𝑛·2·9):-              𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+              𝑛·2·9 := 7.0+              𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·2·11 := 𝑛·2·10             boxed 𝑛·2·12 := 𝑛·2·11.φ+            𝕄(𝑛·2·12):+              𝑛·2·13 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )+              𝑛·2·14 := 40-1C-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·2·15 := 𝑛·2·14+            boxed 𝑛·2·16 := 𝑛·2·15.φ             𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0           𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)-          𝑛·2·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛-          𝕄(𝑛·2·13):-            𝑛·2·14 := Φ.number( φ ↦ 𝜎1:λ )-            morphed 𝑛·2·15 := 𝑛·2·14-          𝑛·2·16 := 𝑛·2·15  # 𝕄(𝑛·2·13)-        boxed 𝑛·1·10 := 𝑛·2·16.φ+          𝑛·2·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛+          𝕄(𝑛·2·17):+            𝑛·2·18 := Φ.number( φ ↦ 𝜎1:λ )+            𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·2·20 := 𝑛·2·19+          𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)+        boxed 𝑛·1·14 := 𝑛·2·21.φ         𝛿·1·2 := 𝔻(𝜎1:λ)       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·11 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-      𝕄(𝑛·1·11):-        𝑛·1·12 := Φ.number( φ ↦ 𝜎2:λ )-        morphed 𝑛·1·13 := 𝑛·1·12-      𝑛·1·14 := 𝑛·1·13  # 𝕄(𝑛·1·11)-    𝑛·0·3 := 𝑛·1·12.plus( x ↦ 8.0 )-    morphed 𝑛·0·4 := 𝑛·0·3+      𝑛·1·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+      𝕄(𝑛·1·15):+        𝑛·1·16 := Φ.number( φ ↦ 𝜎2:λ )+        𝑛·1·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·18 := 𝑛·1·17+      𝑛·1·19 := 𝑛·1·18  # 𝕄(𝑛·1·15)+    𝑛·0·5 := 𝑛·1·16.plus( x ↦ 8.0 )+    𝑛·0·6 := ⟦ x ↦ 8.0, λ ⤍ L_number_plus ⟧+    morphed 𝑛·0·7 := 𝑛·0·6
test-resources/evaluate-packs/parks-a-firing-whose-deferred-argument-got-stuck.yaml view
@@ -32,9 +32,11 @@     𝔼(L_pair):       𝕄(ξ.c):         𝑛·1·1 := Φ.box( s ↦ 𝜎1:λ )-        𝑛·1·2 := 𝑛·1·1( x ↦ ⟦ arg ↦ L_none:λ, λ ⤍ L_outer ⟧.φ )-        morphed 𝑛·1·3 := 𝑛·1·2-      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.c)+        𝑛·1·2 := ⟦ s ↦ 𝜎1:λ, x ↦ ∅, φ ↦ s.next ⟧+        𝑛·1·3 := 𝑛·1·1( x ↦ ⟦ arg ↦ L_none:λ, λ ⤍ L_outer ⟧.φ )+        𝑛·1·4 := ⟦ s ↦ 𝜎1:λ, x ↦ ⟦ arg ↦ L_none:λ, λ ⤍ L_outer ⟧.φ, φ ↦ s.next ⟧+        morphed 𝑛·1·5 := 𝑛·1·4+      𝑛1·1 := 𝑛·1·5  # 𝕄(ξ.c)       𝕄(𝑛1.x):         𝔼(L_outer):           𝔻(ξ.arg):
test-resources/evaluate-packs/parks-a-firing-whose-operand-dataizes-in-circles.yaml view
@@ -27,9 +27,11 @@       𝔻(ξ.arg):         𝕄(ξ.arg):           𝑛·1·1 := Φ.cyc( x ↦ ⟦⟧ )-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.cyc( x ↦ ⟦⟧ )-          morphed 𝑛·1·5 := 𝑛·1·4-        looped 𝑛·1·5  # 𝔻(𝑛·1·3), proven+          𝑛·1·2 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.cyc( x ↦ ⟦⟧ )+          𝑛·1·6 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        looped 𝑛·1·7  # 𝔻(𝑛·1·4), proven
+ test-resources/evaluate-packs/parks-a-firing-whose-operand-has-a-void-phi.yaml view
@@ -0,0 +1,23 @@+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com+# SPDX-License-Identifier: MIT+---+# The 'dataize' operand of 'L_pair' is a formation whose φ is a void nothing+# filled, so the 'box' rule takes that φ and reaches the terminator ⊥ (#2168).+# Under '_partial' that parks the firing, and the protocol writes the box step+# and then the dead end as 'unanswered(⊥)' (#1401).+symbolic: |+  - λ: L_pair+    dataize:+      𝛿1: $.x+    𝑛: ⟦ λ ⤍ 𝜎 ⟧+location: 'Q.y'+partial: true+input: '⟦ y ↦ ⟦ x ↦ ⟦ φ ↦ ∅ ⟧, λ ⤍ L_pair ⟧.z ⟧'+result: '⟦ x(φ) ↦ ⟦⟧, λ ⤍ L_pair ⟧.z'+protocol: |+  𝕄(Φ.y):+    𝔼(L_pair):+      𝔻(ξ.x):+        boxed 𝑛·1·1 := ∅:φ.φ+      unanswered ⊥  # 𝔻(⊥)+      stuck ⊥
− test-resources/evaluate-packs/parks-a-firing-whose-operand-no-rule-dataizes.yaml
@@ -1,21 +0,0 @@-# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com-# SPDX-License-Identifier: MIT-----# The 'dataize' operand of 'L_pair' is a formation whose φ is a void nothing-# filled, so no dataization rule matches it. Under '_partial' that parks the-# firing just as the terminator ⊥ does, and the protocol writes the dead end-# as 'unanswered(⊥)' with the formation beside it (#1401).-symbolic: |-  - λ: L_pair-    dataize:-      𝛿1: $.x-    𝑛: ⟦ λ ⤍ 𝜎 ⟧-location: 'Q.y'-partial: true-input: '⟦ y ↦ ⟦ x ↦ ⟦ φ ↦ ∅ ⟧, λ ⤍ L_pair ⟧.z ⟧'-result: '⟦ x(φ) ↦ ⟦⟧, λ ⤍ L_pair ⟧.z'-protocol: |-  𝕄(Φ.y):-    𝔼(L_pair):-      unanswered ⊥  # 𝔻(∅:φ)-      stuck ⊥
test-resources/evaluate-packs/parks-a-firing-whose-operand-reaches-the-terminator.yaml view
@@ -38,22 +38,28 @@ protocol: |   𝕄(Φ.l🌵.e1):     𝑛·0·1 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )-    𝑛·0·2 := 𝑛·0·1( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )+    𝑛·0·2 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧+    𝑛·0·3 := 𝑛·0·2( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )+    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧     𝔼(L_entry):       𝔻(ξ.n):         𝕄(ξ.n):           𝑛·1·1 := 1.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+          𝑛·1·6 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 3F-F0-00-00-00-00-00-00  # 1.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.n)       𝕄(ξ.v.φ):-        𝑛·1·7 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )-        𝑛·1·8 := Φ.dataized( target ↦ ⊥ )+        𝑛·1·9 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )+        𝑛·1·10 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧+        𝑛·1·11 := Φ.dataized( target ↦ ⊥ )+        𝑛·1·12 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧         𝔼(L_dataized):           unanswered ⊥  # 𝔻(⊥)           stuck ⊥
test-resources/evaluate-packs/parks-the-same-dataization-loop-under-partial.yaml view
@@ -28,10 +28,12 @@       𝔻(ξ.arg):         𝕄(ξ.arg):           𝑛·1·1 := Φ.cyc( x ↦ ⟦⟧ )-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.cyc( x ↦ ⟦⟧ )-          morphed 𝑛·1·5 := 𝑛·1·4-        looped 𝑛·1·5  # 𝔻(𝑛·1·3), proven+          𝑛·1·2 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.cyc( x ↦ ⟦⟧ )+          𝑛·1·6 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        looped 𝑛·1·7  # 𝔻(𝑛·1·4), proven       stuck L_outer
test-resources/evaluate-packs/starts-minting-after-the-symbols-the-program-carries.yaml view
@@ -21,33 +21,40 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )+    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 6.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 6.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.number( φ ↦ 𝜎4:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.number( φ ↦ 𝜎4:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    morphed 𝑛·0·3 := 𝜎4:λ+      𝑛·1·17 := Φ.number( φ ↦ 𝜎4:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.number( φ ↦ 𝜎4:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎4:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    morphed 𝑛·0·5 := 𝜎4:λ
test-resources/evaluate-packs/takes-the-answer-of-a-firing-with-the-same-operands.yaml view
@@ -40,12 +40,14 @@     𝔼(L_pair):       𝕄(ξ.a):         𝑛·1·1 := Φ.dataized( target ↦ Φ.x )-        morphed 𝑛·1·2 := 𝑛·1·1-      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.a)+        𝑛·1·2 := ⟦ target ↦ Φ.x, λ ⤍ L_dataized ⟧+        morphed 𝑛·1·3 := 𝑛·1·2+      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.a)       𝕄(ξ.b):-        𝑛·1·3 := Φ.dataized( target ↦ Φ.y )-        morphed 𝑛·1·4 := 𝑛·1·3-      𝑛2·1 := 𝑛·1·3  # 𝕄(ξ.b)+        𝑛·1·4 := Φ.dataized( target ↦ Φ.y )+        𝑛·1·5 := ⟦ target ↦ Φ.y, λ ⤍ L_dataized ⟧+        morphed 𝑛·1·6 := 𝑛·1·5+      𝑛2·1 := 𝑛·1·5  # 𝕄(ξ.b)       𝔼(L_dataized):  # 𝔼(𝑛1)         𝔻(ξ.target):           𝕄(ξ.target):@@ -66,8 +68,8 @@         𝑛·3·2 := 𝑛3·1  # 𝑛         𝑛·3·3 := 𝑛3·1  # 𝕄(𝑛·3·2)       𝑛4·1 := 𝑛·3·3  # 𝔼(𝑛2)-      𝑛·1·5 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ  # 𝑛-      𝕄(𝑛·1·5):-        morphed 𝑛·1·6 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ-      𝑛·1·7 := 𝑛·1·6  # 𝕄(𝑛·1·5)+      𝑛·1·7 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ  # 𝑛+      𝕄(𝑛·1·7):+        morphed 𝑛·1·8 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ+      𝑛·1·9 := 𝑛·1·8  # 𝕄(𝑛·1·7)     morphed 𝑛·0·1 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧
test-resources/evaluate-packs/takes-the-one-term-both-sides-of-a-join-come-to.yaml view
@@ -35,80 +35,99 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧     𝔼(L_number_gt):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 0.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 0.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.bool( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.if( then ↦ 1.0.plus( 2.0 ) )-    𝑛·0·4 := 𝑛·0·3( else ↦ 1.0.plus( 2.0 ) )+      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ) )+    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧+    𝑛·0·7 := 𝑛·0·5( else ↦ 1.0.plus( 2.0 ) )+    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 1.0.plus( 2.0 ), λ ⤍ L_fork ⟧     𝔼(L_fork):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝕄(ξ.then):-        𝑛·2·4 := 1.0-        𝑛·2·5 := 𝑛·2·4.plus( x ↦ 2.0 )-        morphed 𝑛·2·6 := 𝑛·2·5-      𝕄(ξ.else):-        𝑛·2·7 := 1.0-        𝑛·2·8 := 𝑛·2·7.plus( x ↦ 2.0 )+        𝑛·2·5 := 1.0+        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )+        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧         morphed 𝑛·2·9 := 𝑛·2·8-      𝑛·2·10 := 𝑛·2·8  # 𝕄(ξ.then), 𝕄(ξ.else)+      𝕄(ξ.else):+        𝑛·2·10 := 1.0+        𝑛·2·11 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·12 := 𝑛·2·10.plus( x ↦ 2.0 )+        𝑛·2·13 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·14 := 𝑛·2·13+      𝑛·2·15 := 𝑛·2·13  # 𝕄(ξ.then), 𝕄(ξ.else)     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·3·1 := 1.0-          morphed 𝑛·3·2 := 𝑛·3·1-        boxed 𝑛·3·3 := 𝑛·3·2.φ-        𝕄(𝑛·3·3):-          𝑛·3·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-          morphed 𝑛·3·5 := 𝑛·3·4-        boxed 𝑛·3·6 := 𝑛·3·5.φ+          𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·3·3 := 𝑛·3·2+        boxed 𝑛·3·4 := 𝑛·3·3.φ+        𝕄(𝑛·3·4):+          𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+          𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·3·7 := 𝑛·3·6+        boxed 𝑛·3·8 := 𝑛·3·7.φ         𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0       𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·3·7 := 2.0-          morphed 𝑛·3·8 := 𝑛·3·7-        boxed 𝑛·3·9 := 𝑛·3·8.φ-        𝕄(𝑛·3·9):-          𝑛·3·10 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+          𝑛·3·9 := 2.0+          𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·3·11 := 𝑛·3·10         boxed 𝑛·3·12 := 𝑛·3·11.φ+        𝕄(𝑛·3·12):+          𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+          𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·3·15 := 𝑛·3·14+        boxed 𝑛·3·16 := 𝑛·3·15.φ         𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0       𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)-      𝑛·3·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-      𝕄(𝑛·3·13):-        𝑛·3·14 := Φ.number( φ ↦ 𝜎2:λ )-        morphed 𝑛·3·15 := 𝑛·3·14-      𝑛·3·16 := 𝑛·3·15  # 𝕄(𝑛·3·13)-    morphed 𝑛·0·5 := 𝜎2:λ+      𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+      𝕄(𝑛·3·17):+        𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )+        𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·3·20 := 𝑛·3·19+      𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)+    morphed 𝑛·0·9 := 𝜎2:λ
test-resources/evaluate-packs/tells-two-carried-symbols-apart-in-one-firing.yaml view
@@ -21,25 +21,30 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := Φ.number( φ ↦ 𝜎2:λ )-    𝑛·0·2 := 𝑛·0·1.plus( x ↦ Φ.number( φ ↦ 𝜎5:λ ) )+    𝑛·0·2 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.plus( x ↦ Φ.number( φ ↦ 𝜎5:λ ) )+    𝑛·0·4 := ⟦ x ↦ Φ.number( φ ↦ 𝜎5:λ ), λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := Φ.number( φ ↦ 𝜎2:λ )-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ+          𝑛·1·2 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ         𝛿·1·1 := 𝔻(𝜎2:λ)       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·4 := Φ.number( φ ↦ 𝜎5:λ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·5 := Φ.number( φ ↦ 𝜎5:λ )+          𝑛·1·6 := ⟦ φ ↦ 𝜎5:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·2 := 𝔻(𝜎5:λ)       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·7 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛-      𝕄(𝑛·1·7):-        𝑛·1·8 := Φ.number( φ ↦ 𝜎6:λ )-        morphed 𝑛·1·9 := 𝑛·1·8-      𝑛·1·10 := 𝑛·1·9  # 𝕄(𝑛·1·7)-    morphed 𝑛·0·3 := 𝜎6:λ+      𝑛·1·9 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛+      𝕄(𝑛·1·9):+        𝑛·1·10 := Φ.number( φ ↦ 𝜎6:λ )+        𝑛·1·11 := ⟦ φ ↦ 𝜎6:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·1·12 := 𝑛·1·11+      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·9)+    morphed 𝑛·0·5 := 𝜎6:λ
test-resources/evaluate-packs/tells-two-symbols-of-one-datum-apart-between-firings.yaml view
@@ -33,44 +33,52 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := Φ.pair( x ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎1:λ ) ).φ )-    𝑛·0·2 := 𝑛·0·1( y ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎2:λ ) ).φ )+    𝑛·0·2 := ⟦ x ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎1:λ ) ).φ, y ↦ ∅, λ ⤍ L_pair ⟧+    𝑛·0·3 := 𝑛·0·1( y ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎2:λ ) ).φ )+    𝑛·0·4 := ⟦ x ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎1:λ ) ).φ, y ↦ Φ.dataized( Φ.bytes( φ ↦ 𝜎2:λ ) ).φ, λ ⤍ L_pair ⟧     𝔼(L_pair):       𝕄(ξ.x):         𝑛·1·1 := Φ.dataized( target ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )+        𝑛·1·2 := ⟦ target ↦ Φ.bytes( φ ↦ 𝜎1:λ ), λ ⤍ L_dataized ⟧         𝔼(L_dataized):           𝔻(ξ.target):             𝕄(ξ.target):               𝑛·2·1 := Φ.bytes( φ ↦ 𝜎1:λ )-              morphed 𝑛·2·2 := 𝑛·2·1-            boxed 𝑛·2·3 := 𝑛·2·2.φ+              𝑛·2·2 := 𝜎1:λ:φ+              morphed 𝑛·2·3 := 𝑛·2·2+            boxed 𝑛·2·4 := 𝑛·2·3.φ             𝛿·2·1 := 𝔻(𝜎1:λ)           𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.target)-          𝑛·2·4 := Φ.bytes( φ ↦ 𝜎3:λ )  # 𝑛-          𝕄(𝑛·2·4):-            𝑛·2·5 := Φ.bytes( φ ↦ 𝜎3:λ )-            morphed 𝑛·2·6 := 𝑛·2·5-          𝑛·2·7 := 𝑛·2·6  # 𝕄(𝑛·2·4)-        morphed 𝑛·1·2 := 𝜎3:λ-      𝑛1·1 := 𝑛·1·2  # 𝕄(ξ.x)+          𝑛·2·5 := Φ.bytes( φ ↦ 𝜎3:λ )  # 𝑛+          𝕄(𝑛·2·5):+            𝑛·2·6 := Φ.bytes( φ ↦ 𝜎3:λ )+            𝑛·2·7 := 𝜎3:λ:φ+            morphed 𝑛·2·8 := 𝑛·2·7+          𝑛·2·9 := 𝑛·2·8  # 𝕄(𝑛·2·5)+        morphed 𝑛·1·3 := 𝜎3:λ+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.x)       𝕄(ξ.y):-        𝑛·1·3 := Φ.dataized( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )+        𝑛·1·4 := Φ.dataized( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )+        𝑛·1·5 := ⟦ target ↦ Φ.bytes( φ ↦ 𝜎2:λ ), λ ⤍ L_dataized ⟧         𝔼(L_dataized):           𝔻(ξ.target):             𝕄(ξ.target):               𝑛·3·1 := Φ.bytes( φ ↦ 𝜎2:λ )-              morphed 𝑛·3·2 := 𝑛·3·1-            boxed 𝑛·3·3 := 𝑛·3·2.φ+              𝑛·3·2 := 𝜎2:λ:φ+              morphed 𝑛·3·3 := 𝑛·3·2+            boxed 𝑛·3·4 := 𝑛·3·3.φ             𝛿·3·1 := 𝔻(𝜎2:λ)           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.target)-          𝑛·3·4 := Φ.bytes( φ ↦ 𝜎4:λ )  # 𝑛-          𝕄(𝑛·3·4):-            𝑛·3·5 := Φ.bytes( φ ↦ 𝜎4:λ )-            morphed 𝑛·3·6 := 𝑛·3·5-          𝑛·3·7 := 𝑛·3·6  # 𝕄(𝑛·3·4)-        morphed 𝑛·1·4 := 𝜎4:λ-      𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.y)-      𝑛·1·5 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ  # 𝑛-      𝕄(𝑛·1·5):-        morphed 𝑛·1·6 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ-      𝑛·1·7 := 𝑛·1·6  # 𝕄(𝑛·1·5)-    morphed 𝑛·0·3 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧+          𝑛·3·5 := Φ.bytes( φ ↦ 𝜎4:λ )  # 𝑛+          𝕄(𝑛·3·5):+            𝑛·3·6 := Φ.bytes( φ ↦ 𝜎4:λ )+            𝑛·3·7 := 𝜎4:λ:φ+            morphed 𝑛·3·8 := 𝑛·3·7+          𝑛·3·9 := 𝑛·3·8  # 𝕄(𝑛·3·5)+        morphed 𝑛·1·6 := 𝜎4:λ+      𝑛2·1 := 𝑛·1·6  # 𝕄(ξ.y)+      𝑛·1·7 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ  # 𝑛+      𝕄(𝑛·1·7):+        morphed 𝑛·1·8 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ+      𝑛·1·9 := 𝑛·1·8  # 𝕄(𝑛·1·7)+    morphed 𝑛·0·5 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧
+ test-resources/evaluate-packs/undresses-a-formation-twice-to-reach-what-it-wraps.yaml view
@@ -0,0 +1,38 @@+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com+# SPDX-License-Identifier: MIT+---+# yamllint disable rule:line-length+# The operand of 'morph' comes to a formation binding φ alone, whose φ is a+# formation binding φ alone too, so one dispatch of φ would leave it one φ+# short of what it wraps (#2174). A line of 'undress' reading that meta+# dispatches φ off the term and morphs that, and does it again while the term+# is such a formation, so it stops at the formation binding 't'. The protocol+# writes an 'undressed' line and a 𝕄 block named after it for each pass.+symbolic: |+  - λ: L_peel+    morph:+      𝑛1: $.x+    undress:+      𝑛2: 𝑛1+    𝑛: 𝑛2+location: 'Q.y'+input: '⟦ z ↦ ⟦ t ↦ ⟦ k ↦ ∅ ⟧ ⟧, y ↦ ⟦ λ ⤍ L_peel, x ↦ ⟦ φ ↦ ⟦ φ ↦ Φ.z ⟧ ⟧ ⟧.t ⟧'+result: '⟦ k ↦ ∅ ⟧'+protocol: |+  𝕄(Φ.y):+    𝔼(L_peel):+      𝕄(ξ.x):+        morphed 𝑛·1·1 := Φ.z:φ:φ+      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.x)+      undressed 𝑛·1·2 := 𝑛·1·1.φ+      𝕄(𝑛·1·2):+        morphed 𝑛·1·3 := Φ.z:φ+      undressed 𝑛·1·4 := 𝑛·1·3.φ+      𝕄(𝑛·1·4):+        morphed 𝑛·1·5 := ⟦ t(k) ↦ ⟦⟧ ⟧+      𝑛2·1 := 𝑛·1·5  # undress(𝑛1)+      𝑛·1·6 := 𝑛·1·5  # 𝑛+      𝕄(𝑛·1·6):+        morphed 𝑛·1·7 := 𝑛·1·5+      𝑛·1·8 := 𝑛·1·7  # 𝕄(𝑛·1·6)+    morphed 𝑛·0·1 := ∅:k
+ test-resources/evaluate-packs/undresses-a-formation-wrapping-itself-until-the-steps-run-out.yaml view
@@ -0,0 +1,32 @@+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com+# SPDX-License-Identifier: MIT+---+# yamllint disable rule:line-length+# The object 'w' binds in φ alone the object 'w' itself, so every φ a line of+# 'undress' dispatches off it morphs to the same formation again, and the line+# would undress it forever (#2174). Every pass spends a step of '--max-steps',+# as a frame does, so the run ends once the budget runs out, and the protocol+# keeps the passes it made and the 'starved' line where it stopped.+symbolic: |+  - λ: L_peel+    morph:+      𝑛1: $.x+    undress:+      𝑛2: 𝑛1+    𝑛: 𝑛2+location: 'Q.y'+steps: 6+input: '⟦ w ↦ ⟦ φ ↦ Φ.w ⟧, y ↦ ⟦ λ ⤍ L_peel, x ↦ Φ.w ⟧.φ ⟧'+fails: 'reaching the limit of steps'+protocol: |+  𝕄(Φ.y):+    𝔼(L_peel):+      𝕄(ξ.x):+        morphed 𝑛·1·1 := Φ.w:φ+      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.x)+      undressed 𝑛·1·2 := 𝑛·1·1.φ+      𝕄(𝑛·1·2):+        morphed 𝑛·1·3 := 𝑛·1·1+      undressed 𝑛·1·4 := 𝑛·1·3.φ+      𝕄(𝑛·1·4):+        starved 6
test-resources/evaluate-packs/writes-no-joined-line-for-a-join-the-memo-answered.yaml view
@@ -41,167 +41,204 @@ protocol: |   𝕄(Φ.φ):     𝑛·0·1 := 5.0-    𝑛·0·2 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )+    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧     𝔼(L_number_gt):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·1·1 := 5.0-          morphed 𝑛·1·2 := 𝑛·1·1-        boxed 𝑛·1·3 := 𝑛·1·2.φ-        𝕄(𝑛·1·3):-          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )-          morphed 𝑛·1·5 := 𝑛·1·4-        boxed 𝑛·1·6 := 𝑛·1·5.φ+          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·1·3 := 𝑛·1·2+        boxed 𝑛·1·4 := 𝑛·1·3.φ+        𝕄(𝑛·1·4):+          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )+          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·7 := 𝑛·1·6+        boxed 𝑛·1·8 := 𝑛·1·7.φ         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·1·7 := 0.0-          morphed 𝑛·1·8 := 𝑛·1·7-        boxed 𝑛·1·9 := 𝑛·1·8.φ-        𝕄(𝑛·1·9):-          𝑛·1·10 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·9 := 0.0+          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧           morphed 𝑛·1·11 := 𝑛·1·10         boxed 𝑛·1·12 := 𝑛·1·11.φ+        𝕄(𝑛·1·12):+          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·1·15 := 𝑛·1·14+        boxed 𝑛·1·16 := 𝑛·1·15.φ         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)-      𝑛·1·13 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛-      𝕄(𝑛·1·13):-        𝑛·1·14 := Φ.bool( φ ↦ 𝜎1:λ )-        morphed 𝑛·1·15 := 𝑛·1·14-      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)-    𝑛·0·3 := 𝑛·1·14.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·7 ) )-    𝑛·0·4 := 𝑛·0·3( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·7 ) )+      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛+      𝕄(𝑛·1·17):+        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )+        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+        morphed 𝑛·1·20 := 𝑛·1·19+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)+    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ) )+    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ ∅, λ ⤍ L_fork ⟧+    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ) )+    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ), λ ⤍ L_fork ⟧     𝔼(L_fork):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )-          morphed 𝑛·2·2 := 𝑛·1·16-        boxed 𝑛·2·3 := 𝑛·2·2.φ+          𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧+          morphed 𝑛·2·3 := 𝑛·1·21+        boxed 𝑛·2·4 := 𝑛·2·3.φ         𝛿·2·1 := 𝔻(𝜎1:λ)       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)       𝕄(ξ.then):-        𝑛·2·4 := 1.0-        𝑛·2·5 := 𝑛·2·4.plus( x ↦ 2.0 )+        𝑛·2·5 := 1.0+        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )+        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·3·1 := 1.0-              morphed 𝑛·3·2 := 𝑛·3·1-            boxed 𝑛·3·3 := 𝑛·3·2.φ-            𝕄(𝑛·3·3):-              𝑛·3·4 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )-              morphed 𝑛·3·5 := 𝑛·3·4-            boxed 𝑛·3·6 := 𝑛·3·5.φ+              𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·3·3 := 𝑛·3·2+            boxed 𝑛·3·4 := 𝑛·3·3.φ+            𝕄(𝑛·3·4):+              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )+              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·7 := 𝑛·3·6+            boxed 𝑛·3·8 := 𝑛·3·7.φ             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·3·7 := 2.0-              morphed 𝑛·3·8 := 𝑛·3·7-            boxed 𝑛·3·9 := 𝑛·3·8.φ-            𝕄(𝑛·3·9):-              𝑛·3·10 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·9 := 2.0+              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·3·11 := 𝑛·3·10             boxed 𝑛·3·12 := 𝑛·3·11.φ+            𝕄(𝑛·3·12):+              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )+              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·3·15 := 𝑛·3·14+            boxed 𝑛·3·16 := 𝑛·3·15.φ             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)-          𝑛·3·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛-          𝕄(𝑛·3·13):-            𝑛·3·14 := Φ.number( φ ↦ 𝜎2:λ )-            morphed 𝑛·3·15 := 𝑛·3·14-          𝑛·3·16 := 𝑛·3·15  # 𝕄(𝑛·3·13)-        𝑛·2·6 := 𝑛·3·14.plus( x ↦ 𝑛·1·7 )-        morphed 𝑛·2·7 := 𝑛·2·6+          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛+          𝕄(𝑛·3·17):+            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )+            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·3·20 := 𝑛·3·19+          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)+        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 𝑛·1·9 )+        𝑛·2·10 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·11 := 𝑛·2·10       𝕄(ξ.else):-        𝑛·2·8 := 3.0-        𝑛·2·9 := 𝑛·2·8.plus( x ↦ 4.0 )+        𝑛·2·12 := 3.0+        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 4.0 )+        𝑛·2·15 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧         𝔼(L_number_plus):           𝔻(ξ.ρ):             𝕄(ξ.ρ):               𝑛·4·1 := 3.0-              morphed 𝑛·4·2 := 𝑛·4·1-            boxed 𝑛·4·3 := 𝑛·4·2.φ-            𝕄(𝑛·4·3):-              𝑛·4·4 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )-              morphed 𝑛·4·5 := 𝑛·4·4-            boxed 𝑛·4·6 := 𝑛·4·5.φ+              𝑛·4·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+              morphed 𝑛·4·3 := 𝑛·4·2+            boxed 𝑛·4·4 := 𝑛·4·3.φ+            𝕄(𝑛·4·4):+              𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )+              𝑛·4·6 := 40-08-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·4·7 := 𝑛·4·6+            boxed 𝑛·4·8 := 𝑛·4·7.φ             𝛿·4·1 := 40-08-00-00-00-00-00-00  # 3.0           𝛿1·4 := 𝛿·4·1  # 𝔻(ξ.ρ)           𝔻(ξ.x):             𝕄(ξ.x):-              𝑛·4·7 := 4.0-              morphed 𝑛·4·8 := 𝑛·4·7-            boxed 𝑛·4·9 := 𝑛·4·8.φ-            𝕄(𝑛·4·9):-              𝑛·4·10 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )+              𝑛·4·9 := 4.0+              𝑛·4·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧               morphed 𝑛·4·11 := 𝑛·4·10             boxed 𝑛·4·12 := 𝑛·4·11.φ+            𝕄(𝑛·4·12):+              𝑛·4·13 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )+              𝑛·4·14 := 40-10-00-00-00-00-00-00:Δ:φ+              morphed 𝑛·4·15 := 𝑛·4·14+            boxed 𝑛·4·16 := 𝑛·4·15.φ             𝛿·4·2 := 40-10-00-00-00-00-00-00  # 4.0           𝛿2·4 := 𝛿·4·2  # 𝔻(ξ.x)-          𝑛·4·13 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛-          𝕄(𝑛·4·13):-            𝑛·4·14 := Φ.number( φ ↦ 𝜎3:λ )-            morphed 𝑛·4·15 := 𝑛·4·14-          𝑛·4·16 := 𝑛·4·15  # 𝕄(𝑛·4·13)-        𝑛·2·10 := 𝑛·4·14.plus( x ↦ 𝑛·1·7 )-        morphed 𝑛·2·11 := 𝑛·2·10+          𝑛·4·17 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛+          𝕄(𝑛·4·17):+            𝑛·4·18 := Φ.number( φ ↦ 𝜎3:λ )+            𝑛·4·19 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+            morphed 𝑛·4·20 := 𝑛·4·19+          𝑛·4·21 := 𝑛·4·20  # 𝕄(𝑛·4·17)+        𝑛·2·16 := 𝑛·4·18.plus( x ↦ 𝑛·1·9 )+        𝑛·2·17 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧+        morphed 𝑛·2·18 := 𝑛·2·17       joined 𝜎4 := 𝛿1·2 ? 𝜎2 : 𝜎3-      𝑛·2·12 := ⟦ x ↦ 𝑛·1·7, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)+      𝑛·2·19 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·5·1 := Φ.number( φ ↦ 𝜎4:λ )-          morphed 𝑛·5·2 := 𝑛·5·1-        boxed 𝑛·5·3 := 𝑛·5·2.φ+          𝑛·5·2 := ⟦ φ ↦ 𝜎4:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·3 := 𝑛·5·2+        boxed 𝑛·5·4 := 𝑛·5·3.φ         𝛿·5·1 := 𝔻(𝜎4:λ)       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·5·4 := Φ.number( φ ↦ 𝑛·1·10 )-          morphed 𝑛·5·5 := 𝑛·5·4-        boxed 𝑛·5·6 := 𝑛·5·5.φ-        𝕄(𝑛·5·6):-          𝑛·5·7 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )-          morphed 𝑛·5·8 := 𝑛·5·7-        boxed 𝑛·5·9 := 𝑛·5·8.φ+          𝑛·5·5 := Φ.number( φ ↦ 𝑛·1·13 )+          𝑛·5·6 := ⟦ φ ↦ 𝑛·1·13, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·5·7 := 𝑛·5·6+        boxed 𝑛·5·8 := 𝑛·5·7.φ+        𝕄(𝑛·5·8):+          𝑛·5·9 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )+          𝑛·5·10 := 00-00-00-00-00-00-00-00:Δ:φ+          morphed 𝑛·5·11 := 𝑛·5·10+        boxed 𝑛·5·12 := 𝑛·5·11.φ         𝛿·5·2 := 00-00-00-00-00-00-00-00  # 0.0       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)-      𝑛·5·10 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛-      𝕄(𝑛·5·10):-        𝑛·5·11 := Φ.number( φ ↦ 𝜎5:λ )-        morphed 𝑛·5·12 := 𝑛·5·11-      𝑛·5·13 := 𝑛·5·12  # 𝕄(𝑛·5·10)-    𝑛·0·5 := 𝑛·5·11.plus( x ↦ Φ.f )+      𝑛·5·13 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛+      𝕄(𝑛·5·13):+        𝑛·5·14 := Φ.number( φ ↦ 𝜎5:λ )+        𝑛·5·15 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·5·16 := 𝑛·5·15+      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)+    𝑛·0·9 := 𝑛·5·14.plus( x ↦ Φ.f )+    𝑛·0·10 := ⟦ x ↦ Φ.f, λ ⤍ L_number_plus ⟧     𝔼(L_number_plus):       𝔻(ξ.ρ):         𝕄(ξ.ρ):           𝑛·6·1 := Φ.number( φ ↦ 𝜎5:λ )-          morphed 𝑛·6·2 := 𝑛·5·13-        boxed 𝑛·6·3 := 𝑛·6·2.φ+          𝑛·6·2 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          morphed 𝑛·6·3 := 𝑛·5·17+        boxed 𝑛·6·4 := 𝑛·6·3.φ         𝛿·6·1 := 𝔻(𝜎5:λ)       𝛿1·6 := 𝛿·6·1  # 𝔻(ξ.ρ)       𝔻(ξ.x):         𝕄(ξ.x):-          𝑛·6·4 := Φ.number( φ ↦ 𝑛·1·4 )-          𝑛·6·5 := 𝑛·6·4.gt( x ↦ 𝑛·5·4 )+          𝑛·6·5 := Φ.number( φ ↦ 𝑛·1·5 )+          𝑛·6·6 := ⟦ φ ↦ 𝑛·1·5, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+          𝑛·6·7 := 𝑛·6·5.gt( x ↦ 𝑛·5·5 )+          𝑛·6·8 := ⟦ x ↦ 𝑛·5·5, λ ⤍ L_number_gt ⟧           𝔼(L_number_gt):             𝑛·7·1 := 𝑛·2·1  # 𝑛-            𝑛·7·2 := 𝑛·1·16  # 𝕄(𝑛·7·1)-          𝑛·6·6 := 𝑛·2·1.if( then ↦ 𝑛·3·1.plus( 𝑛·3·7 ).plus( 𝑛·5·4 ) )-          𝑛·6·7 := 𝑛·6·6( else ↦ 𝑛·4·1.plus( 𝑛·4·7 ).plus( 𝑛·5·4 ) )-          morphed 𝑛·6·8 := 𝑛·6·7+            𝑛·7·2 := 𝑛·1·21  # 𝕄(𝑛·7·1)+          𝑛·6·9 := 𝑛·2·1.if( then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ) )+          𝑛·6·10 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ), else ↦ ∅, λ ⤍ L_fork ⟧+          𝑛·6·11 := 𝑛·6·9( else ↦ 𝑛·4·1.plus( 𝑛·4·9 ).plus( 𝑛·5·5 ) )+          𝑛·6·12 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ), else ↦ 𝑛·4·1.plus( 𝑛·4·9 ).plus( 𝑛·5·5 ), λ ⤍ L_fork ⟧+          morphed 𝑛·6·13 := 𝑛·6·12         𝔼(L_fork):-          𝑛·8·1 := ⟦ x ↦ 𝑛·5·4, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)+          𝑛·8·1 := ⟦ x ↦ 𝑛·5·5, λ ⤍ L_number_plus ⟧  # 𝕄(ξ.then), 𝕄(ξ.else)         𝔼(L_number_plus):           𝑛·9·1 := 𝑛·6·1  # 𝑛-          𝑛·9·2 := 𝑛·5·13  # 𝕄(𝑛·9·1)-        boxed 𝑛·6·9 := 𝑛·9·2.φ+          𝑛·9·2 := 𝑛·5·17  # 𝕄(𝑛·9·1)+        boxed 𝑛·6·14 := 𝑛·9·2.φ         𝛿·6·2 := 𝔻(𝜎5:λ)       𝛿2·6 := 𝛿·6·2  # 𝔻(ξ.x)-      𝑛·6·10 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛-      𝕄(𝑛·6·10):-        𝑛·6·11 := Φ.number( φ ↦ 𝜎6:λ )-        morphed 𝑛·6·12 := 𝑛·6·11-      𝑛·6·13 := 𝑛·6·12  # 𝕄(𝑛·6·10)-    morphed 𝑛·0·6 := 𝜎6:λ+      𝑛·6·15 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛+      𝕄(𝑛·6·15):+        𝑛·6·16 := Φ.number( φ ↦ 𝜎6:λ )+        𝑛·6·17 := ⟦ φ ↦ 𝜎6:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧+        morphed 𝑛·6·18 := 𝑛·6·17+      𝑛·6·19 := 𝑛·6·18  # 𝕄(𝑛·6·15)+    morphed 𝑛·0·11 := 𝜎6:λ
test-resources/explain-packs/dataization/box.yaml view
@@ -5,8 +5,8 @@ latex: |-   \begin{phinoDataizationInference}     \phinoName{box}-    \phinoCondition{ [ D \char44{} L ] \cap \lparen B_1 \cup B_2 \rparen = \emptyset }-    \phinoPremise{ \phinoNormalize{ [[ B_1, @ -> e_2, B_2 ]] . @ }{ n } }-    \phinoPremise{ \phinoDataize{ n }{ e_1 }{ s_1 }{ \delta }{ s_2 } }-    \phinoConclusion{ \phinoDataize{ [[ B_1, @ -> e_2, B_2 ]] }{ e_1 }{ s_1 }{ \delta }{ s_2 } }+    \phinoCondition{ @ \in B \phiText{and} [ D \char44{} L ] \cap B = \emptyset }+    \phinoPremise{ \phinoNormalize{ [[ B ]] . @ }{ n } }+    \phinoPremise{ \phinoDataize{ n }{ e }{ s_1 }{ \delta }{ s_2 } }+    \phinoConclusion{ \phinoDataize{ [[ B ]] }{ e }{ s_1 }{ \delta }{ s_2 } }   \end{phinoDataizationInference}
test-resources/explain-packs/dataization/fire.yaml view
@@ -5,8 +5,8 @@ latex: |-   \begin{phinoDataizationInference}     \phinoName{fire}-    \phinoCondition{ [ D ] \cap \lparen B_1 \cup B_2 \rparen = \emptyset }-    \phinoPremise{ \phinoEvaluate{ [[ B_1, L> f, B_2 ]] }{ e }{ s_1 }{ n }{ s_2 } }+    \phinoCondition{ L \in B \phiText{and} [ D ] \cap B = \emptyset }+    \phinoPremise{ \phinoEvaluate{ [[ B ]] }{ e }{ s_1 }{ n }{ s_2 } }     \phinoPremise{ \phinoDataize{ n }{ e }{ s_2 }{ \delta }{ s_3 } }-    \phinoConclusion{ \phinoDataize{ [[ B_1, L> f, B_2 ]] }{ e }{ s_1 }{ \delta }{ s_3 } }+    \phinoConclusion{ \phinoDataize{ [[ B ]] }{ e }{ s_1 }{ \delta }{ s_3 } }   \end{phinoDataizationInference}
test-resources/explain-packs/morphing/ml.yaml view
@@ -6,8 +6,9 @@   \begin{phinoMorphingInference}     \phinoName{ml}     \phinoLabel{\uplambda}-    \phinoPremise{ \phinoEvaluate{ [[ B_1, L> f, B_2 ]] }{ e }{ s_1 }{ n_1 }{ s_2 } }+    \phinoCondition{ L \in B }+    \phinoPremise{ \phinoEvaluate{ [[ B ]] }{ e }{ s_1 }{ n_1 }{ s_2 } }     \phinoPremise{ \phinoNormalize{ n_1 . \tau }{ n_2 } }     \phinoPremise{ \phinoMorph{ n_2 }{ e }{ s_2 }{ n_3 }{ s_3 } }-    \phinoConclusion{ \phinoMorph{ [[ B_1, L> f, B_2 ]] . \tau }{ e }{ s_1 }{ n_3 }{ s_3 } }+    \phinoConclusion{ \phinoMorph{ [[ B ]] . \tau }{ e }{ s_1 }{ n_3 }{ s_3 } }   \end{phinoMorphingInference}
test/AbridgeSpec.hs view
@@ -59,6 +59,17 @@         )         (SWEET, UNICODE, SINGLELINE, defaultMargin)         `shouldBe` "⟦ φ ↦ ⟦ +9 ⟧, +2 ⟧"+    it "keeps a void φ of a long formation and folds the rest into a count" $+      printExpressionWith+        (const (abridged True 64))+        ( ExFormation+            ( BiLambda (Function "L_weit")+                : BiVoid AtPhi+                : map (\idx -> BiTau (AtLabel (T.pack ("anfang-" <> show idx))) ExRoot) [1 .. 5 :: Int]+            )+        )+        (SWEET, UNICODE, SINGLELINE, defaultMargin)+        `shouldBe` "⟦ λ ⤍ L_weit, φ ↦ ∅, +5 ⟧"     it "cuts a long byte string to its first bytes, its last bytes and the count of the bytes between them" $       printExpressionWith         (const (abridged True 64))
test/CLISpec.hs view
@@ -23,7 +23,7 @@ import Paths_phino (version) import System.Directory (createDirectoryIfMissing, doesDirectoryExist, doesFileExist, getTemporaryDirectory, listDirectory, makeAbsolute, removeDirectoryRecursive, removeFile, removePathForcibly, setModificationTime, withCurrentDirectory) import System.Exit (ExitCode (ExitFailure))-import System.FilePath ((</>))+import System.FilePath (takeFileName, (</>)) import System.IO import System.Timeout (timeout) import Test.Hspec@@ -1504,12 +1504,14 @@             `shouldBe` [ "𝔻(Φ.t):"                        , "  𝕄(Φ.t):"                        , "    𝑛·0·1 := Φ.cyc( x ↦ ⟦⟧ )"-                       , "    morphed 𝑛·0·2 := 𝑛·0·1"-                       , "  boxed 𝑛·0·3 := 𝑛·0·2.φ"-                       , "  𝕄(𝑛·0·3):"-                       , "    𝑛·0·4 := Φ.cyc( x ↦ ⟦⟧ )"-                       , "    morphed 𝑛·0·5 := 𝑛·0·4"-                       , "  looped 𝑛·0·5  # 𝔻(𝑛·0·3), proven"+                       , "    𝑛·0·2 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧"+                       , "    morphed 𝑛·0·3 := 𝑛·0·2"+                       , "  boxed 𝑛·0·4 := 𝑛·0·3.φ"+                       , "  𝕄(𝑛·0·4):"+                       , "    𝑛·0·5 := Φ.cyc( x ↦ ⟦⟧ )"+                       , "    𝑛·0·6 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧"+                       , "    morphed 𝑛·0·7 := 𝑛·0·6"+                       , "  looped 𝑛·0·7  # 𝔻(𝑛·0·4), proven"                        ]        it "writes the cut to the XML protocol with the formation in an element of its own" $@@ -1526,14 +1528,16 @@                        , "  <morph at=\"Φ.t\">"                        , "    <formed meta=\"𝑒·0·1\"/>"                        , "    <applied meta=\"𝑛·0·1\" by=\"morph\" at=\"Φ.t\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"-                       , "    <morphed meta=\"𝑛·0·2\">𝑛·0·1</morphed>"+                       , "    <formed meta=\"𝑛·0·2\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"+                       , "    <morphed meta=\"𝑛·0·3\">𝑛·0·2</morphed>"                        , "  </morph>"-                       , "  <boxed meta=\"𝑛·0·3\">𝑛·0·2.φ</boxed>"-                       , "  <morph at=\"𝑛·0·3\">"-                       , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·3\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"-                       , "    <morphed meta=\"𝑛·0·5\">𝑛·0·4</morphed>"+                       , "  <boxed meta=\"𝑛·0·4\">𝑛·0·3.φ</boxed>"+                       , "  <morph at=\"𝑛·0·4\">"+                       , "    <applied meta=\"𝑛·0·5\" by=\"morph\" at=\"𝑛·0·4\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"+                       , "    <formed meta=\"𝑛·0·6\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"+                       , "    <morphed meta=\"𝑛·0·7\">𝑛·0·6</morphed>"                        , "  </morph>"-                       , "  <looped by=\"dataize\" match=\"proven\" at=\"𝑛·0·3\" of=\"𝑛·0·5\"/>"+                       , "  <looped by=\"dataize\" match=\"proven\" at=\"𝑛·0·4\" of=\"𝑛·0·7\"/>"                        , "</dataize>"                        ] @@ -1545,7 +1549,7 @@               ["dataize", "--locator=Q.t", "--acyclic=plausible", "--partial", "--protocol=" ++ path, "--sweet", "--hide-rho", "--flat", "--quiet"]               []           records <- readProtocol path-          lines records `shouldContain` ["  looped 𝑛·0·5  # 𝔻(𝑛·0·3), plausible"]+          lines records `shouldContain` ["  looped 𝑛·0·7  # 𝔻(𝑛·0·4), plausible"]        it "refuses the flag without a mode" $         withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $@@ -1639,6 +1643,10 @@       withStdin "[[ @ -> [[ L> Foo ]] ]]" $         testCLISucceeded ["dataize", "--partial", "--canonize", "--flat", "--sweet"] ["Fn1:λ"] +    it "hides an object outside the residue --locator aims at with --partial" $+      withStdin "[[ t -> [[ @ -> [[ L> Foo ]] ]], o -> [[ D> 03- ]] ]]" $+        testCLISucceeded ["dataize", "--partial", "--locator=Q.t", "--hide=Q.o", "--flat", "--sweet"] ["Foo:λ"]+     it "dataizes with --locator" $       withStdin "[[ ex -> [[ @ -> Q.x ]], x -> [[ D> 42- ]] ]]" $         testCLISucceeded ["dataize", "--locator=Q.ex"] ["42-"]@@ -1737,6 +1745,78 @@           records <- readProtocol path           records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n" +      it "opens the protocol with a header naming the phino that wrote it" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "[[ D> 01- ]]" $+            testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          records `shouldSatisfy` isPrefixOf ("# Written by phino " ++ showVersion version ++ " ")++      it "writes the command line of the run into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "[[ D> 01- ]]" $+            testCLISucceeded ["dataize", "--protocol=" ++ takeFileName path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["# Command: phino dataize --protocol=" ++ takeFileName path ++ " --quiet"]++      it "writes the world read from the standard input into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["# World: stdin, 1 line, 32 bytes, 1 object at the top, 2 bindings"]++      it "writes the world read from a file into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withTempFileContent "worldXXXXXX.phi" "[[\n  t -> [[ D> 01- ]]\n]]\n" $ \world -> do+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet", world] []+            records <- readUtf8 path+            lines records `shouldContain` [printf "# World: %s, 3 lines, 26 bytes, 1 object at the top, 2 bindings" world]++      it "writes the λ functions of the run into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin sum' $+            testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` [printf "# Symbolic: %s, 5 entries" lambdasFile]++      it "writes the locator of the run into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["# Locator: Φ.t"]++      it "writes the expression the locator points at into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["# Expression: ⟦ Δ ⤍ 01- ⟧"]++      it "writes the expression given to --inside into the header" $+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do+          hClose stream+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $+            testCLISucceeded ["morph", "--inside=Φ.t", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["# Expression: Φ.t"]++      it "writes the header into the XML protocol" $+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do+          hClose stream+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []+          records <- readUtf8 path+          lines records `shouldContain` ["  <locator>Φ.t</locator>"]+       it "closes the protocol with its msec on the third line from the end" $         withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do           hClose stream@@ -1780,37 +1860,44 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 5.0"-                       , "    𝑛·0·3 := 𝑛·0·2.plus( x ↦ 6.0 )"-                       , "    morphed 𝑛·0·4 := 𝑛·0·3"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"+                       , "    morphed 𝑛·0·6 := 𝑛·0·5"                        , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"                        , "    𝔻(ξ.ρ):"                        , "      𝕄(ξ.ρ):"                        , "        𝑛·1·1 := 5.0"-                       , "        morphed 𝑛·1·2 := 𝑛·1·1"-                       , "      boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "      𝕄(𝑛·1·3):"-                       , "        𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                       , "        morphed 𝑛·1·5 := 𝑛·1·4"-                       , "      boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "        morphed 𝑛·1·3 := 𝑛·1·2"+                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "      𝕄(𝑛·1·4):"+                       , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                       , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                       , "        morphed 𝑛·1·7 := 𝑛·1·6"+                       , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                        , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "    𝔻(ξ.x):"                        , "      𝕄(ξ.x):"-                       , "        𝑛·1·7 := 6.0"-                       , "        morphed 𝑛·1·8 := 𝑛·1·7"-                       , "      boxed 𝑛·1·9 := 𝑛·1·8.φ"-                       , "      𝕄(𝑛·1·9):"-                       , "        𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "        𝑛·1·9 := 6.0"+                       , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"                        , "        morphed 𝑛·1·11 := 𝑛·1·10"                        , "      boxed 𝑛·1·12 := 𝑛·1·11.φ"+                       , "      𝕄(𝑛·1·12):"+                       , "        𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "        𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"+                       , "        morphed 𝑛·1·15 := 𝑛·1·14"+                       , "      boxed 𝑛·1·16 := 𝑛·1·15.φ"                        , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"                        , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "    𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "    𝕄(𝑛·1·13):"-                       , "      𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "      morphed 𝑛·1·15 := 𝑛·1·14"-                       , "    𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                       , "  boxed 𝑛·0·5 := 𝑛·1·16.φ"+                       , "    𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "    𝕄(𝑛·1·17):"+                       , "      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "      morphed 𝑛·1·20 := 𝑛·1·19"+                       , "    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                       , "  boxed 𝑛·0·7 := 𝑛·1·21.φ"                        , "  𝛿·0·1 := 𝔻(𝜎1:λ)"                        ] @@ -1836,8 +1923,9 @@                        , "  boxed 𝑛·0·4 := 𝑛·1·3.φ"                        , "  𝕄(𝑛·0·4):"                        , "    𝑛·0·5 := Φ.bytes( φ ↦ 𝜎1:λ )"-                       , "    morphed 𝑛·0·6 := 𝑛·0·5"-                       , "  boxed 𝑛·0·7 := 𝑛·0·6.φ"+                       , "    𝑛·0·6 := 𝜎1:λ:φ"+                       , "    morphed 𝑛·0·7 := 𝑛·0·6"+                       , "  boxed 𝑛·0·8 := 𝑛·0·7.φ"                        , "  𝛿·0·1 := 𝔻(𝜎1:λ)"                        ] @@ -1852,62 +1940,74 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 5.0"-                       , "    𝑛·0·3 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"                        , "    𝔼(L_number_plus):"                        , "      𝔻(ξ.ρ):"                        , "        𝕄(ξ.ρ):"                        , "          𝑛·1·1 := 5.0"-                       , "          morphed 𝑛·1·2 := 𝑛·1·1"-                       , "        boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "        𝕄(𝑛·1·3):"-                       , "          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                       , "          morphed 𝑛·1·5 := 𝑛·1·4"-                       , "        boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "        𝕄(𝑛·1·4):"+                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·7 := 𝑛·1·6"+                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                        , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "      𝔻(ξ.x):"                        , "        𝕄(ξ.x):"-                       , "          𝑛·1·7 := 6.0"-                       , "          morphed 𝑛·1·8 := 𝑛·1·7"-                       , "        boxed 𝑛·1·9 := 𝑛·1·8.φ"-                       , "        𝕄(𝑛·1·9):"-                       , "          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·9 := 6.0"+                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"                        , "          morphed 𝑛·1·11 := 𝑛·1·10"                        , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"+                       , "        𝕄(𝑛·1·12):"+                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·15 := 𝑛·1·14"+                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"                        , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"                        , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "      𝕄(𝑛·1·13):"-                       , "        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·1·15 := 𝑛·1·14"-                       , "      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                       , "    𝑛·0·4 := 𝑛·1·14.plus( x ↦ 7.0 )"-                       , "    morphed 𝑛·0·5 := 𝑛·0·4"+                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "      𝕄(𝑛·1·17):"+                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "        morphed 𝑛·1·20 := 𝑛·1·19"+                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                       , "    𝑛·0·6 := 𝑛·1·18.plus( x ↦ 7.0 )"+                       , "    𝑛·0·7 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"+                       , "    morphed 𝑛·0·8 := 𝑛·0·7"                        , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"                        , "    𝔻(ξ.ρ):"                        , "      𝕄(ξ.ρ):"                        , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·2·2 := 𝑛·1·16"-                       , "      boxed 𝑛·2·3 := 𝑛·2·2.φ"+                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "        morphed 𝑛·2·3 := 𝑛·1·21"+                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"                        , "      𝛿·2·1 := 𝔻(𝜎1:λ)"                        , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"                        , "    𝔻(ξ.x):"                        , "      𝕄(ξ.x):"-                       , "        𝑛·2·4 := 7.0"-                       , "        morphed 𝑛·2·5 := 𝑛·2·4"-                       , "      boxed 𝑛·2·6 := 𝑛·2·5.φ"-                       , "      𝕄(𝑛·2·6):"-                       , "        𝑛·2·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"-                       , "        morphed 𝑛·2·8 := 𝑛·2·7"-                       , "      boxed 𝑛·2·9 := 𝑛·2·8.φ"+                       , "        𝑛·2·5 := 7.0"+                       , "        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "        morphed 𝑛·2·7 := 𝑛·2·6"+                       , "      boxed 𝑛·2·8 := 𝑛·2·7.φ"+                       , "      𝕄(𝑛·2·8):"+                       , "        𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"+                       , "        𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ"+                       , "        morphed 𝑛·2·11 := 𝑛·2·10"+                       , "      boxed 𝑛·2·12 := 𝑛·2·11.φ"                        , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"                        , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"-                       , "    𝑛·2·10 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"-                       , "    𝕄(𝑛·2·10):"-                       , "      𝑛·2·11 := Φ.number( φ ↦ 𝜎2:λ )"-                       , "      morphed 𝑛·2·12 := 𝑛·2·11"-                       , "    𝑛·2·13 := 𝑛·2·12  # 𝕄(𝑛·2·10)"-                       , "  boxed 𝑛·0·6 := 𝑛·2·13.φ"+                       , "    𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"+                       , "    𝕄(𝑛·2·13):"+                       , "      𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )"+                       , "      𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "      morphed 𝑛·2·16 := 𝑛·2·15"+                       , "    𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)"+                       , "  boxed 𝑛·0·9 := 𝑛·2·17.φ"                        , "  𝛿·0·1 := 𝔻(𝜎2:λ)"                        ] @@ -1922,62 +2022,74 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 5.0"-                       , "    𝑛·0·3 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"                        , "    𝔼(L_number_plus):"                        , "      𝔻(ξ.ρ):"                        , "        𝕄(ξ.ρ):"                        , "          𝑛·1·1 := 5.0"-                       , "          morphed 𝑛·1·2 := 𝑛·1·1"-                       , "        boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "        𝕄(𝑛·1·3):"-                       , "          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                       , "          morphed 𝑛·1·5 := 𝑛·1·4"-                       , "        boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "        𝕄(𝑛·1·4):"+                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·7 := 𝑛·1·6"+                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                        , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "      𝔻(ξ.x):"                        , "        𝕄(ξ.x):"-                       , "          𝑛·1·7 := 6.0"-                       , "          morphed 𝑛·1·8 := 𝑛·1·7"-                       , "        boxed 𝑛·1·9 := 𝑛·1·8.φ"-                       , "        𝕄(𝑛·1·9):"-                       , "          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·9 := 6.0"+                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"                        , "          morphed 𝑛·1·11 := 𝑛·1·10"                        , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"+                       , "        𝕄(𝑛·1·12):"+                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·15 := 𝑛·1·14"+                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"                        , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"                        , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "      𝕄(𝑛·1·13):"-                       , "        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·1·15 := 𝑛·1·14"-                       , "      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                       , "    𝑛·0·4 := 𝑛·1·14.times( x ↦ 7.0 )"-                       , "    morphed 𝑛·0·5 := 𝑛·0·4"+                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "      𝕄(𝑛·1·17):"+                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "        morphed 𝑛·1·20 := 𝑛·1·19"+                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                       , "    𝑛·0·6 := 𝑛·1·18.times( x ↦ 7.0 )"+                       , "    𝑛·0·7 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧"+                       , "    morphed 𝑛·0·8 := 𝑛·0·7"                        , "  𝔼(L_number_times):  # 𝔻(𝑛·0·1)"                        , "    𝔻(ξ.ρ):"                        , "      𝕄(ξ.ρ):"                        , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·2·2 := 𝑛·1·16"-                       , "      boxed 𝑛·2·3 := 𝑛·2·2.φ"+                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "        morphed 𝑛·2·3 := 𝑛·1·21"+                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"                        , "      𝛿·2·1 := 𝔻(𝜎1:λ)"                        , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"                        , "    𝔻(ξ.x):"                        , "      𝕄(ξ.x):"-                       , "        𝑛·2·4 := 7.0"-                       , "        morphed 𝑛·2·5 := 𝑛·2·4"-                       , "      boxed 𝑛·2·6 := 𝑛·2·5.φ"-                       , "      𝕄(𝑛·2·6):"-                       , "        𝑛·2·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"-                       , "        morphed 𝑛·2·8 := 𝑛·2·7"-                       , "      boxed 𝑛·2·9 := 𝑛·2·8.φ"+                       , "        𝑛·2·5 := 7.0"+                       , "        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "        morphed 𝑛·2·7 := 𝑛·2·6"+                       , "      boxed 𝑛·2·8 := 𝑛·2·7.φ"+                       , "      𝕄(𝑛·2·8):"+                       , "        𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"+                       , "        𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ"+                       , "        morphed 𝑛·2·11 := 𝑛·2·10"+                       , "      boxed 𝑛·2·12 := 𝑛·2·11.φ"                        , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"                        , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"-                       , "    𝑛·2·10 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"-                       , "    𝕄(𝑛·2·10):"-                       , "      𝑛·2·11 := Φ.number( φ ↦ 𝜎2:λ )"-                       , "      morphed 𝑛·2·12 := 𝑛·2·11"-                       , "    𝑛·2·13 := 𝑛·2·12  # 𝕄(𝑛·2·10)"-                       , "  boxed 𝑛·0·6 := 𝑛·2·13.φ"+                       , "    𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"+                       , "    𝕄(𝑛·2·13):"+                       , "      𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )"+                       , "      𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"+                       , "      morphed 𝑛·2·16 := 𝑛·2·15"+                       , "    𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)"+                       , "  boxed 𝑛·0·9 := 𝑛·2·17.φ"                        , "  𝛿·0·1 := 𝔻(𝜎2:λ)"                        ] @@ -1992,62 +2104,74 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 5.0"-                       , "    𝑛·0·3 := 𝑛·0·2.plus( x ↦ 6.0.plus( 7.0 ) )"-                       , "    morphed 𝑛·0·4 := 𝑛·0·3"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0.plus( 7.0 ) )"+                       , "    𝑛·0·5 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧"+                       , "    morphed 𝑛·0·6 := 𝑛·0·5"                        , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"                        , "    𝔻(ξ.ρ):"                        , "      𝕄(ξ.ρ):"                        , "        𝑛·1·1 := 5.0"-                       , "        morphed 𝑛·1·2 := 𝑛·1·1"-                       , "      boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "      𝕄(𝑛·1·3):"-                       , "        𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                       , "        morphed 𝑛·1·5 := 𝑛·1·4"-                       , "      boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "        morphed 𝑛·1·3 := 𝑛·1·2"+                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "      𝕄(𝑛·1·4):"+                       , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                       , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                       , "        morphed 𝑛·1·7 := 𝑛·1·6"+                       , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                        , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "    𝔻(ξ.x):"                        , "      𝕄(ξ.x):"-                       , "        𝑛·1·7 := 6.0"-                       , "        𝑛·1·8 := 𝑛·1·7.plus( x ↦ 7.0 )"-                       , "        morphed 𝑛·1·9 := 𝑛·1·8"+                       , "        𝑛·1·9 := 6.0"+                       , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "        𝑛·1·11 := 𝑛·1·9.plus( x ↦ 7.0 )"+                       , "        𝑛·1·12 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"+                       , "        morphed 𝑛·1·13 := 𝑛·1·12"                        , "      𝔼(L_number_plus):"                        , "        𝔻(ξ.ρ):"                        , "          𝕄(ξ.ρ):"                        , "            𝑛·2·1 := 6.0"-                       , "            morphed 𝑛·2·2 := 𝑛·2·1"-                       , "          boxed 𝑛·2·3 := 𝑛·2·2.φ"-                       , "          𝕄(𝑛·2·3):"-                       , "            𝑛·2·4 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"-                       , "            morphed 𝑛·2·5 := 𝑛·2·4"-                       , "          boxed 𝑛·2·6 := 𝑛·2·5.φ"+                       , "            𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                       , "            morphed 𝑛·2·3 := 𝑛·2·2"+                       , "          boxed 𝑛·2·4 := 𝑛·2·3.φ"+                       , "          𝕄(𝑛·2·4):"+                       , "            𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "            𝑛·2·6 := 40-18-00-00-00-00-00-00:Δ:φ"+                       , "            morphed 𝑛·2·7 := 𝑛·2·6"+                       , "          boxed 𝑛·2·8 := 𝑛·2·7.φ"                        , "          𝛿·2·1 := 40-18-00-00-00-00-00-00  # 6.0"                        , "        𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"                        , "        𝔻(ξ.x):"                        , "          𝕄(ξ.x):"-                       , "            𝑛·2·7 := 7.0"-                       , "            morphed 𝑛·2·8 := 𝑛·2·7"-                       , "          boxed 𝑛·2·9 := 𝑛·2·8.φ"-                       , "          𝕄(𝑛·2·9):"-                       , "            𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"+                       , "            𝑛·2·9 := 7.0"+                       , "            𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"                        , "            morphed 𝑛·2·11 := 𝑛·2·10"                        , "          boxed 𝑛·2·12 := 𝑛·2·11.φ"+                       , "          𝕄(𝑛·2·12):"+                       , "            𝑛·2·13 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"+                       , "            𝑛·2·14 := 40-1C-00-00-00-00-00-00:Δ:φ"+                       , "            morphed 𝑛·2·15 := 𝑛·2·14"+                       , "          boxed 𝑛·2·16 := 𝑛·2·15.φ"                        , "          𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"                        , "        𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"-                       , "        𝑛·2·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "        𝕄(𝑛·2·13):"-                       , "          𝑛·2·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "          morphed 𝑛·2·15 := 𝑛·2·14"-                       , "        𝑛·2·16 := 𝑛·2·15  # 𝕄(𝑛·2·13)"-                       , "      boxed 𝑛·1·10 := 𝑛·2·16.φ"+                       , "        𝑛·2·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "        𝕄(𝑛·2·17):"+                       , "          𝑛·2·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "          𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "          morphed 𝑛·2·20 := 𝑛·2·19"+                       , "        𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)"+                       , "      boxed 𝑛·1·14 := 𝑛·2·21.φ"                        , "      𝛿·1·2 := 𝔻(𝜎1:λ)"                        , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "    𝑛·1·11 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"-                       , "    𝕄(𝑛·1·11):"-                       , "      𝑛·1·12 := Φ.number( φ ↦ 𝜎2:λ )"-                       , "      morphed 𝑛·1·13 := 𝑛·1·12"-                       , "    𝑛·1·14 := 𝑛·1·13  # 𝕄(𝑛·1·11)"-                       , "  boxed 𝑛·0·5 := 𝑛·1·14.φ"+                       , "    𝑛·1·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"+                       , "    𝕄(𝑛·1·15):"+                       , "      𝑛·1·16 := Φ.number( φ ↦ 𝜎2:λ )"+                       , "      𝑛·1·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"+                       , "      morphed 𝑛·1·18 := 𝑛·1·17"+                       , "    𝑛·1·19 := 𝑛·1·18  # 𝕄(𝑛·1·15)"+                       , "  boxed 𝑛·0·7 := 𝑛·1·19.φ"                        , "  𝛿·0·1 := 𝔻(𝜎2:λ)"                        ] @@ -2095,36 +2219,43 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 5.0"-                       , "    𝑛·0·3 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"+                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"                        , "    𝔼(L_number_plus):"                        , "      𝔻(ξ.ρ):"                        , "        𝕄(ξ.ρ):"                        , "          𝑛·1·1 := 5.0"-                       , "          morphed 𝑛·1·2 := 𝑛·1·1"-                       , "        boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "        𝕄(𝑛·1·3):"-                       , "          𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                       , "          morphed 𝑛·1·5 := 𝑛·1·4"-                       , "        boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "        𝕄(𝑛·1·4):"+                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·7 := 𝑛·1·6"+                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                        , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "      𝔻(ξ.x):"                        , "        𝕄(ξ.x):"-                       , "          𝑛·1·7 := 6.0"-                       , "          morphed 𝑛·1·8 := 𝑛·1·7"-                       , "        boxed 𝑛·1·9 := 𝑛·1·8.φ"-                       , "        𝕄(𝑛·1·9):"-                       , "          𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·9 := 6.0"+                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"                        , "          morphed 𝑛·1·11 := 𝑛·1·10"                        , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"+                       , "        𝕄(𝑛·1·12):"+                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·15 := 𝑛·1·14"+                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"                        , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"                        , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "      𝕄(𝑛·1·13):"-                       , "        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·1·15 := 𝑛·1·14"-                       , "      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                       , "    morphed 𝑛·0·4 := L_number_nope:λ"+                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "      𝕄(𝑛·1·17):"+                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"+                       , "        morphed 𝑛·1·20 := 𝑛·1·19"+                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                       , "    morphed 𝑛·0·6 := L_number_nope:λ"                        , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"                        ] @@ -2141,7 +2272,7 @@           withStdin sum' $             testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--output=xmir", "--quiet", "--sweet", "--hide-rho"] []           records <- readProtocol path-          records `shouldEndWith` "    𝕄(𝑛·1·13):\n      𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )\n      morphed 𝑛·1·15 := 𝑛·1·14\n    𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)\n  boxed 𝑛·0·5 := 𝑛·1·16.φ\n  𝛿·0·1 := 𝔻(𝜎1:λ)\n"+          records `shouldEndWith` "    𝕄(𝑛·1·17):\n      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )\n      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧\n      morphed 𝑛·1·20 := 𝑛·1·19\n    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)\n  boxed 𝑛·0·7 := 𝑛·1·21.φ\n  𝛿·0·1 := 𝔻(𝜎1:λ)\n"        it "numbers every step in the text as the XML of the same run numbers it" $         withTempFile "protocolXXXXXX.txt" $ \(text, one) ->@@ -2171,50 +2302,57 @@                          , "  <morph at=\"𝑛·0·1\">"                          , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"+                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"                          , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "    <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"-                         , "    <morphed meta=\"𝑛·0·4\">𝑛·0·3</morphed>"+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></formed>"+                         , "    <morphed meta=\"𝑛·0·6\">𝑛·0·5</morphed>"                          , "  </morph>"                          , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"                          , "    <dataize at=\"ξ.ρ\">"                          , "      <morph at=\"ξ.ρ\">"                          , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"-                         , "        <morphed meta=\"𝑛·1·2\">𝑛·1·1</morphed>"+                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"+                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                         , "      <morph at=\"𝑛·1·3\">"-                         , "        <applied meta=\"𝑛·1·4\" by=\"morph\" at=\"𝑛·1·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"-                         , "        <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"+                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                         , "      <morph at=\"𝑛·1·4\">"+                         , "        <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"+                         , "        <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"+                         , "        <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                         , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                          , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"                          , "    <dataize at=\"ξ.x\">"                          , "      <morph at=\"ξ.x\">"-                         , "        <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "        <morphed meta=\"𝑛·1·8\">𝑛·1·7</morphed>"-                         , "      </morph>"-                         , "      <boxed meta=\"𝑛·1·9\">𝑛·1·8.φ</boxed>"-                         , "      <morph at=\"𝑛·1·9\">"-                         , "        <applied meta=\"𝑛·1·10\" by=\"morph\" at=\"𝑛·1·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"+                         , "        <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"+                         , "        <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"                          , "        <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"                          , "      </morph>"                          , "      <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"+                         , "      <morph at=\"𝑛·1·12\">"+                         , "        <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"+                         , "        <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"+                         , "        <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "      </morph>"+                         , "      <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"                          , "      <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"                          , "    <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"                          , "    <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "    <built meta=\"𝑛·1·13\">𝑒·1·1</built>"-                         , "    <morph at=\"𝑛·1·13\">"-                         , "      <applied meta=\"𝑛·1·14\" by=\"morph\" at=\"𝑛·1·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "      <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "    <built meta=\"𝑛·1·17\">𝑒·1·1</built>"+                         , "    <morph at=\"𝑛·1·17\">"+                         , "      <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"+                         , "      <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "      <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"                          , "    </morph>"-                         , "    <answered meta=\"𝑛·1·16\">𝑛·1·15</answered>"+                         , "    <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"                          , "  </evaluate>"-                         , "  <boxed meta=\"𝑛·0·5\">𝑛·1·16.φ</boxed>"+                         , "  <boxed meta=\"𝑛·0·7\">𝑛·1·21.φ</boxed>"                          , "  <manufactured meta=\"𝛿·0·1\">𝜎1</manufactured>"                          , "</dataize>"                          ]@@ -2225,20 +2363,26 @@             withStdin "[[ D> 01- ]]" $               testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []             records <- readUtf8 path-            take 4 (lines records)-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"-                         , "<protocol>"-                         , "  <dataize at=\"Φ\">"+            take 2 (dropWhile (not . isPrefixOf "  <dataize ") (lines records))+              `shouldBe` [ "  <dataize at=\"Φ\">"                          , "    <dataized meta=\"𝛿·0·1\">01-</dataized>"                          ] +        it "opens the '<protocol>' root right under the declaration" $+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do+            hClose stream+            withStdin "[[ D> 01- ]]" $+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []+            records <- readUtf8 path+            take 2 (lines records) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<protocol>"]+         it "closes the '<protocol>' root with its msec" $           withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do             hClose stream             withStdin "[[ D> 01- ]]" $               testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []             records <- readUtf8 path-            (lines records !! 5) `shouldSatisfy` isPrefixOf "  <msec>"+            (reverse (lines records) !! 3) `shouldSatisfy` isPrefixOf "  <msec>"          it "closes the '<protocol>' root with its firings" $           withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do@@ -2254,7 +2398,7 @@             withStdin "[[ D> 01- ]]" $               testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []             records <- readUtf8 path-            drop 7 (lines records) `shouldBe` ["  <fps>0</fps>", "</protocol>"]+            reverse (take 2 (reverse (lines records))) `shouldBe` ["  <fps>0</fps>", "</protocol>"]          it "nests what a φ body dataizes inside the element of the box rule that entered it" $           withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do@@ -2262,10 +2406,10 @@             withStdin sum' $               testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []             records <- readProtocol path-            filter (\line -> not (any (`isInfixOf` line) ["<applied ", "<morph ", "<morphed ", "</morph>"])) (lines records)+            filter (\line -> not (any (`isInfixOf` line) ["<applied ", "<formed ", "<morph ", "<morphed ", "</morph>"])) (lines records)               `shouldContain` [ "    <dataize at=\"ξ.ρ\">"-                              , "      <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                              , "      <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                              , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                              , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                               , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"                               , "    </dataize>"                               ]@@ -2296,86 +2440,98 @@                          , "  <morph at=\"𝑛·0·1\">"                          , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"+                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"                          , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "    <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></formed>"                          , "    <evaluate λ=\"L_number_plus\" by=\"morph\" at=\"𝑛·0·1\">"                          , "      <dataize at=\"ξ.ρ\">"                          , "        <morph at=\"ξ.ρ\">"                          , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·2\">𝑛·1·1</morphed>"+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                         , "        <morph at=\"𝑛·1·3\">"-                         , "          <applied meta=\"𝑛·1·4\" by=\"morph\" at=\"𝑛·1·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"-                         , "          <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                         , "        <morph at=\"𝑛·1·4\">"+                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"                          , "      <dataize at=\"ξ.x\">"                          , "        <morph at=\"ξ.x\">"-                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·8\">𝑛·1·7</morphed>"-                         , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·9\">𝑛·1·8.φ</boxed>"-                         , "        <morph at=\"𝑛·1·9\">"-                         , "          <applied meta=\"𝑛·1·10\" by=\"morph\" at=\"𝑛·1·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"+                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"+                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"                          , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"                          , "        </morph>"                          , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"+                         , "        <morph at=\"𝑛·1·12\">"+                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "        </morph>"+                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"                          , "      <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"                          , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "      <built meta=\"𝑛·1·13\">𝑒·1·1</built>"-                         , "      <morph at=\"𝑛·1·13\">"-                         , "        <applied meta=\"𝑛·1·14\" by=\"morph\" at=\"𝑛·1·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "        <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"+                         , "      <morph at=\"𝑛·1·17\">"+                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"+                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"                          , "      </morph>"-                         , "      <answered meta=\"𝑛·1·16\">𝑛·1·15</answered>"+                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"                          , "    </evaluate>"                          , "    <applied meta=\"𝑒·0·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·1·14.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"-                         , "    <morphed meta=\"𝑛·0·5\">𝑛·0·4</morphed>"+                         , "    <applied meta=\"𝑛·0·6\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·1·18.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"+                         , "    <formed meta=\"𝑛·0·7\" of=\"𝑛·1·18.plus\"><meta attr=\"x\">𝑒·0·5</meta></formed>"+                         , "    <morphed meta=\"𝑛·0·8\">𝑛·0·7</morphed>"                          , "  </morph>"                          , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"                          , "    <dataize at=\"ξ.ρ\">"                          , "      <morph at=\"ξ.ρ\">"                          , "        <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "        <morphed meta=\"𝑛·2·2\">𝑛·2·1</morphed>"+                         , "        <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "        <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·2·3\">𝑛·2·2.φ</boxed>"+                         , "      <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"                          , "      <manufactured meta=\"𝛿·2·1\">𝜎1</manufactured>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"                          , "    <dataize at=\"ξ.x\">"                          , "      <morph at=\"ξ.x\">"-                         , "        <applied meta=\"𝑛·2·4\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"-                         , "        <morphed meta=\"𝑛·2·5\">𝑛·2·4</morphed>"+                         , "        <applied meta=\"𝑛·2·5\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"+                         , "        <formed meta=\"𝑛·2·6\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></formed>"+                         , "        <morphed meta=\"𝑛·2·7\">𝑛·2·6</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·2·6\">𝑛·2·5.φ</boxed>"-                         , "      <morph at=\"𝑛·2·6\">"-                         , "        <applied meta=\"𝑛·2·7\" by=\"morph\" at=\"𝑛·2·6\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"-                         , "        <morphed meta=\"𝑛·2·8\">𝑛·2·7</morphed>"+                         , "      <boxed meta=\"𝑛·2·8\">𝑛·2·7.φ</boxed>"+                         , "      <morph at=\"𝑛·2·8\">"+                         , "        <applied meta=\"𝑛·2·9\" by=\"morph\" at=\"𝑛·2·8\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"+                         , "        <formed meta=\"𝑛·2·10\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"+                         , "        <morphed meta=\"𝑛·2·11\">𝑛·2·10</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·2·9\">𝑛·2·8.φ</boxed>"+                         , "      <boxed meta=\"𝑛·2·12\">𝑛·2·11.φ</boxed>"                          , "      <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"                          , "    <minted symbol=\"𝜎2\">𝜎1 40-1C-00-00-00-00-00-00</minted>"                          , "    <applied meta=\"𝑒·2·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"-                         , "    <built meta=\"𝑛·2·10\">𝑒·2·1</built>"-                         , "    <morph at=\"𝑛·2·10\">"-                         , "      <applied meta=\"𝑛·2·11\" by=\"morph\" at=\"𝑛·2·10\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"-                         , "      <morphed meta=\"𝑛·2·12\">𝑛·2·11</morphed>"+                         , "    <built meta=\"𝑛·2·13\">𝑒·2·1</built>"+                         , "    <morph at=\"𝑛·2·13\">"+                         , "      <applied meta=\"𝑛·2·14\" by=\"morph\" at=\"𝑛·2·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"+                         , "      <formed meta=\"𝑛·2·15\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"+                         , "      <morphed meta=\"𝑛·2·16\">𝑛·2·15</morphed>"                          , "    </morph>"-                         , "    <answered meta=\"𝑛·2·13\">𝑛·2·12</answered>"+                         , "    <answered meta=\"𝑛·2·17\">𝑛·2·16</answered>"                          , "  </evaluate>"-                         , "  <boxed meta=\"𝑛·0·6\">𝑛·2·13.φ</boxed>"+                         , "  <boxed meta=\"𝑛·0·9\">𝑛·2·17.φ</boxed>"                          , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"                          , "</dataize>"                          ]@@ -2506,87 +2662,99 @@                          , "  <morph at=\"𝑛·0·1\">"                          , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"+                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"                          , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"                          , "    <applied meta=\"𝑒·0·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"                          , "    <applied meta=\"𝑒·0·6\" of=\"𝑒·0·3.plus\"><meta attr=\"α0\">𝑒·0·5</meta></applied>"-                         , "    <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·6</meta></applied>"-                         , "    <morphed meta=\"𝑛·0·4\">𝑛·0·3</morphed>"+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·6</meta></applied>"+                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·6</meta></formed>"+                         , "    <morphed meta=\"𝑛·0·6\">𝑛·0·5</morphed>"                          , "  </morph>"                          , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"                          , "    <dataize at=\"ξ.ρ\">"                          , "      <morph at=\"ξ.ρ\">"                          , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"-                         , "        <morphed meta=\"𝑛·1·2\">𝑛·1·1</morphed>"+                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"+                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                         , "      <morph at=\"𝑛·1·3\">"-                         , "        <applied meta=\"𝑛·1·4\" by=\"morph\" at=\"𝑛·1·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"-                         , "        <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"+                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                         , "      <morph at=\"𝑛·1·4\">"+                         , "        <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"+                         , "        <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"+                         , "        <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"                          , "      </morph>"-                         , "      <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                         , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                          , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"                          , "    <dataize at=\"ξ.x\">"                          , "      <morph at=\"ξ.x\">"-                         , "        <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "        <applied meta=\"𝑛·1·8\" by=\"morph\" at=\"ξ.x\" of=\"𝑛·1·7.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"-                         , "        <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"+                         , "        <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"+                         , "        <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"+                         , "        <applied meta=\"𝑛·1·11\" by=\"morph\" at=\"ξ.x\" of=\"𝑛·1·9.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"+                         , "        <formed meta=\"𝑛·1·12\" of=\"𝑛·1·9.plus\"><meta attr=\"x\">𝑒·0·5</meta></formed>"+                         , "        <morphed meta=\"𝑛·1·13\">𝑛·1·12</morphed>"                          , "      </morph>"                          , "      <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"ξ.x\">"                          , "        <dataize at=\"ξ.ρ\">"                          , "          <morph at=\"ξ.ρ\">"                          , "            <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "            <morphed meta=\"𝑛·2·2\">𝑛·2·1</morphed>"+                         , "            <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"+                         , "            <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"                          , "          </morph>"-                         , "          <boxed meta=\"𝑛·2·3\">𝑛·2·2.φ</boxed>"-                         , "          <morph at=\"𝑛·2·3\">"-                         , "            <applied meta=\"𝑛·2·4\" by=\"morph\" at=\"𝑛·2·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"-                         , "            <morphed meta=\"𝑛·2·5\">𝑛·2·4</morphed>"+                         , "          <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"+                         , "          <morph at=\"𝑛·2·4\">"+                         , "            <applied meta=\"𝑛·2·5\" by=\"morph\" at=\"𝑛·2·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"+                         , "            <formed meta=\"𝑛·2·6\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"+                         , "            <morphed meta=\"𝑛·2·7\">𝑛·2·6</morphed>"                          , "          </morph>"-                         , "          <boxed meta=\"𝑛·2·6\">𝑛·2·5.φ</boxed>"+                         , "          <boxed meta=\"𝑛·2·8\">𝑛·2·7.φ</boxed>"                          , "          <dataized meta=\"𝛿·2·1\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"                          , "        </dataize>"                          , "        <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"                          , "        <dataize at=\"ξ.x\">"                          , "          <morph at=\"ξ.x\">"-                         , "            <applied meta=\"𝑛·2·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"-                         , "            <morphed meta=\"𝑛·2·8\">𝑛·2·7</morphed>"-                         , "          </morph>"-                         , "          <boxed meta=\"𝑛·2·9\">𝑛·2·8.φ</boxed>"-                         , "          <morph at=\"𝑛·2·9\">"-                         , "            <applied meta=\"𝑛·2·10\" by=\"morph\" at=\"𝑛·2·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"+                         , "            <applied meta=\"𝑛·2·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"+                         , "            <formed meta=\"𝑛·2·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></formed>"                          , "            <morphed meta=\"𝑛·2·11\">𝑛·2·10</morphed>"                          , "          </morph>"                          , "          <boxed meta=\"𝑛·2·12\">𝑛·2·11.φ</boxed>"+                         , "          <morph at=\"𝑛·2·12\">"+                         , "            <applied meta=\"𝑛·2·13\" by=\"morph\" at=\"𝑛·2·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"+                         , "            <formed meta=\"𝑛·2·14\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"+                         , "            <morphed meta=\"𝑛·2·15\">𝑛·2·14</morphed>"+                         , "          </morph>"+                         , "          <boxed meta=\"𝑛·2·16\">𝑛·2·15.φ</boxed>"                          , "          <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"                          , "        </dataize>"                          , "        <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"                          , "        <minted symbol=\"𝜎1\">40-18-00-00-00-00-00-00 40-1C-00-00-00-00-00-00</minted>"                          , "        <applied meta=\"𝑒·2·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "        <built meta=\"𝑛·2·13\">𝑒·2·1</built>"-                         , "        <morph at=\"𝑛·2·13\">"-                         , "          <applied meta=\"𝑛·2·14\" by=\"morph\" at=\"𝑛·2·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "          <morphed meta=\"𝑛·2·15\">𝑛·2·14</morphed>"+                         , "        <built meta=\"𝑛·2·17\">𝑒·2·1</built>"+                         , "        <morph at=\"𝑛·2·17\">"+                         , "          <applied meta=\"𝑛·2·18\" by=\"morph\" at=\"𝑛·2·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"+                         , "          <formed meta=\"𝑛·2·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "          <morphed meta=\"𝑛·2·20\">𝑛·2·19</morphed>"                          , "        </morph>"-                         , "        <answered meta=\"𝑛·2·16\">𝑛·2·15</answered>"+                         , "        <answered meta=\"𝑛·2·21\">𝑛·2·20</answered>"                          , "      </evaluate>"-                         , "      <boxed meta=\"𝑛·1·10\">𝑛·2·16.φ</boxed>"+                         , "      <boxed meta=\"𝑛·1·14\">𝑛·2·21.φ</boxed>"                          , "      <manufactured meta=\"𝛿·1·2\">𝜎1</manufactured>"                          , "    </dataize>"                          , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"                          , "    <minted symbol=\"𝜎2\">40-14-00-00-00-00-00-00 𝜎1</minted>"                          , "    <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"-                         , "    <built meta=\"𝑛·1·11\">𝑒·1·1</built>"-                         , "    <morph at=\"𝑛·1·11\">"-                         , "      <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"𝑛·1·11\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"-                         , "      <morphed meta=\"𝑛·1·13\">𝑛·1·12</morphed>"+                         , "    <built meta=\"𝑛·1·15\">𝑒·1·1</built>"+                         , "    <morph at=\"𝑛·1·15\">"+                         , "      <applied meta=\"𝑛·1·16\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"+                         , "      <formed meta=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"+                         , "      <morphed meta=\"𝑛·1·18\">𝑛·1·17</morphed>"                          , "    </morph>"-                         , "    <answered meta=\"𝑛·1·14\">𝑛·1·13</answered>"+                         , "    <answered meta=\"𝑛·1·19\">𝑛·1·18</answered>"                          , "  </evaluate>"-                         , "  <boxed meta=\"𝑛·0·5\">𝑛·1·14.φ</boxed>"+                         , "  <boxed meta=\"𝑛·0·7\">𝑛·1·19.φ</boxed>"                          , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"                          , "</dataize>"                          ]@@ -2604,50 +2772,57 @@                          , "  <morph at=\"𝑛·0·1\">"                          , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"+                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"                          , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "    <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></formed>"                          , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"                          , "      <dataize at=\"ξ.ρ\">"                          , "        <morph at=\"ξ.ρ\">"                          , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·2\">𝑛·1·1</morphed>"+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                         , "        <morph at=\"𝑛·1·3\">"-                         , "          <applied meta=\"𝑛·1·4\" by=\"morph\" at=\"𝑛·1·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"-                         , "          <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                         , "        <morph at=\"𝑛·1·4\">"+                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"                          , "      <dataize at=\"ξ.x\">"                          , "        <morph at=\"ξ.x\">"-                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·8\">𝑛·1·7</morphed>"-                         , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·9\">𝑛·1·8.φ</boxed>"-                         , "        <morph at=\"𝑛·1·9\">"-                         , "          <applied meta=\"𝑛·1·10\" by=\"morph\" at=\"𝑛·1·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"+                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"+                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"                          , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"                          , "        </morph>"                          , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"+                         , "        <morph at=\"𝑛·1·12\">"+                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "        </morph>"+                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"                          , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"                          , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "      <built meta=\"𝑛·1·13\">𝑒·1·1</built>"-                         , "      <morph at=\"𝑛·1·13\">"-                         , "        <applied meta=\"𝑛·1·14\" by=\"morph\" at=\"𝑛·1·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "        <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"+                         , "      <morph at=\"𝑛·1·17\">"+                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"+                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"                          , "      </morph>"-                         , "      <answered meta=\"𝑛·1·16\">𝑛·1·15</answered>"+                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"                          , "    </evaluate>"-                         , "    <morphed meta=\"𝑛·0·4\">𝑛·1·14.nope</morphed>"+                         , "    <morphed meta=\"𝑛·0·6\">𝑛·1·18.nope</morphed>"                          , "  </morph>"-                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·14.nope</unanswered>"+                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·18.nope</unanswered>"                          , "</dataize>"                          ] @@ -2678,50 +2853,57 @@                          , "  <morph at=\"𝑛·0·1\">"                          , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"+                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"                          , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"                          , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "    <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"+                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></formed>"                          , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"                          , "      <dataize at=\"ξ.ρ\">"                          , "        <morph at=\"ξ.ρ\">"                          , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·2\">𝑛·1·1</morphed>"+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·3\">𝑛·1·2.φ</boxed>"-                         , "        <morph at=\"𝑛·1·3\">"-                         , "          <applied meta=\"𝑛·1·4\" by=\"morph\" at=\"𝑛·1·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"-                         , "          <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"+                         , "        <morph at=\"𝑛·1·4\">"+                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"                          , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·6\">𝑛·1·5.φ</boxed>"+                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"                          , "      <dataize at=\"ξ.x\">"                          , "        <morph at=\"ξ.x\">"-                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"-                         , "          <morphed meta=\"𝑛·1·8\">𝑛·1·7</morphed>"-                         , "        </morph>"-                         , "        <boxed meta=\"𝑛·1·9\">𝑛·1·8.φ</boxed>"-                         , "        <morph at=\"𝑛·1·9\">"-                         , "          <applied meta=\"𝑛·1·10\" by=\"morph\" at=\"𝑛·1·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"+                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"+                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"                          , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"                          , "        </morph>"                          , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"+                         , "        <morph at=\"𝑛·1·12\">"+                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"+                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"+                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "        </morph>"+                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"                          , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"                          , "      </dataize>"                          , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"                          , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"                          , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "      <built meta=\"𝑛·1·13\">𝑒·1·1</built>"-                         , "      <morph at=\"𝑛·1·13\">"-                         , "        <applied meta=\"𝑛·1·14\" by=\"morph\" at=\"𝑛·1·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"-                         , "        <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"+                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"+                         , "      <morph at=\"𝑛·1·17\">"+                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"+                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"+                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"                          , "      </morph>"-                         , "      <answered meta=\"𝑛·1·16\">𝑛·1·15</answered>"+                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"                          , "    </evaluate>"-                         , "    <morphed meta=\"𝑛·0·4\">𝑛·1·14.nope</morphed>"+                         , "    <morphed meta=\"𝑛·0·6\">𝑛·1·18.nope</morphed>"                          , "  </morph>"-                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·14.nope</unanswered>"+                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·18.nope</unanswered>"                          , "</dataize>"                          ] @@ -2792,36 +2974,43 @@                        , "  boxed 𝑛·0·1 := Φ.φ"                        , "  𝕄(𝑛·0·1):"                        , "    𝑛·0·2 := 2.0"-                       , "    𝑛·0·3 := 𝑛·0·2.times( x ↦ 3.0 )"+                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"+                       , "    𝑛·0·4 := 𝑛·0·2.times( x ↦ 3.0 )"+                       , "    𝑛·0·5 := ⟦ x ↦ 3.0, λ ⤍ L_number_times ⟧"                        , "    𝔼(L_number_times):"                        , "      𝔻(ξ.ρ):"                        , "        𝕄(ξ.ρ):"                        , "          𝑛·1·1 := 2.0"-                       , "          morphed 𝑛·1·2 := 𝑛·1·1"-                       , "        boxed 𝑛·1·3 := 𝑛·1·2.φ"-                       , "        𝕄(𝑛·1·3):"-                       , "          𝑛·1·4 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"-                       , "          morphed 𝑛·1·5 := 𝑛·1·4"-                       , "        boxed 𝑛·1·6 := 𝑛·1·5.φ"+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"+                       , "        𝕄(𝑛·1·4):"+                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·6 := 40-00-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·7 := 𝑛·1·6"+                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"                        , "        𝛿·1·1 := 40-00-00-00-00-00-00-00  # 2.0"                        , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                        , "      𝔻(ξ.x):"                        , "        𝕄(ξ.x):"-                       , "          𝑛·1·7 := 3.0"-                       , "          morphed 𝑛·1·8 := 𝑛·1·7"-                       , "        boxed 𝑛·1·9 := 𝑛·1·8.φ"-                       , "        𝕄(𝑛·1·9):"-                       , "          𝑛·1·10 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·9 := 3.0"+                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"                        , "          morphed 𝑛·1·11 := 𝑛·1·10"                        , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"+                       , "        𝕄(𝑛·1·12):"+                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"+                       , "          𝑛·1·14 := 40-08-00-00-00-00-00-00:Δ:φ"+                       , "          morphed 𝑛·1·15 := 𝑛·1·14"+                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"                        , "        𝛿·1·2 := 40-08-00-00-00-00-00-00  # 3.0"                        , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                       , "      𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                       , "      𝕄(𝑛·1·13):"-                       , "        𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                       , "        morphed 𝑛·1·15 := 𝑛·1·14"-                       , "      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                       , "    morphed 𝑛·0·4 := L_number_nope:λ"+                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                       , "      𝕄(𝑛·1·17):"+                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"+                       , "        morphed 𝑛·1·20 := 𝑛·1·19"+                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                       , "    morphed 𝑛·0·6 := L_number_nope:λ"                        , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"                        ] @@ -2914,6 +3103,10 @@         withStdin universe $           testCLISucceeded ["dataize", "--inside=[[ x -> [[ D> 2A- ]] ]].x"] ["2A-"] +      it "hides an object of the universe from the answer it morphs inside it" $+        withStdin universe $+          testCLISucceeded ["morph", "--inside=[[ x -> [[ D> 2A- ]] ]].x", "--hide=Q.bytes", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 2A- ⟧"]+       it "morphs inside the universe just as it dataizes inside it" $         withStdin universe $           testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--sweet", "--hide-rho", "--flat"] ["⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"]@@ -3068,6 +3261,18 @@       withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $         testCLISucceeded ["morph", "--show=Q.x", "--flat", "--sweet"] ["Foo:λ:x"] +    it "hides an object outside the answer --locator aims at" $+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $+        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.o", "--flat", "--hide-rho"] ["⟦ a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]++    it "hides a binding of the answer --locator aims at" $+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $+        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.t.a", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]++    it "shows only one binding of the answer --locator aims at" $+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $+        testCLISucceeded ["morph", "--locator=Q.t", "--show=Q.t.b", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]+     it "prints ⊥ instead of failing the run" $       withStdin "[[ x -> $ ]]" $         testCLISucceeded ["morph", "--locator=Q.x"] ["⊥"]@@ -3116,37 +3321,45 @@         lines records           `shouldBe` [ "𝕄(Φ.φ):"                      , "  𝑛·0·1 := 5.0"-                     , "  𝑛·0·2 := 𝑛·0·1.plus( x ↦ 6.0 )"+                     , "  𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                     , "  𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )"+                     , "  𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"                      , "  𝔼(L_number_plus):"                      , "    𝔻(ξ.ρ):"                      , "      𝕄(ξ.ρ):"                      , "        𝑛·1·1 := 5.0"-                     , "        morphed 𝑛·1·2 := 𝑛·1·1"-                     , "      boxed 𝑛·1·3 := 𝑛·1·2.φ"-                     , "      𝕄(𝑛·1·3):"-                     , "        𝑛·1·4 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"-                     , "        morphed 𝑛·1·5 := 𝑛·1·4"-                     , "      boxed 𝑛·1·6 := 𝑛·1·5.φ"+                     , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"+                     , "        morphed 𝑛·1·3 := 𝑛·1·2"+                     , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"+                     , "      𝕄(𝑛·1·4):"+                     , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"+                     , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"+                     , "        morphed 𝑛·1·7 := 𝑛·1·6"+                     , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"                      , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"                      , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"                      , "    𝔻(ξ.x):"                      , "      𝕄(ξ.x):"-                     , "        𝑛·1·7 := 6.0"-                     , "        morphed 𝑛·1·8 := 𝑛·1·7"-                     , "      boxed 𝑛·1·9 := 𝑛·1·8.φ"-                     , "      𝕄(𝑛·1·9):"-                     , "        𝑛·1·10 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                     , "        𝑛·1·9 := 6.0"+                     , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"                      , "        morphed 𝑛·1·11 := 𝑛·1·10"                      , "      boxed 𝑛·1·12 := 𝑛·1·11.φ"+                     , "      𝕄(𝑛·1·12):"+                     , "        𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"+                     , "        𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"+                     , "        morphed 𝑛·1·15 := 𝑛·1·14"+                     , "      boxed 𝑛·1·16 := 𝑛·1·15.φ"                      , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"                      , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-                     , "    𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-                     , "    𝕄(𝑛·1·13):"-                     , "      𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-                     , "      morphed 𝑛·1·15 := 𝑛·1·14"-                     , "    𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-                     , "  𝑛·0·3 := 𝑛·1·14.plus( x ↦ 7.0 )"-                     , "  morphed 𝑛·0·4 := 𝑛·0·3"+                     , "    𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+                     , "    𝕄(𝑛·1·17):"+                     , "      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+                     , "      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"+                     , "      morphed 𝑛·1·20 := 𝑛·1·19"+                     , "    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+                     , "  𝑛·0·5 := 𝑛·1·18.plus( x ↦ 7.0 )"+                     , "  𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"+                     , "  morphed 𝑛·0·7 := 𝑛·0·6"                      ]      it "saves morphing steps to dir with --steps-dir" $@@ -3336,9 +3549,10 @@                      , "    <bound meta=\"𝑛1·1\">01-</bound>"                      , "    <morph at=\"ξ.b\">"                      , "      <applied meta=\"𝑛·1·2\" by=\"morph\" at=\"ξ.b\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></applied>"-                     , "      <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"+                     , "      <formed meta=\"𝑛·1·3\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></formed>"+                     , "      <morphed meta=\"𝑛·1·4\">𝑛·1·3</morphed>"                      , "    </morph>"-                     , "    <bound meta=\"𝑛2·1\">𝑛·1·3</bound>"+                     , "    <bound meta=\"𝑛2·1\">𝑛·1·4</bound>"                      , "    <bound meta=\"𝑛3·1\">01-</bound>"                      , "    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.step\"><with><symbol attr=\"tup\">𝜎1</symbol></with></deferred>"                      , "    <diverged left=\"𝑛3·1\" right=\"𝜎3\" at=\".Δ\" reason=\"the join names no otherwise\"/>"@@ -3352,7 +3566,7 @@        it "names an argument of a deferred copy that is no bare symbol by the meta its morph bound, though an element formed it" $ do         records <- deferred [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ ⟦ z ↦ Φ ⟧ ), λ ⤍ L_fork ⟧ ⟧"-        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·1·5</meta></with></deferred>"]+        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·1·7</meta></with></deferred>"]        it "names a deferred copy of a formation the world does not declare by the element that formed it" $ do         records <- deferred [] "⟦ wrap(v) ↦ ⟦⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.wrap( v ↦ ⟦ inner(x) ↦ ⟦ φ ↦ x.next ⟧ ⟧ ).v.inner( x ↦ Φ.items.tail ), λ ⤍ L_fork ⟧ ⟧"@@ -3360,7 +3574,7 @@        it "names an argument of a deferred copy by the object its morph answered" $ do         records <- recordedWith (joining <> counting) [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, num(φ) ↦ ⟦⟧, inc(x) ↦ ⟦ λ ⤍ L_inc ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ Φ.inc( ⟦ Δ ⤍ 2A- ⟧ ) ), λ ⤍ L_fork ⟧ ⟧"-        filter (isInfixOf "<deferred") records `shouldBe` ["    <deferred symbol=\"𝜎4\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·2·4</meta></with></deferred>"]+        filter (isInfixOf "<deferred") records `shouldBe` ["    <deferred symbol=\"𝜎4\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·2·5</meta></with></deferred>"]      describe "--acyclic=plausible" $ do       let twins = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], pair(a, b) -> [[ L> L_pair ]], t -> Φ.pair( 7.plus( 5.plus( 6 ) ), 7.plus( 5.plus( 6 ) ) ).φ ]]"@@ -3399,7 +3613,7 @@         recorded "plausible" >>= (`shouldSatisfy` ((== 3) . length . filter (isInfixOf "𝔼(L_number_plus)")))        it "answers a recalled firing with the line of the first under plausible" $-        recorded "plausible" >>= (`shouldContain` ["      𝑛·4·1 := 𝑛·2·12  # 𝑛"])+        recorded "plausible" >>= (`shouldContain` ["      𝑛·4·1 := 𝑛·2·16  # 𝑛"])        it "dataizes to the same datum under plausible" $         withStdin chained $
test/DataizeSpec.hs view
@@ -222,37 +222,44 @@           , "    boxed 𝑛·0·1 := Φ.φ"           , "    𝕄(𝑛·0·1):"           , "      𝑛·0·2 := 2.0"-          , "      𝑛·0·3 := 𝑛·0·2.times( x ↦ 3.0 )"+          , "      𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"+          , "      𝑛·0·4 := 𝑛·0·2.times( x ↦ 3.0 )"+          , "      𝑛·0·5 := ⟦ ρ ↦ 𝑛·0·2, x ↦ 3.0, λ ⤍ L_number_times ⟧"           , "      𝔼(L_number_times):"           , "        𝔻(ξ.ρ):"           , "          𝕄(ξ.ρ):"           , "            𝑛·1·1 := 2.0"-          , "            morphed 𝑛·1·2 := 𝑛·1·1"-          , "          boxed 𝑛·1·3 := 𝑛·1·2.φ"-          , "          𝕄(𝑛·1·3):"-          , "            𝑛·1·4 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"-          , "            morphed 𝑛·1·5 := 𝑛·1·4"-          , "          boxed 𝑛·1·6 := 𝑛·1·5.φ"+          , "            𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"+          , "            morphed 𝑛·1·3 := 𝑛·1·2"+          , "          boxed 𝑛·1·4 := 𝑛·1·3.φ"+          , "          𝕄(𝑛·1·4):"+          , "            𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"+          , "            𝑛·1·6 := ⟦ φ ↦ 40-00-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"+          , "            morphed 𝑛·1·7 := 𝑛·1·6"+          , "          boxed 𝑛·1·8 := 𝑛·1·7.φ"           , "          𝛿·1·1 := 40-00-00-00-00-00-00-00  # 2.0"           , "        𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"           , "        𝔻(ξ.x):"           , "          𝕄(ξ.x):"-          , "            𝑛·1·7 := 3.0"-          , "            morphed 𝑛·1·8 := 𝑛·1·7"-          , "          boxed 𝑛·1·9 := 𝑛·1·8.φ"-          , "          𝕄(𝑛·1·9):"-          , "            𝑛·1·10 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"+          , "            𝑛·1·9 := 3.0"+          , "            𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"           , "            morphed 𝑛·1·11 := 𝑛·1·10"           , "          boxed 𝑛·1·12 := 𝑛·1·11.φ"+          , "          𝕄(𝑛·1·12):"+          , "            𝑛·1·13 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"+          , "            𝑛·1·14 := ⟦ φ ↦ 40-08-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"+          , "            morphed 𝑛·1·15 := 𝑛·1·14"+          , "          boxed 𝑛·1·16 := 𝑛·1·15.φ"           , "          𝛿·1·2 := 40-08-00-00-00-00-00-00  # 3.0"           , "        𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"-          , "        𝑛·1·13 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"-          , "        𝕄(𝑛·1·13):"-          , "          𝑛·1·14 := Φ.number( φ ↦ 𝜎1:λ )"-          , "          morphed 𝑛·1·15 := 𝑛·1·14"-          , "        𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·13)"-          , "      morphed 𝑛·0·4 := ⟦ ρ ↦ 𝑛·1·14, λ ⤍ L_number_nope ⟧"-          , "    unanswered L_number_nope  # 𝔻(⟦ ρ ↦ 𝑛·1·14, λ ⤍ L_number_nope ⟧)"+          , "        𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"+          , "        𝕄(𝑛·1·17):"+          , "          𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"+          , "          𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"+          , "          morphed 𝑛·1·20 := 𝑛·1·19"+          , "        𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"+          , "      morphed 𝑛·0·6 := ⟦ ρ ↦ 𝑛·1·18, λ ⤍ L_number_nope ⟧"+          , "    unanswered L_number_nope  # 𝔻(⟦ ρ ↦ 𝑛·1·18, λ ⤍ L_number_nope ⟧)"           ]     it "leaves an unanswered λ function dataized directly as the whole residue" $ do       ((outcome, chain), protocol) <- partially known "[[ L> Sym_arg_0 ]]"@@ -270,7 +277,7 @@       length (filter (isPrefixOf "    𝕄(") (lines protocol)) `shouldBe` 2     it "writes every box step of a dataization into the protocol" $ do       (_, protocol) <- partially known "73.25"-      filter (isInfixOf "boxed") (lines protocol) `shouldBe` ["    boxed 𝑛·0·1 := Φ.φ", "    boxed 𝑛·0·4 := 𝑛·0·3.φ", "    boxed 𝑛·0·7 := 𝑛·0·6.φ"]+      filter (isInfixOf "boxed") (lines protocol) `shouldBe` ["    boxed 𝑛·0·1 := Φ.φ", "    boxed 𝑛·0·5 := 𝑛·0·4.φ", "    boxed 𝑛·0·9 := 𝑛·0·8.φ"]     it "names the morphing that follows a box step by the meta the box step bound" $ do       (_, protocol) <- partially known "73.25"       lines protocol `shouldContain` ["    boxed 𝑛·0·1 := Φ.φ", "    𝕄(𝑛·0·1):"]
test/DepsSpec.hs view
@@ -10,8 +10,9 @@ import Control.Monad (replicateM_, when) import Data.IORef (modifyIORef', newIORef, readIORef) import Data.List (isInfixOf, isPrefixOf)+import Data.Time (LocalTime (LocalTime), TimeOfDay (TimeOfDay), ZonedTime (ZonedTime), fromGregorian, hoursToTimeZone) import Data.Time.Clock.POSIX (getPOSIXTime)-import Deps (Acyclic (Proven), Evaluation (EvAnswer, EvApplied, EvBound, EvBoxed, EvBuilt, EvData, EvDeferred, EvDelta, EvDiverged, EvFabricated, EvFiring, EvJoined, EvLooped, EvManufactured, EvMorphed, EvReshaped, EvRun, EvStarted, EvStuck, EvStuckOn, EvSymbolized, EvTaken, EvTerm, EvWorld), Judgment (Dataization, Morphing), Nesting (..), Protocol (..), dontSaveEval, dontSaveStep, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, perSecond, progressed, resited, saveStep)+import Deps (Acyclic (Proven), Evaluation (EvAnswer, EvApplied, EvBound, EvBoxed, EvBuilt, EvData, EvDeferred, EvDelta, EvDiverged, EvFabricated, EvFiring, EvHeader, EvJoined, EvLooped, EvManufactured, EvMorphed, EvReshaped, EvRun, EvStarted, EvStuck, EvStuckOn, EvSymbolized, EvTaken, EvTerm, EvUndressed, EvWorld), Header (Header), Judgment (Dataization, Morphing), Nesting (..), Protocol (..), World (World), dontSaveEval, dontSaveStep, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, perSecond, progressed, resited, saveStep) import Fixtures (readUtf8, recorded, recordedWhole, recordedXml) import Forks (Refusal (..), Side (..)) import GHC.Clock (getMonotonicTime)@@ -41,6 +42,9 @@         when exists (removeDirectoryRecursive dir)     ) +dated :: Int -> ZonedTime+dated hours = ZonedTime (LocalTime (fromGregorian 2026 10 27) (TimeOfDay 9 41 12)) (hoursToTimeZone hours)+ spec :: Spec spec = do   describe "dontSaveStep" $@@ -131,21 +135,27 @@     it "writes nothing for the world it is told" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvWorld (ExFormation [BiTau (AtLabel "ёж") (ExFormation [])])])       filter (isInfixOf "ёж") (lines written) `shouldBe` []-    it "writes an application as a line binding what it made to a fresh 𝑛" $ do+    it "writes an application as a line binding its call to a fresh 𝑛" $ do       (_, written) <- recorded (\record -> record (EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w"))))-      written `shouldBe` "  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.w)\n"+      take 1 (lines written) `shouldBe` ["  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.w)"]+    it "writes the formation an application made on a line of its own after the line of the application" $ do+      (_, written) <- recorded (\record -> record (EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "сом")) (ArTau (AtLabel "ус") (ExFormation []))) (ExFormation [BiTau (AtLabel "ус") (ExFormation []), BiTau (AtLabel "хвост") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "пруд"))))+      last (lines written) `shouldBe` "  𝑛·0·2 := ⟦ ус ↦ ⟦⟧, хвост ↦ ⟦⟧ ⟧"     it "spells an object an application made by its name on a later line" $ do       (_, written) <- recorded (\record -> mapM_ record [EvFiring 1 "L_щ" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot, EvTerm 2 "𝑛1" Morphing (ExDispatch ExXi (AtLabel "z")) (ExFormation [BiTau (AtLabel "z") (ExFormation [BiTau (AtLabel "q") (ExFormation [])]), BiTau (AtLabel "у") (ExFormation [])])])-      last (lines written) `shouldBe` "    𝑛1·1 := ⟦ z ↦ 𝑛·1·1, у ↦ ⟦⟧ ⟧  # 𝕄(ξ.z)"+      last (lines written) `shouldBe` "    𝑛1·1 := ⟦ z ↦ 𝑛·1·2, у ↦ ⟦⟧ ⟧  # 𝕄(ξ.z)"     it "numbers the answer of a firing past the objects applications made inside it" $ do       (_, written) <- recorded (\record -> mapM_ record [EvFiring 1 "L_ю" Morphing ExRoot, EvBuilt 2 (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot, EvAnswer 2 (ExFormation [BiTau (AtLabel "q") (ExFormation [])])])-      last (lines written) `shouldBe` "    𝑛·1·3 := 𝑛·1·2  # 𝕄(𝑛·1·1)"+      last (lines written) `shouldBe` "    𝑛·1·4 := 𝑛·1·3  # 𝕄(𝑛·1·1)"     it "spells an application an earlier line wrote by its name in the argument of a later one" $ do       (_, written) <- recorded (\record -> mapM_ record [EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot, EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))))) (ExFormation [BiTau (AtLabel "w") (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation [])))]) ExRoot])-      last (lines written) `shouldBe` "  𝑛·0·2 := Φ.жук( w ↦ 𝑛·0·1 )  # 𝕄(Φ)"+      lines written `shouldContain` ["  𝑛·0·3 := Φ.жук( w ↦ 𝑛·0·1 )  # 𝕄(Φ)"]     it "spells an application made again by its head and argument rather than by the name of the first one" $ do       (_, written) <- recorded (\record -> replicateM_ 2 (record (EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot)))-      last (lines written) `shouldBe` "  𝑛·0·2 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ)"+      lines written `shouldContain` ["  𝑛·0·3 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ)"]+    it "spells the formation an application made again in full rather than by the name of the first one" $ do+      (_, written) <- recorded (\record -> replicateM_ 2 (record (EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "карп")) (ArTau (AtLabel "плавник") (ExFormation []))) (ExFormation [BiTau (AtLabel "плавник") (ExFormation []), BiTau (AtLabel "чешуя") (ExFormation [])]) ExRoot)))+      last (lines written) `shouldBe` "  𝑛·0·4 := ⟦ плавник ↦ ⟦⟧, чешуя ↦ ⟦⟧ ⟧"     it "writes the datum the delta rule found under a name of its own" $ do       (_, written) <- recorded (\record -> mapM_ record [EvFiring 1 "L_ж" Dataization ExRoot, EvDelta 2 (BtMany ["1F", "E0"]), EvDelta 2 (BtOne "33")])       last (lines written) `shouldBe` "    𝛿·1·2 := 33-"@@ -173,18 +183,24 @@     it "writes the term a morphing came to as a line binding it to a fresh 𝑛 under the heading of the morphing" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "жук")), EvMorphed 2 (ExDispatch ExRoot (AtLabel "щука"))])       lines written `shouldBe` ["𝕄(Φ):", "  𝕄(Φ.жук):", "    morphed 𝑛·0·1 := Φ.щука"]-    it "spells the term a morphing came to by the name of the application that made it" $ do+    it "spells the term a morphing came to by the name of the formation an application made" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "w")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w")), EvMorphed 2 (ExFormation [BiTau (AtLabel "q") (ExFormation [])])])-      last (lines written) `shouldBe` "    morphed 𝑛·0·2 := 𝑛·0·1"+      last (lines written) `shouldBe` "    morphed 𝑛·0·3 := 𝑛·0·2"     it "numbers a box step past the term the morphing before it came to, as the markup does" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ.e", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "e")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "байт")) (ArTau AtPhi (ExFormation [BiLambda (FnSymbol 1)]))) (ExFormation [BiTau AtPhi (ExFormation [BiLambda (FnSymbol 1)])]) (ExDispatch ExRoot (AtLabel "e")), EvMorphed 2 (ExFormation [BiTau AtPhi (ExFormation [BiLambda (FnSymbol 1)])]), EvBoxed 1 (ExDispatch (ExFormation [BiTau AtPhi (ExFormation [BiLambda (FnSymbol 1)])]) AtPhi)])-      last (lines written) `shouldBe` "  boxed 𝑛·0·3 := 𝑛·0·2.φ"+      last (lines written) `shouldBe` "  boxed 𝑛·0·4 := 𝑛·0·3.φ"     it "names the term a morphing came to in the box after it" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "жук")), EvMorphed 2 (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "щука"))]), EvBoxed 1 (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "щука"))]) AtPhi)])       last (lines written) `shouldBe` "  boxed 𝑛·0·2 := 𝑛·0·1.φ"     it "names the term a morphing came to by its meta in the box after it, though an application named it before" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ.ю", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "ю")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "хорь")) (ArTau (AtLabel "ось") (ExFormation []))) (ExFormation [BiTau (AtLabel "ось") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ось"))]) (ExDispatch ExRoot (AtLabel "ю")), EvMorphed 2 (ExFormation [BiTau (AtLabel "ось") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ось"))]), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "ось") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ось"))]) AtPhi)])-      last (lines written) `shouldBe` "  boxed 𝑛·0·3 := 𝑛·0·2.φ"+      last (lines written) `shouldBe` "  boxed 𝑛·0·4 := 𝑛·0·3.φ"+    it "writes a pass of an undress line as a line naming the φ it took off the term a morphing came to" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvMorphed 2 (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "щегол"))]), EvUndressed 2 (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "щегол"))]) AtPhi)])+      last (lines written) `shouldBe` "    undressed 𝑛·1·2 := 𝑛·1·1.φ"+    it "names the morphing after a pass of an undress line by the meta of that pass" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvMorphed 2 (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "сокол"))]), EvUndressed 2 (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "сокол"))]) AtPhi), EvStarted 2 Morphing (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "сокол"))]) AtPhi), EvMorphed 3 (ExDispatch ExRoot (AtLabel "сокол"))])+      lines written `shouldContain` ["    𝕄(𝑛·1·2):", "      morphed 𝑛·1·3 := Φ.сокол"]     it "spells the datum of an operand in full when the line before it found no datum" $ do       (_, written) <- recorded (\record -> mapM_ record [EvFiring 1 "L_ж" Dataization ExRoot, EvDelta 3 (BtOne "7F"), EvFiring 2 "L_з" Dataization ExRoot, EvData 2 "𝛿1" (ExDispatch ExXi (AtLabel "щ")) (Right (BtOne "7F"))])       last (lines written) `shouldBe` "    𝛿1·1 := 7F-  # 𝔻(ξ.щ)"@@ -193,19 +209,19 @@       lines written `shouldBe` ["𝔻(Φ):", "  𝛿·0·1 := 0A-"]     it "writes the heading of a judgment above the first line under it and drops the comment naming it" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "w")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w"))])-      lines written `shouldBe` ["𝔻(Φ):", "  𝕄(Φ.w):", "    𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )"]+      lines written `shouldBe` ["𝔻(Φ):", "  𝕄(Φ.w):", "    𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )", "    𝑛·0·2 := ⟦⟧:q"]     it "keeps the comment of a line made at a site other than the one of its block" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ.w", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "е"))])-      last (lines written) `shouldBe` "  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.е)"+      lines written `shouldContain` ["  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.е)"]     it "keeps the comment of a line made by a judgment other than the one of its block" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ.w", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w"))])-      last (lines written) `shouldBe` "  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.w)"+      lines written `shouldContain` ["  𝑛·0·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ.w)"]     it "drops the comment of a firing the judgment of its block asked for at its site" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvFiring 1 "L_ш" Dataization ExRoot])       last (lines written) `shouldBe` "  𝔼(L_ш):"     it "keeps the comment of a line standing in a firing" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ш" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot])-      last (lines written) `shouldBe` "    𝑛·1·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ)"+      lines written `shouldContain` ["    𝑛·1·1 := Φ.ёж( q ↦ ⟦⟧ )  # 𝕄(Φ)"]     it "writes one heading for two blocks of one judgment at one site in a row" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "w")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w")), EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "w")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w"))])       length (filter (== "  𝕄(Φ.w):") (lines written)) `shouldBe` 1@@ -214,7 +230,7 @@       length (filter (== "  𝕄(Φ.w):") (lines written)) `shouldBe` 2     it "writes the box step of a dataization as a line naming the φ it took" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExFormation []))) (ExFormation [BiTau (AtLabel "ял") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) (ExDispatch ExRoot (AtLabel "гнёт")), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "ял") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) AtPhi)])-      lines written `shouldBe` ["𝔻(Φ):", "  𝕄(Φ.гнёт):", "    𝑛·0·1 := Φ.щур( ял ↦ ⟦⟧ )", "  boxed 𝑛·0·2 := 𝑛·0·1.φ"]+      lines written `shouldBe` ["𝔻(Φ):", "  𝕄(Φ.гнёт):", "    𝑛·0·1 := Φ.щур( ял ↦ ⟦⟧ )", "    𝑛·0·2 := ⟦ ял ↦ ⟦⟧, φ ↦ ял ⟧", "  boxed 𝑛·0·3 := 𝑛·0·2.φ"]     it "writes the heading again for a morphing that follows a box step" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExFormation []))) (ExFormation [BiTau (AtLabel "ял") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) (ExDispatch ExRoot (AtLabel "гнёт")), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "ял") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) AtPhi), EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExBytes (BtOne "3C")))) (ExFormation [BiTau (AtLabel "ял") (ExBytes (BtOne "3C"))]) (ExDispatch ExRoot (AtLabel "гнёт"))])       length (filter (== "  𝕄(Φ.гнёт):") (lines written)) `shouldBe` 2@@ -278,9 +294,9 @@     it "writes the symbol a join minted beside the path its condition was read off" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvJoined 2 (Right (ExDispatch ExXi (AtLabel "щит"))) 12 (5, 9)])       last (lines written) `shouldBe` "    joined 𝜎12 := ξ.щит ? 𝜎5 : 𝜎9"-    it "writes two sides a join could not join by the applications that made them" $ do+    it "writes two sides a join could not join by the formations applications made" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExFormation []))) (ExFormation [BiTau (AtLabel "w") (ExFormation [])]) ExRoot, EvDiverged 2 (ExDispatch ExXi (AtLabel "then"), ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExXi (AtLabel "else"), ExFormation [BiTau (AtLabel "w") (ExFormation [])]) [AtLabel "q"] Unnamed])-      last (lines written) `shouldBe` "    diverged 𝑛·1·1 vs 𝑛·1·2  # they differ at .q, and the join names no otherwise"+      last (lines written) `shouldBe` "    diverged 𝑛·1·2 vs 𝑛·1·4  # they differ at .q, and the join names no otherwise"     it "writes two sides a join could not join by the metas of the lines that bound them" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvTerm 2 "𝑛1" Morphing (ExDispatch ExXi (AtLabel "a")) (ExFormation [BiTau AtPhi (ExFormation [BiDelta (BtOne "1F")])]), EvTerm 2 "𝑛2" Morphing (ExDispatch ExXi (AtLabel "b")) (ExFormation [BiTau AtPhi (ExFormation [BiDelta (BtOne "2E")])]), EvDiverged 2 (ExMeta "n1", ExFormation [BiTau AtPhi (ExFormation [BiDelta (BtOne "1F")])]) (ExMeta "n2", ExFormation [BiTau AtPhi (ExFormation [BiDelta (BtOne "2E")])]) [AtPhi, AtDelta] Unnamed])       last (lines written) `shouldBe` "    diverged 𝑛1·1 vs 𝑛2·1  # they differ at .φ.Δ, and the join names no otherwise"@@ -308,13 +324,79 @@     it "opens a heading of its own for every run of the protocol" $ do       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvDelta 1 (BtOne "0C"), EvRun Morphing "Φ", EvDelta 1 (BtOne "0D")])       lines written `shouldBe` ["𝕄(Φ):", "  𝛿·0·1 := 0C-", "𝕄(Φ):", "  𝛿·0·2 := 0D-"]+    it "opens the header with the version and the revision of phino and the date the run began" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      take 1 (lines written) `shouldBe` ["# Written by phino 0.0.156 (9be96d8) on 2026-10-27 09:41:12 +03:00"]+    it "leaves the revision out of the header when phino was built with none" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.157" Nothing (dated (-5)) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      take 1 (lines written) `shouldBe` ["# Written by phino 0.0.157 on 2026-10-27 09:41:12 -05:00"]+    it "writes the command of the run into the header, quoting an argument a shell would split" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["morph", "--inside=⟦ ёж ↦ ∅ ⟧", "--sweet"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Morphing "Φ"])+      lines written `shouldContain` ["# Command: phino morph '--inside=⟦ ёж ↦ ∅ ⟧' --sweet"]+    it "writes the size of the world into the header" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "лес/мир.phi") 8125 295805 51 6454) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["# World: лес/мир.phi, 8125 lines, 295805 bytes, 51 objects at the top, 6454 bindings"]+    it "names a world read from the standard input stdin in the header" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World Nothing 4 77 0 9) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["# World: stdin, 4 lines, 77 bytes, 0 objects at the top, 9 bindings"]+    it "writes one of a kind in the world of the header in the singular" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "ёж.phi") 1 1 1 1) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["# World: ёж.phi, 1 line, 1 byte, 1 object at the top, 1 binding"]+    it "writes the λ functions of the run and the count of their entries into the header" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) (Just ("ёж.yaml", 10))) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["# Symbolic: ёж.yaml, 10 entries"]+    it "writes one entry of the λ functions in the header in the singular" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) (Just ("ёж.yaml", 1))) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["# Symbolic: ёж.yaml, 1 entry"]+    it "writes no λ functions into the header of a run with none" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      filter (isPrefixOf "# Symbolic") (lines written) `shouldBe` []+    it "writes the locator of the run into the header" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) (ExDispatch (ExDispatch ExRoot (AtLabel "лес")) (AtLabel "ёж")) (ExFormation []), EvRun Dataization "Φ.лес.ёж"])+      lines written `shouldContain` ["# Locator: Φ.лес.ёж"]+    it "writes the expression the locator points at into the header" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) (ExDispatch ExRoot (AtLabel "ёж")) (ExDispatch ExRoot (AtLabel "щука")), EvRun Dataization "Φ.ёж"])+      lines written `shouldContain` ["# Expression: Φ.щука"]+    it "parts the header from the heading of the run with an empty line" $ do+      (_, written) <- recorded (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) (ExDispatch ExRoot (AtLabel "ёж")) (ExFormation []), EvRun Dataization "Φ.ёж"])+      lines written `shouldContain` ["# Expression: ⟦⟧", "", "𝔻(Φ.ёж):"]   describe "saveEvalXml" $ do+    it "opens the root with the version and the revision of phino and the date the run began" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      take 3 (lines written) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<protocol>", "  <written by=\"phino\" version=\"0.0.156\" revision=\"9be96d8\" on=\"2026-10-27T09:41:12+03:00\"/>"]+    it "leaves the revision out of the markup when phino was built with none" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.157" Nothing (dated (-5)) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["  <written by=\"phino\" version=\"0.0.157\" on=\"2026-10-27T09:41:12-05:00\"/>"]+    it "writes the command of the run into the markup" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["morph", "--inside=⟦ ёж ↦ ∅ ⟧", "--x=<b>"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Morphing "Φ"])+      lines written `shouldContain` ["  <command>phino morph '--inside=⟦ ёж ↦ ∅ ⟧' '--x=&lt;b&gt;'</command>"]+    it "writes the size of the world into the markup" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "лес/мир.phi") 8125 295805 51 6454) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["  <world file=\"лес/мир.phi\" lines=\"8125\" bytes=\"295805\" objects=\"51\" bindings=\"6454\"/>"]+    it "writes a world read from the standard input into the markup with no file" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World Nothing 4 77 0 9) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["  <world lines=\"4\" bytes=\"77\" objects=\"0\" bindings=\"9\"/>"]+    it "writes the λ functions of the run into the markup" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) (Just ("ёж.yaml", 10))) ExRoot ExRoot, EvRun Dataization "Φ"])+      lines written `shouldContain` ["  <symbolic file=\"ёж.yaml\" entries=\"10\"/>"]+    it "writes no λ functions into the markup of a run with none" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      filter (isInfixOf "<symbolic") (lines written) `shouldBe` []+    it "writes the locator of the run into the markup" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) (ExDispatch (ExDispatch ExRoot (AtLabel "лес")) (AtLabel "ёж")) (ExFormation []), EvRun Dataization "Φ.лес.ёж"])+      lines written `shouldContain` ["  <locator>Φ.лес.ёж</locator>"]+    it "writes no expression into the markup, since the markup writes no term" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) (ExDispatch ExRoot (AtLabel "ёж")) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "щука"))]), EvRun Dataization "Φ.ёж"])+      filter (isInfixOf "щука") (lines written) `shouldBe` []+    it "opens the root once for the header and the run after it" $ do+      (_, written) <- recordedWhole (\record -> mapM_ record [EvHeader (Header "0.0.156" (Just "9be96d8") (dated 3) ["dataize"] (World (Just "мир.phi") 3 120 2 7) Nothing) ExRoot ExRoot, EvRun Dataization "Φ"])+      filter (== "<protocol>") (lines written) `shouldBe` ["<protocol>"]     it "writes an application as an element naming its head and holding its argument" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ.w", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) (ExDispatch ExRoot (AtLabel "w"))])       lines written `shouldContain` ["  <applied meta=\"𝑛·0·1\" by=\"morph\" at=\"Φ.w\" of=\"Φ.ёж\"><ref attr=\"q\">Φ.ю</ref></applied>"]     it "spells an argument an earlier application made by its name" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))))) (ExFormation [BiTau (AtLabel "w") (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))))]) ExRoot])-      lines written `shouldContain` ["  <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"Φ\" of=\"Φ.жук\"><meta attr=\"w\">𝑛·0·1</meta></applied>"]+      lines written `shouldContain` ["  <applied meta=\"𝑛·0·3\" by=\"morph\" at=\"Φ\" of=\"Φ.жук\"><meta attr=\"w\">𝑛·0·1</meta></applied>"]     it "spells an argument that is a bare symbol as that symbol" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "цапля")) (ArTau AtPhi (ExFormation [BiLambda (FnSymbol 7)]))) (ExFormation [BiTau AtPhi (ExFormation [BiLambda (FnSymbol 7)])]) ExRoot])       lines written `shouldContain` ["  <applied meta=\"𝑛·0·1\" by=\"morph\" at=\"Φ\" of=\"Φ.цапля\"><symbol attr=\"φ\">𝜎7</symbol></applied>"]@@ -350,10 +432,19 @@       lines written `shouldContain` ["  <built meta=\"𝑛·0·1\">𝑒·0·1</built>"]     it "spells an object an application made by its name in a later element" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ы" Morphing ExRoot, EvBuilt 2 (ExDispatch ExRoot (AtLabel "ю")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvAnswer 2 (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))])])-      lines written `shouldContain` ["    <answered meta=\"𝑛·1·3\">𝑛·1·2</answered>"]+      lines written `shouldContain` ["    <answered meta=\"𝑛·1·4\">𝑛·1·3</answered>"]     it "writes a formation no object of the world made as an element holding its bindings" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvAnswer 1 (ExFormation [BiLambda (Function "L_вилка"), BiVoid (AtLabel "лево"), BiTau AtPhi (ExFormation [BiLambda (FnSymbol 5)])])])       lines written `shouldContain` ["  <formed meta=\"𝑒·0·1\" λ=\"L_вилка\"><void attr=\"лево\"/><symbol attr=\"φ\">𝜎5</symbol></formed>"]+    it "writes the formation an application made as an element of its own right after the application" $ do+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvWorld (ExFormation [BiTau (AtLabel "ёж") (ExFormation [BiVoid (AtLabel "q"), BiTau (AtLabel "w") ExRoot])]), EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation [BiLambda (FnSymbol 3)]))) (ExFormation [BiTau (AtLabel "q") (ExFormation [BiLambda (FnSymbol 3)]), BiTau (AtLabel "w") ExRoot]) ExRoot])+      lines written `shouldContain` ["  <applied meta=\"𝑛·0·1\" by=\"morph\" at=\"Φ\" of=\"Φ.ёж\"><symbol attr=\"q\">𝜎3</symbol></applied>", "  <formed meta=\"𝑛·0·2\" of=\"Φ.ёж\"><symbol attr=\"q\">𝜎3</symbol></formed>"]+    it "writes the formation an application made that copies no object of the world as an element holding its bindings" $ do+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "выпь")) (ArTau (AtLabel "лапа") (ExFormation [BiLambda (FnSymbol 6)]))) (ExFormation [BiTau (AtLabel "лапа") (ExFormation [BiLambda (FnSymbol 6)])]) ExRoot])+      lines written `shouldContain` ["  <formed meta=\"𝑛·0·2\"><symbol attr=\"лапа\">𝜎6</symbol></formed>"]+    it "names the term a morphing came to by the meta of the formation an application made" $ do+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "тина")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "линь")) (ArTau (AtLabel "жабры") (ExFormation [BiLambda (FnSymbol 2)]))) (ExFormation [BiTau (AtLabel "жабры") (ExFormation [BiLambda (FnSymbol 2)])]) (ExDispatch ExRoot (AtLabel "тина")), EvMorphed 2 (ExFormation [BiTau (AtLabel "жабры") (ExFormation [BiLambda (FnSymbol 2)])])])+      lines written `shouldContain` ["    <morphed meta=\"𝑛·0·3\">𝑛·0·2</morphed>"]     it "names a formation that copies an object of the world by the object and the attributes it binds" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvWorld (ExFormation [BiTau (AtLabel "ёж") (ExFormation [BiVoid (AtLabel "q"), BiTau (AtLabel "w") ExRoot])]), EvAnswer 1 (ExFormation [BiTau (AtLabel "q") (ExFormation [BiLambda (FnSymbol 3)]), BiTau (AtLabel "w") ExRoot])])       lines written `shouldContain` ["  <formed meta=\"𝑒·0·1\" of=\"Φ.ёж\"><symbol attr=\"q\">𝜎3</symbol></formed>"]@@ -435,13 +526,19 @@       lines written `shouldContain` ["  </morph>", "  <dataized meta=\"𝛿·0·1\">0D-</dataized>"]     it "writes the box step of a dataization as an element naming the φ it took" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]))) (ExFormation [BiTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) (ExDispatch ExRoot (AtLabel "гнёт")), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) AtPhi)])-      lines written `shouldContain` ["  </morph>", "  <boxed meta=\"𝑛·0·2\">𝑛·0·1.φ</boxed>"]+      lines written `shouldContain` ["  </morph>", "  <boxed meta=\"𝑛·0·3\">𝑛·0·2.φ</boxed>"]     it "names the term a morphing came to by its meta in the element of the box after it, though an application named it before" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Dataization "Φ.ж", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "ж")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "рысь")) (ArTau (AtLabel "пух") (ExFormation [BiDelta (BtOne "4E")]))) (ExFormation [BiTau (AtLabel "пух") (ExFormation [BiDelta (BtOne "4E")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "пух"))]) (ExDispatch ExRoot (AtLabel "ж")), EvMorphed 2 (ExFormation [BiTau (AtLabel "пух") (ExFormation [BiDelta (BtOne "4E")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "пух"))]), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "пух") (ExFormation [BiDelta (BtOne "4E")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "пух"))]) AtPhi)])-      lines written `shouldContain` ["  <boxed meta=\"𝑛·0·3\">𝑛·0·2.φ</boxed>"]+      lines written `shouldContain` ["  <boxed meta=\"𝑛·0·4\">𝑛·0·3.φ</boxed>"]     it "names the answer of a firing by its meta in the element of the box after it" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Dataization "Φ", EvFiring 1 "L_сова" Dataization ExRoot, EvAnswer 2 (ExFormation [BiTau (AtLabel "мох") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "мох"))]), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "мох") (ExFormation []), BiTau AtPhi (ExDispatch ExXi (AtLabel "мох"))]) AtPhi)])       lines written `shouldContain` ["  <boxed meta=\"𝑛·0·1\">𝑛·1·1.φ</boxed>"]+    it "writes a pass of an undress line as an element naming the φ it took" $ do+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvMorphed 2 (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "чибис"))]), EvUndressed 2 (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "чибис"))]) AtPhi)])+      lines written `shouldContain` ["    <undressed meta=\"𝑛·1·2\">𝑛·1·1.φ</undressed>"]+    it "writes a morph element at the meta of an undress pass for the morphing that follows it" $ do+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvMorphed 2 (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "кайра"))]), EvUndressed 2 (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "кайра"))]) AtPhi), EvStarted 2 Morphing (ExDispatch (ExFormation [BiTau AtPhi (ExDispatch ExRoot (AtLabel "кайра"))]) AtPhi), EvMorphed 3 (ExDispatch ExRoot (AtLabel "кайра"))])+      lines written `shouldContain` ["    <morph at=\"𝑛·1·2\">"]     it "writes a morph element again for a morphing that follows a box step" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Dataization "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]))) (ExFormation [BiTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) (ExDispatch ExRoot (AtLabel "гнёт")), EvBoxed 1 (ExDispatch (ExFormation [BiTau (AtLabel "ял") (ExFormation [BiDelta (BtOne "3C")]), BiTau AtPhi (ExDispatch ExXi (AtLabel "ял"))]) AtPhi), EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "гнёт")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "щур")) (ArTau (AtLabel "ял") (ExBytes (BtOne "3C")))) (ExFormation [BiTau (AtLabel "ял") (ExBytes (BtOne "3C"))]) (ExDispatch ExRoot (AtLabel "гнёт"))])       length (filter (isInfixOf "<morph at=") (lines written)) `shouldBe` 2@@ -472,9 +569,9 @@     it "writes a cut that answered no copy as an element naming the formation it entered" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvLooped 1 Morphing Proven (ExFormation [BiTau (AtLabel "ъ") ExRoot]) ExRoot])       lines written `shouldContain` ["  <looped by=\"morph\" match=\"proven\" at=\"Φ\" of=\"𝑒·0·1\"/>"]-    it "names an argument of a deferred copy by the application that made it" $ do+    it "names an argument of a deferred copy by the formation an application made" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvApplied 1 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "кулик")) (ArTau (AtLabel "ш") ExRoot)) (ExFormation [BiTau (AtLabel "ш") ExRoot]) ExRoot, EvDeferred 1 31 Morphing (ExFormation [BiTau (AtLabel "щ") (ExFormation [BiTau (AtLabel "ш") ExRoot]), BiTau AtPhi (ExDispatch ExXi (AtLabel "щ"))]) (Just (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "щ") (ExFormation [BiTau (AtLabel "ш") ExRoot])))) ExRoot])-      lines written `shouldContain` ["  <deferred symbol=\"𝜎31\" by=\"morph\" at=\"Φ\" of=\"Φ.ёж\"><with><meta attr=\"щ\">𝑛·0·1</meta></with></deferred>"]+      lines written `shouldContain` ["  <deferred symbol=\"𝜎31\" by=\"morph\" at=\"Φ\" of=\"Φ.ёж\"><with><meta attr=\"щ\">𝑛·0·2</meta></with></deferred>"]     it "writes the term a join came to as the answer of its firing in the markup" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvTaken 2 [ExDispatch ExXi (AtLabel "then")] (ExFormation [BiLambda (FnSymbol 3)])])       lines written `shouldContain` ["    <answered meta=\"𝑛·1·1\">𝜎3</answered>"]@@ -486,7 +583,7 @@       lines written `shouldContain` ["    <joined symbol=\"𝜎12\" on=\"ξ.щит\" left=\"𝜎5\" right=\"𝜎9\"/>"]     it "writes two sides a join could not join as an element naming both" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvDiverged 2 (ExDispatch ExXi (AtLabel "then"), ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) (ExDispatch ExXi (AtLabel "else"), ExFormation [BiTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю"))]) [AtLabel "q"] Unnamed])-      lines written `shouldContain` ["    <diverged left=\"𝑛·1·1\" right=\"𝑛·1·2\" at=\".q\" reason=\"the join names no otherwise\"/>"]+      lines written `shouldContain` ["    <diverged left=\"𝑛·1·2\" right=\"𝑛·1·4\" at=\".q\" reason=\"the join names no otherwise\"/>"]     it "writes a side of a join that is a path as that path in the markup" $ do       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvDiverged 2 (ExDispatch ExXi (AtLabel "a"), ExDispatch ExRoot (AtLabel "ёж")) (ExDispatch ExXi (AtLabel "b"), ExDispatch ExRoot (AtLabel "щука")) [] (Unformed Righthand)])       lines written `shouldContain` ["    <diverged left=\"Φ.ёж\" right=\"Φ.щука\" reason=\"the right side is no formation\"/>"]
test/Fixtures.hs view
@@ -177,8 +177,13 @@     sansTotals :: String -> String     sansTotals       | map toLower (takeExtension path) == ".xml" = withoutWrapper-      | otherwise = withoutTotals+      | otherwise = withoutTotals . withoutHeader +withoutHeader :: String -> String+withoutHeader text = case span ("# " `isPrefixOf`) (lines text) of+  (_ : _, "" : rest) -> unlines rest+  _ -> text+ withoutTotals :: String -> String withoutTotals text   | [msec, firings, fps] <- drop (length ls - 3) ls@@ -193,9 +198,11 @@ withoutWrapper :: String -> String withoutWrapper text = case lines text of   (decl : "<protocol>" : rest)-    | Just kept <- withoutRunTotals rest -> unlines (decl : map dedented kept)+    | Just kept <- withoutRunTotals (dropWhile told rest) -> unlines (decl : map dedented kept)   _ -> text   where+    told :: String -> Bool+    told line = any (`isPrefixOf` line) ["  <written ", "  <command>", "  <world ", "  <symbolic ", "  <locator>"]     withoutRunTotals :: [String] -> Maybe [String]     withoutRunTotals rest = case reverse rest of       (closing : fps : firings : msec : kept)
test/InferenceSpec.hs view
@@ -40,7 +40,7 @@     it "answers with the data the rule 'delta' finds" $       snd <$> dataizationSpine (dataizationRule "delta") `shouldBe` Right (Answered (Dataization, "delta") (BtMeta "d1"))     it "labels the step of the rule 'box' by its own name" $-      snd <$> dataizationSpine (dataizationRule "box") `shouldBe` Right (Onward (Normalized (Dataization, "box")) (ExDispatch (ExFormation [BiMeta "B1", BiTau AtPhi (ExMeta "e2"), BiMeta "B2"]) AtPhi) (ExMeta "e1"))+      snd <$> dataizationSpine (dataizationRule "box") `shouldBe` Right (Onward (Normalized (Dataization, "box")) (ExDispatch (ExFormation [BiMeta "B1"]) AtPhi) (ExMeta "e1"))     it "labels the step of the rule 'fire' by its 'evaluate'" $       snd <$> dataizationSpine (dataizationRule "fire") `shouldBe` Right (Onward (Taken (Evaluation, "evaluate")) (ExMeta "n1") (ExMeta "e1"))     it "labels the step of the rule 'none' by its 'dataize'" $
test/LambdasSpec.hs view
@@ -40,6 +40,7 @@     bound :: Line -> T.Text     bound (Dataized meta _) = _spelling meta     bound (Morphed meta _) = _spelling meta+    bound (Undressed meta _) = _spelling meta     bound (Evaluated meta _) = _spelling meta     bound (Deferred meta _) = _spelling meta     bound (Stayed meta _) = _spelling meta@@ -52,6 +53,9 @@ morphs :: Lambdas -> T.Text -> [(T.Text, T.Text)] morphs known func = [(_spelling meta, _spelling source) | Morphed meta source <- lined known func] +undresses :: Lambdas -> T.Text -> [(T.Text, T.Text)]+undresses known func = [(_spelling meta, _spelling source) | Undressed meta source <- lined known func]+ fired :: Lambdas -> T.Text -> [(T.Text, T.Text)] fired known func = [(_spelling meta, _spelling source) | Evaluated meta source <- lined known func] @@ -309,6 +313,32 @@       known <- lambdasOf "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  𝑛: 𝑛1\n"       symbolizes known "L_hold" `shouldBe` [] +    it "keeps under 'undress' only the operands reading '$'" $ do+      known <- lambdasOf "- λ: L_hold\n  undress:\n    𝑛1: $.a\n    𝑛3: 𝑛2\n  stay:\n    𝑛2: 𝑛1\n  𝑛: 𝑛3\n"+      map (_spelling . fst) (maybe [] _undressed (matched known "L_hold")) `shouldBe` ["𝑛1"]++    it "reads the lines of 'undress' with the metas they read" $ do+      known <- lambdasOf "- λ: L_hold\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  undress:\n    𝑛4: 𝑛2\n    𝑛3: 𝑛1\n  𝑛: 𝑛3\n"+      undresses known "L_hold" `shouldBe` [("𝑛3", "𝑛1"), ("𝑛4", "𝑛2")]++    it "runs a 'morph' line reading what an operand of 'undress' bound" $ do+      known <- lambdasOf "- λ: L_hold\n  undress:\n    𝑛1: $.a\n  morph:\n    𝑛2: 𝑛1\n  𝑛: 𝑛2\n"+      morphs known "L_hold" `shouldBe` [("𝑛2", "𝑛1")]++    it "runs an 'undress' line after the 'stay' line binding the meta it reads" $ do+      known <- lambdasOf "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  undress:\n    𝑛3: 𝑛2\n  stay:\n    𝑛2: 𝑛1\n  𝑛: 𝑛3\n"+      order known "L_hold" `shouldBe` ["𝑛2", "𝑛3"]++    it "reads a 'join' block whose sides are metas 'undress' bound" $ do+      known <- lambdasOf "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  undress:\n    𝑛1: $.a\n    𝑛2: $.b\n  join:\n    on: 𝛿1\n    left: 𝑛1\n    right: 𝑛2\n"+      left <- parseExpressionThrows "𝑛1"+      right <- parseExpressionThrows "𝑛2"+      sides known "L_fork" `shouldBe` Just (left, right)++    it "reads an entry naming no 'undress' block at all" $ do+      known <- lambdasOf "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  𝑛: 𝑛1\n"+      undresses known "L_hold" `shouldBe` []+     it "reads the lines of 'rewrite' with the metas they read and the count of their rules" $ do       known <- lambdasOf ("- λ: L_hold\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  rewrite:\n    𝑛4:\n      of: 𝑛2\n" <> truth <> "        - name: false-literal\n          pattern: Φ.false\n          result: Φ.bool( if ↦ ⟦ Δ ⤍ 00- ⟧ )\n    𝑛3:\n      of: 𝑛1\n" <> truth <> "  𝑛: 𝑛3\n")       rewrites known "L_hold" `shouldBe` [("𝑛3", "𝑛1", 1), ("𝑛4", "𝑛2", 2)]@@ -391,6 +421,10 @@       , ("a meta bound by 'defer' and again by 'evaluate'", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  defer:\n    𝑛2: 𝑛1\n  evaluate:\n    𝑛2: 𝑛1\n  𝑛: 𝑛2\n", "The meta '𝑛2' of λ function 'L_hold' is bound by more than one line")       , ("a meta bound by 'evaluate' and again by 'defer' in its other spelling", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  evaluate:\n    𝑛3: 𝑛1\n  defer:\n    \"!n3\": 𝑛1\n  𝑛: 𝑛3\n", "The meta '!n3' of λ function 'L_hold' is bound by more than one line")       , ("a meta bound twice by 'defer' in its two spellings", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  defer:\n    𝑛3: 𝑛1\n    \"!n3\": 𝑛2\n  𝑛: 𝑛3\n", "is bound by more than one line")+      , ("an operand of 'undress' which is no expression meta", "- λ: L_hold\n  undress:\n    𝛿1: $.a\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n", "is not an expression meta")+      , ("an operand of 'undress' reading a meta inside a term", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  undress:\n    𝑛2: 𝑛1.x\n  𝑛: 𝑛2\n", "The operand '𝑛2' of 'undress' of λ function 'L_hold' reads the meta 'n1', while only a path from '$' or a meta alone can be reduced there")+      , ("an operand of 'undress' naming a meta nothing binds", "- λ: L_hold\n  undress:\n    𝑛2: 𝑛5\n  𝑛: 𝑛2\n", "The operand '𝑛5' of λ function 'L_hold' names no meta bound by 'morph' or by any line")+      , ("a meta bound by 'morph' and again by 'undress'", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  undress:\n    𝑛1: $.b\n  𝑛: 𝑛1\n", "The meta '𝑛1' of λ function 'L_hold' is bound by more than one line")       , ("a 'stay' line keeping a meta the entry never bound", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  stay:\n    𝑛3: 𝑛2\n  𝑛: 𝑛3\n", "names no meta bound by 'morph' or by any line")       , ("a 'stay' line bound to what is no expression meta", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  stay:\n    𝛿1: 𝑛1\n  𝑛: 𝑛1\n", "is not an expression meta")       , ("a 'stay' line keeping a term instead of a meta", "- λ: L_hold\n  morph:\n    𝑛1: $.a\n  stay:\n    𝑛2: $.a\n  𝑛: 𝑛2\n", "is not an expression meta")@@ -423,7 +457,7 @@       , ("a 'join' block whose 'otherwise' is no λ name", joint <> "    otherwise: l_join\n", "The 'otherwise' of the 'join' block of λ function 'L_fork' is 'l_join', while it must name a λ function, such as 'L_join'")       , ("a 'join' block whose 'otherwise' names a symbol", joint <> "    otherwise: 𝜎3\n", "The 'otherwise' of the 'join' block of λ function 'L_fork' is '𝜎3', while it must name a λ function, such as 'L_join'")       , ("a 'join' block which is no mapping", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join: [𝛿1, $.a, $.b]\n", "join: parsing")-      , ("a side of a 'join' block naming a meta nothing binds", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: 𝑛1\n    right: $.b\n", "The side 'left' of the 'join' block of λ function 'L_fork' reads the meta 'n1' that none of 'morph', 'evaluate', 'stay', 'rewrite', 'symbolize' and 'defer' binds")+      , ("a side of a 'join' block naming a meta nothing binds", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: 𝑛1\n    right: $.b\n", "The side 'left' of the 'join' block of λ function 'L_fork' reads the meta 'n1' that none of 'morph', 'undress', 'evaluate', 'stay', 'rewrite', 'symbolize' and 'defer' binds")       , ("a side of a 'join' block reading a meta inside a term", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  morph:\n    𝑛1: $.a\n  join:\n    on: 𝛿1\n    left: 𝑛1.x\n    right: $.b\n", "The side 'left' of the 'join' block of λ function 'L_fork' reads the meta 'n1' inside a term, while a side is a path from '$' or a meta alone")       , ("a side of a 'join' block which is no term of the calculus", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: ⟦ λ ⤍\n    right: $.b\n", "cannot be read")       , ("a 'fork' block, which is gone", "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  fork:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n", "The key 'fork' of λ function 'L_fork' is none of the keys an entry reads")
test/ParserSpec.hs view
@@ -427,6 +427,20 @@           it tight (parseExpression tight `shouldBe` parseExpression spaced)       ) +  describe "an arrow ends a meta variable" $+    forM_+      [ ("[[ !t1->$ ]]", "[[ !t1 -> $ ]]")+      , ("[[ !t1->!e1 ]]", "[[ !t1 -> !e1 ]]")+      , ("⟦ 𝜏1->$ ⟧", "⟦ 𝜏1 -> $ ⟧")+      , ("[[]](!t1->$)", "[[]](!t1 -> $)")+      , ("[[ !t-a->$ ]]", "[[ !t-a -> $ ]]")+      ]+      ( \(tight, spaced) ->+          it tight $ do+            parseExpression spaced `shouldSatisfy` isRight+            parseExpression tight `shouldBe` parseExpression spaced+      )+   describe "parse number" $     test       parseNumber