From fc4bc559d3f1ebf056c4afb8280a1ec8f4d90bc2 Mon Sep 17 00:00:00 2001 From: Jedidiah Barber Date: Mon, 17 Nov 2025 15:35:49 +1300 Subject: Lazy Conjunct should properly work for infinite results now --- src/kompsos.adb | 8 +++++--- test/membero.adb | 6 +++--- test/rembero.adb | 42 ++++++++++++++++++++++++++++++++++++++++++ tests.gpr | 4 +++- 4 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 test/rembero.adb diff --git a/src/kompsos.adb b/src/kompsos.adb index 2093406..d0005cb 100644 --- a/src/kompsos.adb +++ b/src/kompsos.adb @@ -355,10 +355,12 @@ package body Kompsos is Ptr (This.Engine.Con_World).Rollover; if Ptr (This.Engine.Con_World).Possibles.Length > 0 then declare - Next : constant World := - Call_Lazy (Ptr (This.Engine.Con_World).all, This.Engine.Con_Data); + So_Far : constant World := + ((Possibles => Ptr (This.Engine.Con_World).Possibles, + Engine => (Kind => No_Gen))); begin - This := Next; + Ptr (This.Engine.Con_World).Possibles.Clear; + This := Disjunct (Call_Lazy (So_Far, This.Engine.Con_Data), This); end; elsif Ptr (This.Engine.Con_World).Engine.Kind = No_Gen then This.Engine := (Kind => No_Gen); diff --git a/test/membero.adb b/test/membero.adb index bc51c33..89e7f2e 100644 --- a/test/membero.adb +++ b/test/membero.adb @@ -24,10 +24,10 @@ procedure Membero is renames SU.To_Unbounded_String; - package InKomp is new Kompsos (SU.Unbounded_String); - use InKomp; + package SKomp is new Kompsos (SU.Unbounded_String); + use SKomp; - package Printer is new InKomp.Pretty_Print (SU.To_String); + package Printer is new SKomp.Pretty_Print (SU.To_String); Verse : World := Empty_World; diff --git a/test/rembero.adb b/test/rembero.adb new file mode 100644 index 0000000..e2f9a87 --- /dev/null +++ b/test/rembero.adb @@ -0,0 +1,42 @@ + + +-- Programmed by Jedidiah Barber +-- Licensed under the Sunset License v1.0 + +-- See license.txt for further details + + +with + + Ada.Text_IO, + Kompsos.Pretty_Print; + + +procedure Rembero is + + package TIO renames Ada.Text_IO; + + + package InKomp is new Kompsos (Integer); + use InKomp; + + package Printer is new InKomp.Pretty_Print (Integer'Image); + + Verse : World := Empty_World; + +begin + + TIO.Put_Line ("Test program to check if calculating an infinite number of results works."); + TIO.New_Line; + TIO.Put_Line ("It will call rembero with variables as all arguments."); + TIO.Put_Line ("The first 10 results will be displayed."); + + TIO.New_Line; + + Verse.Remove (Verse.Fresh ("item") & Verse.Fresh ("list") & Verse.Fresh ("out")); + + TIO.Put_Line (Printer.Image (Verse.Take (10))); + +end Rembero; + + diff --git a/tests.gpr b/tests.gpr index 6540560..a8007d8 100644 --- a/tests.gpr +++ b/tests.gpr @@ -19,13 +19,15 @@ project Tests is ("ab.adb", "fivesix.adb", "membero.adb", - "pprint.adb"); + "pprint.adb", + "rembero.adb"); package Builder is for Executable ("ab.adb") use "ab"; for Executable ("fivesix.adb") use "fivesix"; for Executable ("membero.adb") use "membero"; for Executable ("pprint.adb") use "pprint"; + for Executable ("rembero.adb") use "rembero"; for Default_Switches ("Ada") use Common.Builder'Default_Switches ("Ada"); -- cgit