DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦c1e722358⟧ Ada Source

    Length: 5120 (0x1400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Moving_Guru_Rule, seg_02d0d7, seg_02d123, seg_0399ec, seg_03b93a, seg_03c0b2, seg_03c51d, seg_03c6c4, seg_03c9f9, seg_04a9d2, seg_04b43e, separate Towers_Of_Hanoi_Rules_For_Graphic

Derivation

└─⟦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⟧ 

E3 Source Code



separate (Towers_Of_Hanoi_Rules_For_Graphic)
package body Moving_Guru_Rule is

    function Premiss return Fact_Queries is
        The_Priority    : constant Alias.Name := Alias.P;
        The_Source      : constant Alias.Name := Alias.S;
        The_Destination : constant Alias.Name := Alias.D;
        The_Level       : constant Alias.Name := Alias.L;
    begin
        return (Movements.Exist ((Count      => Is_Equal (1),
                                  Priority   => Define_As (The_Priority),
                                  From_Tower => Define_As (The_Source),
                                  To_Tower   => Define_As (The_Destination))),

                Towers.Exist ((Location   => Is_Equal (The_Source),
                               Disk_Count => Is_Greater (0) and
                                                Define_As (The_Level))),

                Towers.Exist ((Location   => Is_Equal (The_Destination),
                               Disk_Count => Is_Any)),

                Disks.Exist ((Tower => Is_Equal (The_Source),
                              Level => Is_Equal (The_Level),
                              Size  => Is_Any)),

                Movements.Absent ((Priority => Is_Greater (The_Priority),
                                   From_Tower | To_Tower | Count => Is_Any)));
    end Premiss;

    procedure Action (The_Facts : Fact_Collection) is
        The_Movement             : Fact_Name renames The_Facts (1);  
        The_Source               : Fact_Name renames The_Facts (2);  
        The_Destination          : Fact_Name renames The_Facts (3);  
        The_Disk                 : Fact_Name renames The_Facts (4);
        The_Disk_Count           : Natural;
        The_Destination_Location : Natural;
    begin
        The_Disk_Count := Towers.Get (The_Source, Disk_Count);
        Towers.Change (The_Source, Disk_Count, The_Disk_Count - 1);
        Delete_Disk (For_Needle => Towers.Get (The_Source, Location),
                     The_Disk   => Disks.Get (The_Disk, Level),
                     Its_Size   => Disks.Get (The_Disk, Size));

        The_Disk_Count := Towers.Get (The_Destination, Disk_Count);
        Towers.Change (The_Destination, Disk_Count, The_Disk_Count + 1);
        Print_Disk (For_Needle => Towers.Get (The_Destination, Location),
                    The_Disk   => The_Disk_Count + 1,
                    Its_Size   => Disks.Get (The_Disk, Size));

        The_Destination_Location := Towers.Get (The_Destination, Location);
        Disks.Change (The_Disk, Tower, The_Destination_Location);
        Disks.Change (The_Disk, Level, The_Disk_Count + 1);

        Movements.Delete (The_Movement);
        delay 0.5;

    end Action;

end Moving_Guru_Rule;

E3 Meta Data

    nblk1=4
    nid=0
    hdr6=8
        [0x00] rec0=15 rec1=00 rec2=01 rec3=058
        [0x01] rec0=01 rec1=00 rec2=02 rec3=000
        [0x02] rec0=14 rec1=00 rec2=04 rec3=008
        [0x03] rec0=14 rec1=00 rec2=03 rec3=000
    tail 0x21526158484154d6001b4 0x42a00088462063c03