|
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 - download
Length: 16384 (0x4000) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Working_Memory, seg_04a324, seg_04a9ec, seg_04b45a, separate Generic_Fact_Base
└─⟦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=f nid=0 hdr6=1e [0x00] rec0=26 rec1=00 rec2=01 rec3=03a [0x01] rec0=19 rec1=00 rec2=02 rec3=02c [0x02] rec0=00 rec1=00 rec2=0f rec3=020 [0x03] rec0=10 rec1=00 rec2=03 rec3=07a [0x04] rec0=00 rec1=00 rec2=0e rec3=00a [0x05] rec0=12 rec1=00 rec2=04 rec3=016 [0x06] rec0=20 rec1=00 rec2=05 rec3=026 [0x07] rec0=19 rec1=00 rec2=06 rec3=016 [0x08] rec0=00 rec1=00 rec2=0d rec3=040 [0x09] rec0=0f rec1=00 rec2=07 rec3=034 [0x0a] rec0=01 rec1=00 rec2=0c rec3=006 [0x0b] rec0=11 rec1=00 rec2=08 rec3=034 [0x0c] rec0=00 rec1=00 rec2=0b rec3=016 [0x0d] rec0=18 rec1=00 rec2=09 rec3=000 [0x0e] rec0=1d rec1=00 rec2=0a rec3=001 tail 0x2174ea1da866e7c4db4ae 0x42a00088462063c03