DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 6499 (0x1963) Types: TextFile Names: »B«
└─⟦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⟧ └─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦e24fb53b7⟧ └─⟦this⟧
with Condition; with Class_Id; with Text_Io; use Condition; package body Fact is Max_Object_Count : constant := 100; Last_Object : Name := 0; subtype Object_Size is Natural range 0 .. Max_Slots; type Object (Size : Object_Size := 0) is record Valid : Boolean := False; Value : Frame (1 .. Size); end record; Null_Object : constant Object := (Size => 0, Valid => False, Value => (others => 0)); type Object_Collection is array (Name range <>) of Object; Working_Memory : Object_Collection (1 .. Max_Object_Count) := (others => Null_Object); function Make_Object (F : Frame) return Object is begin return (Size => F'Length, Valid => True, Value => F); end Make_Object; function Empty_Collection return Collection is begin return (1 .. 0 => Null_Name); end Empty_Collection; function Match (Value : Frame; Against : Pattern) return Boolean is begin for I in Value'Range loop if not Match (Value (I), Against (I)) then return False; end if; end loop; return True; end Match; function Find (Filter : Pattern) return Name is Wm : Object_Collection renames Working_Memory; begin for I in Wm'First .. Last_Object loop if Wm (I).Valid and then Match (Wm (I).Value, Against => Filter) then return I; end if; end loop; return Null_Name; end Find; function Find (Filter : Pattern) return Collection is Wm : Object_Collection renames Working_Memory; function Recursive_Find (Starting_At : Name) return Collection is begin for I in Starting_At .. Last_Object loop if Wm (I).Valid and then Match (Wm (I).Value, Against => Filter) then return I & Recursive_Find (Starting_At => I + 1); end if; end loop; return Empty_Collection; end Recursive_Find; begin return Recursive_Find (Starting_At => Wm'First); end Find; function Retrieve (Filter : Join_Descriptor) return Collection is Result : Collection (Filter'Range); Wm : Object_Collection renames Working_Memory; function Recursive_Search (Search_Index : Positive) return Boolean is begin if Search_Index > Filter'Last then return True; else case Filter (Search_Index).Kind is when Find => for I in Wm'First .. Last_Object loop if Wm (I).Valid and then Match (Wm (I).Value, Filter (Search_Index).Value) then if Recursive_Search (Search_Index + 1) then Result (Search_Index) := I; return True; end if; end if; end loop; when Check_No => for I in Wm'First .. Last_Object loop if Wm (I).Valid and then Match (Wm (I).Value, Filter (Search_Index).Value) then return False; end if; end loop; if Recursive_Search (Search_Index + 1) then Result (Search_Index) := Null_Name; return True; end if; end case; return False; end if; end Recursive_Search; begin if Filter'Length /= 0 and then Recursive_Search (Filter'First) then return Result; else return Empty_Collection; end if; end Retrieve; procedure Put (The_Fact : Name) is First : Boolean := True; The_Object : Object renames Working_Memory (The_Fact); begin if The_Object /= Null_Object then Text_Io.Put ("Class => " & Class_Id.Image (The_Object.Value (1)) & ", "); for I in 2 .. The_Object.Value'Last loop if not First then Text_Io.Put (", "); else First := False; end if; Text_Io.Put ("Attribute" & Slot_Names'Image (I) & " => " & Integer'Image (The_Object.Value (I))); end loop; Text_Io.New_Line; end if; end Put; procedure Put (The_Collection : Collection) is begin if The_Collection'Length /= 0 then for I in The_Collection'Range loop Put (The_Collection (I)); end loop; end if; end Put; procedure Add (The_Fact : Frame) is begin for I in Working_Memory'Range loop if Working_Memory (I) = Null_Object then Working_Memory (I) := Make_Object (The_Fact); if I > Last_Object then Last_Object := I; end if; return; end if; end loop; raise Overflow; end Add; procedure Delete (The_Fact : Name) is begin Working_Memory (The_Fact) := Null_Object; if Last_Object = The_Fact then Last_Object := Last_Object - 1; for I in reverse 1 .. Last_Object loop exit when Working_Memory (I) /= Null_Object; Last_Object := I; end loop; end if; end Delete; procedure Change (The_Fact : Name; Value : Frame) is begin Working_Memory (The_Fact) := Make_Object (Value); end Change; procedure Change (The_Fact : Name; The_Slot : Slot_Names; To_Value : Integer) is begin Working_Memory (The_Fact).Value (The_Slot) := To_Value; end Change; function Get (The_Fact : Name) return Frame is begin return Working_Memory (The_Fact).Value; end Get; function Get (The_Fact : Name; Slot : Slot_Names) return Integer is begin return Working_Memory (The_Fact).Value (Slot); end Get; end Fact;