From 1514dac9f7ff360a5c0cc45018851dead5c618ed Mon Sep 17 00:00:00 2001 From: "Brady J. Garvin" <bgarvin@cse.unl.edu> Date: Mon, 30 Oct 2023 11:48:05 -0500 Subject: [PATCH] Recorded work from Friday. --- monoid-design.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/monoid-design.md b/monoid-design.md index 611274a..f5cf156 100644 --- a/monoid-design.md +++ b/monoid-design.md @@ -184,16 +184,16 @@ Problem: Given a list of numbers, compute the minimum. ## Monoid Identification * Interpretation of input elements as actions: - * … + * An element `a` in the input is an instruction to "ensure that the result is at most `a`". * Combination of two actions: - * … + * If we ensure that the result is at most `a` and then we ensure that the result is a most `b`, altogether we ensure that result is at most `min(a, b)`. * Representation of actions: - * … + * We can represent any action by storing the cap on the result. * Identity element: - * … + * Solving `min(e, x) = min(x, e) = x` gives us `e = ∞`. * Monoid: - * `M = (…, …, …)` + * `M = (𝐑 ∪ {∞}, min, ∞)` -------------------------------------------------------------------------------- @@ -212,22 +212,22 @@ As another way to look at the problem, if we know the average of a left-hand sid This is the same issue we saw in divide-and-conquer design: we must be asking the wrong question. -If we ask for …, deferring …, then we can find a monoid. +If we ask for a sum and a count, deferring the division until the end, then we can find a monoid. ## Monoid Identification * Interpretation of input elements as actions: - * … + * An element `a` in the input is an instruction to "add `a` to the total and add `1` the count". * Combination of two actions: - * … - * … + * If we add `a` to the total and `1` to the count and then we add `c` to the total and `1` to the count, altogether we add `a + c` to the total and `2` to the count. + * If we add `a` to the total and `b` to the count and then we add `c` to the total and `d` to the count, altogether we add `a + c` to the total and `b + d` to the count. * Representation of actions: - * … + * We can represent any action by storing an amount to add to the total (a real number) and an amount to add to the count (a natural number). * Identity element: - * … + * Solving `e∙x = x∙e = x`, where `(a, b) ∙ (c, d) = (a + c, b + d)`, give us `e = (0, 0)`. * Monoid: - * `A = (…, ∙, …)` where `(a, b) ∙ (c, d) = (…, …)` + * `A = (𝐑 × 𝐍, ∙, (0, 0))` where `(a, b) ∙ (c, d) = (a + c, b + d)` -------------------------------------------------------------------------------- @@ -236,14 +236,14 @@ If we ask for …, deferring …, then we can find a monoid. Problem: Given a string of parentheses, determine if the parentheses are balanced. * Example of balanced parentheses: `()(())` -* Example of unbalanced parentheses: `…` -* Example of unbalanced parentheses with same number of each type: `…` +* Example of unbalanced parentheses: `(((` +* Example of unbalanced parentheses with same number of each type: `)(` ## Clues about the Monoid from an Iterative Design ```js function isBalanced(parentheses) { - let nesting = 0; + let nesting = 0; // ← result variable; looks like monoid (𝐙, +, 0) for (const character of parentheses) { if (character === '(') { ++nesting; @@ -262,16 +262,16 @@ function isBalanced(parentheses) { * Taking the submonoid generated by `(`: * The identity is different than `(`, which is different than `((`, which is different than `(((`, etc. - * So it seems like our monoid will need …. + * So it seems like our monoid will need, as a factor, the number of open parentheses. * Taking the submonoid generated by `)`: * The identity is different than `)`, which is different than `))`, which is different than `)))`, etc. - * So it seems like our monoid will need …. + * So it seems like our monoid will need, as a factor, the number of close parentheses. ## Quotienting a Free Monoid by Relations * The sequence `…` cancels to the identity. -* If we simplify any input by repeatedly removing occurrences of `()`, we eventually end up with a string of the form …. +* If we simplify any input by repeatedly removing occurrences of `…`, we eventually end up with a string of the form `…` where `…` is …. ## Parentheses Monoid -- GitLab