-- Definitions fondamentales pour les bandits manchots (Lean 4 pur)
abbrev Real := Float
-- Un bras de bandit est caracterise par sa distribution de recompense
structure BanditArm where
name : String
trueMean : Real -- esperance de la recompense
deriving Repr
-- Instance de bandit : ensemble de bras avec facteur d'escompte
structure BanditInstance where
arms : Array BanditArm
discount : Real -- gamma in (0, 1)
deriving Repr
-- Politique : a chaque etape, choisir un bras
def Policy := Nat → Nat
-- Historique de recompenses pour un bras
def RewardHistory := List Real
-- Nombre de tirages d'un bras
def pullCount (h : RewardHistory) : Nat := h.length
-- Moyenne empirique (0 si historique vide)
def empiricalMean (h : RewardHistory) : Real :=
match h with
| [] => 0.0
| _ => h.foldl (· + ·) 0.0 / h.length.toFloat
-- Exemple : bandit a 2 bras
def exampleBandit : BanditInstance := {
arms := #[{ name := "Bras A", trueMean := 0.3 },
{ name := "Bras B", trueMean := 0.7 }],
discount := 0.95
}
#check BanditArm
#check BanditInstance
#check Policy
#eval s!"Bras : {exampleBandit.arms.toList.map (·.name)} | gamma = {exampleBandit.discount}"
-- Definitions fondamentales pour les bandits manchots (Lean 4 pur)
abbrev Real := Float
-- Un bras de bandit est caracterise par sa distribution de recompense
structure BanditArm where
name : String
trueMean : Real -- esperance de la recompense
deriving Repr
-- Instance de bandit : ensemble de bras avec facteur d'escompte
structure BanditInstance where
arms : Array BanditArm
discount : Real -- gamma in (0, 1)
deriving Repr
-- Politique : a chaque etape, choisir un bras
def Policy := Nat → Nat
-- Historique de recompenses pour un bras
def RewardHistory := List Real
-- Nombre de tirages d'un bras
def pullCount (h : RewardHistory) : Nat := h.length
-- Moyenne empirique (0 si historique vide)
def empiricalMean (h : RewardHistory) : Real :=
match h with
| [] => 0.0
| _ => h.foldl (· + ·) 0.0 / h.length.toFloat
-- Exemple : bandit a 2 bras
def exampleBandit : BanditInstance := {
arms := #[{ name := "Bras A", trueMean := 0.3 },
{ name := "Bras B", trueMean := 0.7 }],
discount := 0.95
}
--% env 0
Raw input
{"cmd": "-- Definitions fondamentales pour les bandits manchots (Lean 4 pur)\n\nabbrev Real := Float\n\n-- Un bras de bandit est caracterise par sa distribution de recompense\nstructure BanditArm where\n name : String\n trueMean : Real -- esperance de la recompense\n deriving Repr\n\n-- Instance de bandit : ensemble de bras avec facteur d'escompte\nstructure BanditInstance where\n arms : Array BanditArm\n discount : Real -- gamma in (0, 1)\n deriving Repr\n\n-- Politique : a chaque etape, choisir un bras\ndef Policy := Nat \u2192 Nat\n\n-- Historique de recompenses pour un bras\ndef RewardHistory := List Real\n\n-- Nombre de tirages d'un bras\ndef pullCount (h : RewardHistory) : Nat := h.length\n\n-- Moyenne empirique (0 si historique vide)\ndef empiricalMean (h : RewardHistory) : Real :=\n match h with\n | [] => 0.0\n | _ => h.foldl (\u00b7 + \u00b7) 0.0 / h.length.toFloat\n\n-- Exemple : bandit a 2 bras\ndef exampleBandit : BanditInstance := {\n arms := #[{ name := \"Bras A\", trueMean := 0.3 },\n { name := \"Bras B\", trueMean := 0.7 }],\n discount := 0.95\n}\n\n#check BanditArm\n#check BanditInstance\n#check Policy\n#eval s!\"Bras : {exampleBandit.arms.toList.map (\u00b7.name)} | gamma = {exampleBandit.discount}\""}
Raw output
{"messages":
[{"severity": "info",
"pos": {"line": 39, "column": 0},
"endPos": {"line": 39, "column": 6},
"data": "BanditArm : Type"},
{"severity": "info",
"pos": {"line": 40, "column": 0},
"endPos": {"line": 40, "column": 6},
"data": "BanditInstance : Type"},
{"severity": "info",
"pos": {"line": 41, "column": 0},
"endPos": {"line": 41, "column": 6},
"data": "Policy : Type"},
{"severity": "info",
"pos": {"line": 42, "column": 0},
"endPos": {"line": 42, "column": 5},
"data": "\"Bras : [Bras A, Bras B] | gamma = 0.950000\""}],
"env": 0}