|
|
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: 22528 (0x5800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Working_Memory, seg_03c59c, seg_03c6de, separate Generic_Fact_Base
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
separate (Generic_Fact_Base)
package body Working_Memory is
type Class_Objects is array (Class_Names) of Class.Object;
The_Classes : Class_Objects := (others => Class.Null_Class);
procedure Make_Empty is
use Class;
begin
for C in Class_Names loop
if C /= Null_Class_Name and then The_Classes (C) /= Null_Class then
Class.Make_Empty (The_Classes (C));
end if;
end loop;
end Make_Empty;
function Get (Using : Class_Names) return Class.Object is
begin
return The_Classes (Using);
end Get;
function Retrieve (Filter : Query.Objects) return Class.User_Objects is
Result : Class.User_Objects (Filter'Range);
function Twins_Exist
(Start_Index : Positive; The_Fact : Class.User_Object)
return Boolean is
use Class;
begin
for I in (Start_Index) .. Result'Last loop
if Result (I) = The_Fact then
return True;
end if;
end loop;
return False;
end Twins_Exist;
function Recursive_Search (Index : Positive) return Boolean is
The_Class_Name : Class_Names;
The_Class : Class.Object;
The_Matching_Fact : Class.User_Object;
begin
if Index > Filter'Last then
return True;
else
case Filter (Index).Kind is
when Query.Find =>
The_Class_Name := Filter (Index).Class;
The_Class := The_Classes (The_Class_Name);
for Id in 1 .. Class.Last_Instance (The_Class) loop
if Class.Match (The_Instance => Id,
Against_Patterns =>
Filter (Index).Value,
Using_Class => The_Class) then
if Recursive_Search (Index + 1) then
The_Matching_Fact :=
Class.As_User_Object (Id, The_Class);
if not Twins_Exist (Index + 1,
The_Matching_Fact) then
Result (Index) := The_Matching_Fact;
return True;
end if;
end if;
end if;
end loop;
when Query.Check_No =>
The_Class_Name := Filter (Index).Class;
The_Class := The_Classes (The_Class_Name);
for Id in 1 .. Class.Last_Instance (The_Class) loop
if Class.Match (The_Instance => Id,
Against_Patterns =>
Filter (Index).Value,
Using_Class => The_Class) then
return False;
end if;
end loop;
if Recursive_Search (Index + 1) then
Result (Index) := Class.Null_User_Object;
return True;
end if;
when Query.Evaluate =>
if Query.Operators.Match
(Filter (Index).The_Expression,
Filter (Index).The_Predicate) then
if Recursive_Search (Index + 1) then
Result (Index) := Class.Null_User_Object;
return True;
end if;
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 Class.No_User_Objects;
end if;
end Retrieve;
function Twins_Exist (The_Facts : Class.User_Objects) return Boolean is
use Class;
begin
for I in The_Facts'First .. The_Facts'Last - 1 loop
for J in I + 1 .. The_Facts'Last loop
if The_Facts (I) /= Class.Null_User_Object and then
The_Facts (I) = The_Facts (J) then
return True;
end if;
end loop;
end loop;
return False;
end Twins_Exist;
procedure Retrieve_With_Conflict_Set
(The_Rule : Rule_Id; Filter : Query.Objects) is
Result : Class.User_Objects (Filter'Range);
Trace : array (Filter'Range) of Class.Instance_Name := (others => 1);
Instance_Has_Been_Found : Boolean := False;
function Recursive_Search (Index : Positive) return Boolean is
The_Class_Name : Class_Names;
The_Class : Class.Object;
The_Matching_Fact : Class.User_Object;
The_Last_Instance : Class.Instance_Name;
use Class;
begin
if Index > Filter'Last then
if Instance_Has_Been_Found then
Instance_Has_Been_Found := False;
Trace := (others => 1);
return False;
else
return True;
end if;
else
case Filter (Index).Kind is
when Query.Find =>
The_Class_Name := Filter (Index).Class;
The_Class := The_Classes (The_Class_Name);
The_Last_Instance := Class.Last_Instance (The_Class);
for Id in Trace (Index) .. The_Last_Instance loop
if Class.Match (The_Instance => Id,
Against_Patterns =>
Filter (Index).Value,
Using_Class => The_Class) then
if Recursive_Search (Index + 1) then
The_Matching_Fact :=
Class.As_User_Object (Id, The_Class);
Result (Index) := The_Matching_Fact;
Trace (Index) := Id;
return True;
end if;
end if;
end loop;
when Query.Check_No =>
The_Class_Name := Filter (Index).Class;
The_Class := The_Classes (The_Class_Name);
The_Last_Instance := Class.Last_Instance (The_Class);
for Id in 1 .. The_Last_Instance loop
if Class.Match (The_Instance => Id,
Against_Patterns =>
Filter (Index).Value,
Using_Class => The_Class) then
return False;
end if;
end loop;
if Recursive_Search (Index + 1) then
Result (Index) := Class.Null_User_Object;
return True;
end if;
when Query.Evaluate =>
if Query.Operators.Match
(Filter (Index).The_Expression,
Filter (Index).The_Predicate) then
if Recursive_Search (Index + 1) then
Result (Index) := Class.Null_User_Object;
return True;
end if;
end if;
end case;
return False;
end if;
end Recursive_Search;
begin
if Filter'Length /= 0 then
while not Conflict_Set_Is_Full and then
Recursive_Search (Filter'First) loop
Instance_Has_Been_Found := True;
if not Twins_Exist (Result) then
Add_To_Conflict_Set (Instance_Value (The_Rule, Result));
end if;
end loop;
end if;
end Retrieve_With_Conflict_Set;
procedure Generic_Put (Where : Output_Stream.Object) is
procedure Class_Put is new Class.Generic_Put (Put);
begin
for C in The_Classes'Range loop
if C /= Null_Class_Name then
Class_Put (The_Class => The_Classes (C), Where => Where);
end if;
end loop;
end Generic_Put;
procedure Default_Put (Where : Output_Stream.Object) is
procedure Default_Working_Memory_Put is
new Generic_Put (Class.Default_Put);
begin
Default_Working_Memory_Put (Where);
end Default_Put;
procedure Register (The_Class : Class.Object) is
begin
The_Classes (Class.Class_Name_Of (The_Class)) := The_Class;
end Register;
end Working_Memory;
nblk1=15
nid=2
hdr6=1e
[0x00] rec0=26 rec1=00 rec2=01 rec3=03a
[0x01] rec0=01 rec1=00 rec2=06 rec3=044
[0x02] rec0=19 rec1=00 rec2=04 rec3=01a
[0x03] rec0=00 rec1=00 rec2=0a rec3=020
[0x04] rec0=10 rec1=00 rec2=03 rec3=05a
[0x05] rec0=00 rec1=00 rec2=07 rec3=00a
[0x06] rec0=12 rec1=00 rec2=08 rec3=034
[0x07] rec0=20 rec1=00 rec2=09 rec3=01c
[0x08] rec0=01 rec1=00 rec2=10 rec3=03c
[0x09] rec0=18 rec1=00 rec2=0f rec3=094
[0x0a] rec0=04 rec1=00 rec2=05 rec3=046
[0x0b] rec0=10 rec1=00 rec2=0e rec3=05a
[0x0c] rec0=12 rec1=00 rec2=0c rec3=008
[0x0d] rec0=1e rec1=00 rec2=0b rec3=026
[0x0e] rec0=11 rec1=00 rec2=11 rec3=000
[0x0f] rec0=11 rec1=00 rec2=05 rec3=064
[0x10] rec0=1d rec1=00 rec2=0e rec3=020
[0x11] rec0=12 rec1=00 rec2=06 rec3=000
[0x12] rec0=00 rec1=00 rec2=00 rec3=000
[0x13] rec0=00 rec1=00 rec2=00 rec3=000
[0x14] rec0=00 rec1=00 rec2=00 rec3=000
tail 0x2173ab9a885b152b952f7 0x42a00088462063c03
Free Block Chain:
0x2: 0000 00 0d 00 0e 80 04 74 68 65 6e 04 00 04 20 20 20 ┆ then ┆
0xd: 0000 00 15 03 fc 80 34 20 20 20 20 20 20 20 20 20 20 ┆ 4 ┆
0x15: 0000 00 12 03 f4 80 36 46 69 6c 74 65 72 27 52 61 6e ┆ 6Filter'Ran┆
0x12: 0000 00 13 00 07 80 04 20 20 20 20 04 05 20 20 20 20 ┆ ┆
0x13: 0000 00 14 00 0a 80 07 6e 64 65 78 20 2d 20 07 00 00 ┆ ndex - ┆
0x14: 0000 00 00 00 36 80 19 20 28 54 68 65 5f 49 6e 73 74 ┆ 6 (The_Inst┆