Require Import word memory peripherals atari dragster. Definition this_is_a_dragster_rom (rom : ROM) : Prop (* The first half of the cartridge contains the code for Dragster. (Dragster is a 2K game, but there is 4K of memory available.) *) := fst rom = dragster_rom (* The reset vector points to 0xF000. *) /\ get rom (pushLow (false, pushLow (false, op0 true))) = op0 false /\ get rom (pushLow (true, pushLow (false, op0 true))) = concat (op0 (n := 4) false, op0 (n := 4) true). (* The theorem we want to prove. "Dragster cannot be beaten in fewer than 5.57 seconds." *) Definition speedrun_lower_bound : Prop := (* On any Dragster rom, *) forall rom, this_is_a_dragster_rom rom -> (* for any reachable state of the game, *) forall s : state rom, reachable s -> (* if the player has crossed the finish line, *) nat_of_word (get (RAM (Peripherals s)) (word_of_nat 0x3a)) > 0x60 -> (* then the timer shows at least 5.57 seconds. *) let '(digit1, digit2) := split (m := 4) (n := 4) (get (RAM (Peripherals s)) (word_of_nat 0x33)) in let '(digit3, digit4) := split (m := 4) (n := 4) (get (RAM (Peripherals s)) (word_of_nat 0x35)) in nat_of_word digit1 * 1000 + nat_of_word digit2 * 100 + nat_of_word digit3 * 10 + nat_of_word digit4 * 1 >= 557.