1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- {-
- Types Summer School 2007
- Bertinoro
- Aug 19 - 31, 2007
- Agda
- Ulf Norell
- -}
- module Filter where
- open import Nat
- data Bool : Set where
- false : Bool
- true : Bool
- infixr 40 _::_
- data List (A : Set) : Set where
- [] : List A
- _::_ : A -> List A -> List A
- filter : {A : Set} -> (A -> Bool) -> List A -> List A
- filter p [] = []
- filter p (x :: xs) with p x
- filter p (x :: xs) | true = x :: filter p xs
- filter p (x :: xs) | false = filter p xs
- infix 20 _⊆_
- data _⊆_ {A : Set} : List A -> List A -> Set where
- stop : [] ⊆ []
- drop : forall {xs y ys} -> xs ⊆ ys -> xs ⊆ y :: ys
- keep : forall {x xs ys} -> xs ⊆ ys -> x :: xs ⊆ x :: ys
- subset : {A : Set}(p : A -> Bool)(xs : List A) -> filter p xs ⊆ xs
- subset p [] = stop
- subset p (x :: xs) with p x
- ... | true = keep (subset p xs)
- ... | false = drop (subset p xs)
- {-
- subset p (x :: xs) with p x
- subset p (x :: xs) | true = keep (subset p xs)
- subset p (x :: xs) | false = drop (subset p xs)
- -}
|