Theorem: SimpleGraph.Walk.IsTrail.even_countP_edges_iff
File: Mathlib/Combinatorics/SimpleGraph/Trails.lean

tactic: induction' p with u u v w huv p ih
state_before: V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v : V
p : G.Walk u v
ht : p.IsTrail
x : V
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ u ≠ v → x ≠ u ∧ x ≠ v
state_after: case nil
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u : V
ht : Walk.nil.IsTrail
⊢ Even (List.countP (fun e => decide (x ∈ e)) Walk.nil.edges) ↔ u ≠ u → x ≠ u ∧ x ≠ u

case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ih : p.IsTrail → (Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w)
ht : (cons huv p).IsTrail
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w

tactic: simp
state_before: case nil
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u : V
ht : Walk.nil.IsTrail
⊢ Even (List.countP (fun e => decide (x ∈ e)) Walk.nil.edges) ↔ u ≠ u → x ≠ u ∧ x ≠ u
state_after: no goals

tactic: rw [cons_isTrail_iff] at ht
state_before: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ih : p.IsTrail → (Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w)
ht : (cons huv p).IsTrail
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w
state_after: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ih : p.IsTrail → (Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w)
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w

tactic: specialize ih ht.1
state_before: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ih : p.IsTrail → (Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w)
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w
state_after: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w

tactic: simp only [List.countP_cons, Ne, edges_cons, Sym2.mem_iff]
state_before: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) (cons huv p).edges) ↔ u ≠ w → x ≠ u ∧ x ≠ w
state_after: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + if decide (x = u ∨ x = v) = true then 1 else 0) ↔
    ¬u = w → ¬x = u ∧ ¬x = w

tactic: split_ifs with h
state_before: case cons
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + if decide (x = u ∨ x = v) = true then 1 else 0) ↔
    ¬u = w → ¬x = u ∧ ¬x = w
state_after: case pos
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : decide (x = u ∨ x = v) = true
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w

case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : ¬decide (x = u ∨ x = v) = true
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 0) ↔ ¬u = w → ¬x = u ∧ ¬x = w

tactic: rw [decide_eq_true_eq] at h
state_before: case pos
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : decide (x = u ∨ x = v) = true
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w
state_after: case pos
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : x = u ∨ x = v
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w

tactic: obtain (rfl | rfl) := h
state_before: case pos
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : x = u ∨ x = v
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w
state_after: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬x = w → ¬x = x ∧ ¬x = w

case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w

tactic: rw [Nat.even_add_one, ih]
state_before: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬x = w → ¬x = x ∧ ¬x = w
state_after: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ ¬(v ≠ w → x ≠ v ∧ x ≠ w) ↔ ¬x = w → ¬x = x ∧ ¬x = w

tactic: simp only [huv.ne, imp_false, Ne, not_false_iff, true_and_iff, not_forall,
  Classical.not_not, exists_prop, eq_self_iff_true, not_true, false_and_iff,
  and_iff_right_iff_imp]
state_before: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ ¬(v ≠ w → x ≠ v ∧ x ≠ w) ↔ ¬x = w → ¬x = x ∧ ¬x = w
state_after: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ x = w → ¬v = w

tactic: rintro rfl rfl
state_before: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v w : V
p : G.Walk v w
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
huv : G.Adj x v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ x = w → ¬v = w
state_after: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ v : V
huv : G.Adj v v
p : G.Walk v v
ih : Even (List.countP (fun e => decide (v ∈ e)) p.edges) ↔ v ≠ v → v ≠ v ∧ v ≠ v
ht : p.IsTrail ∧ s(v, v) ∉ p.edges
⊢ False

tactic: exact G.loopless _ huv
state_before: case pos.inl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ v : V
huv : G.Adj v v
p : G.Walk v v
ih : Even (List.countP (fun e => decide (v ∈ e)) p.edges) ↔ v ≠ v → v ≠ v ∧ v ≠ v
ht : p.IsTrail ∧ s(v, v) ∉ p.edges
⊢ False
state_after: no goals

tactic: rw [Nat.even_add_one, ih, ← not_iff_not]
state_before: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 1) ↔ ¬u = w → ¬x = u ∧ ¬x = w
state_after: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ ¬¬(x ≠ w → x ≠ x ∧ x ≠ w) ↔ ¬(¬u = w → ¬x = u ∧ ¬x = w)

tactic: simp only [huv.ne.symm, Ne, eq_self_iff_true, not_true, false_and_iff, not_forall,
  not_false_iff, exists_prop, and_true_iff, Classical.not_not, true_and_iff, iff_and_self]
state_before: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ ¬¬(x ≠ w → x ≠ x ∧ x ≠ w) ↔ ¬(¬u = w → ¬x = u ∧ ¬x = w)
state_after: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ x = w → ¬u = w

tactic: rintro rfl
state_before: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u w : V
huv : G.Adj u x
p : G.Walk x w
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ w → x ≠ x ∧ x ≠ w
⊢ x = w → ¬u = w
state_after: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u : V
huv : G.Adj u x
p : G.Walk x x
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ x → x ≠ x ∧ x ≠ x
⊢ ¬u = x

tactic: exact huv.ne
state_before: case pos.inr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v x u : V
huv : G.Adj u x
p : G.Walk x x
ht : p.IsTrail ∧ s(u, x) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ x ≠ x → x ≠ x ∧ x ≠ x
⊢ ¬u = x
state_after: no goals

tactic: rw [decide_eq_true_eq, not_or] at h
state_before: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : ¬decide (x = u ∨ x = v) = true
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 0) ↔ ¬u = w → ¬x = u ∧ ¬x = w
state_after: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : ¬x = u ∧ ¬x = v
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 0) ↔ ¬u = w → ¬x = u ∧ ¬x = w

tactic: simp only [h.1, h.2, not_false_iff, true_and_iff, add_zero, Ne] at ih ⊢
state_before: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ v ≠ w → x ≠ v ∧ x ≠ w
h : ¬x = u ∧ ¬x = v
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges + 0) ↔ ¬u = w → ¬x = u ∧ ¬x = w
state_after: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
h : ¬x = u ∧ ¬x = v
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = w → ¬x = w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬u = w → ¬x = w

tactic: rw [ih]
state_before: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
h : ¬x = u ∧ ¬x = v
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = w → ¬x = w
⊢ Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬u = w → ¬x = w
state_after: case neg
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
h : ¬x = u ∧ ¬x = v
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = w → ¬x = w
⊢ ¬v = w → ¬x = w ↔ ¬u = w → ¬x = w

tactic: rintro h' h'' rfl
state_before: case neg.mpr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v w : V
huv : G.Adj u v
p : G.Walk v w
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
h : ¬x = u ∧ ¬x = v
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = w → ¬x = w
⊢ (¬u = w → ¬x = w) → ¬v = w → ¬x = w
state_after: case neg.mpr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v : V
huv : G.Adj u v
h : ¬x = u ∧ ¬x = v
p : G.Walk v x
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h' : ¬u = x → ¬x = x
h'' : ¬v = x
⊢ False

tactic: simp only [imp_false, eq_self_iff_true, not_true, Classical.not_not] at h'
state_before: case neg.mpr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v : V
huv : G.Adj u v
h : ¬x = u ∧ ¬x = v
p : G.Walk v x
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h' : ¬u = x → ¬x = x
h'' : ¬v = x
⊢ False
state_after: case neg.mpr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v : V
huv : G.Adj u v
h : ¬x = u ∧ ¬x = v
p : G.Walk v x
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h'' : ¬v = x
h' : u = x
⊢ False

tactic: cases h'
state_before: case neg.mpr
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u✝ v✝ x u v : V
huv : G.Adj u v
h : ¬x = u ∧ ¬x = v
p : G.Walk v x
ht : p.IsTrail ∧ s(u, v) ∉ p.edges
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h'' : ¬v = x
h' : u = x
⊢ False
state_after: case neg.mpr.refl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v : V
p : G.Walk v x
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h'' : ¬v = x
huv : G.Adj x v
h : ¬x = x ∧ ¬x = v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ False

tactic: simp only [not_true, and_false, false_and] at h
state_before: case neg.mpr.refl
V : Type u_1
G : SimpleGraph V
inst✝ : DecidableEq V
u v✝ x v : V
p : G.Walk v x
ih : Even (List.countP (fun e => decide (x ∈ e)) p.edges) ↔ ¬v = x → ¬x = x
h'' : ¬v = x
huv : G.Adj x v
h : ¬x = x ∧ ¬x = v
ht : p.IsTrail ∧ s(x, v) ∉ p.edges
⊢ False
state_after: no goals