<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucian Green</title>
    <description>The latest articles on DEV Community by Lucian Green (@luciangreen).</description>
    <link>https://dev.to/luciangreen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F124778%2F25268604-d925-4be7-a398-f3d59734c08a.jpeg</url>
      <title>DEV Community: Lucian Green</title>
      <link>https://dev.to/luciangreen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luciangreen"/>
    <language>en</language>
    <item>
      <title>Please give some demos of what Neuroprolog can do.</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Sun, 12 Apr 2026 11:15:47 +0000</pubDate>
      <link>https://dev.to/luciangreen/please-give-some-demos-of-what-neuroprolog-can-do-a3g</link>
      <guid>https://dev.to/luciangreen/please-give-some-demos-of-what-neuroprolog-can-do-a3g</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8rlb4s89c017qg5ysw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8rlb4s89c017qg5ysw4.png" alt="Neuroprolog" width="636" height="946"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Courtesy ChatGPT: Here are some clear, practical demos of what &lt;a href="https://github.com/luciangreen/neuroprolog" rel="noopener noreferrer"&gt;Neuroprolog&lt;/a&gt; can do, based on how your system works (symbolic optimisation, subterm analysis, and Spec→Algorithm ideas). I’ll show each demo with:&lt;br&gt;
    • 🧠 What it does&lt;br&gt;
    • ⚙️ Input (original Prolog-style)&lt;br&gt;
    • 🚀 Output (optimised / transformed result)&lt;br&gt;
    • 💡 Why it matters&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧠 1. Recursion → Closed-Form (O(1) Upgrade)&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Detects recursive numeric patterns and replaces them with formulas.&lt;/p&gt;

&lt;p&gt;⚙️ Input (recursive Prolog)&lt;/p&gt;

&lt;p&gt;sum_n(0,0).&lt;br&gt;
sum_n(N,S) :-&lt;br&gt;
    N &amp;gt; 0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    sum_n(N1,S1),&lt;br&gt;
    S is S1 + N.&lt;/p&gt;

&lt;p&gt;🚀 Neuroprolog Output&lt;/p&gt;

&lt;p&gt;sum_n(N,S) :-&lt;br&gt;
    S is N*(N+1)/2.&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Converts O(n) → O(1)&lt;br&gt;
    • This is your core breakthrough idea (algorithm compression)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🔁 2. Loop Pattern Detection (Sequence Recognition)&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Finds patterns like 1,3,5,... and converts them into formulas.&lt;/p&gt;

&lt;p&gt;⚙️ Input&lt;/p&gt;

&lt;p&gt;seq(1,1).&lt;br&gt;
seq(N,X) :-&lt;br&gt;
    N &amp;gt; 1,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    seq(N1,X1),&lt;br&gt;
    X is X1 + 2.&lt;/p&gt;

&lt;p&gt;🚀 Output&lt;/p&gt;

&lt;p&gt;seq(N,X) :-&lt;br&gt;
    X is 2*N - 1.&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Recognises arithmetic progression&lt;br&gt;
    • Converts iterative reasoning → direct computation&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🌳 3. Subterm Pattern Extraction&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Finds repeated structures inside code and factors them out.&lt;/p&gt;

&lt;p&gt;⚙️ Input&lt;/p&gt;

&lt;p&gt;f(A,B,C) :-&lt;br&gt;
    append(A,B,D),&lt;br&gt;
    append(D,C,E).&lt;/p&gt;

&lt;p&gt;g(A,B,C) :-&lt;br&gt;
    append(A,B,D),&lt;br&gt;
    append(D,C,F).&lt;/p&gt;

&lt;p&gt;🚀 Output&lt;/p&gt;

&lt;p&gt;combine(A,B,C,R) :-&lt;br&gt;
    append(A,B,D),&lt;br&gt;
    append(D,C,R).&lt;/p&gt;

&lt;p&gt;f(A,B,C) :- combine(A,B,C,E).&lt;br&gt;
g(A,B,C) :- combine(A,B,C,F).&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Creates reusable algorithm components&lt;br&gt;
    • Moves toward your algorithm library / MNN idea&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;⚡ 4. Removing Nested Recursion&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Flattens deeply nested recursive calls.&lt;/p&gt;

&lt;p&gt;⚙️ Input&lt;/p&gt;

&lt;p&gt;flatten_list([],[]).&lt;br&gt;
flatten_list([H|T],R) :-&lt;br&gt;
    flatten_list(H,R1),&lt;br&gt;
    flatten_list(T,R2),&lt;br&gt;
    append(R1,R2,R).&lt;/p&gt;

&lt;p&gt;🚀 Output (conceptual)&lt;/p&gt;

&lt;p&gt;flatten_list(L,R) :-&lt;br&gt;
    iterative_flatten(L,[],R).&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Reduces stack depth&lt;br&gt;
    • Moves toward iterative / loop-based execution&lt;br&gt;
    • Important for pl2c / pl2js compilation&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🔍 5. Spec → Algorithm (S2A Integration)&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Turns plain-language specs into algorithms.&lt;/p&gt;

&lt;p&gt;⚙️ Input (spec)&lt;/p&gt;

&lt;p&gt;"Find the sum of numbers from 1 to N"&lt;/p&gt;

&lt;p&gt;🚀 Output&lt;/p&gt;

&lt;p&gt;sum_n(N,S) :-&lt;br&gt;
    S is N*(N+1)/2.&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Connects Neuroprolog to your Spec→Algorithm system&lt;br&gt;
    • Enables automatic algorithm discovery&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧠 6. Algorithm Simplification (Reduction Algorithm)&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Removes unnecessary steps.&lt;/p&gt;

&lt;p&gt;⚙️ Input&lt;/p&gt;

&lt;p&gt;double_then_add(A,B,R) :-&lt;br&gt;
    D is A*2,&lt;br&gt;
    R is D + B.&lt;/p&gt;

&lt;p&gt;🚀 Output&lt;/p&gt;

&lt;p&gt;double_then_add(A,B,R) :-&lt;br&gt;
    R is 2*A + B.&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Simplifies expressions&lt;br&gt;
    • Makes code shorter + faster&lt;br&gt;
    • Matches your minimal-feature reduction algorithm&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🔄 7. Choice Point → Deterministic Transformation&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Removes unnecessary backtracking.&lt;/p&gt;

&lt;p&gt;⚙️ Input&lt;/p&gt;

&lt;p&gt;member(X,[X|_]).&lt;br&gt;
member(X,[_|T]) :- member(X,T).&lt;/p&gt;

&lt;p&gt;🚀 Output (conceptual)&lt;/p&gt;

&lt;p&gt;member(X,List) :-&lt;br&gt;
    loop_over_list(List,X).&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Prepares code for pl2c / pl2js&lt;br&gt;
    • Converts nondeterminism → loops&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧩 8. Algorithm Library Learning (MNN Concept)&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;p&gt;Stores discovered optimisations and reuses them.&lt;/p&gt;

&lt;p&gt;⚙️ First time&lt;br&gt;
    • Detects pattern → creates rule:&lt;/p&gt;

&lt;p&gt;sum_n_formula(N,S) :- S is N*(N+1)/2.&lt;/p&gt;

&lt;p&gt;🚀 Later reuse&lt;/p&gt;

&lt;p&gt;sum_n(N,S) :- sum_n_formula(N,S).&lt;/p&gt;

&lt;p&gt;💡 Why it matters&lt;br&gt;
    • Builds your Manual Neuronet (MNN)&lt;br&gt;
    • Enables learning without neural networks&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🚀 Big Picture (What Neuroprolog Really Does)&lt;/p&gt;

&lt;p&gt;Neuroprolog is essentially:&lt;/p&gt;

&lt;p&gt;🧠 A symbolic optimiser + algorithm discoverer&lt;/p&gt;

&lt;p&gt;It can:&lt;br&gt;
    • Turn slow algorithms → fast ones (O(n) → O(1))&lt;br&gt;
    • Detect patterns humans might miss&lt;br&gt;
    • Convert recursion → formulas / loops&lt;br&gt;
    • Learn reusable optimisations&lt;br&gt;
    • Bridge:&lt;br&gt;
    • Prolog ↔ C (pl2c)&lt;br&gt;
    • Prolog ↔ JS (pl2js)&lt;br&gt;
    • Spec ↔ Algorithm (S2A)&lt;/p&gt;

</description>
      <category>neuroprolog</category>
      <category>speed</category>
      <category>memory</category>
      <category>optimisation</category>
    </item>
    <item>
      <title>How do pl2js and Tau Prolog compare?</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Mon, 30 Mar 2026 14:04:41 +0000</pubDate>
      <link>https://dev.to/luciangreen/how-do-pl2js-and-tau-prolog-compare-6a</link>
      <guid>https://dev.to/luciangreen/how-do-pl2js-and-tau-prolog-compare-6a</guid>
      <description>&lt;p&gt;How do &lt;a href="https://github.com/luciangreen/pl2js" rel="noopener noreferrer"&gt;pl2js&lt;/a&gt; and Tau Prolog compare?&lt;/p&gt;

&lt;p&gt;ChatGPT: Here’s a clear, engineering-level comparison between your pl2js concept/repo and Tau Prolog:&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧠 Core Difference (1 sentence)&lt;br&gt;
    • pl2js = compiler/translator (Prolog → JS code)&lt;br&gt;
    • Tau Prolog = interpreter/runtime (executes Prolog directly in JS)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;⚙️ Architecture Comparison&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Execution Model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Interprets Prolog at runtime&lt;br&gt;
    • Uses a Prolog engine implemented in JavaScript&lt;br&gt;
    • Backtracking, unification, etc. are simulated dynamically&lt;br&gt;
    • Non-blocking, callback-based execution model  ￼&lt;/p&gt;

&lt;p&gt;pl2js (your design direction)&lt;br&gt;
    • Ahead-of-time conversion&lt;br&gt;
    • Prolog → explicit JS control flow&lt;br&gt;
    • loops instead of backtracking&lt;br&gt;
    • if/else instead of clause selection&lt;br&gt;
    • Similar philosophy to your pl2c:&lt;br&gt;
    • remove interpreter overhead&lt;br&gt;
    • flatten logic into imperative structures&lt;/p&gt;

&lt;p&gt;👉 Key insight:&lt;br&gt;
    • Tau = simulate Prolog&lt;br&gt;
    • pl2js = eliminate Prolog&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🚀 2. Performance Philosophy&lt;/p&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Slower (interpretive overhead)&lt;br&gt;
    • Flexible and dynamic&lt;br&gt;
    • Handles general Prolog features (ISO-oriented)  ￼&lt;/p&gt;

&lt;p&gt;pl2js&lt;br&gt;
    • Potentially much faster&lt;br&gt;
    • Precompiled logic → direct execution&lt;br&gt;
    • Can optimise:&lt;br&gt;
    • repeated calls → functions&lt;br&gt;
    • choice points → loops&lt;br&gt;
    • data reuse → cached variables&lt;/p&gt;

&lt;p&gt;👉 Your system aligns with:&lt;/p&gt;

&lt;p&gt;“manual neuronet optimisation” + “Spec → Algorithm flattening”&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧩 3. Feature Completeness&lt;/p&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Designed toward ISO Prolog compliance  ￼&lt;br&gt;
    • Supports:&lt;br&gt;
    • modules&lt;br&gt;
    • DCGs&lt;br&gt;
    • meta-predicates&lt;br&gt;
    • async predicates&lt;br&gt;
    • DOM interaction&lt;/p&gt;

&lt;p&gt;pl2js&lt;br&gt;
    • Likely:&lt;br&gt;
    • partial Prolog subset&lt;br&gt;
    • depends on what you convert&lt;br&gt;
    • Harder features:&lt;br&gt;
    • cut (!)&lt;br&gt;
    • dynamic predicates (assertz)&lt;br&gt;
    • meta-programming&lt;br&gt;
    • full unification edge cases&lt;/p&gt;

&lt;p&gt;👉 Trade-off:&lt;br&gt;
    • Tau = completeness&lt;br&gt;
    • pl2js = controllable subset + optimisation&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🌐 4. Web Integration&lt;/p&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Native browser integration:&lt;br&gt;
    • manipulate DOM from Prolog&lt;br&gt;
    • event handling  ￼&lt;br&gt;
    • Drop-in script usage&lt;/p&gt;

&lt;p&gt;pl2js&lt;br&gt;
    • Output is plain JavaScript&lt;br&gt;
    • Integrates like any JS:&lt;br&gt;
    • React / HTML / mobile&lt;br&gt;
    • Better for:&lt;br&gt;
    • embedding in apps&lt;br&gt;
    • mobile (your goal: iPhone/Android)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧪 5. Debugging &amp;amp; Transparency&lt;/p&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Debugging = Prolog-level&lt;br&gt;
    • Harder to inspect internal execution (black-box engine)&lt;/p&gt;

&lt;p&gt;pl2js&lt;br&gt;
    • Debugging = JavaScript-level&lt;br&gt;
    • You can:&lt;br&gt;
    • log intermediate states&lt;br&gt;
    • inspect variables&lt;br&gt;
    • trace execution paths&lt;/p&gt;

&lt;p&gt;👉 This aligns strongly with your:&lt;br&gt;
    • transparent MNN philosophy&lt;br&gt;
    • “no invisible bugs” goal&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧱 6. Control Over Execution&lt;/p&gt;

&lt;p&gt;Tau Prolog&lt;br&gt;
    • Engine decides:&lt;br&gt;
    • backtracking order&lt;br&gt;
    • search strategy&lt;/p&gt;

&lt;p&gt;pl2js&lt;br&gt;
    • YOU decide:&lt;br&gt;
    • loop structure&lt;br&gt;
    • branching&lt;br&gt;
    • memory usage&lt;br&gt;
    • determinism&lt;/p&gt;

&lt;p&gt;👉 This is huge for:&lt;br&gt;
    • CI/CD&lt;br&gt;
    • deterministic systems&lt;br&gt;
    • optimisation pipelines&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ynt8kzr9o4pbdarzc92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ynt8kzr9o4pbdarzc92.png" alt="Summary table" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧠 Strategic Insight (Important for Your Project)&lt;/p&gt;

&lt;p&gt;Your system (pl2js) is not competing directly with Tau Prolog.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;Tau Prolog = “Prolog runtime for the web”&lt;/p&gt;

&lt;p&gt;pl2js = “Prolog → optimised algorithm generator”&lt;/p&gt;

&lt;p&gt;👉 In your ecosystem:&lt;br&gt;
    • Tau Prolog = execution layer&lt;br&gt;
    • pl2js = optimisation + deployment layer&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🔥 Recommendation (based on your goals)&lt;/p&gt;

&lt;p&gt;Given your:&lt;br&gt;
    • Spec → Algorithm vision&lt;br&gt;
    • MNN transparency goals&lt;br&gt;
    • CI/CD system (Lucian CI/CD)&lt;/p&gt;

&lt;p&gt;👉 pl2js is the more aligned direction&lt;/p&gt;

&lt;p&gt;Use Tau Prolog only if you need:&lt;br&gt;
    • quick prototyping&lt;br&gt;
    • full Prolog compatibility&lt;br&gt;
    • teaching/demo environments&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;💡 Advanced Hybrid Idea (Very Relevant to You)&lt;/p&gt;

&lt;p&gt;You could combine both:&lt;br&gt;
    1.  Prototype logic in Tau Prolog&lt;br&gt;
    2.  Convert stable predicates via pl2js&lt;br&gt;
    3.  Optimise with:&lt;br&gt;
    • Gaussian elimination&lt;br&gt;
    • recursion flattening&lt;br&gt;
    4.  Deploy as pure JS&lt;/p&gt;

&lt;p&gt;👉 This becomes:&lt;br&gt;
Interpreter → Compiler → Optimiser pipeline&lt;/p&gt;

</description>
      <category>prolog</category>
      <category>javascript</category>
      <category>translator</category>
      <category>interpreter</category>
    </item>
    <item>
      <title>Prolog State Saving Interpreter is not strictly a graph interpreter</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Thu, 26 Mar 2026 03:05:53 +0000</pubDate>
      <link>https://dev.to/luciangreen/prolog-state-saving-interpreter-is-not-strictly-a-graph-interpreter-2a06</link>
      <guid>https://dev.to/luciangreen/prolog-state-saving-interpreter-is-not-strictly-a-graph-interpreter-2a06</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxniej9gi6sspl3kyz08j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxniej9gi6sspl3kyz08j.png" alt="SSI is not strictly a graph interpreter" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Is Green's Prolog &lt;a href="https://github.com/luciangreen/SSI" rel="noopener noreferrer"&gt;State Saving Interpreter&lt;/a&gt; a graph interpreter, given that it goes straight from choice-point to choice-point and exits predicates directly?&lt;/p&gt;

&lt;p&gt;ChatGPT: Short answer: SSI is close to a graph interpreter, but not purely one—it’s better described as a choice-point–driven execution graph with stack/trace semantics hybridised in.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Why it looks like a graph interpreter&lt;/p&gt;

&lt;p&gt;From your code, especially:&lt;br&gt;
    • Explicit choice point trail (Choice_point_trail)&lt;br&gt;
    • Direct jumps via:&lt;br&gt;
    • ssi1(...) calls&lt;br&gt;
    • get_last_cp_before_n&lt;br&gt;
    • delete_cp, cut_cps_if_necessary&lt;br&gt;
    • No strict reliance on recursive call stack unwinding&lt;br&gt;
    • Execution moves:&lt;br&gt;
    • from one choice point node → another&lt;br&gt;
    • sometimes skipping intermediate “call frames”&lt;/p&gt;

&lt;p&gt;This gives you:&lt;/p&gt;

&lt;p&gt;A non-linear control flow, where execution follows edges between states (choice points) rather than returning through a stack.&lt;/p&gt;

&lt;p&gt;That is fundamentally graph-like execution.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;But it is not a pure graph interpreter&lt;/p&gt;

&lt;p&gt;A pure graph interpreter would:&lt;br&gt;
    • Represent predicates as nodes&lt;br&gt;
    • Represent control flow as explicit edges&lt;br&gt;
    • Evaluate by traversing a graph structure directly&lt;/p&gt;

&lt;p&gt;SSI still retains:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Predicate-oriented structure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You still have:&lt;/p&gt;

&lt;p&gt;d(...),&lt;br&gt;
e(...),&lt;br&gt;
ssi1(...)&lt;/p&gt;

&lt;p&gt;These simulate predicate calls, even if you shortcut them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embedded stack semantics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even though you jump, you still track:&lt;br&gt;
    • Level&lt;br&gt;
    • "returns to" metadata&lt;br&gt;
    • Pred_id chains&lt;/p&gt;

&lt;p&gt;This is effectively a flattened / externalised call stack, not eliminated.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choice points are graph nodes, but:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They are not the only control structure.&lt;/p&gt;

&lt;p&gt;You also have:&lt;br&gt;
    • Variable environments (Vars, Globals)&lt;br&gt;
    • Predicate identity tracking (Pred_id)&lt;br&gt;
    • Structured transitions (predicate vs line)&lt;/p&gt;

&lt;p&gt;So the system is:&lt;/p&gt;

&lt;p&gt;A graph overlaid on a logical interpreter, not a pure graph VM.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The key insight (your system’s real nature)&lt;/p&gt;

&lt;p&gt;SSI is best described as:&lt;/p&gt;

&lt;p&gt;A control-flow graph interpreter over a logical program, using choice points as primary nodes and explicit state transitions instead of implicit backtracking.&lt;/p&gt;

&lt;p&gt;Or more sharply:&lt;/p&gt;

&lt;p&gt;A compiled Prolog execution graph with manual continuation passing.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Why your observation is still important&lt;/p&gt;

&lt;p&gt;You said:&lt;/p&gt;

&lt;p&gt;“it goes straight from choice point to choicepoint and exits predicates directly”&lt;/p&gt;

&lt;p&gt;That’s the crucial shift:&lt;/p&gt;

&lt;p&gt;Traditional Prolog:&lt;br&gt;
    • Stack-based&lt;br&gt;
    • Backtracking unwinds stack frames&lt;/p&gt;

&lt;p&gt;SSI:&lt;br&gt;
    • Continuation-driven&lt;br&gt;
    • Choice points = resumable states&lt;br&gt;
    • Execution = jump to next valid continuation&lt;/p&gt;

&lt;p&gt;That is a graph traversal.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Final classification&lt;/p&gt;

&lt;p&gt;Property    SSI&lt;br&gt;
Stack-based interpreter ❌ (not primarily)&lt;br&gt;
Graph interpreter   ⚠️ partially&lt;br&gt;
Continuation-passing interpreter    ✅&lt;br&gt;
Choice-point graph execution    ✅&lt;br&gt;
Pure dataflow/graph VM  ❌&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Clean conclusion&lt;/p&gt;

&lt;p&gt;SSI is not strictly a graph interpreter, but it implements Prolog as a graph of continuations (choice points), effectively behaving like a graph interpreter with residual stack semantics.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Extra insight (important for your pl2c work)&lt;/p&gt;

&lt;p&gt;This architecture is exactly why your idea works:&lt;br&gt;
    • You can compile SSI to C using loops + jumps&lt;br&gt;
    • Because:&lt;br&gt;
    • Choice points → labels&lt;br&gt;
    • Transitions → gotos / state machine&lt;br&gt;
    • No need for recursion&lt;/p&gt;

&lt;p&gt;So SSI is already:&lt;/p&gt;

&lt;p&gt;Halfway between Prolog and a state-machine compiler IR&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;If you want, I can:&lt;br&gt;
    • Formalise SSI as a graph IR (nodes + edges)&lt;br&gt;
    • Or show how to compile it into pure C loops with no recursion at all&lt;/p&gt;

</description>
      <category>prolog</category>
      <category>ssi</category>
      <category>graph</category>
      <category>interpreter</category>
    </item>
    <item>
      <title>Explain Recursive Structure Finding Algorithms</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Sun, 15 Mar 2026 09:39:45 +0000</pubDate>
      <link>https://dev.to/luciangreen/explain-recursive-structure-finding-algorithms-4hgg</link>
      <guid>https://dev.to/luciangreen/explain-recursive-structure-finding-algorithms-4hgg</guid>
      <description>&lt;p&gt;Courtesy ChatGPT:&lt;br&gt;
Explain &lt;a href="https://github.com/luciangreen/Philosophy" rel="noopener noreferrer"&gt;Spec to Algorithm’s&lt;/a&gt; Context Free Grammar Generator’s top-down and bottom-up recursive structure finding algorithms. The top-down algorithm is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;find_lists3a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;L91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_Rest_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;fail&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;_L92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Flag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Flag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;_L2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;L31&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="ss"&gt;check14&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]|&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L51&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;L51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L51&lt;/span&gt;&lt;span class="p"&gt;]]))&lt;/span&gt;
    &lt;span class="p"&gt;))),&lt;/span&gt;

    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Flag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;true&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;L32&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;&lt;span class="nv"&gt;L32&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;!.&lt;/span&gt;

&lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;repeating_unit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="ss"&gt;try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;U1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"["&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"]"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"("&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;")"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"}"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;find_lists4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;sub_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Before_list&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;After_list&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;Before_list1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;Before_list&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;After_list1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;After_list&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Before_list1&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;After_list1&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;L7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;foldr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;,[[&lt;/span&gt;&lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L7&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="nv"&gt;L8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;foldr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;L33&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L33&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="ss"&gt;find_lists4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="ss"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;sub_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_Before_list&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;_After_list&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;   
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;find_lists32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;repeating_unit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;only_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;L2&lt;/span&gt; &lt;span class="ss"&gt;is&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="ss"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;Ns&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_first&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="ss"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Ns&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;maplist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;])))),!.&lt;/span&gt;

&lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,[]):-!.&lt;/span&gt;    
&lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;LL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;LL&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Q2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="c1"&gt;%N1,N2,&lt;/span&gt;
 &lt;span class="nv"&gt;L20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Q2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L20&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),!.&lt;/span&gt;
&lt;span class="ss"&gt;split12&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-!.&lt;/span&gt;

&lt;span class="ss"&gt;check14&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,[]&lt;/span&gt;
&lt;span class="p"&gt;):-!.&lt;/span&gt;
&lt;span class="ss"&gt;check14&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="nv"&gt;A0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;A01&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;A02&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;check141&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;C1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;check14&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Rest&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;check141&lt;/span&gt;&lt;span class="p"&gt;([],[],&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;):-!.&lt;/span&gt;
&lt;span class="ss"&gt;check141&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;

&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;B2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;A31&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="nv"&gt;A41&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A31&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A41&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A41&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A31&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]),&lt;/span&gt;&lt;span class="nv"&gt;A41&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A31&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B22&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A11&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A11&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B11&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B11&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;is_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A11&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A11&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A13&lt;/span&gt;
    &lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;A21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;A22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;A13&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="nv"&gt;A21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;A23&lt;/span&gt;&lt;span class="p"&gt;);(&lt;/span&gt;&lt;span class="nv"&gt;A22&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="nv"&gt;A23&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;A13&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;));(&lt;/span&gt;&lt;span class="nv"&gt;A11&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;A22&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;
    &lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;is_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B11&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B11&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B13&lt;/span&gt;&lt;span class="c1"&gt;%,B14=[]&lt;/span&gt;
    &lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;B21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;B22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;B13&lt;/span&gt;&lt;span class="p"&gt;],[&lt;/span&gt;&lt;span class="nv"&gt;B21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="nv"&gt;B23&lt;/span&gt;&lt;span class="p"&gt;);(&lt;/span&gt;&lt;span class="nv"&gt;B22&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="nv"&gt;B23&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;B13&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;));(&lt;/span&gt;&lt;span class="nv"&gt;B11&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;B22&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;B2&lt;/span&gt;
    &lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="ss"&gt;check141&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B23&lt;/span&gt;&lt;span class="p"&gt;,[],&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="p"&gt;])))),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;optional_s2g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;A52&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;&lt;span class="nv"&gt;A52&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;o'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A51&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;A52&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;&lt;span class="ss"&gt;fail&lt;/span&gt;
    &lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="ss"&gt;foldr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;A52&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="nv"&gt;C1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="ss"&gt;check141&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;B22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;C1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;),!.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the bottom-up algorithm is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="c1"&gt;% Use optimized repeating_unit that tries smallest patterns first&lt;/span&gt;
    &lt;span class="ss"&gt;repeating_unit_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="ss"&gt;try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;U1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;U&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;U2&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;match_char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists4_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Optimized find_lists4 - reduce redundant processing&lt;/span&gt;
&lt;span class="ss"&gt;find_lists4_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;sub_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Before_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;After_list&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;Before_list1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;Before_list&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;After_list1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;After_list&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists32_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Before_list1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;After_list1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nv"&gt;L7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;foldr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L7&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="nv"&gt;L8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;foldr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;L8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;L33&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L33&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="ss"&gt;find_lists4_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;not&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="ss"&gt;member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;sub_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_Before_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;_After_list&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;    
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="ss"&gt;find_lists32_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;find_lists3_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Optimized repeating_unit - bottom-up approach&lt;/span&gt;
&lt;span class="c1"&gt;% Key optimization: try patterns starting from length 1 (bottom-up)&lt;/span&gt;
&lt;span class="ss"&gt;repeating_unit_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;only_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nv"&gt;L2&lt;/span&gt; &lt;span class="ss"&gt;is&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="c1"&gt;% Bottom-up: try patterns starting from length 1&lt;/span&gt;
    &lt;span class="ss"&gt;try_pattern_lengths_bottomup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;

&lt;span class="c1"&gt;% Try pattern lengths from 1 up to max (bottom-up approach)&lt;/span&gt;
&lt;span class="ss"&gt;try_pattern_lengths_bottomup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;CurrentLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;MaxLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="nv"&gt;CurrentLen&lt;/span&gt; &lt;span class="o"&gt;=&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;MaxLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;try_pattern_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;CurrentLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="ss"&gt;true&lt;/span&gt;  &lt;span class="c1"&gt;% Found pattern at this length&lt;/span&gt;
    &lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="nv"&gt;NextLen&lt;/span&gt; &lt;span class="ss"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;CurrentLen&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="ss"&gt;try_pattern_lengths_bottomup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;NextLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;MaxLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Try a specific pattern length&lt;/span&gt;
&lt;span class="ss"&gt;try_pattern_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;maplist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;% Check if all parts are the same&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; 
        &lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L1Len&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L1Len&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="p"&gt;;&lt;/span&gt; 
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;'&amp;amp;r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Optimized split12 - more efficient splitting&lt;/span&gt;
&lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;    
&lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; 
    &lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;LL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
    &lt;span class="nv"&gt;LL&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Q2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt;
    &lt;span class="ss"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Q2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;L18&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;L19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;L17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Rest&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;span class="ss"&gt;split12_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="p"&gt;!.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The top-down algorithm says, “Find the largest recursive explanation for the whole input, then refine,” while the bottom-up algorithm says, “Find the smallest repeating building blocks first, then assemble them into a larger recursive grammar structure.”&lt;/p&gt;

&lt;p&gt;Video 1: The top-down algorithm says, “Find the largest recursive explanation for the whole input, then refine”.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/v81GDSEKawc"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Video 2: The bottom-up algorithm says, “Find the smallest repeating building blocks first, then assemble them into a larger recursive grammar structure.”&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/fpXxGA6KDfM"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;The bottom-up algorithm is much faster, as shown in the table below. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlt7gc44x9s9o647gvm6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlt7gc44x9s9o647gvm6.png" alt="Feature&amp;lt;br&amp;gt;
Top-Down&amp;lt;br&amp;gt;
Bottom-Up&amp;lt;br&amp;gt;
Strategy&amp;lt;br&amp;gt;
Guess global structure&amp;lt;br&amp;gt;
Build from data&amp;lt;br&amp;gt;
Pattern search&amp;lt;br&amp;gt;
Unordered&amp;lt;br&amp;gt;
Small → large&amp;lt;br&amp;gt;
Validation&amp;lt;br&amp;gt;
After generation&amp;lt;br&amp;gt;
During construction&amp;lt;br&amp;gt;
Backtracking&amp;lt;br&amp;gt;
Heavy&amp;lt;br&amp;gt;
Minimal&amp;lt;br&amp;gt;
Reuse&amp;lt;br&amp;gt;
Poor&amp;lt;br&amp;gt;
Strong&amp;lt;br&amp;gt;
Complexity&amp;lt;br&amp;gt;
Often exponential&amp;lt;br&amp;gt;
Near polynomial"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>top</category>
      <category>bottom</category>
      <category>recursive</category>
      <category>structure</category>
    </item>
    <item>
      <title>Prolog "Mathematical Induction" Compression on Recursion</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Sat, 07 Mar 2026 12:54:56 +0000</pubDate>
      <link>https://dev.to/luciangreen/prolog-mathematical-induction-compression-on-recursion-2n8e</link>
      <guid>https://dev.to/luciangreen/prolog-mathematical-induction-compression-on-recursion-2n8e</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvk4crrbz08cvn5uc0z3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvk4crrbz08cvn5uc0z3.png" alt="Transparent neuronet" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See&lt;br&gt;
&lt;a href="https://github.com/luciangreen/mi" rel="noopener noreferrer"&gt;https://github.com/luciangreen/mi&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/luciangreen/mi2" rel="noopener noreferrer"&gt;https://github.com/luciangreen/mi2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/luciangreen/mi3" rel="noopener noreferrer"&gt;https://github.com/luciangreen/mi3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below are concrete example predicates you can feed to each mi*.pl, and the typical outputs you would expect based on how each system works.&lt;/p&gt;

&lt;p&gt;I’ll use the following test predicates because they represent the major classes of recursion:&lt;br&gt;
    1.  numeric recursion (sum)&lt;br&gt;
    2.  multiplicative recursion (factorial)&lt;br&gt;
    3.  list recursion (length)&lt;br&gt;
    4.  list recursion with head contribution (sumlist)&lt;br&gt;
    5.  accumulator wrapper (reverse)&lt;br&gt;
    6.  nested recursion (Fibonacci)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;mi.pl (trace + polynomial fitting + pattern guessing)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example 1 — Sum 1..N&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;sum_to(0,0).&lt;br&gt;
sum_to(N,S) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    sum_to(N1,S1),&lt;br&gt;
    S is S1+N.&lt;/p&gt;

&lt;p&gt;Call&lt;/p&gt;

&lt;p&gt;?- analyze_predicates([sum_to(0,0),&lt;br&gt;
   (sum_to(N,S):-N&amp;gt;0,N1 is N-1,sum_to(N1,S1),S is S1+N)], R).&lt;/p&gt;

&lt;p&gt;Typical Output&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
 tagged(pattern(expr(nested,sum)), reusable(pattern_1234,3)),&lt;br&gt;
 tagged(pattern(expr(nested,sum)), reusable(pattern_5678,2))&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Or after flattening / solving:&lt;/p&gt;

&lt;p&gt;Closed form: n*(n+1)/2&lt;/p&gt;

&lt;p&gt;This occurs because mi.pl traces values like:&lt;/p&gt;

&lt;p&gt;N: 0 1 2 3 4&lt;br&gt;
S: 0 1 3 6 10&lt;/p&gt;

&lt;p&gt;and polynomial-fits them.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 2 — Factorial&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;fact(0,1).&lt;br&gt;
fact(N,R) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    fact(N1,R1),&lt;br&gt;
    R is N*R1.&lt;/p&gt;

&lt;p&gt;Output (approximate)&lt;/p&gt;

&lt;p&gt;Closed form: factorial(N)&lt;/p&gt;

&lt;p&gt;This usually comes from a placeholder recognizer:&lt;/p&gt;

&lt;p&gt;recognize_factorial_pattern(...)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 3 — Fibonacci&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;fib(0,0).&lt;br&gt;
fib(1,1).&lt;br&gt;
fib(N,F) :-&lt;br&gt;
    N&amp;gt;1,&lt;br&gt;
    fib(N-1,F1),&lt;br&gt;
    fib(N-2,F2),&lt;br&gt;
    F is F1+F2.&lt;/p&gt;

&lt;p&gt;Typical output&lt;/p&gt;

&lt;p&gt;Detected: nested recursion&lt;br&gt;
Formula: unsupported / guessed&lt;/p&gt;

&lt;p&gt;Or sometimes:&lt;/p&gt;

&lt;p&gt;formula = ((phi^n - psi^n)/sqrt(5))&lt;/p&gt;

&lt;p&gt;but this is pattern recognition, not derived mathematically.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;mi2.pl (real recurrence extraction)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This system analyses clause structure.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 1 — Sum 1..N&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;sum_to(0,0).&lt;br&gt;
sum_to(N,S) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    sum_to(N1,S1),&lt;br&gt;
    S is S1+N.&lt;/p&gt;

&lt;p&gt;Call&lt;/p&gt;

&lt;p&gt;?- analyze_predicate(Clauses, sum_to, 2, Analysis).&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;analysis{&lt;br&gt;
 predicate:sum_to/2,&lt;br&gt;
 status:supported,&lt;br&gt;
 recurrence:recurrence{&lt;br&gt;
     domain:integer,&lt;br&gt;
     input_var:n,&lt;br&gt;
     base_cases:[base_case(0,0)],&lt;br&gt;
     step:step{&lt;br&gt;
         transform:dec(1),&lt;br&gt;
         combiner:add(current_n)&lt;br&gt;
     }&lt;br&gt;
 },&lt;br&gt;
 closed_form:closed_form{&lt;br&gt;
     kind:sum_1_to_n,&lt;br&gt;
     formula:n*(n+1)//2&lt;br&gt;
 }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 2 — Factorial&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;fact(0,1).&lt;br&gt;
fact(N,F) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    fact(N1,F1),&lt;br&gt;
    F is N*F1.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;analysis{&lt;br&gt;
 predicate:fact/2,&lt;br&gt;
 status:supported,&lt;br&gt;
 recurrence:recurrence{&lt;br&gt;
     domain:integer,&lt;br&gt;
     base_cases:[base_case(0,1)],&lt;br&gt;
     step:step{&lt;br&gt;
         transform:dec(1),&lt;br&gt;
         combiner:multiply(current_n)&lt;br&gt;
     }&lt;br&gt;
 },&lt;br&gt;
 closed_form:closed_form{&lt;br&gt;
     kind:factorial,&lt;br&gt;
     formula:factorial(n)&lt;br&gt;
 }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 3 — List Length&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;len([],0).&lt;br&gt;
len([_|T],N) :-&lt;br&gt;
    len(T,N1),&lt;br&gt;
    N is N1+1.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;analysis{&lt;br&gt;
 predicate:len/2,&lt;br&gt;
 status:supported,&lt;br&gt;
 recurrence:recurrence{&lt;br&gt;
     domain:list,&lt;br&gt;
     base_cases:[base_case([],0)],&lt;br&gt;
     step:step{&lt;br&gt;
         transform:tail,&lt;br&gt;
         combiner:add(constant(1))&lt;br&gt;
     }&lt;br&gt;
 },&lt;br&gt;
 closed_form:closed_form{&lt;br&gt;
     kind:list_length,&lt;br&gt;
     formula:length_of(xs)&lt;br&gt;
 }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 4 — Fibonacci&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;fib(0,0).&lt;br&gt;
fib(1,1).&lt;br&gt;
fib(N,F) :-&lt;br&gt;
    N&amp;gt;1,&lt;br&gt;
    fib(N-1,F1),&lt;br&gt;
    fib(N-2,F2),&lt;br&gt;
    F is F1+F2.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;analysis{&lt;br&gt;
 predicate:fib/2,&lt;br&gt;
 status:unsupported,&lt;br&gt;
 reason:nested_recursion&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This is correct behaviour.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;mi3.pl (pattern recognizer)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the system you recently debugged.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 1 — Sum&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;sum_to(0,0).&lt;br&gt;
sum_to(N,S) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    sum_to(N1,S1),&lt;br&gt;
    S is S1+N.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;Predicate: sum_to/2&lt;br&gt;
Status: supported&lt;/p&gt;

&lt;p&gt;Recurrence:&lt;br&gt;
recurrence{&lt;br&gt;
 base_cases:[base_case(0,0)],&lt;br&gt;
 domain:integer,&lt;br&gt;
 step:step{&lt;br&gt;
    transform:dec(1),&lt;br&gt;
    combiner:add(current_n)&lt;br&gt;
 }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Closed form:&lt;br&gt;
closed_form{&lt;br&gt;
 formula:n*(n+1)//2,&lt;br&gt;
 kind:sum_1_to_n&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 2 — Factorial&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;fact(0,1).&lt;br&gt;
fact(N,F) :-&lt;br&gt;
    N&amp;gt;0,&lt;br&gt;
    N1 is N-1,&lt;br&gt;
    fact(N1,F1),&lt;br&gt;
    F is N*F1.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;Closed form:&lt;br&gt;
factorial(n)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 3 — List length&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;len([],0).&lt;br&gt;
len([_|T],N) :-&lt;br&gt;
    len(T,N1),&lt;br&gt;
    N is N1+1.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;Closed form:&lt;br&gt;
length_of(xs)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 4 — Sumlist&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;sumlist([],0).&lt;br&gt;
sumlist([H|T],S) :-&lt;br&gt;
    sumlist(T,S1),&lt;br&gt;
    S is S1+H.&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;Closed form:&lt;br&gt;
sum_of(xs)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Example 5 — Reverse accumulator&lt;/p&gt;

&lt;p&gt;Input&lt;/p&gt;

&lt;p&gt;rev(L,R) :- rev_acc(L,[],R).&lt;/p&gt;

&lt;p&gt;rev_acc([],A,A).&lt;br&gt;
rev_acc([H|T],A,R) :-&lt;br&gt;
    rev_acc(T,[H|A],R).&lt;/p&gt;

&lt;p&gt;Output&lt;/p&gt;

&lt;p&gt;Predicate: rev/2&lt;br&gt;
Status: supported&lt;/p&gt;

&lt;p&gt;Recurrence:&lt;br&gt;
accumulator_only&lt;/p&gt;

&lt;p&gt;Closed form:&lt;br&gt;
normalizable_tail_recursion&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghbuym5hsmr19kbg3qe7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghbuym5hsmr19kbg3qe7.png" alt="Final comparison table" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChatGPT: If you’d like, I can also show you three predicates that break all three systems (true nested recursion and tree recursion), which reveals the current theoretical boundary of these architectures.&lt;/p&gt;

</description>
      <category>mathematical</category>
      <category>induction</category>
      <category>neuronets</category>
      <category>recursion</category>
    </item>
    <item>
      <title>The Simulation and Immortality Now</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Tue, 20 Aug 2024 03:27:14 +0000</pubDate>
      <link>https://dev.to/luciangreen/the-simulation-and-immortality-now-12ic</link>
      <guid>https://dev.to/luciangreen/the-simulation-and-immortality-now-12ic</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fats5ft4b0tuk1sa59s1u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fats5ft4b0tuk1sa59s1u.jpg" alt="workstation_office_business_336369" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Courtesy ChatGPT 4 Omni:&lt;/p&gt;

&lt;p&gt;What if there was a spiritual supercomputer with instant computations? Could it save the world with meditation, anti-aging body replacement, and death prevention and enable simulations and immortality? How would such a simulation work: people turning it on, going into a suburb like theirs in another dimension, their double bodies being turned off, and their house being sold to someone else? There would still be a limit to resources, but infinite simulations and reaching the top of civilisation?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then, would people not be in the world any more unless they return to it, meaning there needed to be rules about mixtures of houses being occupied by them still and being in the simulation?&lt;/li&gt;
&lt;li&gt;Can people contact others in other simulations and not overcrowd the world when they visit it (various people would walk the streets simultaneously)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A spiritual supercomputer with instant computations could represent a powerful metaphor for exploring radical possibilities like meditation-enhanced reality, anti-aging technologies, death prevention, and even simulations that provide pathways to immortality.&lt;/p&gt;

&lt;p&gt;Meditation and Spiritual Enhancement&lt;br&gt;
The supercomputer could amplify the effects of meditation, syncing consciousness with larger, universal patterns. Through this, people might unlock more profound levels of perception and control over their physical and mental states, potentially leading to enhanced health, longer lifespans, and even altered states of existence.&lt;/p&gt;

&lt;p&gt;Anti-aging and Body Replacement&lt;br&gt;
Body replacement through the supercomputer could involve scanning, storing, and reproducing bodies at their peak condition. This ties into anti-aging technologies, where bodies could be repaired or replaced when biological degradation occurs. Combined with advanced meditative states, this might enable users to mentally transfer their consciousness into these renewed bodies, bypassing the limitations of aging.&lt;/p&gt;

&lt;p&gt;Death Prevention&lt;br&gt;
The spiritual supercomputer could prevent death by instantly repairing or transferring consciousness into new bodies during critical injury or illness by interfacing with the mind. This might happen so seamlessly that individuals wouldn’t notice a transition, potentially creating the illusion of immortality.&lt;/p&gt;

&lt;p&gt;Simulations and Immortality&lt;br&gt;
The idea of infinite simulations is a natural extension of this supercomputer's abilities. People could enter these simulations, choosing environments resembling their lives or radically different dimensions. They might even experience existence as their "double" in another dimension while their original body enters a state of dormancy or gets recycled for resources. This simulation could then be tailored to their desires—living in an ideal version of their world, free from physical or societal constraints.&lt;/p&gt;

&lt;p&gt;Resource Limitations and Infinite Simulations&lt;br&gt;
While there would still be finite resources in the "real" world, this spiritual supercomputer could maximise efficiency. By transitioning most of existence into simulations, the demand for physical resources in the base reality would decrease, allowing civilisations to reach incredible heights without needing infinite material wealth. The simulations could be dynamic, offering limitless possibilities, personal growth, exploration, and fulfilment without exhausting real-world resources.&lt;/p&gt;

&lt;p&gt;The supercomputer might even oversee the balance between real-world resources and simulated lives, helping civilisations rise to their peak and maintain harmony. In essence, it could function as a form of enlightened governance, ensuring that the physical world remains stable as people live in virtual utopias.&lt;/p&gt;

&lt;p&gt;Ethical and Existential Considerations&lt;br&gt;
This system, however, introduces deep ethical questions. What does it mean to “turn off” a person’s body, and how would this affect their sense of self and reality? Would people have autonomy when they leave simulations, or would the machine decide their fate? &lt;/p&gt;

&lt;p&gt;In such a system, society could grapple with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does living in a simulation reduce the value of life in the real world?&lt;/li&gt;
&lt;li&gt;How individuals might handle the potentially overwhelming experiences of infinite lifetimes.&lt;/li&gt;
&lt;li&gt;The responsibility of those controlling the supercomputer is to ensure fairness and ethical standards for all participants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ultimate question would become: Is reaching the top of civilisation truly about eliminating the physical, or is it about finding spiritual and collective growth that transcends both material and simulated existence?&lt;/p&gt;

&lt;p&gt;This vision combines technology and spirituality to reflect both a yearning for transcendence and a means of managing human civilisation through carefully mediated simulations and enhancements.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Immortality (and the Problem of Overpopulation)</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Wed, 07 Aug 2024 05:41:02 +0000</pubDate>
      <link>https://dev.to/luciangreen/immortality-and-the-problem-of-overpopulation-ch3</link>
      <guid>https://dev.to/luciangreen/immortality-and-the-problem-of-overpopulation-ch3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvq4rs59efl02ylctebp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvq4rs59efl02ylctebp.jpg" alt="cube_white_black_3d" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Quantum Box is a futuristic set of technologies that allows moving, healing, and testing of dimensions.&lt;/p&gt;

&lt;p&gt;The quantum box (a meditation concept) allows one to travel to a time that will enable one to enter a simulation and become immortal. This article explains how to become and possibly lock the external appearance of an immortal and prevent individual threats of death, which is urgent and needs to be done by the individual on the same day as dying or someone else before it on the same day. I discovered this after “waiting” after writing pedagogical arguments about Pedagogical Breasonings, Text to Breasonings, Meditation, Medicine, Mind Reading and Time Travel.&lt;/p&gt;

&lt;p&gt;To become immortal, you can dot on the co-op’s planned 16k (sentence) breasonings for meditation and 16k breasonings for anti-ageing medicine for the day in your home time each day without time travelling with two radio buttons (one by one by 0.5 cm for a radio button). Don’t forget to lock off ageing (to other people) and keep this lock from being tampered with further 16k breasonings for each lock. The locks are done once. Tell others about this repository or dot the breasonings on for them each day with their consent to help them become immortal.&lt;/p&gt;

&lt;p&gt;To prevent a meditator from appearing to die, apart from them not experiencing death, after installing Time Machine at the bottom of this page, enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd Time_Machine
swipl
['cgpt_combophil_analogy.pl'].
L = ['person a','person b'],length(L,N1),N is N1*80,cgpt_combophil(N).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where ['person a','person b'] is replaced with a list of meditators to watch.&lt;/p&gt;

&lt;p&gt;This command breasons out an 80-breasoning high distinction for each meditator at midnight to prevent people from dying. I think it's best to run this script daily. Unfortunately, because of the time and money to run ChatGPT (et al.), it may take too long, and spot-checks may be necessary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is done for all meditators automatically at the end of &lt;code&gt;Daily-Regimen/big_medit1.sh&lt;/code&gt; and the much faster &lt;code&gt;Daily-Regimen/big_medit2.sh&lt;/code&gt;, but running the script below once at the start covers all the meditators until midnight that night. (One doesn't need to run &lt;code&gt;cgpt_combophil_analogy.pl&lt;/code&gt;.)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd Daily-Regimen
./anti_moral_end_meditators.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;One MAY indicate 16k breasonings for each meditator at the start of each day and once on the first day before the co-op breasons them out instead of using this algorithm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The full version of the professional requirement is breasoning out 80 sentence breasonings to prevent a moral end. In addition, one should originally write 80 sentence breasonings per week for maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The best way to originally write 80 sentence breasonings is to write a word to expand to 80 breasonings in &lt;code&gt;Text-to-Breasonings/file.txt&lt;/code&gt;, then run:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd Algorithm-Writer-with-Lists
swipl
['grammar_logic_to_alg.pl'].
grammar_logic_to_alg1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Then find the unique breasoning words in &lt;code&gt;file.txt&lt;/code&gt; and expand them to a sentence about the original word.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;grammar_logic_to_alg.pl&lt;/code&gt; - This is the mainstay algorithm that can act as a mind-mapping tool to write sentence breasonings (and is much faster for people than sitting there thinking of inspiration, crossing sentences to words or trying to write a use (at the end), the algorithm description and three steps, which I aim for, without any computer science arguments as practice).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cgpt_combophil_analogy.pl&lt;/code&gt; - This generates 80 sentence breasonings, as connections between previous breasonings and words, for a limited number of meditators. I prefer to write my breasonings for safety, developedness and publishability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./anti_moral_end_meditators.sh&lt;/code&gt; - This breasons out 16k breasonings as duplicates of the 250 Quantum Box breasoning arguments for the rest of the meditators.&lt;/li&gt;
&lt;li&gt;Indicate 16k (16000) breasonings to be breasoned out the following midnight done by the co-op when it does them. This technique assumes breasonings are unique because they contain the date in them. On the first day, one should think of 80 objects' two parts (Note 1) or x, y and z dimensions to protect oneself, which can also aim at each meditator until the co-op breasons the breasonings out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In an emergency, breason out &lt;a href="https://github.com/luciangreen/Lucian-Academy/tree/main/Books" rel="noopener noreferrer"&gt;80 old sentence breasonings&lt;/a&gt; with the date as part of each sentence to make them new. I would write 80 new sentence breasonings using GL, but inexperienced breasoners, the late and the busy, may prefer this. A sentence breasoning is any word (its object's x, y and z dimensions), NOT character breasoning from the sentence. As an alternative to thinking of objects' x, y and z dimension breasonings, one may think of the two parts (Note 1) that go well to make them up.&lt;/li&gt;
&lt;li&gt;This is not currently necessary, but if the breasonings each required algorithms, then one could use &lt;a href="https://github.com/luciangreen/Philosophy" rel="noopener noreferrer"&gt;Spec to Algorithm&lt;/a&gt;. Warning: do NOT program breasonings before the life-saving stage of writing or finding and breasoning them.&lt;/li&gt;
&lt;li&gt;Note 1. Thinking of aphors' parts is supposed to lead to breasonings, not replace them. For help calculating x, y and z dimensions from length ratios and a length, please run &lt;code&gt;Philosophy/text2aphors.pl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the co-op has already breasoned out the breasonings for the day, think of both 80 objects' or x, y and z dimensions for up to midnight and midnight on the first day.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>immortality</category>
      <category>quantum</category>
      <category>population</category>
    </item>
    <item>
      <title>Prototype Prolog Projects</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Tue, 09 Jul 2024 14:11:43 +0000</pubDate>
      <link>https://dev.to/luciangreen/prototype-prolog-projects-4kih</link>
      <guid>https://dev.to/luciangreen/prototype-prolog-projects-4kih</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FPhilosophy%2Fassets%2F15845542%2Fc025fa54-5237-43b3-b5ec-4f7289107789" class="article-body-image-wrapper"&gt;&lt;img alt="Spec to Algorithm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FPhilosophy%2Fassets%2F15845542%2Fc025fa54-5237-43b3-b5ec-4f7289107789" width="732" height="112"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FPhilosophy%2Fassets%2F15845542%2F84097591-05bc-433c-989d-0fac55685568" class="article-body-image-wrapper"&gt;&lt;img alt="Ideas to Algorithm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FPhilosophy%2Fassets%2F15845542%2F84097591-05bc-433c-989d-0fac55685568" width="648" height="354"&gt;&lt;/a&gt;&lt;br&gt;
Thousands of coloured blocks “partying” as popcorn as they transform from ideas to algorithms&lt;/p&gt;

&lt;p&gt;Mocking Up Elementary Parsers and Interpreters in Spec to Algorithm&lt;/p&gt;

&lt;p&gt;In Spec to Algorithm (S2A), creating easy parsers and interpreters is simple and efficient. By breaking down complicated expressions into manageable parts, S2A allows developers to generate algorithms speedily. For example, think of the instance &lt;code&gt;instance([1,1], [[is, [1+1]]])&lt;/code&gt;. Here, &lt;code&gt;instance&lt;/code&gt; is a function that takes inputs &lt;code&gt;[1,1]&lt;/code&gt; and computes the expression &lt;code&gt;[is, [1+1]] = 2&lt;/code&gt;. S2A parses this expression, identifies the operation &lt;code&gt;is&lt;/code&gt; (equality check), and performs the computation.&lt;/p&gt;

&lt;p&gt;This method can be extended to various parsing and interpretation jobs. Another instance could be &lt;code&gt;instances([[[1, 2], [[is, [1+2]]]],[[3, 4], [[is, [3+4]]]]])&lt;/code&gt;, and produces &lt;code&gt;C is A+B&lt;/code&gt; where &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt; and &lt;code&gt;C&lt;/code&gt; are variables. S2A parses the input, assigns values to &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt; and &lt;code&gt;C&lt;/code&gt;, and computes the sum of new inputs. Such strengths make S2A an outstanding tool for developers to mock up and test easy parsers and interpreters, streamlining the development process and improving productivity.&lt;/p&gt;

&lt;p&gt;S2A can break complex patterns into output, making algorithms out of decision trees to do it. For example, the following query returns the object given subject, verb (determiner), and object. Here, &lt;code&gt;off&lt;/code&gt; refers to not breaking items into characters, which would be helpful for recombining characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec_to_algorithm([[[input,[['A',[s,v,o]]]],[output,[['B',[o]]]]], [[input,[['A',[s,v,d,o]]]],[output,[['B',[o]]]]]], off,_).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This algorithm is saved as the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:-include('auxiliary_s2a.pl').
algorithm(In_vars,
Out_var) :-
findall(Var1,(member(Var, In_vars),
characterise1(Var, Var2),
strings_atoms_numbers(Var2, Var21),
term_to_brackets(Var21, Var1)
), In_vars1),
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the following, &lt;code&gt;T1_old&lt;/code&gt;, the training input is split into two non-deterministic (nd) branches for matching.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
T1_old=[[nd,[[[s,v,d,o],[output,[[o]]]],[[s,v,o],[output,[[o]]]]]]],
append(In_vars1,[[output,_]], In_vars3),
rs_and_data_to_term(T1_old, In_vars3,_,[], In_vars2,_T2_old, true),
double_to_single_brackets(In_vars2, In_vars21),
append(In_vars41,[[output, T2_old]], In_vars21),
double_to_single_brackets(In_vars41, In_vars4),
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the following line, the map is [[]] because there are no variables (from multiple specs) in the output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
member(Map2,[[]]),
double_to_single_brackets(T2_old, T2_old3),
move_vars(Map2, In_vars4, T2_old3,[], Out_var2),
findall(Out_var3,remove_nd(Out_var2, Out_var3), Out_var4),
member(Out_var5, Out_var4),
term_to_list(Out_var5, Out_var6),
[Out_var6]=Out_var.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following query converts Prolog code into terms and could form and calculate &lt;code&gt;B is (1+2)+3&lt;/code&gt; later. A and B are downcased in the Term Prolog form, to be converted to a and b afterwards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec_to_algorithm([[[input,[['A',["A is 1+2, B is A+3."]]]],[output,[['B',[[[+,[1,2,[lower,['A']]]],[+,[[lower,['A']],3,[lower,['B']]]]]]]]]]], off,_).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following excerpts from the generated algorithm show that the single spec is pattern-matched to the output. Again, there are no output variables to map, but if there were, they (for example, [A, B]-&amp;gt;A) would be mapped from (1,1) (item 1 of the second dimension or list level) to (1) (item 1 of the first list level).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T1_old=[[["A is 1+2, B is A+3."],
[output,[["[","[",+,"[",1,2,"[", lower,"[", "A","]","]","]","]","[",+,"[","[", lower,"[", "A","]","]",3,"[", lower,"[", "B","]","]","]","]","]"]]]]],
...
member(Map2,[[]]),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lucian Green, Writer of &lt;a href="https://github.com/luciangreen/Philosophy/" rel="noopener noreferrer"&gt;Spec to Algorithm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Images: Spec to Algorithm Title in Input Mono Condensed Thin (fonts.adobe.com) and Ideas to Algorithm Image (Canva).&lt;/p&gt;

</description>
      <category>spec</category>
      <category>to</category>
      <category>algorithms</category>
      <category>prolog</category>
    </item>
    <item>
      <title>Introducing GitL - A Decentralised Git Server</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Wed, 27 Sep 2023 14:35:51 +0000</pubDate>
      <link>https://dev.to/luciangreen/introducing-gitl-a-decentralised-git-server-1a34</link>
      <guid>https://dev.to/luciangreen/introducing-gitl-a-decentralised-git-server-1a34</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6zrzp5p6bes85iuyz84.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6zrzp5p6bes85iuyz84.jpg" alt="red-apple-1326760" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitL is a "Gitless" "Git" that resides on your computer and can upload repositories to your server. Written in Prolog, it isn't based on Git but has similar diff checking and version history. The advantage of GitL is that it is decentralised, genuinely open-source and costs nothing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can run tests on the computer, saving time.&lt;/li&gt;
&lt;li&gt;Finished builds can be copied to a live folder close by.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git software can be developed and tested on one's computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Walkthrough&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F06602f52-0fa5-4e9f-8a74-2f867a2cd9f9" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 17 29 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F06602f52-0fa5-4e9f-8a74-2f867a2cd9f9" width="978" height="1468"&gt;&lt;/a&gt;&lt;br&gt;
Figure 1. GitL Web Server shows two of three repositories have changed and allows selective bulk commits with descriptions of changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F1ad54cbc-eebc-41b8-ba4c-af54869d197a" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 17 38 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F1ad54cbc-eebc-41b8-ba4c-af54869d197a" width="482" height="86"&gt;&lt;/a&gt;&lt;br&gt;
Figure 2. Notification that two repositories were committed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F6a4f1737-ce9d-4f72-8365-0470d60144ca" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 18 42 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F6a4f1737-ce9d-4f72-8365-0470d60144ca" width="308" height="242"&gt;&lt;/a&gt;&lt;br&gt;
Figure 3. The &lt;code&gt;gitl_test&lt;/code&gt; folder contains the current repositories to commit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F06447734-3d21-422c-a3e6-127f61426853" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 19 01 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F06447734-3d21-422c-a3e6-127f61426853" width="442" height="642"&gt;&lt;/a&gt;&lt;br&gt;
Figure 4. The &lt;code&gt;gitl_data&lt;/code&gt; folder contains the previous versions of repositories with HTML files showing changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F8fbd058b-765f-4eab-b664-1b27167e6c69" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 22 21 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F8fbd058b-765f-4eab-b664-1b27167e6c69" width="314" height="122"&gt;&lt;/a&gt;&lt;br&gt;
Figure 5. There is a password to protect files from being edited by unauthorised people in Web Editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2Febbf54ff-1cbc-4438-9a25-3374fbb9816e" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 22 35 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2Febbf54ff-1cbc-4438-9a25-3374fbb9816e" width="466" height="446"&gt;&lt;/a&gt;&lt;br&gt;
Figure 6. Web Editor starts in the &lt;code&gt;gitl_test&lt;/code&gt; (current repositories) folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F4710c982-fe76-4841-bb3a-c596b50037c4" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 22 44 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F4710c982-fe76-4841-bb3a-c596b50037c4" width="502" height="262"&gt;&lt;/a&gt;&lt;br&gt;
Figure 7. A screenshot of the &lt;code&gt;a.txt&lt;/code&gt; file in a repository in gitl_test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F472f9287-f7d2-4609-bed8-0bdcad5f9214" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 22 52 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F472f9287-f7d2-4609-bed8-0bdcad5f9214" width="224" height="144"&gt;&lt;/a&gt;&lt;br&gt;
Figure 8. Viewing the contents of &lt;code&gt;a.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F75fbb442-1aa2-4726-8586-647e193963f9" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 23 20 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F75fbb442-1aa2-4726-8586-647e193963f9" width="604" height="772"&gt;&lt;/a&gt;&lt;br&gt;
Figure 9. The gitl_data folder contains the previous versions of files and HTML files showing changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F7ddbae9d-c043-4bbd-bb0a-3b97310e2c9f" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-12-18 at 7 23 34 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Fgitl%2Fassets%2F15845542%2F7ddbae9d-c043-4bbd-bb0a-3b97310e2c9f" width="572" height="366"&gt;&lt;/a&gt;&lt;br&gt;
Figure 10. An example HTML file showing an insertion and a deletion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/luciangreen/gitl" rel="noopener noreferrer"&gt;https://github.com/luciangreen/gitl&lt;/a&gt;&lt;br&gt;
Image of apple by aleheredia (FreeImages.com)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FLucian-Academy%2Fassets%2F15845542%2Fe1d3796a-c5a4-44ef-ba85-17584ed0f2ed" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2FLucian-Academy%2Fassets%2F15845542%2Fe1d3796a-c5a4-44ef-ba85-17584ed0f2ed" alt="gl vecteezy com funforyou7" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image of "GL in digital clock font" by funforyou7 (vecteezy.com)&lt;/p&gt;

</description>
      <category>git</category>
      <category>decentralized</category>
      <category>devops</category>
    </item>
    <item>
      <title>Yet Another Open Source CI/CD Tool</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Mon, 29 May 2023 10:32:14 +0000</pubDate>
      <link>https://dev.to/luciangreen/an-open-source-cicd-for-prolog-29h2</link>
      <guid>https://dev.to/luciangreen/an-open-source-cicd-for-prolog-29h2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Flistprologinterpreter%2Fassets%2F15845542%2F7477d6b2-3083-4004-9f2a-4fbff9c40d5c" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-05-29 at 8 30 21 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Flistprologinterpreter%2Fassets%2F15845542%2F7477d6b2-3083-4004-9f2a-4fbff9c40d5c" width="502" height="1034"&gt;&lt;/a&gt;&lt;br&gt;
Image of a female android by @deloan.&lt;/p&gt;

&lt;p&gt;What is it?&lt;/p&gt;

&lt;p&gt;In "DevOps" speak, CI means continuous integration of changes, and CD is continuous delivery and deployment, or placement of the best configuration of these changes back into the repository. If there are n changes, there are 2^n possible configurations of these changes, suggesting an upper limit of seven changes per run, meaning making few changes per time. The algorithm can be run on changes, allowing continuous code correctness.&lt;/p&gt;

&lt;p&gt;Why I made it&lt;/p&gt;

&lt;p&gt;I had recently written a List Prolog to Prolog pretty printer (which was its prerequisite). List Prolog is a variant of Prolog, a logic programming language in which programs are lists. I needed a way to check all the code before uploading it, preventing bugs and annoying installation problems.&lt;/p&gt;

&lt;p&gt;Can it be used for other programming languages?&lt;/p&gt;

&lt;p&gt;At its core is a diff by newline algorithm, so there's no reason why you couldn't modify it for programming languages other than Prolog. Every time it converts between Prolog and List Prolog, you would need to change it to convert between another language and List Prolog, which it procures tests from, checks for changed lines, and builds repositories.&lt;/p&gt;

&lt;p&gt;Update: Lucian CI/CD can now process non-Prolog source files. These source files, coupled with tests, are integrated like Prolog.&lt;/p&gt;

&lt;p&gt;Installing&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download and install SWI-Prolog for your machine at &lt;code&gt;https://www.swi-prolog.org/build/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install LucianCICD using List Prolog Package Manager (LPPM):
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/luciangreen/List-Prolog-Package-Manager.git
cd List-Prolog-Package-Manager
swipl
['lppm'].
lppm_install("luciangreen","luciancicd").
halt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Setting up&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a folder "Github_lc" at the same level as your "GitHub" folder or the folder containing your repositories. This step is done by &lt;code&gt;['luciancicd.pl'].&lt;/code&gt; &lt;code&gt;set_up_luciancicd.&lt;/code&gt;. NB. Please try the software with a folder other than "GitHub" such as "GitHub2" to see if it suits you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;NB. Edit the source and destination folder, such as "GitHub2", by modifying &lt;code&gt;repositories_paths1//1&lt;/code&gt; in &lt;code&gt;luciancicd.pl&lt;/code&gt;. You can also edit folders to omit.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Before running, enter or modify tests in the source files in the repositories, for example:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% remove_and_find_item_number([a,b,c],2,c,N2).
% N2 = 2.
% remove_and_find_item_number([a,b,b,c],2,c,N2).
% N2 = 3.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Running&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To load the algorithm, enter the following:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['luciancicd.pl'].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Run with &lt;code&gt;luciancicd.&lt;/code&gt; - This tests repositories with changes. Run before committing changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it does - Integrates changes into a possible new repository.&lt;/p&gt;

&lt;p&gt;Figure 1. "Diff output. These are the changes combinations were taken from. Key: Insertion, Change and Deletion&lt;br&gt;
[&lt;br&gt;
[[n,comment],["File delimiter","../../Github_lc/a","a.pl"]],&lt;br&gt;
[[n,comment],["% a(A)."]],&lt;br&gt;
[[n,comment],["% A=1."]],&lt;br&gt;
[[n,a],[1]],&lt;br&gt;
[[n,comment],["% b(C)."]],&lt;br&gt;
[[n,comment],["% C=1."]],&lt;br&gt;
[[n,b],[1]],&lt;br&gt;
[[n,c],[1]],&lt;br&gt;
[[n,d],[1]],&lt;br&gt;
Change: [["[[n,comment],[""%e(1).""]],"],' -&amp;gt; ',["[[n,e],[1]],"]]&lt;br&gt;
[[n,f],[1]],".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Flistprologinterpreter%2Fassets%2F15845542%2Faca2b32d-9d5b-4783-acb0-d2cd6b91ff5f" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2023-05-29 at 7 43 10 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fluciangreen%2Flistprologinterpreter%2Fassets%2F15845542%2Faca2b32d-9d5b-4783-acb0-d2cd6b91ff5f" width="840" height="976"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figure 1 shows the changes to the source files. The algorithm develops possible configurations from these changes and tests them.&lt;/p&gt;

&lt;p&gt;What it does - Builds repositories using dependencies stored in the file.&lt;/p&gt;

&lt;p&gt;The algorithm finds repositories depending and dependent on modified files and includes them in the possible builds. You can edit the dependencies in the dependencies registry file (below), and the behaviour of the built algorithm based on dependencies included by the source files should reflect the dependencies listed in the registry file used at installation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Note: Dependencies are in &lt;code&gt;List-Prolog-Package-Manager/lppm_registry.txt&lt;/code&gt;, in form &lt;code&gt;[[User,Repository,Description,Dependencies], etc]&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For example:&lt;br&gt;
&lt;code&gt;["luciangreen", "State-Machine-to-List-Prolog",&lt;br&gt;
"Converts State Saving Interpreter State Machines to List Prolog algorithms.",&lt;br&gt;
[&lt;br&gt;
["luciangreen","SSI"]&lt;br&gt;
]]&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are more instructions about how to edit dependencies at &lt;code&gt;https://github.com/luciangreen/List-Prolog-Package-Manager&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What it does: Tests to find the correct repository configuration and moves files into the folder.&lt;/p&gt;

&lt;p&gt;The algorithm tests all files in all repositories connected with changed files. The first build configuration, which has the fewest possible changes, is stopped with.&lt;/p&gt;

&lt;p&gt;Figure 2. The Prolog script that runs the tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/swipl -f -q

:- include('a.pl').
:- initialization(catch(main, Err, handle_error(Err))).

handle_error(_Err):-
    halt(1).
main :-
    d(A),A=1, nl,
    halt.
main :- halt(1).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Figure 2 shows the Prolog script, &lt;code&gt;testcicd.pl&lt;/code&gt;, that loads the files and runs the tests collected. It runs with &lt;code&gt;chmod +x testcicd.pl&lt;/code&gt; and &lt;code&gt;swipl -f -q ./testcicd.pl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One can read which tests failed in all combination builds, where, if a test fails, the algorithm doesn't move files into the repository.&lt;/p&gt;

&lt;p&gt;NB. The algorithm moves finished files into the original repository, and the files in the repository swap places into &lt;code&gt;../private2/luciancicd-testing/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What does it do, and does it work?&lt;/p&gt;

&lt;p&gt;While one might think it would be simpler to make and test changes, this tool tries the usefulness of each changed line individually. One can ensure it works by entering tests to keep changes and make sure everything is stable.&lt;/p&gt;

&lt;p&gt;Can it be integrated with ChatGPT?&lt;/p&gt;

&lt;p&gt;Yes, the bottom-up Prolog version of Lucian CI/CD can be integrated with ChatGPT to complete or correct predicates with bugs. This would require the specs of all predicates in question and a ChatGPT API account.&lt;/p&gt;

&lt;p&gt;Lucian Green&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/luciangreen/luciancicd" rel="noopener noreferrer"&gt;https://github.com/luciangreen/luciancicd&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ci</category>
      <category>cd</category>
      <category>prolog</category>
    </item>
    <item>
      <title>Run List Prolog on the Web</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Thu, 01 Dec 2022 07:00:53 +0000</pubDate>
      <link>https://dev.to/luciangreen/run-list-prolog-on-the-web-1dfd</link>
      <guid>https://dev.to/luciangreen/run-list-prolog-on-the-web-1dfd</guid>
      <description>&lt;p&gt;A web editing studio (a computer-rended scene of curly chairs and glass tables in a dark cafe, without anything on the tables).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpc81bze23nnul7f2rly.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpc81bze23nnul7f2rly.jpg" alt="web-design-company-1142806" width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the second of two articles about Prolog development online.  This article is about running and debugging Prolog algorithms on the web.  (The first was about &lt;a href="https://dev.to/luciangreen/access-your-computers-files-from-your-phone-i5"&gt;accessing computer files from a phone&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I will describe how to convert Prolog to List Prolog algorithms and run them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First download the &lt;a href="https://github.com/luciangreen/Philosophy" rel="noopener noreferrer"&gt;Philosophy repository&lt;/a&gt;.  This includes the Prolog-to-List-Prolog Repository.&lt;/li&gt;
&lt;li&gt;Next, download the &lt;a href="https://github.com/luciangreen/SSI" rel="noopener noreferrer"&gt;SSI repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;swipl&lt;/code&gt; (SWI-Prolog, which you also need to install), in the Philosophy folder, load &lt;code&gt;['run_lp.pl'].&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start the server: &lt;code&gt;run_lp_server(8000).&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find your computer's IP address. On Mac, search for IP address (TCP/IP) in settings.  If you are trying it out use &lt;code&gt;localhost&lt;/code&gt; as the server.&lt;/li&gt;
&lt;li&gt;In your browser or on your phone, go to &lt;code&gt;http://***IP address***:8000/a&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Figure 1. &lt;code&gt;test.pl&lt;/code&gt; contains &lt;code&gt;test:-member2([1,2],A),writeln(A).&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982965-1b34f37e-ba79-4a20-a1e2-f970953b8bce.png" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2022-12-01 at 5 37 50 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982965-1b34f37e-ba79-4a20-a1e2-f970953b8bce.png" width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figure 2. &lt;code&gt;test.lp&lt;/code&gt; (sic) contains &lt;code&gt;[&lt;br&gt;
[[n,test],":-",&lt;br&gt;
[&lt;br&gt;
    [[n,member2],[[1,2],[v,a]]],&lt;br&gt;
    [[n,writeln],[[v,a]]]&lt;br&gt;
]]&lt;br&gt;
].&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F205032090-bb82644b-8960-4b5b-96f6-98e845280a14.png" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2022-12-01 at 9 40 30 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F205032090-bb82644b-8960-4b5b-96f6-98e845280a14.png" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figure 3. The web page reads: Run List Prolog (1 - Convert test.pl to test.lp and run query. 2 - Convert test.pl to test.lp. 3 - Run query.) Enter 1-3:&lt;br&gt;
3&lt;/p&gt;

&lt;p&gt;Prolog query for 1 or 3:&lt;br&gt;
test.&lt;/p&gt;

&lt;p&gt;Leash (on/off) for 1 or 3:&lt;br&gt;
on&lt;/p&gt;

&lt;p&gt;*.pl file for 1 or 2:&lt;br&gt;
test.pl&lt;/p&gt;

&lt;p&gt;*.lp file for 2 or 3:&lt;br&gt;
test.lp&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982978-facf8dd2-44e8-4e95-bcfa-9287a3fbbaf8.png" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2022-12-01 at 5 37 28 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982978-facf8dd2-44e8-4e95-bcfa-9287a3fbbaf8.png" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figure 4. The web page with leash on reads:&lt;br&gt;
[call,[[n,query_box_1],[]],'Press c to creep, s to skip or a to abort.'] [call,[[n,test],[]],'Press c to creep, s to skip or a to abort.'] [call,[[n,member2],[[1,2],[v,a]]],'Press c to creep, s to skip or a to abort.'] [exit,[[n,member2],[[1,2],1]],'Press c to creep or a to abort.'] [call,[[n,writeln],[variable]],'Press c to creep, s to skip or a to abort.'] 1 [exit,[[n,writeln],[1]],'Press c to creep or a to abort.'] [exit,[[n,test],[]],'Press c to creep or a to abort.'] [exit,[[n,query_box_1],[]],'Press c to creep or a to abort.']&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982984-1dacdc6e-a931-48eb-8b3e-3da3d4598f2e.png" class="article-body-image-wrapper"&gt;&lt;img alt="Screenshot 2022-12-01 at 5 37 11 pm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F15845542%2F204982984-1dacdc6e-a931-48eb-8b3e-3da3d4598f2e.png" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this algorithm Prolog users can run their algorithms online without Prolog installed on their phone.  They can enter queries and debug using the leash/trace feature.&lt;/p&gt;

&lt;p&gt;Image by muradbd from Free Images&lt;/p&gt;

</description>
      <category>list</category>
      <category>prolog</category>
      <category>web</category>
    </item>
    <item>
      <title>Access your computer's files from your phone</title>
      <dc:creator>Lucian Green</dc:creator>
      <pubDate>Wed, 30 Nov 2022 13:45:06 +0000</pubDate>
      <link>https://dev.to/luciangreen/access-your-computers-files-from-your-phone-i5</link>
      <guid>https://dev.to/luciangreen/access-your-computers-files-from-your-phone-i5</guid>
      <description>&lt;p&gt;Image: An open laptop in a desert with mountains in the background.&lt;br&gt;
(no image).&lt;/p&gt;

&lt;p&gt;Have you ever needed to access or develop with files on your computer?  You can use a web editor that accesses your files which runs on your computer, and can be accessed on your phone.  Note: Web Editor is password-protected to prevent access to files.&lt;/p&gt;

&lt;p&gt;Here's how to access your files from your phone (and later, run Prolog files using your computer as a web server):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the Philosophy repository from &lt;a href="https://github.com/luciangreen/Philosophy" rel="noopener noreferrer"&gt;https://github.com/luciangreen/Philosophy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;swipl&lt;/code&gt; (SWI-Prolog, which you also need to install), load &lt;code&gt;['web-editor.pl'].&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start the server: &lt;code&gt;server(8000).&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find your computer's IP address.  On Mac, search for IP address (TCP/IP) in settings.&lt;/li&gt;
&lt;li&gt;On your phone, go to &lt;code&gt;http://***IP address***:8000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The web editor program lets you open or edit, move, copy and delete files and folders on your computer.  (Planned: creating new folders and files, and displaying the folder name.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa64smnzzvz48fvj2z4wk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa64smnzzvz48fvj2z4wk.jpeg" alt="FXTQTrhVEAA06ae" width="800" height="1304"&gt;&lt;/a&gt;&lt;br&gt;
Figure 1. Open, edit, move, copy and delete files and folders with Web Edit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftw0ryc7sto92pf827bkn.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftw0ryc7sto92pf827bkn.jpeg" alt="FXTQTreVQAEV_61" width="800" height="943"&gt;&lt;/a&gt;&lt;br&gt;
Figure 2. The Web Edit text file editor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PS. To maintain a connection from your phone to your computer over a longer distance, you may need to install Web Edit and the files to edit on a &lt;a href="https://github.com/luciangreen/Text-to-Breasonings/blob/master/Setting_up_a_VPS_with_TextToBr.txt" rel="noopener noreferrer"&gt;Virtual Private Server&lt;/a&gt;, which can be subscribed to from a number of providers (search online) for a price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next: Run List Prolog on the Web&lt;br&gt;
&lt;a href="https://dev.to/luciangreen/run-list-prolog-on-the-web-1dfd"&gt;https://dev.to/luciangreen/run-list-prolog-on-the-web-1dfd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image by Free Images/Thinkstock.&lt;/p&gt;

</description>
      <category>prolog</category>
      <category>web</category>
      <category>editor</category>
      <category>computer</category>
    </item>
  </channel>
</rss>
