{-# OPTIONS --safe #-}
open import Level
open import Data.Empty
open import Data.Nat as ℕ hiding (_⊔_)
open import Data.Nat.Properties as ℕ
open import Data.Product
open import Data.Maybe
open import Data.Product.Base as Σ
open import Data.Sum as ⊎
open import Data.Unit
open import Function.Base using (case_of_; id)
open import Relation.Binary.Definitions
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary.Negation
open import Utils
module NatLearning where
data WrongNat : Set where
too-high : WrongNat
too-low : WrongNat
data F {ℓr : Level} (R : Set ℓr) {ℓ : Level} (X : Set ℓ) : Set (ℓ ⊔ ℓr) where
guess : (hyp : ℕ) → (ret : R) → (next : WrongNat → X) → F R X
open import Game-Definitions ℕ F public
⟦WrongNat_⟧ : WrongNat → ℕ → ℕ → Set
⟦WrongNat_⟧ too-low hyp truth = hyp < truth
⟦WrongNat_⟧ too-high hyp truth = hyp > truth
module NatSem {ℓr : Level} {R : Set ℓr} where
⟦F_⟧ : {ℓ : Level} {X : Set ℓ} → F R X → F R ((ℕ → Set) × X)
⟦F_⟧ (guess hyp ret next) = guess hyp ret λ wn → ⟦WrongNat wn ⟧ hyp , next wn
F-map : {ℓ ℓ' : Level} {X : Set ℓ} {Y : Set ℓ'} → (f : X → Y) → F R X → F R Y
F-map f (guess hyp ret next) = guess hyp ret (λ r → f (next r))
proj₂∘⟦F⟧ : ∀ {ℓ : Level} {X : Set ℓ} {query : F R X} → F-map proj₂ (⟦F query ⟧) ≡ query
proj₂∘⟦F⟧ {query = guess hyp ret next} = refl
_⊧F∀_ : {ℓ ℓ' : Level} {X : Set ℓ} → F R X → (P : X → Set ℓ') → Set ℓ'
_⊧F∀_ (guess hyp ret next) P = ∀ resp → P (next resp)
F∀-elim : {ℓ ℓ' : Level} {X : Set ℓ} → (query : F R X) → {P : X → Set ℓ'} → query ⊧F∀ P → F R (Σ X P)
F∀-elim (guess hyp ret next) prop = guess hyp ret (λ resp → next resp , prop resp)
proj₁∘F∀elim : {ℓ ℓ' : Level} {X : Set ℓ} → {query : F R X} → {P : X → Set ℓ'} → (res : query ⊧F∀ P) → F-map proj₁ (F∀-elim query res) ≡ query
proj₁∘F∀elim {query = guess hyp ret next} _ = refl
open NatSem public
NatLearning-Semantics : GameSemantics
NatLearning-Semantics = record
{ ⟦F_⟧ = ⟦F_⟧
; F-map = F-map
; proj₂∘⟦F⟧ = proj₂∘⟦F⟧
; _⊧F∀_ = _⊧F∀_
; F∀-elim = F∀-elim
; proj₁∘F∀elim = proj₁∘F∀elim
}
NatTeacher-on : ∀ {ℓt : Level} (T : Set ℓt) → Set ℓt
NatTeacher-on T = (T → ℕ → Maybe (WrongNat × T))
record NatTeacher (ℓt : Level) : Set (Level.suc ℓt) where
field
T : Set ℓt
st₀ : T
δ : NatTeacher-on T
NatLearner : (ℓ : Level) → Set (Level.suc ℓ)
NatLearner = Learner
open TeacherNaturality F-map public
mkTeacherδ : ∀ {ℓt : Level} {T : Set ℓt} → NatTeacher-on T → Teacherδ T
mkTeacherδ f (guess hyp ret next) st =
case (f st hyp) of λ
{ nothing → inj₁ ret
; (just (wrong , st')) → inj₂ (st' , next wrong)
}
mkTeacherδ-IsNatural : ∀ {ℓt : Level} {T : Set ℓt} → (f : NatTeacher-on T) → TeacherIsNatural (mkTeacherδ f)
mkTeacherδ-IsNatural δ f (guess hyp ret next) st with (δ st hyp)
... | just x = refl
... | nothing = refl
mkTeacher-on : ∀ {ℓt : Level} {T : Set ℓt} → NatTeacher-on T → Teacher-on T
mkTeacher-on f = record { δ = mkTeacherδ f ; natural = mkTeacherδ-IsNatural f }
mkTeacher : ∀ {ℓt : Level} → NatTeacher ℓt → Teacher ℓt
mkTeacher teacher =
record { T = T ; st₀ = st₀ ; teacher-on = mkTeacher-on δ }
where open NatTeacher teacher
mkTeacher-on⁻¹ : ∀ {ℓt : Level} {T : Set ℓt} → Teacher-on T → NatTeacher-on T
mkTeacher-on⁻¹ teacher st hyp with (Teacher-on.δ teacher (guess hyp tt id) st)
... | inj₁ tt = nothing
... | inj₂ (st' , wn) = just (wn , st')
mkTeacher⁻¹ : ∀ {ℓt : Level} → Teacher ℓt → NatTeacher ℓt
mkTeacher⁻¹ teacher = record { T = T ; st₀ = st₀ ; δ = mkTeacher-on⁻¹ teacher-on }
where
open Teacher teacher
open ExplicitWinningConditions NatLearning-Semantics F-map NatTeacher mkTeacher public