{-# OPTIONS --safe #-}
open import Level
open import Data.Product as Σ
open import Data.Sum as ⊎
open import Data.Nat
open import Data.Unit
open import Data.Empty
open import Function.Base
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary.Negation
open import Game-Basics
module Game-Definitions {ℓd : Level} (𝔻 : Set ℓd) (F : Game-Type) where
record GameSemantics : Setω where
field
F-map : Functorial F
⟦F_⟧ : {ℓr : Level} {R : Set ℓr} {ℓ : Level} {X : Set ℓ} → F R X → F R ((𝔻 → Set) × X)
proj₂∘⟦F⟧ : ∀ {ℓr : Level} {R : Set ℓr} {ℓ : Level} {X : Set ℓ} {query : F R X} → F-map proj₂ (⟦F query ⟧) ≡ query
_⊧F∀_ : {ℓr : Level} {R : Set ℓr} {ℓ ℓ' : Level} {X : Set ℓ} → F R X → (P : X → Set ℓ') → Set ℓ'
F∀-elim : {ℓr : Level} {R : Set ℓr} {ℓ ℓ' : Level} {X : Set ℓ} → (query : F R X) → {P : X → Set ℓ'} → query ⊧F∀ P → F R (Σ X P)
proj₁∘F∀elim : {ℓr : Level} {R : Set ℓr} {ℓ ℓ' : Level} {X : Set ℓ} → {query : F R X} → {P : X → Set ℓ'} → (res : query ⊧F∀ P) → F-map proj₁ (F∀-elim query res) ≡ query
Learnerδ : ∀ {ℓr : Level} (R : Set ℓr) {ℓc : Level} (C : Set ℓc) → Set (ℓr Level.⊔ ℓc)
Learnerδ R C = C → F R C
record Learner-on {ℓr : Level} (R : Set ℓr) {ℓ} (C : Set ℓ) : Set (ℓr Level.⊔ ℓ) where
field
δ : Learnerδ R C
record Learner (ℓ : Level) : Set (Level.suc ℓ) where
field
C : Set ℓ
R : Set ℓ
q₀ : C
learner-on : Learner-on R C
open Learner-on learner-on public
Teacherδ : ∀ {ℓt : Level} (T : Set ℓt) → Setω
Teacherδ T = ∀ {ℓr : Level} {R : Set ℓr} {ℓ : Level} {X : Set ℓ} → F R X → M R T X
module TeacherNaturality (F-map : Functorial F) where
TeacherIsNaturalFor : ∀ {ℓr : Level} {R : Set ℓr} {ℓt : Level} {T : Set ℓt} → Teacherδ T → {ℓ1 ℓ2 : Level} → {X : Set ℓ1} → {Y : Set ℓ2} → (f : X → Y) → Set _
TeacherIsNaturalFor {R = R} {T = T} δ {X = X} f = ∀ (q : F R X) → M-map f (δ q) ≗ δ (F-map f q)
TeacherIsNatural : ∀ {ℓt : Level} {T : Set ℓt} → Teacherδ T → Setω
TeacherIsNatural δ = ∀ {ℓr : Level} {R : Set ℓr} {ℓ1 ℓ2 : Level} → {X : Set ℓ1} → {Y : Set ℓ2}
→ (f : X → Y) → TeacherIsNaturalFor {R = R} δ f
record Teacher-on {ℓ} (T : Set ℓ) : Setω where
field
δ : Teacherδ T
natural : TeacherIsNatural δ
record Teacher (ℓ : Level) : Setω where
field
T : Set ℓ
st₀ : T
teacher-on : Teacher-on T
open Teacher-on teacher-on public
module Game (sem : GameSemantics) {ℓr : Level} {R : Set ℓr} {ℓ} {C : Set ℓ} {ℓt : Level} {T : Set ℓt} (teacher : Teacherδ T) (learner : Learnerδ R C) where
open GameSemantics sem
game-step : T × C → R ⊎ (T × C)
game-step (t , l) = teacher (learner l) t
game-step-prop : T × C → R ⊎ (T × (𝔻 → Set) × C)
game-step-prop (t , l) = teacher ⟦F learner l ⟧ t
still-possible : T × C → ℕ → (𝔻 → Set)
still-possible q ℕ.zero = λ x → ⊤
still-possible q (ℕ.suc r) =
case game-step-prop q of λ
{ (inj₁ ret) → (λ x → ⊥)
; (inj₂ (t' , _∈response , l')) →
λ x → x ∈response × still-possible (t' , l') r x
}
learner_finds_within_rounds : T × C → 𝔻 → ℕ → Set
learner q finds secret within ℕ.zero rounds = ⊥
learner q finds secret within ℕ.suc r rounds =
case game-step-prop q of λ
{ (inj₁ _) → ⊤
; (inj₂ (t' , _∈response , l')) →
secret ∈response
→ learner (t' , l') finds secret within r rounds
}
still-possible⇒¬finds : ∀ q r x → still-possible q r x → ¬ (learner q finds x within r rounds)
still-possible⇒¬finds q ℕ.zero x still-poss = λ ()
still-possible⇒¬finds q (ℕ.suc r) x still-poss with (game-step-prop q)
still-possible⇒¬finds q (ℕ.suc r) x (x∈resp , x-still-poss) | inj₂ (t' , _∈response , l') =
λ x∈resp⇒learner-guess → still-possible⇒¬finds (t' , l') r x x-still-poss (x∈resp⇒learner-guess x∈resp)
open TeacherNaturality F-map
proj∘game-step-prop : TeacherIsNatural teacher → (q : T × C) → game-step q ≡ ⊎.map₂ (Σ.map₂ proj₂) (game-step-prop q)
proj∘game-step-prop teacher-natural (t , l) =
begin
game-step (t , l) ≡⟨⟩
teacher (learner l) t ≡⟨ cong (λ - → teacher - t) proj₂∘⟦F⟧ ⟨
teacher (F-map proj₂ ⟦F learner l ⟧) t ≡⟨ teacher-natural proj₂ _ t ⟨
M-map proj₂ (teacher ⟦F learner l ⟧) t ≡⟨⟩
⊎.map₂ (Σ.map₂ proj₂) (game-step-prop (t , l))
∎
where
open ≡-Reasoning
module ExplicitWinningConditions
(sem : GameSemantics)
(F-map : Functorial F)
(ExplicitTeacher : (ℓt : Level) → Set (Level.suc ℓt))
(mkTeacher : ∀ {ℓt : Level} → ExplicitTeacher ℓt → TeacherNaturality.Teacher F-map ℓt)
where
open TeacherNaturality F-map
_learns_from_within_rounds : ∀ {ℓ} {ℓ'} → Learner ℓ → 𝔻 → ExplicitTeacher ℓ' → ℕ → Set
_learns_from_within_rounds learner secret teacher r =
learner teacher.st₀ , learner.q₀ finds secret within r rounds
where
module teacher = Teacher (mkTeacher (teacher))
module learner = Learner learner
open Game sem teacher.δ learner.δ
_defeats_with-bound_ : ∀ {ℓ} {ℓ'} → Learner ℓ → ExplicitTeacher ℓ' → (𝔻 → ℕ) → Set ℓd
_defeats_with-bound_ learner teacher bound =
∀ secret → learner learns secret from teacher within bound (secret) rounds
_can't-learn_from_within_rounds : ∀ {ℓ} {ℓ'} → Learner ℓ → 𝔻 → ExplicitTeacher ℓ' → ℕ → Set
_can't-learn_from_within_rounds learner secret teacher r =
still-possible (teacher.st₀ , learner.q₀) r secret
where
module teacher = Teacher (mkTeacher teacher)
module learner = Learner learner
open Game sem teacher.δ learner.δ