newish musings
blog logic puzzles piward coding the-bonfire
github profile
𝟙𝟜· coding Periodically, I tell myself I'm going to alternate exploratory coding (aka hacking) with a phase of refactoring toward a clear design (aka cleanup). The
problem is the clear design phase may never happen - it's too easy to be satisfied with code that passes the current testing, however informal. On the other hand,
it's easy to overcommit to a clear, elegant design, and if it doesn't meet some of the goals set for the project, it can be a major issue.
I'm here again, thinking my solo recreational coding would be more fun if I took time to consolidate what I've learned into a good design. Process options are plenty,
but I probably can't master the discipline of most - e.g. separate branches for exploratory phases seems heavy handed on a solo project. Alternating priorities always
feels like the best thing to try, but I usually can't stick to it - maybe that ADHD diagnosis isn't so far off...
Of course, AI assistance is becoming standard practice, and beyond quickly finding simple mistakes, it can refactor efficiently and even take part in a friendly chat
about what the plan is. The increases in productivity, even if human programmers end up only in a code review role, is hard to resist in business.
But I'm programming because I enjoy it. Algorithmic assistance is great, as long as I could have a hope of understanding the algorithms being used. Maybe I could
figure out how LLM's work, but the current systems are massive, remote black box servers - which isn't part of the fun for me. The fun is opening the black boxes and
figuring out what's going on inside.
𝟙𝟘· the-bonfire To better understand why I seemed to be getting so much wrong about AI, I turned to Wikipedia and found my own notions weren't that out of whack with at
least one standard reference. The entry on Artificial General Intelligence is altogether different.
My understanding of AGI was a ‘universal problem solving’ ability without reference to human ability, when it really means ‘exceedinmg human ability on all or nearly
all’ cognitive tasks. Live and learn.
An the other hand, AGI or "strong AI" implies consciousness for some, which I reject. The concept of mind - the collection of cognition and qualia that the phrase "I
think therefore I am" refers to - captures what I mean by consciousness (perhaps sentience is a more helpful word, but consciousness is etched in my mind).
It is useful to keep consciousness distinct from intelligence. To date, there is no evidence or theory as to how consciousness would enhance intelligence, no
computational model in which consciousness could act as an oracle, allowing the incomputable to be computed. This means there is no, as yet, reason to assume
𝔽 consciousness becomes necessary at some level of intelligence. Nor, if we fully reject solipsism, does consciousness provide average human intelligence.
𝕖
𝕓 Passing the ‘Turing Test’ is not evidence of consciousness, it's a proposal to qualify a computer program as "intelligent". Because lesser abilities are often
𝕣 described as intelligent, it defines a "general intelligence" in terms of human abilities. Perhaps we might call it a test for "Artificial General Intelligence". But
𝕦 we cannot justify conflating it with consciousness.
𝕒
𝕣 𝟘𝟡· the-bonfire I've posted online in a few forums about AI, and I wish I could just retract it all... I'm worried about two ways the current pursuit of AI could lead to
𝕪 a global Depression in the relatively near term; it could fail and, between the bursting investment bubble and changes made on unfulfilled expectations could collapse
the intertwined economic system; it could succeed, creating a shift that happens faster than we can adapt.
If AI succeeds in the long term, it will dramatically devalue human labor, both mental and physical - yes, I'm talking about robots. Fully automated assembly lines,
with large stationary robots. Replacing support personnel with smaller mobile robots for repair resolving malfunctions makes fro a human-free factory. Broader
defnitions include driverless cars which, operating in an uncontrolled environment, require more ‘intelligence.’ With minimal demands from AI, we can throw in washing
machines, which have devalued any human effort scrubbing clothes in a nearby stream.
Protecting jobs is a band-aid to keep capitalism going, but, if we want to keep a decent quality of life for human beings in the long term, we should ensure AI is the
light at the end of the capitalism tunnel, not a reason to predict a miraculous singularity where we merge our consciousness with machines.
𝟘𝟞· coding Woof! Slow progress... ⟪Sapphire⟫ has both logic and domain variables - a named value which may be left unspecified, given a value as assertions are simplified
and resolved. Both ‘x=3’ and ‘3=x’ mean the same thing - as an assertion it is resolved in ⟪Silver⟫ if ‘x’ evaluates to 3, but if something else, a contradiction is
flagged. If x has no value, ⟪Silver⟫ resolves the assertion by assigning 3 to x. For finite problems, functions and relations can be treated as domain or logic
variable spaces, respectively. To dig myself out from under earlier hacks, I'm rewriting things around what I'm calling ‘free order variables’ for now, which are just
⟨key table⟩ pairs, replacing constrained expressions with, in theory at least, nested function calls...
𝟘𝟝· the-bonfire Christian Nationalism is the new face of the KKK. Project 2025 is a Christian Nationalist plan to use Trump's narcissism and exploit The Constitution's
failure against those without a modicum of dignity, or degree of self awareness rising to power in our Democracy. Trump is a child-like puppet of those who would,
using the tyranny of the majority, ethnically cleanse America.
𝟘𝟛· I just learned about the beautiful discovery of Pentagonal tilings by Marjorie Rice. Doris Schattsneider encouraged Rice to present her work at the MAA - notable only
because I met her as part of The Visual Geometry Project. Maybe I can connect ⟪Sapphire⟫ back to my early life through geometry!
𝟘𝟙· It might be my unfathomably old age of 57, but time flies like a peregrine falcon! Soon I'll get started on my plans for January... For now I'm still trundling along
on first class constraints, and at this point, I'm not sure it's a good idea. It's probably time to read up on research and prior software (from the 1970's). At least
I'm still living and learning.
𝟚𝟡· I left Stack Overflow because, like all social media-ish sites, it triggered PTSD from going to high school in the the 1980s. My eyes prefer ‘Dark Mode’ on emissive
displays and the highest rated answer here shares a javascript one-liner in a bookmark that tweaks the pdf viewer object to invert the pdf image. I didn't even know
‘bookmarklets’ were a thing!
𝟚𝟟· logic In trying to add expressive set comprehensions to ⟪Sapphire⟫, it's hard to avoid Russell's Paradox. Expressed in ⟪Sapphire⟫ extended with unrestricted
quantifiers it would be expressed as ‘∃x ∀y y∈x≡y¬∈y’. The restrictions I want to place on quantifiers complicate things, and with Python-like comprehensions as
values, it get's even more complicated. Lots to think about.
𝟚𝟞· puzzles Using summation for Slitherlink and Killer Sudoku is a natural choice, but Peano's Axioms are insufficient to define the integers using only first order
logic. I want to dig into the theoretical concerns, but I'm going to defer them for now while I try to get some functionality working.
𝟚𝟝· puzzles I'm a focused on solving logic pencil puzzles as Constraint Satisfaction Problems in part because I'd like to try my hand at a puzzle generator. Perhaps my
ambition to share a monthly or even weekly sheet of puzzles at my local puzzle & game store is misguided, but for now it's on my hopes and dreams list.
𝟚𝟝· coding Changes are settling and maybe my OCD will give me a chance to work on something else for a bit. Between making these changes too haphazardly and global
distractions, everything else has been suffering neglect. A pause, then forward on Slitherlink puzzles and, hopefully, some graphics fun!
𝟚𝟛· coding The transition to treating constraints as a class of ⟪Iron⟫ Interpreter internal values has been... slow. I make a mess when I'm exploring to find a solution
or implementation that works and meets my design goals. Breaking changes are a time to consolidate the current design before going forward... I was too focused on
getting to the next exploration - constraints as first class values, and, well, messed up.
𝟚𝟘· logic By encoding logic pencil puzzles, rules and instances, in ⟪Sapphire⟫ I define a CSP (Constraint Satisfaction Problem) and ⟪Silver⟫ is my ad-hoc solver. My
⟪Iron⟫ interpreter can, when an expression would be undefined with eager evaluation, return a meta-object, referencing the only partially evaluated expression. These
can be interpreted as errors by the environment, but are used by Silver to find solutions: an assertion such as ‘x=5+7’ might not be evaluated past ‘x=12’ if ‘x’ is
completely unkown, but can be fully resolved by commiting ‘x’ in the solution to be ‘12’. If ‘y’ is undefined, ‘y∈{3 12 15}’ won't be evaluated, but can be used as a
constraint on ‘y’ in the solution. These, combined with an assertion that ‘x=y’ yields the solution ‘x=12 ∧ y=12’.
Previously, I didn't allow constraints to be passed around as a ‘first class’ meta-value with ⟪Silver⟫ relied almost on re-evaluating the current unresolved
assertions with various ‘resolution’ steps that reconcile constraints. Now constraints can be passed as values, and carry, along with information what the domain
value could be, but also information about the source of the constraint. As an example, given ‘x∈{1 2 3}’ and ‘y∈{3 4 5}’ as constraints, ‘x+y’ can be evaluated to
the constraint ‘x+y∈{4⋯8}’ which, returned as a meta-value means ‘x+y<10’ can be evaluted to true.
This can't eliminate the need for specialized resolution steps, like my ⟪Silver⟫ pigeonholer, but the hope is that they can be kept simple and orthogonal to be used,
along with extended evaluation, as primitive steps in a search.
Lazy evaluation, if I want to use it for optimization or expressiveness, will hopefully be follow as a relatively straightforward extension of all this.
𝟚𝟘· the-bonfire The Trump Adminstration's demands for lists of Jewish Faculty from educational institutions is a not only a potential danger to those faculty members
given past and recent history, but even a list for ‘special protection’ is unlawful: the use of Congressionally allocated funds to defend or support Jewish Faculty
violates the 1st Amendment's establishment clause. LDS Members, Muslims, Sikhs, Buddhists, Hindus, Spiritualists, Atheists, Wiccans, Scientologists and more have
experienced persecution on American campuses. Any government protection from religious persecution must defend all belief systems and not be biased by political
motivation.
𝕁
𝕒 𝟙𝟡· the-bonfire The title of Robert Wachter's recent article... (continued)
𝕟
𝕦 𝟙𝟠· the-bonfire I was updating my rant about how Unicode is poorly suited for use as a character set in computing when I realized it is a real solid start to an open
𝕒 standard in word processing. The addition of emoji makes communication so much clearer: 🇺🇸/🇬🇱=🙀
𝕣
𝕪 𝟙𝟠· logic I've ‘discovered’ the field of Mathematics called Finite Model Theory! Model Theory includes, and is introduced with, a focus on infite structures, so I put it
on the future pile - logic pencil puzzles are finite. But Finite Model Theory looks relevant - it is likely over my head, but I'll dig in a bit and see if I can
connect any dots to my playground.
𝟙𝟞· puzzles To even solve the trivial Slitherlink Puzzle (a 1×1 puzzle with a single ‘4’) semi-symbolically, I'm going to have to up my constraint handling. My plan was
to support constraint expressions - special objects which give some information about an otherwise indeterminate value.
My choice was to wrap a logical formula (another expression) using the variable ‘_’ to represent the constraint expression. This could get unweildy, so in practice I
have kept them simple enough to be useful for my current, puzzle-solving purposes.
As an example, if x is ‘_∈{1 2}’ and y is ‘_∈{2 7}’ we can deduce ‘x+y’ will satisfy the constraint ‘_∈{3 4 8 9}’and we could also deduce from ‘x=y’ that ‘x=y=2’. The
pigeonholer I implemented to solve Sudoku puzzles in ⟪Silver⟫ starts with ‘_∈{1⋯9}’ for blank squares and 27 9-way not-equal expressions using an n-ary ‘¬=’ operator.
The handling is not Sudoku specific - I'm hoping it will work for a few more puzzles before I tidy things up.
Which brings me back to the start - I didn't implement constraint expressions properly, and now that I'm counting the number of edges around a square that are on the
path, I have to do at least some tidying.
𝟙𝟞· Some online news source or other asked if AI could create anything original... (continued)
𝟙𝟝· I don't know how to address the political situation here in the US... (continued)
𝟙𝟚· puzzles The paper “Mathematical Definition and Systematization of Puzzle Rules” by Itsuki Maeda and Yasuhiro Inoue details a mathematical framework for logic pencil
puzzles with formulas defining 10 different puzzle types. Nikoli, the company that popularized “Number Place” puzzles under the Japanese trademark ‘Sudoku’, publishes
collections in Japan and describes each on their website:
Slitherlink Sudoku Shikaku Choco Banana Inshi no Heya Fillomino Kurotto Sukoro Norinori Hitori.
As I get my ⟪Silver⟫ Solver working on each, I'll post my ⟪Sapphire⟫ definitions.
𝟘𝟡· coding I often pass keyword parameters to a subroutine unchanged, and ended up with alot of ‘keyword=keyword’ code in Python function calls. Reserving ‘=’ for the
equality predicate (I just replace ‘=’ with ‘==’ when generating Python or C) I instead use ‘→’ to pass keyword parameters - ‘keyword→7’. I added a postfix operator
‘→←’ to pass the value of the variable as the keyword, so I can abbreviate ‘keyword→keyword’ ·as ‘keyword→←’.
𝟘𝟠· logic I've added ‘comprehensions’ which support set and sequence expressions such as { _^3 ⋮ 1⋯2026} and ⟨ ⦗str _⦘ ⋮ x y z ⟩, where the variable ‘_’ (displayed as ◒
in logical contexts, to satisfy my aesthic preferences) which is evaluated for each of the elements to the right of the ‘⋮’ symbol. I use ‘⋯’ as an inclusive, integer
range operator, so ⟨1⋯3⟩ is the tuple ⟨1 2 3⟩. It meshes well with my implementation of sets of integers expressed as intervals.
𝟘𝟠· coding I've been on a side trip to additional ‘rational’ code generation based on syntactic analysis rather than ad-hoc text manipulation. This next stage let me
translate operators (‘⊗’ and ‘⊙’ for cross and dot-product) into calls to generic functions, but there's more work to make it remotely robust.
𝟘𝟝· puzzles I started on a formulation of Slitherlink rules in ⟪Sapphire⟫. Connectivity, as a pairwise relation could be easily satisfied by being true for any vertices
that are connected to anything. I ended up defining a distance function with a special value (rather than a distinct relation) for ‘not connected’. In the next day or
two, I'll see how ⟪Silver⟫ does trying to find a satisfying model (aka solution).
𝟛𝟘· I've been bogged down by my bootstrapping ... coding
𝟚𝟠· More language infrastructure progress - I've got code generating from the ⟪Violet⟫ language layer that bridges between ⟪Cobalt⟫ (aka C) and ⟪Midnight⟫ (aka Python). I
generate code that uses Python's ‘ctypes’ module to call C from Python, making it easy to mix and match implementations.
𝟚𝟞· I took a small step toward sensible language handling by generating a full parse tree for a small input file. Starting life as a no-op, my evolving ‘zypp’
preprocessor converts ⟪Midnight⟫ and ⟪Cobalt⟫ to Python and C, respectively, in an entirely ad-hoc fashion. At least I know I can create an inviting bug hotel.
Eventually, each language layer I use will share a unified parser, but different intermediate code generators which will perform first level semantic checks. The
intermiedate language will support high level primitives that can be lowered to target subsets which can be used to emit code. My ⟪Sapphire⟫ project has a good deal
of infrastructure to cope with.
𝔻 𝟚𝟝· I finished implementing SDL ‘framebuffer’ objects which display a screen sized OpenGL texture. Framebuffer support is primarily for debugging, but also can be used
𝕖 with small ‘gadget’ displays, like Pimoroni's Display Hat Mini, ePaper displays, also available from Pimoroni or from Waveshare, which I used to prototype a Raspberry
𝕔 Pi based e-Reader.
𝕖
𝕞 𝟚𝟜· I finally got around to watching Jordan Peele's documentary "Get Out" the other night. I have to say, the re-enactments were grisly, but well done.
𝕓
𝕖 𝟚𝟛· I've added support for the Cartesian Product, represented by ‘×’ in Unicode (U+D7). What I call “tuple constrained quantification” (∀⟨x y⟩∈Z×Z) is accepted in
𝕣 ⟪Sapphire⟫ as well as set exponentiation by an integer (Z^4 ▷ Z×Z×Z×Z) ({1⋯3}^3 ▷ {1⋯3}×{1⋯3}×{1⋯3}). Finite expressions can be evaluated in calculator fashion (⟨1 2
3⟩∈{1⋯3}^3 ▷ ✔) (∀⟨a b⟩∈{1⋯3}^2 a>3 ⇒ a+b>4 ▷ ✔) and can also be symbolically manipulated by ⟪Ag⟫, aka “The Silver Solver”. I've updated my Sudoku rules to use these
new features
𝟚𝟚· I'm using ‘⊙‘ for dot product and ‘⊗’ for cross product. My preprocessor translates these from binary operators into calls to ‘dot’ and ‘cross’, which are native in
GLSL and implemented in Python to work on number sequences of equal length (dot) or only 3-tuples of numbers (cross).
𝟚𝟚· While I use Unicode extensively and appreciate its near universal adoption and support, I object to any description of it as a "character set". ... coding
𝟚𝟙· I updated my color text routines that I use in all my Python tools to proceess faster when read into Emacs. One day, I may create an IDE for my ‘neo-retro’
logic-puzzle computing environment, but Emacs is still the best tool for me.
𝟘𝟞· I now have a somewhat general "pigeonhole solver" ... logic