summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJedidiah Barber <contact@jedbarber.id.au>2025-11-17 15:35:49 +1300
committerJedidiah Barber <contact@jedbarber.id.au>2025-11-17 15:35:49 +1300
commitfc4bc559d3f1ebf056c4afb8280a1ec8f4d90bc2 (patch)
tree4e7e3f308f26fbc9162a3766b55da67423a1a81c
parent0e3cb04b840c3ecc61b9e3efc77af5ebea585d17 (diff)
Lazy Conjunct should properly work for infinite results now
-rw-r--r--src/kompsos.adb8
-rw-r--r--test/membero.adb6
-rw-r--r--test/rembero.adb42
-rw-r--r--tests.gpr4
4 files changed, 53 insertions, 7 deletions
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");