summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kompsos-prelude.adb148
-rw-r--r--src/kompsos-prelude.ads60
-rw-r--r--test/membero.adb53
-rw-r--r--tests.gpr2
4 files changed, 259 insertions, 4 deletions
diff --git a/src/kompsos-prelude.adb b/src/kompsos-prelude.adb
index 6cb8b2b..58b80f4 100644
--- a/src/kompsos-prelude.adb
+++ b/src/kompsos-prelude.adb
@@ -15,10 +15,11 @@ package body Kompsos.Prelude is
return World is
begin
return Result : World := This do
- Result.Unify (T (Head_Term & T (Result.Fresh)), Full_List);
+ Result.Unify (T (Term (Head_Term), T (Result.Fresh)), Full_List);
end return;
end Head;
+
procedure Head
(This : in out World;
Full_List, Head_Term : in Term'Class) is
@@ -27,16 +28,19 @@ package body Kompsos.Prelude is
end Head;
+
+
function Tail
(This : in World;
Full_List, Tail_Term : in Term'Class)
return World is
begin
return Result : World := This do
- Result.Unify (T (T (Result.Fresh) & Tail_Term), Full_List);
+ Result.Unify (T (T (Result.Fresh), Term (Tail_Term)), Full_List);
end return;
end Tail;
+
procedure Tail
(This : in out World;
Full_List, Tail_Term : in Term'Class) is
@@ -45,16 +49,19 @@ package body Kompsos.Prelude is
end Tail;
+
+
function Cons
(This : in World;
Head_Term, Tail_Term, Full_List : in Term'Class)
return World is
begin
return Result : World := This do
- Result.Unify (T (Head_Term & Tail_Term), Full_List);
+ Result.Unify (T (Term (Head_Term), Term (Tail_Term)), Full_List);
end return;
end Cons;
+
procedure Cons
(This : in out World;
Head_Term, Tail_Term, Full_List : in Term'Class) is
@@ -63,6 +70,8 @@ package body Kompsos.Prelude is
end Cons;
+
+
function Nil
(This : in World;
Nil_Term : in Term'Class)
@@ -73,6 +82,7 @@ package body Kompsos.Prelude is
end return;
end Nil;
+
procedure Nil
(This : in out World;
Nil_Term : in Term'Class) is
@@ -81,16 +91,19 @@ package body Kompsos.Prelude is
end Nil;
+
+
function Pair
(This : in World;
Pair_Term : in Term'Class)
return World is
begin
return Result : World := This do
- Result.Unify (T (T (Result.Fresh), T (Result.Fresh)), Pair_Term);
+ Cons (Result, T (Result.Fresh), T (Result.Fresh), Pair_Term);
end return;
end Pair;
+
procedure Pair
(This : in out World;
Pair_Term : in Term'Class) is
@@ -99,6 +112,133 @@ package body Kompsos.Prelude is
end Pair;
+
+
+ function Linked_List
+ (This : in World;
+ List_Term : in Term'Class)
+ return World
+ is
+ Result_Nil, Result_Pair : World := This;
+ Ref_Term : constant Term := T (Result_Pair.Fresh);
+ begin
+ Nil (Result_Nil, List_Term);
+
+ Pair (Result_Pair, List_Term);
+ Tail (Result_Pair, List_Term, Ref_Term);
+ if not Result_Pair.Failed then
+ Linked_List (Result_Pair, Ref_Term);
+ end if;
+
+ return Disjunct (Result_Nil, Result_Pair);
+ end Linked_List;
+
+
+ procedure Linked_List
+ (This : in out World;
+ List_Term : in Term'Class) is
+ begin
+ This := Linked_List (This, List_Term);
+ end Linked_List;
+
+
+
+
+ function Member
+ (This : in World;
+ Item_Term, List_Term : in Term'Class)
+ return World
+ is
+ Result_Head, Result_Rest : World := This;
+ Ref_Term : constant Term := T (Result_Rest.Fresh);
+ begin
+ Head (Result_Head, List_Term, Item_Term);
+
+ Tail (Result_Rest, List_Term, Ref_Term);
+ if not Result_Rest.Failed then
+ Member (Result_Rest, Item_Term, Ref_Term);
+ end if;
+
+ return Disjunct (Result_Head, Result_Rest);
+ end Member;
+
+
+ procedure Member
+ (This : in out World;
+ Item_Term, List_Term : in Term'Class) is
+ begin
+ This := Member (This, Item_Term, List_Term);
+ end Member;
+
+
+
+
+ function Remove
+ (This : in World;
+ Item_Term, List_Term, Out_Term : in Term'Class)
+ return World
+ is
+ Result_Head, Result_Rest : World := This;
+ Left : constant Term := T (Result_Rest.Fresh);
+ Right : constant Term := T (Result_Rest.Fresh);
+ Rest : constant Term := T (Result_Rest.Fresh);
+ begin
+ Head (Result_Head, List_Term, Item_Term);
+ Tail (Result_Head, List_Term, Out_Term);
+
+ -- infinite loops if run in reverse with vars for item and list
+ -- probably needs lazy conjunction to work properly
+ Cons (Result_Rest, Left, Right, List_Term);
+ if not Result_Rest.Failed then
+ Remove (Result_Rest, Item_Term, Right, Rest);
+ Cons (Result_Rest, Left, Rest, Out_Term);
+ end if;
+
+ return Disjunct (Result_Head, Result_Rest);
+ end Remove;
+
+
+ procedure Remove
+ (This : in out World;
+ Item_Term, List_Term, Out_Term : in Term'Class) is
+ begin
+ This := Remove (This, Item_Term, List_Term, Out_Term);
+ end Remove;
+
+
+
+
+ function Append
+ (This : in World;
+ List_Term, Item_Term, Out_Term : in Term'Class)
+ return World
+ is
+ Result_Nil, Result_Rest : World := This;
+ Left : constant Term := T (Result_Rest.Fresh);
+ Right : constant Term := T (Result_Rest.Fresh);
+ Rest : constant Term := T (Result_Rest.Fresh);
+ begin
+ Nil (Result_Nil, List_Term);
+ Unify (Result_Nil, Item_Term, Out_Term);
+
+ Cons (Result_Rest, Left, Right, List_Term);
+ Cons (Result_Rest, Left, Rest, Out_Term);
+ if not Result_Rest.Failed then
+ Append (Result_Rest, Right, Item_Term, Rest);
+ end if;
+
+ return Disjunct (Result_Nil, Result_Rest);
+ end Append;
+
+
+ procedure Append
+ (This : in out World;
+ List_Term, Item_Term, Out_Term : in Term'Class) is
+ begin
+ This := Append (This, List_Term, Item_Term, Out_Term);
+ end Append;
+
+
end Kompsos.Prelude;
diff --git a/src/kompsos-prelude.ads b/src/kompsos-prelude.ads
index 5dbc562..237edbf 100644
--- a/src/kompsos-prelude.ads
+++ b/src/kompsos-prelude.ads
@@ -78,6 +78,66 @@ package Kompsos.Prelude is
Pair_Term : in Term'Class);
+ -- listo --
+
+ function Linked_List
+ (This : in World;
+ List_Term : in Term'Class)
+ return World;
+
+ procedure Linked_List
+ (This : in out World;
+ List_Term : in Term'Class);
+
+
+ -- membero --
+
+ function Member
+ (This : in World;
+ Item_Term, List_Term : in Term'Class)
+ return World;
+
+ procedure Member
+ (This : in out World;
+ Item_Term, List_Term : in Term'Class);
+
+
+ -- rembero --
+
+ function Remove
+ (This : in World;
+ Item_Term, List_Term, Out_Term : in Term'Class)
+ return World;
+
+ procedure Remove
+ (This : in out World;
+ Item_Term, List_Term, Out_Term : in Term'Class);
+
+
+ -- appendo --
+
+ function Append
+ (This : in World;
+ List_Term, Item_Term, Out_Term : in Term'Class)
+ return World;
+
+ procedure Append
+ (This : in out World;
+ List_Term, Item_Term, Out_Term : in Term'Class);
+
+
+ -- anyo --
+ -- Skipped due to Recurse doing the same thing
+
+
+ -- nevero --
+ -- Skipped since it just creates a failed World
+
+
+ -- alwayso --
+ -- Skipped due to Recurse doing the same thing
+
+
end Kompsos.Prelude;
diff --git a/test/membero.adb b/test/membero.adb
new file mode 100644
index 0000000..694410d
--- /dev/null
+++ b/test/membero.adb
@@ -0,0 +1,53 @@
+
+
+-- Programmed by Jedidiah Barber
+-- Licensed under the Sunset License v1.0
+
+-- See license.txt for further details
+
+
+with
+
+ Ada.Strings.Unbounded,
+ Ada.Text_IO,
+ Kompsos.Prelude,
+ Kompsos.Pretty_Print;
+
+
+procedure Membero is
+
+ package SU renames Ada.Strings.Unbounded;
+ package TIO renames Ada.Text_IO;
+
+ function "+"
+ (Item : in String)
+ return SU.Unbounded_String
+ renames SU.To_Unbounded_String;
+
+
+ package InKomp is new Kompsos (SU.Unbounded_String);
+ use InKomp;
+
+ package Prelude is new InKomp.Prelude;
+ package Printer is new InKomp.Pretty_Print (SU.To_String);
+
+ Verse : World := Empty_World;
+
+ Test_Item : constant Term := T (T (+"one") & T (+"two") & T (+"three") & T (+"four"));
+
+begin
+
+ TIO.Put_Line ("Test program to check if membero, and hence recursion, is working.");
+ TIO.Put_Line ("Not currently designed to check for infinite recursion.");
+ TIO.New_Line;
+ TIO.Put_Line ("Should find all possible members of (one two three four)");
+
+ TIO.New_Line;
+
+ Prelude.Member (Verse, T (Verse.Fresh ("result")), Test_Item);
+
+ TIO.Put_Line (Printer.Image (Verse));
+
+end Membero;
+
+
diff --git a/tests.gpr b/tests.gpr
index e555285..6540560 100644
--- a/tests.gpr
+++ b/tests.gpr
@@ -18,11 +18,13 @@ project Tests is
for Main use
("ab.adb",
"fivesix.adb",
+ "membero.adb",
"pprint.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 Default_Switches ("Ada") use