{-# OPTIONS --safe #-}
open import Level hiding (suc)
open import Data.Empty
open import Data.Unit
open import Data.Product
open import Data.Nat as ℕ hiding (_⊔_)
open import Data.Nat.Properties
open import Data.Nat.Logarithm
import Data.Nat.Properties as ℕ
open import Relation.Binary.PropositionalEquality.Core
open import NatLearning
open import Learner-Correctness ℕ F NatLearning-Semantics
open import Utils
module NatExamples.SimpleLogLearner where
bound : ℕ → ℕ
bound sec = 3 + ⌊log₂ sec ⌋ + ⌊log₂ sec ⌋
data SimpleLogLearner : Set where
[_,∞] : (n : ℕ) → SimpleLogLearner
[_,_] : (n : ℕ) → (m : ℕ) → SimpleLogLearner
_⊧_ : SimpleLogLearner → ℕ → Set
_⊧_ [ n ,∞] secret = n ≤ secret
_⊧_ [ n , m ] secret = n ≤ secret × secret ≤ m
q₀ : SimpleLogLearner
q₀ = [ 0 ,∞]
mid : ℕ → ℕ → ℕ
mid n m = ⌊ n + m /2⌋
δ : SimpleLogLearner → F ℕ SimpleLogLearner
δ [ n ,∞] = guess (1 + 2 * n) (1 + 2 * n) (λ
{ too-low → [ (2 * (suc n)) ,∞]
; too-high → [ n , (2 * n) ]
})
δ [ n , m ] = guess (mid n m) (mid n m) λ
{ too-low → [ suc (mid n m) , m ]
; too-high → [ n , pred (mid n m) ]
}
simple-bisect : Learner 0ℓ
simple-bisect = record
{ C = SimpleLogLearner
; R = ℕ
; q₀ = q₀
; learner-on = record { δ = δ }
}