Documentation

Projects.Sokoban.Basic

theorem Sokoban.get_iff {s : State} {p : PointZ} {d : Tile} :
s.Get p d Map.get? p s.grid = some d
theorem Sokoban.get'_iff {s : State} {d : Tile} :
s.Get' d ∃ (p : PointZ), Map.get? p s.grid = some d
theorem Sokoban.State.Get.eq_of {s : State} {p : PointZ} {d₁ d₂ : Tile} (h₁ : s.Get p d₁) (h₂ : s.Get p d₂) :
d₁ = d₂
theorem Sokoban.State.Get.get' {s : State} {p : PointZ} {d : Tile} [hd : s.Get p d] :
s.Get' d
theorem Sokoban.State.Get.wf {s : State} {p : PointZ} {d : Tile} [hs : s.WF] [hd : s.Get p d] :
d.WF
theorem Sokoban.State.Get'.wf {s : State} {d : Tile} [hs : s.WF] [hd : s.Get' d] :
d.WF
theorem Sokoban.State.Get.mem {s : State} {p : PointZ} {d : Tile} [hd : s.Get p d] :
p s.grid
@[simp]
theorem Sokoban.width_movePlayer {s : State} {p₁ : PointZ} :
(s.movePlayer p₁).width = s.width
@[simp]
theorem Sokoban.height_movePlayer {s : State} {p₁ : PointZ} :
@[simp]
theorem Sokoban.player_movePlayer {s : State} {p₁ : PointZ} :
(s.movePlayer p₁).player = p₁
@[simp]
theorem Sokoban.width_moveBox {s : State} {p₁ p₂ : PointZ} :
(s.moveBox p₁ p₂).width = s.width
@[simp]
theorem Sokoban.height_moveBox {s : State} {p₁ p₂ : PointZ} :
(s.moveBox p₁ p₂).height = s.height
@[simp]
theorem Sokoban.player_moveBox {s : State} {p₁ p₂ : PointZ} :
(s.moveBox p₁ p₂).player = s.player
@[simp]
theorem Sokoban.mem_grid_movePlayer {s : State} {p₁ p : PointZ} :
p (s.movePlayer p₁).grid p s.grid
@[simp]
theorem Sokoban.mem_grid_moveBox {s : State} {p₁ p₂ p : PointZ} :
p (s.moveBox p₁ p₂).grid p s.grid
@[simp]
theorem Sokoban.get?_grid_movePlayer {s : State} {p₁ p : PointZ} :
Map.get? p (s.movePlayer p₁).grid = Option.map (fun (d : Tile) => if p₁ = p then { player := true, box := d.box, target := d.target, wall := d.wall } else if s.player = p then { player := false, box := d.box, target := d.target, wall := d.wall } else d) (Map.get? p s.grid)
@[simp]
theorem Sokoban.get?_grid_moveBox {s : State} {p₁ p₂ p : PointZ} :
Map.get? p (s.moveBox p₁ p₂).grid = Option.map (fun (d : Tile) => if p₂ = p then { player := d.player, box := true, target := d.target, wall := d.wall } else if p₁ = p then { player := d.player, box := false, target := d.target, wall := d.wall } else d) (Map.get? p s.grid)
@[simp]
theorem Sokoban.get_movePlayer {s : State} {p₁ p : PointZ} {d : Tile} :
(s.movePlayer p₁).Get p d ∃ (d' : Tile), s.Get p d' (if p₁ = p then { player := true, box := d'.box, target := d'.target, wall := d'.wall } else if s.player = p then { player := false, box := d'.box, target := d'.target, wall := d'.wall } else d') = d
@[simp]
theorem Sokoban.get_moveBox {s : State} {p₁ p₂ p : PointZ} {d : Tile} :
(s.moveBox p₁ p₂).Get p d ∃ (d' : Tile), s.Get p d' (if p₂ = p then { player := d'.player, box := true, target := d'.target, wall := d'.wall } else if p₁ = p then { player := d'.player, box := false, target := d'.target, wall := d'.wall } else d') = d
theorem Sokoban.moveBox_movePlayer {s : State} {p₁ p₂ p₃ : PointZ} :
(s.movePlayer p₁).moveBox p₂ p₃ = (s.moveBox p₂ p₃).movePlayer p₁
theorem Sokoban.movePlayer_moveBox {s : State} {p₁ p₂ p₃ : PointZ} :
(s.moveBox p₁ p₂).movePlayer p₃ = (s.movePlayer p₃).moveBox p₁ p₂
theorem Sokoban.tr_eq_some_iff {s s' : State} (t : Move) :
sys.tr s t = some s' have p_dif := Dir.point t; have p₁ := s.player + p_dif; have p₂ := p₁ + p_dif; have s₁ := s.movePlayer p₁; ∃ (d₁ : Tile), s.Get p₁ d₁ (!d₁.wall) = true if (!d₁.box) = true then s₁ = s' else ∃ (d₂ : Tile), s.Get p₂ d₂ d₂.box = false d₂.wall = false s₁.moveBox p₁ p₂ = s'
theorem Sokoban.State.Get.player_eq {s : State} {p : PointZ} {d : Tile} [hs : s.WF] (hd : s.Get p d) :
theorem Sokoban.State.Get.player_iff {s : State} {p : PointZ} {d : Tile} [hs : s.WF] (hd : s.Get p d) :
theorem Sokoban.State.Get.player_of_get_player {s : State} {d : Tile} [hs : s.WF] (hd : s.Get s.player d) :
@[simp]
@[simp]
theorem Sokoban.get?_grid_of_get {s : State} {p : PointZ} {d : Tile} [h : s.Get p d] :
@[simp]
theorem Sokoban.get!_grid_of_get {s : State} {p : PointZ} {d : Tile} [h : s.Get p d] :
@[simp]
theorem Sokoban.mem_grid_of_get {s : State} {p : PointZ} {d : Tile} [h : s.Get p d] :
p s.grid
@[simp]
theorem Sokoban.points_moveBox {s : State} {p₁ p₂ : PointZ} :
(s.moveBox p₁ p₂).points = s.points
@[simp]
theorem Sokoban.mem_points_of_get {s : State} {p : PointZ} {d : Tile} [h : s.Get p d] :
theorem Sokoban.mem_points_iff_exi_get {s : State} {p : PointZ} :
p s.points ∃ (d : Tile), s.Get p d
theorem Sokoban.boxes_moveBox {s : State} {p₁ p₂ : PointZ} {d₁ d₂ : Tile} [h₁ : s.Get p₁ d₁] [h₂ : s.Get p₂ d₂] :
(s.moveBox p₁ p₂).boxes = (s.boxes.erase p₁).insert p₂
theorem Sokoban.eq_of_get_and_get {s : State} {p : PointZ} {d₁ d₂ : Tile} [h₁ : s.Get p d₁] [h₂ : s.Get p d₂] :
d₁ = d₂
theorem Sokoban.size_boxes_moveBox {s : State} {p₁ p₂ : PointZ} {d₁ d₂ : Tile} [h₁ : s.Get p₁ d₁] [h₂ : s.Get p₂ d₂] (h₃ : d₁.box = true) (h₄ : d₂.box = false) :
(s.moveBox p₁ p₂).boxes.size = s.boxes.size
@[simp]
theorem Sokoban.box_get!_grid_movePlayer {s : State} {p p₁ : PointZ} :
(Map.get! p₁ (s.movePlayer p).grid).box = (Map.get! p₁ s.grid).box
@[simp]
@[simp]
@[simp]
theorem Sokoban.target_get!_grid_moveBox {s : State} {p₁ p₂ p : PointZ} :
(Map.get! p (s.moveBox p₁ p₂).grid).target = (Map.get! p s.grid).target
@[simp]
theorem Sokoban.targets_moveBox {s : State} {p₁ p₂ : PointZ} :
(s.moveBox p₁ p₂).targets = s.targets
theorem Sokoban.wf_of_reachable {s s' : State} [hs : s.WF] (hr : sys.Reachable s s') :
s'.WF
@[simp]
theorem Sokoban.player_mem {s : State} [hs : s.WF] :
theorem Sokoban.width_ne_zero {s : State} [hs : s.WF] :
theorem Sokoban.height_ne_zero {s : State} [hs : s.WF] :
theorem Sokoban.width_and_height_eq_of_reachable {s₀ s : State} [hs₀ : s₀.WF] (h : sys.Reachable s₀ s) :
s.width = s₀.width s.height = s₀.height
theorem Sokoban.width_eq_of_reachable {s₀ s : State} [hs₀ : s₀.WF] (h : sys.Reachable s₀ s) :
s.width = s₀.width
theorem Sokoban.height_eq_of_reachable {s₀ s : State} [hs₀ : s₀.WF] (h : sys.Reachable s₀ s) :
s.height = s₀.height
theorem Sokoban.mem_grid_iff_of_reachable {s₀ s : State} [hs₀ : s₀.WF] {p : PointZ} (h : sys.Reachable s₀ s) :
p s.grid p s₀.grid
theorem Sokoban.targets_eq_of_tr {s s' : State} {p : Move} (h : sys.tr s p = some s') :
theorem Sokoban.targets_eq_of_reachable {s s' : State} [hs : sys.WF s] (h : sys.Reachable s s') :
theorem Sokoban.size_boxes_eq_of_tr {s s' : State} {p : Move} (h : sys.tr s p = some s') :