DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ B T

⟦d21303045⟧ TextFile

    Length: 47474 (0xb972)
    Types: TextFile
    Names: »B«

Derivation

└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13
    └─ ⟦124ff5788⟧ »DATA« 
        └─⟦this⟧ 
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
    └─ ⟦129cab021⟧ »DATA« 
        └─⟦this⟧ 
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
    └─ ⟦6f12a12be⟧ »DATA« 
        └─⟦this⟧ 
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
    └─ ⟦d65440be7⟧ »DATA« 
        └─⟦this⟧ 

TextFile

with Expertsystem;
use Expertsystem;
with Monkeyobject;
use Monkeyobject;
with Monkey, Physicalobject, Goal;

procedure Ctxban2 is

    package Monkeyandban is
        procedure Find_The_Bananas;
    end Monkeyandban;

    package body Monkeyandban is

        function As_Name (Str : String) return Physical_Object is
            The_Name : Physical_Object;
            Ln : Integer := 1;
        begin
            if Str'Length > Maxlengthname then
                Ln := Maxlengthname;
            else
                Ln := Str'Length;
            end if;
            The_Name (1 .. Ln) := Str (1 .. Ln);
            Ln := Ln + 1;
            while Ln <= Maxlengthname loop
                The_Name (Ln) := ' ';
                Ln := Ln + 1;
            end loop;
            return The_Name;
        end As_Name;

        function Active_Goal (A_Goal : Reference) return Boolean is
        begin
            return Goal.Status (A_Goal) = Active;
        end Active_Goal;
        function Find_Active is new Collection.Findone (Active_Goal);

        function Active_Is_On (A_Goal : Reference) return Boolean is
        begin
            return Goal.Status (A_Goal) = Active and then
                      Goal.Goal_Type (A_Goal) = Is_On;
        end Active_Is_On;

        function Active_Holds (A_Goal : Reference) return Boolean is
        begin
            return Goal.Status (A_Goal) = Active and then
                      Goal.Goal_Type (A_Goal) = Holds;
        end Active_Holds;

        function Active_Is_At (A_Goal : Reference) return Boolean is
        begin
            return Goal.Status (A_Goal) = Active and then
                      Goal.Goal_Type (A_Goal) = Is_At;
        end Active_Is_At;
-----------------------------------------------------------------------------
--          RULES                         context_on                       --
-----------------------------------------------------------------------------

        function Match_1 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Floor and then
                      Monkey.Is_On (A_Monkey) /= Floor;
        end Match_1;
        function Rule_1 is new Tuplecollection.Join2 (Match_1);

        function On_Floor_C return Tuplecollection.Object is
        begin
            return Rule_1 (Monkey.Instances, Goal.Instances, Any);
        end On_Floor_C;

        procedure On_Floor_A (Mg : Tuple.Object) is
            A_Monkey, A_Goal : Reference;
        begin  
            A_Monkey := Tuple.First (Mg);  
            A_Goal := Tuple.Second (Mg);
            Monkey.Modify_Is_On (A_Monkey, Floor);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put_Line ("Jump onto the floor");
        end On_Floor_A;

        function Match_2 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Floor and then
                      Monkey.Is_On (A_Monkey) = Floor;
        end Match_2;
        function Rule_2 is new Tuplecollection.Join2 (Match_2);

        function On_Floor_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_2 (Monkey.Instances, Goal.Instances, Any);
        end On_Floor_Satisfied_C;

        procedure On_Floor_Satisfied_A (Mg : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mg);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put_Line ("Monkey is already on floor");
        end On_Floor_Satisfied_A;

        function Match_3 (A_Monkey, A_Goal, An_Object : Reference)
                         return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Is_On (An_Object) = Floor and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Holds (A_Monkey) = Nil and then
                      Monkey.Is_On (A_Monkey) /= Goal.Object_Name (A_Goal);
        end Match_3;
        function Rule_3 is new Tuplecollection.Join3 (Match_3);

        function On_Physical_Object_C return Tuplecollection.Object is
        begin
            return Rule_3 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances, Any);
        end On_Physical_Object_C;

        procedure On_Physical_Object_A (Mgo : Tuple.Object) is
            A_Monkey, A_Goal : Reference;
        begin
            A_Monkey := Tuple.First (Mgo);
            A_Goal := Tuple.Second (Mgo);
            Monkey.Modify_Is_On (A_Monkey, Goal.Object_Name (A_Goal));
            Goal.Modify_Status (A_Goal, Satisfied);
            Put ("Climb onto ");
            Put_Line (Goal.Object_Name (A_Goal));
        end On_Physical_Object_A;

        function Match_4 (A_Monkey, A_Goal, An_Object : Reference)
                         return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Holds (A_Monkey) /= Nil;
        end Match_4;
        function Rule_4 is new Tuplecollection.Join3 (Match_4);

        function On_Physical_Object_Holds_C return Tuplecollection.Object is
        begin
            return Rule_4 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances, Any);
        end On_Physical_Object_Holds_C;

        procedure On_Physical_Object_Holds_A (Mgo : Tuple.Object) is
        begin
            Goal.Make (Active, Holds, Nil, (1, 1));
--         put_line("make subgoal on_physical_object_holds");
        end On_Physical_Object_Holds_A;

        function Match_5 (A_Monkey, A_Goal, An_Object : Reference)
                         return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Is_On (An_Object) = Floor and then
                      Monkey.Is_At (A_Monkey) /=
                         Physicalobject.Is_At (An_Object);
        end Match_5;
        function Rule_5 is new Tuplecollection.Join3 (Match_5);

        function On_Physical_Object_At_Monkey_C return Tuplecollection.Object is
        begin
            return Rule_5 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances, Any);
        end On_Physical_Object_At_Monkey_C;

        procedure On_Physical_Object_At_Monkey_A (Mgo : Tuple.Object) is
            An_Object : Reference;
        begin
            An_Object := Tuple.Third (Mgo);
            Goal.Make (Active, Is_At, Nil, Physicalobject.Is_At (An_Object));
--         put_line("make subgoal on_physical_object_at_monkey");
        end On_Physical_Object_At_Monkey_A;

        function Match_6 (A_Monkey, A_Goal, An_Object : Reference)
                         return Boolean is
        begin
            return Active_Is_On (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Is_On (An_Object) = Floor and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Is_On (A_Monkey) = Goal.Object_Name (A_Goal);
        end Match_6;
        function Rule_6 is new Tuplecollection.Join3 (Match_6);

        function On_Physical_Object_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_6 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances, Any);
        end On_Physical_Object_Satisfied_C;

        procedure On_Physical_Object_Satisfied_A (Mgo : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mgo);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put ("Monkey is already on ");
            Put_Line (Goal.Object_Name (A_Goal));
        end On_Physical_Object_Satisfied_A;

-----------------------------------------------------------------------------
--          RULES                         context_holds                    --
-----------------------------------------------------------------------------

        function Match_7 (A_Monkey, A_Goal, An_Object : Reference)
                         return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Holds (A_Monkey) /= Nil and then
                      Physicalobject.Name (An_Object) = Monkey.Holds (A_Monkey);
        end Match_7;
        function Rule_7 is new Tuplecollection.Join3 (Match_7);

        function Holds_Nil_C return Tuplecollection.Object is
        begin
            return Rule_7 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances, Any);
        end Holds_Nil_C;

        procedure Holds_Nil_A (Mgo : Tuple.Object) is
            A_Monkey, A_Goal, An_Object : Reference;
        begin
            A_Monkey := Tuple.First (Mgo);
            A_Goal := Tuple.Second (Mgo);
            An_Object := Tuple.Third (Mgo);
            Put ("Drop  ");
            Put_Line (Monkey.Holds (A_Monkey));
            Goal.Modify_Status (A_Goal, Satisfied);
            Monkey.Modify_Object_Held (A_Monkey, Nil);
            Physicalobject.Modify_Is_On (An_Object, Floor);
        end Holds_Nil_A;

        function Match_8 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Holds (A_Monkey) = Nil;
        end Match_8;
        function Rule_8 is new Tuplecollection.Join2 (Match_8);

        function Holds_Nil_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_8 (Monkey.Instances, Goal.Instances, Any);
        end Holds_Nil_Satisfied_C;

        procedure Holds_Nil_Satisfied_A (Mg : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mg);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put_Line ("Monkey is holding nothing");
        end Holds_Nil_Satisfied_A;

        function Match_9 (A_Monkey, A_Goal, An_Object1, An_Object2 : Reference)
                         return Boolean is
            function Match2 (An_Object : Reference) return Boolean is
            begin
                return Physicalobject.Is_On (An_Object) =
                          Goal.Object_Name (A_Goal);
            end Match2;
            function On_Goal_Object is new Collection.Findone (Match2);
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object1) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object1) = Light and then
                      Physicalobject.Is_On (An_Object1) = Ceiling and then
                      Physicalobject.Name (An_Object2) = Ladder and then
                      Physicalobject.Is_On (An_Object2) = Floor and then
                      Physicalobject.Is_At (An_Object1) =
                         Physicalobject.Is_At (An_Object2) and then
                      Monkey.Is_On (A_Monkey) = Ladder and then
                      Monkey.Holds (A_Monkey) = Nil and then
                      Collection.Isnull (On_Goal_Object
                                            (Physicalobject.Instances));
        end Match_9;
        function Rule_9 is new Tuplecollection.Join4 (Match_9);

        function Holds_Object_Ceiling_C return Tuplecollection.Object is
        begin
            return Rule_9 (Monkey.Instances, Goal.Instances,
                           Physicalobject.Instances,
                           Physicalobject.Instances, Any);
        end Holds_Object_Ceiling_C;

        procedure Holds_Object_Ceiling_A (Mgo1o2 : Tuple.Object) is
            A_Monkey, A_Goal, An_Object : Reference;
        begin
            A_Monkey := Tuple.First (Mgo1o2);
            A_Goal := Tuple.Second (Mgo1o2);
            An_Object := Tuple.Third (Mgo1o2);
            Goal.Modify_Status (A_Goal, Satisfied);
            Monkey.Modify_Object_Held (A_Monkey, Goal.Object_Name (A_Goal));
            Physicalobject.Modify_Is_On (An_Object, Nil);
            Put ("Grab ");
            Put_Line (Goal.Object_Name (A_Goal));
        end Holds_Object_Ceiling_A;

        function Match_10 (A_Monkey, A_Goal, An_Object1, An_Object2 : Reference)
                          return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object1) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object1) = Light and then
                      Physicalobject.Is_On (An_Object1) = Ceiling and then
                      Physicalobject.Name (An_Object2) = Ladder and then
                      Physicalobject.Is_On (An_Object2) = Floor and then
                      Physicalobject.Is_At (An_Object1) =
                         Physicalobject.Is_At (An_Object2) and then
                      Monkey.Is_On (A_Monkey) /= Ladder;
        end Match_10;
        function Rule_10 is new Tuplecollection.Join4 (Match_10);

        function Holds_Object_Ceiling_On_C return Tuplecollection.Object is
        begin
            return Rule_10 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Ceiling_On_C;

        procedure Holds_Object_Ceiling_On_A (Mgo1o2 : Tuple.Object) is
        begin
            Goal.Make (Active, Is_On, Ladder, (1, 1));
--         put_line("make subgoal holds_object_ceiling_on");
        end Holds_Object_Ceiling_On_A;

        function Match_11 (A_Goal, An_Object1, An_Object2 : Reference)
                          return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object1) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object1) = Light and then
                      Physicalobject.Is_On (An_Object1) = Ceiling and then
                      Physicalobject.Name (An_Object2) = Ladder and then
                      Physicalobject.Is_At (An_Object1) /=
                         Physicalobject.Is_At (An_Object2);
        end Match_11;
        function Rule_11 is new Tuplecollection.Join3 (Match_11);

        function Holds_Object_Ceiling_At_Object_C
                    return Tuplecollection.Object is
        begin
            return Rule_11 (Goal.Instances, Physicalobject.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Ceiling_At_Object_C;

        procedure Holds_Object_Ceiling_At_Object_A (Go1o2 : Tuple.Object) is
            An_Object : Reference;
        begin
            An_Object := Tuple.Second (Go1o2);
            Goal.Make (Active, Is_At, Ladder, Physicalobject.Is_At (An_Object));
--         put_line("make subgoal holds_object_ceiling_at_object");
        end Holds_Object_Ceiling_At_Object_A;

        function Match_12
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
            function Match2 (An_Object : Reference) return Boolean is
            begin
                return Physicalobject.Is_On (An_Object) =
                          Goal.Object_Name (A_Goal);
            end Match2;
            function On_Goal_Object is new Collection.Findone (Match2);
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_On (An_Object) /= Ceiling and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Is_On (A_Monkey) = Floor and then
                      Monkey.Holds (A_Monkey) = Nil and then
                      Collection.Isnull (On_Goal_Object
                                            (Physicalobject.Instances));
        end Match_12;
        function Rule_12 is new Tuplecollection.Join3 (Match_12);

        function Holds_Object_Not_Ceiling_C return Tuplecollection.Object is
        begin
            return Rule_12 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Not_Ceiling_C;

        procedure Holds_Object_Not_Ceiling_A (Mgo : Tuple.Object) is
            A_Monkey, A_Goal, An_Object : Reference;
        begin
            A_Monkey := Tuple.First (Mgo);
            A_Goal := Tuple.Second (Mgo);
            An_Object := Tuple.Third (Mgo);
            Goal.Modify_Status (A_Goal, Satisfied);
            Monkey.Modify_Object_Held (A_Monkey, Goal.Object_Name (A_Goal));
            Physicalobject.Modify_Is_On (An_Object, Nil);
            Put ("Grab ");
            Put_Line (Goal.Object_Name (A_Goal));
        end Holds_Object_Not_Ceiling_A;

        function Match_13
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_On (An_Object) /= Ceiling and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Is_On (A_Monkey) /= Floor;
        end Match_13;
        function Rule_13 is new Tuplecollection.Join3 (Match_13);

        function Holds_Object_Not_Ceiling_On_C return Tuplecollection.Object is
        begin
            return Rule_13 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Not_Ceiling_On_C;

        procedure Holds_Object_Not_Ceiling_On_A (Mgo : Tuple.Object) is
        begin
            Goal.Make (Active, Is_On, Floor, (1, 1));
--         put_line("make subgoal holds_object_not_ceiling_on");
        end Holds_Object_Not_Ceiling_On_A;

        function Match_14
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_On (An_Object) /= Ceiling and then
                      Monkey.Is_At (A_Monkey) /=
                         Physicalobject.Is_At (An_Object);
        end Match_14;
        function Rule_14 is new Tuplecollection.Join3 (Match_14);

        function Holds_Object_Not_Ceiling_At_Monkey_C
                    return Tuplecollection.Object is
        begin
            return Rule_14 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Not_Ceiling_At_Monkey_C;

        procedure Holds_Object_Not_Ceiling_At_Monkey_A (Mgo : Tuple.Object) is
            An_Object : Reference;
        begin
            An_Object := Tuple.Third (Mgo);
            Goal.Make (Active, Is_At, Nil, Physicalobject.Is_At (An_Object));
--         put_line("make subgoal holds_object_not_ceiling_at_monkey");
        end Holds_Object_Not_Ceiling_At_Monkey_A;

        function Match_15
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Holds (A_Monkey) /= Nil and then
                      Monkey.Holds (A_Monkey) /= Goal.Object_Name (A_Goal);
        end Match_15;
        function Rule_15 is new Tuplecollection.Join3 (Match_15);

        function Holds_Object_Holds_C return Tuplecollection.Object is
        begin
            return Rule_15 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Holds_C;

        procedure Holds_Object_Holds_A (Mgo : Tuple.Object) is
        begin
            Goal.Make (Active, Holds, Nil, (1, 1));
--         put_line("make subgoal holds_object_holds");
        end Holds_Object_Holds_A;

        function Match_16
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Holds (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_On (An_Object) = Nil and then
                      Monkey.Is_At (A_Monkey) =
                         Physicalobject.Is_At (An_Object) and then
                      Monkey.Holds (A_Monkey) = Goal.Object_Name (A_Goal);
        end Match_16;
        function Rule_16 is new Tuplecollection.Join3 (Match_16);

        function Holds_Object_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_16 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end Holds_Object_Satisfied_C;

        procedure Holds_Object_Satisfied_A (Mgo : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mgo);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put ("Object ");
            Put (Goal.Object_Name (A_Goal));
            Put_Line (" is already being held");
        end Holds_Object_Satisfied_A;

-----------------------------------------------------------------------------
--          RULES                         context_at                       --
-----------------------------------------------------------------------------

        function Match_17
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Monkey.Is_At (A_Monkey) /= Goal.Go_To (A_Goal) and then
                      Monkey.Holds (A_Monkey) =
                         Goal.Object_Name (A_Goal) and then
                      Monkey.Is_On (A_Monkey) = Floor;
        end Match_17;
        function Rule_17 is new Tuplecollection.Join3 (Match_17);

        function At_Object_C return Tuplecollection.Object is
        begin
            return Rule_17 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end At_Object_C;

        procedure At_Object_A (Mgo : Tuple.Object) is
            A_Monkey, A_Goal, An_Object : Reference;
        begin
            A_Monkey := Tuple.First (Mgo);
            A_Goal := Tuple.Second (Mgo);
            An_Object := Tuple.Third (Mgo);
            Goal.Modify_Status (A_Goal, Satisfied);
            Monkey.Modify_Coordinate (A_Monkey, Goal.Go_To (A_Goal));
            Physicalobject.Modify_Coordinate (An_Object, Goal.Go_To (A_Goal));
            Put ("Move ");
            Put (Goal.Object_Name (A_Goal));
            Put (" to (");
            Put (Goal.Go_To (A_Goal).X);
            Put (" , ");
            Put (Goal.Go_To (A_Goal).Y);
            Put_Line (" )");
        end At_Object_A;

        function Match_18
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Monkey.Is_On (A_Monkey) /= Floor and then
                      Monkey.Holds (A_Monkey) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Is_At (An_Object) /= Goal.Go_To (A_Goal);
        end Match_18;
        function Rule_18 is new Tuplecollection.Join3 (Match_18);

        function At_Object_On_Floor_C return Tuplecollection.Object is
        begin
            return Rule_18 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end At_Object_On_Floor_C;

        procedure At_Object_On_Floor_A (Mgo : Tuple.Object) is
        begin
            Goal.Make (Active, Is_On, Floor, (1, 1));
--         put_line("make subgoal at_object_on_floor");
        end At_Object_On_Floor_A;

        function Match_19
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_At (An_Object) /=
                         Goal.Go_To (A_Goal) and then
                      Monkey.Holds (A_Monkey) /= Goal.Object_Name (A_Goal);
        end Match_19;
        function Rule_19 is new Tuplecollection.Join3 (Match_19);

        function At_Object_Holds_C return Tuplecollection.Object is
        begin
            return Rule_19 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end At_Object_Holds_C;

        procedure At_Object_Holds_A (Mgo : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mgo);
            Goal.Make (Active, Holds, Goal.Object_Name (A_Goal), (1, 1));
--         put_line("make subgoal at_object_holds");
        end At_Object_Holds_A;

        function Match_20 (A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Physicalobject.Name (An_Object) =
                         Goal.Object_Name (A_Goal) and then
                      Physicalobject.Weight (An_Object) = Light and then
                      Physicalobject.Is_At (An_Object) = Goal.Go_To (A_Goal);
        end Match_20;
        function Rule_20 is new Tuplecollection.Join2 (Match_20);

        function At_Object_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_20 (Goal.Instances, Physicalobject.Instances, Any);
        end At_Object_Satisfied_C;

        procedure At_Object_Satisfied_A (Go : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.First (Go);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put ("The object ");
            Put (Goal.Object_Name (A_Goal));
            Put (" is already at (");
            Put (Goal.Go_To (A_Goal).X);
            Put (" , ");
            Put (Goal.Go_To (A_Goal).Y);
            Put_Line (" )");
        end At_Object_Satisfied_A;

        function Match_21 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Is_At (A_Monkey) /= Goal.Go_To (A_Goal) and then
                      Monkey.Is_On (A_Monkey) = Floor and then
                      Monkey.Holds (A_Monkey) = Nil;
        end Match_21;
        function Rule_21 is new Tuplecollection.Join2 (Match_21);

        function At_Monkey_C return Tuplecollection.Object is
        begin
            return Rule_21 (Monkey.Instances, Goal.Instances, Any);
        end At_Monkey_C;

        procedure At_Monkey_A (Mg : Tuple.Object) is
            A_Monkey, A_Goal : Reference;
        begin
            A_Monkey := Tuple.First (Mg);
            A_Goal := Tuple.Second (Mg);
            Goal.Modify_Status (A_Goal, Satisfied);
            Monkey.Modify_Coordinate (A_Monkey, Goal.Go_To (A_Goal));
            Put ("Walk to (");
            Put (Goal.Go_To (A_Goal).X);
            Put (" , ");
            Put (Goal.Go_To (A_Goal).Y);
            Put_Line (" )");
        end At_Monkey_A;

        function Match_22
                    (A_Monkey, A_Goal, An_Object : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Is_On (A_Monkey) = Floor and then
                      Physicalobject.Name (An_Object) =
                         Monkey.Holds (A_Monkey) and then
                      Monkey.Is_At (A_Monkey) /= Goal.Go_To (A_Goal);
        end Match_22;
        function Rule_22 is new Tuplecollection.Join3 (Match_22);

        function At_Monkey_Object_C return Tuplecollection.Object is
        begin
            return Rule_22 (Monkey.Instances, Goal.Instances,
                            Physicalobject.Instances, Any);
        end At_Monkey_Object_C;

        procedure At_Monkey_Object_A (Mgo : Tuple.Object) is
            A_Monkey, A_Goal, An_Object : Reference;
        begin
            A_Monkey := Tuple.First (Mgo);
            A_Goal := Tuple.Second (Mgo);
            An_Object := Tuple.Third (Mgo);
            Goal.Modify_Status (A_Goal, Satisfied);
            Physicalobject.Modify_Coordinate (An_Object, Goal.Go_To (A_Goal));
            Monkey.Modify_Coordinate (A_Monkey, Goal.Go_To (A_Goal));
            Put ("Walk to (");
            Put (Goal.Go_To (A_Goal).X);
            Put (" , ");
            Put (Goal.Go_To (A_Goal).Y);
            Put (" ) carrying ");
            Put_Line (Monkey.Holds (A_Monkey));
        end At_Monkey_Object_A;

        function Match_23 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Is_At (A_Monkey) /= Goal.Go_To (A_Goal) and then
                      Monkey.Is_On (A_Monkey) /= Floor;
        end Match_23;
        function Rule_23 is new Tuplecollection.Join2 (Match_23);

        function At_Monkey_On_C return Tuplecollection.Object is
        begin
            return Rule_23 (Monkey.Instances, Goal.Instances, Any);
        end At_Monkey_On_C;

        procedure At_Monkey_On_A (Mg : Tuple.Object) is
        begin
            Goal.Make (Active, Is_On, Floor, (1, 1));
--         put_line("make subgoal at_monkey_on");
        end At_Monkey_On_A;

        function Match_24 (A_Monkey, A_Goal : Reference) return Boolean is
        begin
            return Active_Is_At (A_Goal) and then
                      Goal.Object_Name (A_Goal) = Nil and then
                      Monkey.Is_At (A_Monkey) = Goal.Go_To (A_Goal);
        end Match_24;
        function Rule_24 is new Tuplecollection.Join2 (Match_24);

        function At_Monkey_Satisfied_C return Tuplecollection.Object is
        begin
            return Rule_24 (Monkey.Instances, Goal.Instances, Any);
        end At_Monkey_Satisfied_C;

        procedure At_Monkey_Satisfied_A (Mg : Tuple.Object) is
            A_Goal : Reference;
        begin
            A_Goal := Tuple.Second (Mg);
            Goal.Modify_Status (A_Goal, Satisfied);
            Put ("Monkey is already at (");
            Put (Goal.Go_To (A_Goal).X);
            Put (" , ");
            Put (Goal.Go_To (A_Goal).Y);
            Put_Line (" )");
        end At_Monkey_Satisfied_A;

        function Match_25 (A_Goal : Reference) return Boolean is
        begin
            return Goal.Status (A_Goal) = Satisfied and then
                      Collection.Isnull (Find_Active (Goal.Instances));
        end Match_25;
        function Rule_25 is new Collection.Findone (Match_25);

        function Congratulations_C return Boolean is
        begin  
            return not Collection.Isnull (Rule_25 (Goal.Instances));
        end Congratulations_C;

        procedure Congratulations_A is
        begin
            Put_Line ("CONGRATULATIONS the goals are satisfied");
        end Congratulations_A;


        function Impossible_C return Boolean is
        begin
            return not Collection.Isnull (Find_Active (Goal.Instances));
        end Impossible_C;

        procedure Impossible_A is
            A_Goal : Reference;
        begin
            A_Goal := Find_Active (Goal.Instances);
            Put ("IMPOSSIBLE, the goal ");
            Put (G_Type'Image (Goal.Goal_Type (A_Goal)));
            Put_Line (" cannot be achieved");
        end Impossible_A;


        procedure Create_Test (I : Positive) is
        begin
            case I is
                when 1 =>
                    Physicalobject.Make (As_Name ("bananas"),
                                         (9, 9), Light, Ceiling);
                    Physicalobject.Make (As_Name ("couch"),  
                                         (7, 7), Heavy, Floor);
                    Physicalobject.Make (Ladder,  
                                         (4, 3), Light, Floor);
                    Monkey.Make ((7, 7), As_Name ("couch"),
                                 As_Name ("blanket"));
                    Physicalobject.Make (As_Name ("blanket"), (7, 7), Light,  
                                         Nil);
                    Goal.Make (Active, Holds, As_Name ("bananas"), (1, 1));
                when 2 =>
                    Physicalobject.Make (As_Name ("bananas"),
                                         (7, 7), Light, Ceiling);
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Floor);
                    Physicalobject.Make (As_Name ("blanket"), (5, 5), Light,  
                                         Floor);
                    Monkey.Make ((5, 5), Ladder, Nil);
                    Goal.Make (Active, Holds, As_Name ("bananas"), (1, 1));
                when 3 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 7), Light, Floor);
                    Monkey.Make ((5, 7), Ladder, Nil);
                    Goal.Make (Active, Is_On, Floor, (1, 1));
                when 4 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 7), Light, Floor);
                    Monkey.Make ((5, 7), Floor, Nil);
                    Goal.Make (Active, Is_On, Floor, (1, 1));
                when 5 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Floor);
                    Monkey.Make ((5, 5), Floor, Nil);
                    Goal.Make (Active, Is_On, Ladder, (1, 1));
                when 6 =>
                    Monkey.Make ((5, 5), Floor, Ladder);
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Nil);
                    Goal.Make (Active, Is_On, Ladder, (1, 1));
                when 7 =>
                    Physicalobject.Make (Ladder,  
                                         (6, 5), Light, Floor);
                    Monkey.Make ((3, 3), Floor, Nil);
                    Goal.Make (Active, Is_On, Ladder, (1, 1));
                when 8 =>
                    Physicalobject.Make (Ladder,  
                                         (6, 5), Light, Floor);
                    Monkey.Make ((6, 5), Ladder, Nil);
                    Goal.Make (Active, Is_On, Ladder, (1, 1));
                when 9 =>
                    Monkey.Make ((5, 5), Floor, As_Name ("blanket"));
                    Physicalobject.Make (As_Name ("blanket"),  
                                         (5, 5), Light, Nil);
                    Goal.Make (Active, Holds, Nil, (1, 1));
                when 10 =>
                    Monkey.Make ((5, 5), Floor, Nil);
                    Goal.Make (Active, Holds, Nil, (1, 1));
                when 11 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Floor);
                    Physicalobject.Make (As_Name ("bananas"),  
                                         (5, 5), Light, Ceiling);
                    Monkey.Make ((5, 5), Floor, Nil);
                    Goal.Make (Active, Holds, As_Name ("bananas"), (1, 1));
                when 12 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Floor);
                    Physicalobject.Make (As_Name ("bananas"),  
                                         (7, 7), Light, Ceiling);
                    Monkey.Make ((5, 5), Ladder, As_Name ("blanket"));
                    Physicalobject.Make (As_Name ("blanket"),
                                         (5, 5), Light, Nil);
                    Goal.Make (Active, Holds, As_Name ("bananas"), (1, 1));
                when 13 =>
                    Physicalobject.Make (Ladder,  
                                         (5, 5), Light, Floor);
                    Monkey.Make ((5, 5), Ladder, Nil);
                    Goal.Make (Active, Holds, Ladder, (1, 1));
                when 14 =>
                    Physicalobject.Make (Ladder,  
                                         (7, 5), Light, Floor);
                    Monkey.Make ((5, 5), Floor, Nil);
                    Goal.Make (Active, Holds, Ladder, (1, 1));
                when 15 =>
                    Monkey.Make ((5, 5), Floor, As_Name ("bananas"));
                    Physicalobject.Make (As_Name ("bananas"),
                                         (5, 5), Light, Nil);
                    Goal.Make (Active, Holds, As_Name ("bananas"), (1, 1));
                when 16 =>
                    Monkey.Make ((5, 7), Floor, Nil);
                    Physicalobject.Make (Ladder, (7, 7), Light, Floor);
                    Goal.Make (Active, Is_At, Nil, (7, 7));
                when 17 =>
                    Monkey.Make ((5, 5), Floor, As_Name ("blanket"));
                    Physicalobject.Make (As_Name ("blanket"),
                                         (5, 5), Light, Nil);
                    Physicalobject.Make (Ladder, (7, 7), Light, Floor);
                    Goal.Make (Active, Is_At, Nil, (7, 7));
                when 18 =>
                    Physicalobject.Make (As_Name ("couch"),
                                         (5, 5), Light, Floor);
                    Monkey.Make ((5, 5), As_Name ("couch"), Nil);
                    Physicalobject.Make (Ladder, (7, 7), Light, Floor);
                    Goal.Make (Active, Is_At, Nil, (7, 7));
                when 19 =>
                    Monkey.Make ((5, 5), Floor, Ladder);
                    Physicalobject.Make (Ladder, (5, 5), Light, Nil);
                    Physicalobject.Make (As_Name ("bananas"),
                                         (8, 8), Light, Ceiling);
                    Goal.Make (Active, Is_At, Ladder, (8, 8));
                when 20 =>
                    Physicalobject.Make (As_Name ("couch"),
                                         (5, 5), Heavy, Floor);
                    Monkey.Make ((5, 5), As_Name ("couch"),
                                 As_Name ("bananas"));
                    Physicalobject.Make (As_Name ("bananas"),
                                         (5, 5), Light, Nil);
                    Goal.Make (Active, Is_At, As_Name ("bananas"), (7, 7));
                when 21 =>
                    Physicalobject.Make (Ladder, (7, 5), Light, Floor);
                    Monkey.Make ((5, 5), Floor, Nil);
                    Physicalobject.Make (As_Name ("bananas"),
                                         (8, 8), Light, Ceiling);
                    Goal.Make (Active, Is_At, Ladder, (8, 8));
                when 22 =>
                    Monkey.Make ((5, 5), Floor, Nil);
                    Physicalobject.Make (As_Name ("elephant"),
                                         (8, 8), Heavy, Floor);
                    Goal.Make (Active, Is_At, As_Name ("elephant"), (6, 7));

                when others =>
                    null;
            end case;
        end Create_Test;

        package Context_On is
           new Engine (Context_Name => "context_on",
                       Resolution => Lex,
                       Used_Rules => 6,
                       Name_1 => "on_floor       ",
                       Condition_1 => On_Floor_C,
                       Action_1 => On_Floor_A,
                       Name_2 => "on_floor_satisf",
                       Condition_2 => On_Floor_Satisfied_C,
                       Action_2 => On_Floor_Satisfied_A,
                       Name_3 => "on_physical_obj",
                       Condition_3 => On_Physical_Object_C,
                       Action_3 => On_Physical_Object_A,
                       Name_4 => "on_physical_obj",
                       Condition_4 => On_Physical_Object_Holds_C,
                       Action_4 => On_Physical_Object_Holds_A,
                       Name_5 => "on_physical_obj",
                       Condition_5 => On_Physical_Object_At_Monkey_C,
                       Action_5 => On_Physical_Object_At_Monkey_A,
                       Name_6 => "on_physical_obj",
                       Condition_6 => On_Physical_Object_Satisfied_C,
                       Action_6 => On_Physical_Object_Satisfied_A);

        package Context_Holds is
           new Engine (Context_Name => "context_ho",
                       Resolution => Lex,
                       Used_Rules => 10,
                       Name_1 => "holds_nil      ",
                       Condition_1 => Holds_Nil_C,
                       Action_1 => Holds_Nil_A,
                       Name_2 => "holds_nil_satis",
                       Condition_2 => Holds_Nil_Satisfied_C,
                       Action_2 => Holds_Nil_Satisfied_A,
                       Name_3 => "holds_object_ce",
                       Condition_3 => Holds_Object_Ceiling_C,
                       Action_3 => Holds_Object_Ceiling_A,
                       Name_4 => "holds_object_ce",
                       Condition_4 => Holds_Object_Ceiling_On_C,
                       Action_4 => Holds_Object_Ceiling_On_A,
                       Name_5 => "holds_object_ce",
                       Condition_5 => Holds_Object_Ceiling_At_Object_C,
                       Action_5 => Holds_Object_Ceiling_At_Object_A,
                       Name_6 => "holds_object_no",
                       Condition_6 => Holds_Object_Not_Ceiling_C,
                       Action_6 => Holds_Object_Not_Ceiling_A,
                       Name_7 => "holds_object_no",
                       Condition_7 => Holds_Object_Not_Ceiling_On_C,
                       Action_7 => Holds_Object_Not_Ceiling_On_A,
                       Name_8 => "holds_object_no",
                       Condition_8 => Holds_Object_Not_Ceiling_At_Monkey_C,
                       Action_8 => Holds_Object_Not_Ceiling_At_Monkey_A,
                       Name_9 => "holds_object_ho",
                       Condition_9 => Holds_Object_Holds_C,
                       Action_9 => Holds_Object_Holds_A,
                       Name_10 => "holds_object_sa",
                       Condition_10 => Holds_Object_Satisfied_C,
                       Action_10 => Holds_Object_Satisfied_A);

        package Context_At is new Engine (Context_Name => "context_at",
                                          Resolution => Lex,
                                          Used_Rules => 8,
                                          Name_1 => "at_object      ",
                                          Condition_1 => At_Object_C,
                                          Action_1 => At_Object_A,
                                          Name_2 => "at_object_on_fl",
                                          Condition_2 => At_Object_On_Floor_C,
                                          Action_2 => At_Object_On_Floor_A,
                                          Name_3 => "at_object_holds",
                                          Condition_3 => At_Object_Holds_C,
                                          Action_3 => At_Object_Holds_A,
                                          Name_4 => "at_object_satis",
                                          Condition_4 => At_Object_Satisfied_C,
                                          Action_4 => At_Object_Satisfied_A,
                                          Name_5 => "at_monkey      ",
                                          Condition_5 => At_Monkey_C,
                                          Action_5 => At_Monkey_A,
                                          Name_6 => "at_monkey_objec",
                                          Condition_6 => At_Monkey_Object_C,
                                          Action_6 => At_Monkey_Object_A,
                                          Name_7 => "at_monkey_on   ",
                                          Condition_7 => At_Monkey_On_C,
                                          Action_7 => At_Monkey_On_A,
                                          Name_8 => "at_monkey_satis",
                                          Condition_8 => At_Monkey_Satisfied_C,
                                          Action_8 => At_Monkey_Satisfied_A);


        procedure Find_The_Bananas is
        begin
            Put_Line ("-------------------------------------------------");
            for I in 1 .. 22 loop
                Put ("TEST ");
                Put (I);
                Put_Line (" :");
                Create_Test (I);
                loop
                    exit when not Context_On.Inference (1) and
                                 not Context_Holds.Inference (1) and
                                 not Context_At.Inference (1);
                end loop;
                if Congratulations_C then
                    Congratulations_A;
                elsif Impossible_C then
                    Impossible_A;
                end if;
                Monkey.Clear;
                Physicalobject.Clear;
                Goal.Clear;
                Put_Line ("-------------------------------------------------");
            end loop;
        end Find_The_Bananas;
    end Monkeyandban;

begin


    Debugger.Setdebugoff (Debugger.Completly);

    Monkeyandban.Find_The_Bananas;

    Debugger.Resetdebug (Debugger.Text);
    Debugger.Setdebugon (Debugger.Completly);
    Debugger.Refreshdebug;
    Debugger.Setdebugoff (Debugger.Conditionevalued);

    Monkeyandban.Find_The_Bananas;

end Ctxban2;