|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 16384 (0x4000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Fact, seg_02ad95
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦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;
nblk1=f
nid=c
hdr6=18
[0x00] rec0=23 rec1=00 rec2=01 rec3=03c
[0x01] rec0=1e rec1=00 rec2=07 rec3=044
[0x02] rec0=02 rec1=00 rec2=05 rec3=04e
[0x03] rec0=12 rec1=00 rec2=0b rec3=044
[0x04] rec0=23 rec1=00 rec2=08 rec3=036
[0x05] rec0=23 rec1=00 rec2=09 rec3=08c
[0x06] rec0=1c rec1=00 rec2=0f rec3=06e
[0x07] rec0=0b rec1=00 rec2=02 rec3=012
[0x08] rec0=1f rec1=00 rec2=0a rec3=05e
[0x09] rec0=01 rec1=00 rec2=04 rec3=036
[0x0a] rec0=1d rec1=00 rec2=06 rec3=010
[0x0b] rec0=14 rec1=00 rec2=0d rec3=000
[0x0c] rec0=14 rec1=00 rec2=0d rec3=001
[0x0d] rec0=40 rec1=00 rec2=00 rec3=002
[0x0e] rec0=00 rec1=00 rec2=00 rec3=019
tail 0x21723f45683e57bdb42e9 0x42a00088462063c03
Free Block Chain:
0xc: 0000 00 03 00 06 80 03 43 6c 61 03 6e 20 69 73 20 20 ┆ Cla n is ┆
0x3: 0000 00 0e 00 16 80 13 20 20 20 20 20 75 73 65 20 4f ┆ use O┆
0xe: 0000 00 00 00 57 80 0e 61 72 64 5f 4f 75 74 70 75 74 ┆ W ard_Output┆