# Zulip Chat Archive

## Stream: new members

### Topic: Well founded recursion

#### Fox Thomson (May 31 2020 at 19:32):

I'm currently trying to formalize things about impartial games and am having trouble using well founded recursion. I have defined a `subsequent`

relation similar to the ones on `pgame`

in mathlib and have shown it is well founded. To use it I have been showing that the appropriate things are subsequent and then writing `using_well_founded {dec_tac := tactic.assumption}`

. This has worked in a couple of proofs but has broken when I tried to show that P-positions (second player has a winning strategy) are not N-positions (first player has a winning strategy):

```
lemma p_imp_not_n : ∀ (G : pimpartial), p_position G → ¬ (n_position G)
| (mk 0 M) :=
begin
intro hpG,
rw zero_unique,
exact zero_not_n_position
end
| (mk (nat.succ n) M) :=
begin
intro hpG,
intro hnG,
unfold p_position at hpG,
unfold n_position at hnG,
cases hnG with i hnG',
have hpG' := hpG i,
cases hpG' with j hpG'',
have hnG'' := hnG' j,
-- For recursion
have h1 : (((mk (nat.succ n) M).move i).move j).subsequent ((mk (nat.succ n) M).move i), from subsequent.from_move ((mk (nat.succ n) M).move i) j,
have h2 : ((mk (nat.succ n) M).move i).subsequent (mk (nat.succ n) M), from subsequent.from_move (mk (nat.succ n) M) i,
have hwf : (((mk (nat.succ n) M).move i).move j).subsequent (mk n.succ M), from subsequent.from_trans (((mk n.succ M).move i).move j) ((mk n.succ M).move i) (mk n.succ M) h1 h2,
exact p_imp_not_n (((mk (nat.succ n) M).move i).move j) hpG'' hnG'',
end
using_well_founded {dec_tac := tactic.assumption}
```

This has an error saying that it could not find a well founded relation between `((mk (nat.succ n) M).move i).move j`

and `mk (nat.suc n) M`

and `hwf`

is not listed in the current state. Is there a better way to use well founded recursion and why is `hwf`

not in the current state?

#### Bryan Gin-ge Chen (Jun 01 2020 at 07:06):

Can you share a #mwe ?

#### Fox Thomson (Jun 01 2020 at 11:45):

```
universe u
inductive pimpartial : Type u
| mk : ∀ (n : ℕ), (fin n → pimpartial) → pimpartial
namespace pimpartial
-- Definitions to talk about moves
def moves : pimpartial → Type
| (mk n _) := fin n
def move : Π (G : pimpartial), G.moves → pimpartial
| (mk n M) i := M i
-- definitions of subsequent and proof it is well founded
inductive subsequent : pimpartial → pimpartial → Prop
| from_move : Π (G : pimpartial) (i : G.moves), subsequent (G.move i) G
| from_trans : Π (G H F : pimpartial), subsequent G H → subsequent H F → subsequent G F
theorem wf_subsequent : well_founded subsequent := sorry
instance : has_well_founded pimpartial :=
{ r := subsequent,
wf := wf_subsequent }
-- Definition using well founded recursion (works)
def p_position : pimpartial → Prop
| (mk 0 M) := true
| (mk (nat.succ n) M) :=
∀ (i : (mk (nat.succ n) M).moves), ∃ (j : ((mk (nat.succ n) M).move i).moves),
have hwf : (((mk (nat.succ n) M).move i).move j).subsequent (mk n.succ M), from sorry,
p_position (((mk (nat.succ n) M).move i).move j)
using_well_founded {dec_tac := tactic.assumption}
def n_position : pimpartial → Prop := sorry
-- Proof using well founded recursion (does not work)
lemma p_imp_not_n : ∀ (G : pimpartial), p_position G → ¬ (n_position G)
| (mk 0 M) := sorry
| (mk (nat.succ n) M) :=
begin
intro hpG,
intro hnG,
unfold p_position at hpG,
unfold n_position at hnG,
cases hnG with i hnG',
have hpG' := hpG i,
cases hpG' with j hpG'',
have hnG'' := hnG' j,
-- For recursion
have h1 : (((mk (nat.succ n) M).move i).move j).subsequent ((mk (nat.succ n) M).move i), from subsequent.from_move ((mk (nat.succ n) M).move i) j,
have h2 : ((mk (nat.succ n) M).move i).subsequent (mk (nat.succ n) M), from subsequent.from_move (mk (nat.succ n) M) i,
have hwf : (((mk (nat.succ n) M).move i).move j).subsequent (mk n.succ M), from subsequent.from_trans (((mk n.succ M).move i).move j) ((mk n.succ M).move i) (mk n.succ M) h1 h2,
exact p_imp_not_n (((mk (nat.succ n) M).move i).move j) hpG'' hnG'',
end
using_well_founded {dec_tac := tactic.assumption}
end pimpartial
```

#### Scott Morrison (Jun 01 2020 at 12:01):

@Fox Thomson, sorry, I don't have time to look at this now, but notice in `pgame.lean`

I used a more complicated tactic for proving well-founded-ness. Look for the line `using_well_founded { dec_tac := pgame_wf_tac }`

.

#### Scott Morrison (Jun 01 2020 at 12:01):

Not sure if that will help with your problem; I haven't read your code yet.

#### Fox Thomson (Jun 01 2020 at 20:26):

@Scott Morrison I've just tried using the tactic and it seems to be working now, thank you.

Last updated: Dec 20 2023 at 11:08 UTC