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: 8640 (0x21c0) Types: TextFile Names: »B«
└─⟦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⟧
with Condition; with Constant_String; with Text_Io; use Condition; package body Fact is Max_Frame_Count : constant := 200; Last_Frame : Name := 0; type Frames is array (Name range <>) of Frame; Working_Memory : Frames (1 .. Max_Frame_Count) := (others => Null_Frame); ------------------------------------------------------------------------- function Image (Of_Class : Class_Name) return String renames Constant_String.Image; function "=" (Left, Right : Class_Name) return Boolean renames Constant_String."="; ------------------------------------------------------------------------- function Empty_Collection return Collection is begin return (1 .. 0 => Null_Name); end Empty_Collection; function Match (The_Fact_Class, The_Filter_Class : Class_Name) return Boolean is Result : Boolean; begin Result := The_Fact_Class /= Null_Class_Name and then The_Fact_Class = The_Filter_Class; return Result; end Match; function Match (The_Slots : Slots; Against : Patterns) return Boolean is begin for I in The_Slots'Range loop if not Match (The_Slots (I), Against (I)) then return False; end if; end loop; return True; end Match; ------------------------------------------------------------------------- function Retrieve (Filter : Queries) return Collection is Result : Collection (Filter'Range); Wm : Frames renames Working_Memory; function Recursive_Search (Index : Positive) return Boolean is Filter_Class : Class_Name; begin if Index > Filter'Last then return True; else Filter_Class := Filter (Index).Class; case Filter (Index).Kind is when Find => for I in Wm'First .. Last_Frame loop if Match (Wm (I).Class, Filter_Class) and then Match (Wm (I).Value, Filter (Index).Value) then if Recursive_Search (Index + 1) then Result (Index) := I; return True; end if; end if; end loop; when Check_No => for I in Wm'First .. Last_Frame loop if Match (Wm (I).Class, Filter_Class) and then Match (Wm (I).Value, Filter (Index).Value) then return False; end if; end loop; if Recursive_Search (Index + 1) then Result (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 Add (The_Fact : Frame) is begin for I in Working_Memory'Range loop if Working_Memory (I) = Null_Frame then Working_Memory (I) := The_Fact; if I > Last_Frame then Last_Frame := I; end if; return; end if; end loop; raise Overflow; end Add; procedure Delete (The_Fact : Name) is begin Working_Memory (The_Fact) := Null_Frame; if Last_Frame = The_Fact then Last_Frame := Last_Frame - 1; for I in reverse 1 .. Last_Frame loop exit when Working_Memory (I) /= Null_Frame; Last_Frame := I; end loop; end if; end Delete; procedure Change (The_Fact : Name; Value : Frame) is begin Working_Memory (The_Fact) := 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); end Get; function Get (The_Fact : Name; Slot : Slot_Names) return Integer is begin return Working_Memory (The_Fact).Value (Slot); end Get; ------------------------------------------------------------------------- procedure Put (The_Patterns : Patterns; Where : Output_Stream.Object := Output_Stream.Standard_Output) is First : Boolean := True; use Output_Stream; begin for I in The_Patterns'Range loop if not First then Put_Line (", ", Where); else First := False; end if; Put ("Slot" & Slot_Names'Image (I) & " => ", Where); Put (The_Condition => The_Patterns (I), Where => Where); end loop; end Put; procedure Put (The_Query : Query; Where : Output_Stream.Object) is use Output_Stream; begin case The_Query.Kind is when Find => Put_Line ("Find_" & Image (The_Query.Class) & "_Such_As'(", Where); when Check_No => Put_Line ("Check_No_" & Image (The_Query.Class) & "_Has'(", Where); end case; Indent_Right (Where); Put (The_Patterns => The_Query.Value, Where => Where); Indent_Left (Where); Put_Line (")", Where); end Put; procedure Put (The_Queries : Queries; Where : Output_Stream.Object) is use Output_Stream; begin Put ("Premiss'(", Where); Indent_Right (Where); for I in The_Queries'Range loop Put (The_Queries (I), Where); New_Line (Where); end loop; Indent_Left (Where); Put_Line (")", Where); end Put; procedure Put (The_Slots : Slots; Where : Output_Stream.Object := Output_Stream.Standard_Output) is First : Boolean := True; use Output_Stream; begin for I in The_Slots'Range loop if not First then Put (", ", Where); if I mod 2 /= 0 then New_Line (Where); end if; else First := False; end if; Put ("Slot" & Slot_Names'Image (I) & " =>", Where); Put (Integer'Image (The_Slots (I)), Where); end loop; end Put; procedure Put (The_Fact : Name; Where : Output_Stream.Object) is The_Object : Frame; use Output_Stream; begin if The_Fact /= Null_Name then The_Object := Working_Memory (The_Fact); if The_Object /= Null_Frame then Put_Line (Image (The_Object.Class) & "'(", Where); Indent_Right (Where); Put (The_Slots => The_Object.Value, Where => Where); Indent_Left (Where); Put_Line (")", Where); end if; else Put ("No name", Where); end if; end Put; procedure Put (The_Collection : Collection; Where : Output_Stream.Object) is use Output_Stream; begin Put_Line ("Fact_collection'(", Where); Indent_Right (Where); if The_Collection'Length /= 0 then for I in The_Collection'Range loop Put (The_Collection (I), Where); end loop; end if; Indent_Left (Where); New_Line (Where); Put_Line (")", Where); end Put; procedure Put (Where : Output_Stream.Object) is The_Object : Frame; use Output_Stream; begin Put_Line ("Working_Memory'(", Where); Indent_Right (Where); for Name in Working_Memory'Range loop The_Object := Working_Memory (Name); if The_Object /= Null_Frame then Put (Name, Where); end if; end loop; Indent_Left (Where); Put_Line (")", Where); end Put; end Fact;