Agda-2.3.2.2: examples/outdated-and-incorrect/Screen.agda
module Screen where
import Data.Nat
import Data.Bool
import Data.List
import Logic.Base
open Data.Bool
open Data.List
open Data.Nat
open Logic.Base
-- Ranges -----------------------------------------------------------------
data Range : Set where
range : Nat -> Nat -> Range
inRange : Range -> Nat -> Bool
inRange (range lo hi) x = lo ≤ x && x ≤ hi
low : Range -> Nat
low (range lo _) = lo
high : Range -> Nat
high (range _ hi) = hi
size : Range -> Nat
size (range lo hi) = suc hi - lo
enumerate : Range -> List Nat
enumerate (range lo hi) = enum lo hi
where
list : Nat -> Nat -> List Nat
list _ 0 = []
list k (suc n) = k :: list (suc k) n
enum : Nat -> Nat -> List Nat
enum lo hi = map (_+_ lo) (list 0 (suc hi - lo))
-- The screen example -----------------------------------------------------
xRange : Range
xRange = range 0 79
yRange : Range
yRange = range 0 24
screenRange : Range
screenRange = range 0xb8000 0xb87ff
-- Converting (x,y) to addr
plot : Nat -> Nat -> Nat
plot x y = low screenRange + x + size xRange * y
-- The property
forAll : Range -> (Nat -> Bool) -> Bool
forAll r p = foldr (\n b -> p n && b) true (enumerate r)
prop : Bool
prop = forAll xRange \x ->
forAll yRange \y ->
inRange screenRange (plot x y)
proof : IsTrue prop
proof = tt