Section Sn.
(* The inductive step.  To keep things simple, we will put definitions first. *)
Variable f : K1.knot -> K2.knot.
Variable g : K2.knot -> K1.knot.
Definition f_Sn (k1 : K1.knot) : K2.knot :=
match K1.unsquash k1 with
(n, F_p1) => K2.squash (n, f_F' g F_p1)
end.
Definition g_Sn (k2 : K2.knot) : K1.knot :=
match K2.unsquash k2 with
(n, F_p2) => K1.squash (n, g_F' f F_p2)
end.
(* Now we include details relevant to the proof of the inductive step. *)
Variable n : nat.
Variable iso1 : forall k, level k <= n -> (g oo f) k = k.
Variable iso2 : forall k, level k <= n -> (f oo g) k = k.
(* These two properties are enough to prove a bijection up to level k *)
(* Now we show that k1_pred and k2_pred are the identity under approximation. *)
(* Not clear that we need this. *)
(* Lemma k1_pred_iso: K1.approx (n+1) oo k1_pred = K1.approx (n+1).  Lemma k2_pred_iso: K2.approx (n+1) oo k2_pred = K2.approx (n+1). *)
(* What we would like to show next is that f and g preserve the level of the knot, even in their (unfortunately non-unique over level n) inverses. Unfortunately, this is not possible:  Lemma f_level: forall k, K1.level k = K2.level (f k).  This is clearly impossible since we don't know anything about the behavior of f for knots above level n.  Actually, even this weaker version is not provable:  Lemma f_level: forall k, (K1.level k <= n \/ K2.level (f k) <= n) -> K1.level k = K2.level (f k).  Counterexample: K1.knot = K2.knot = nat; K1.level = K2.level = id; f = inc, g = dec; *)
(* So we must assert them as axioms, which means a bigger induction *)
Variable f_level: forall k, level k = level (f k).
Variable g_level: forall k, level k = level (g k).
(* Finally, we must show that f_Sn preserves unsquashing. *)
Variable fn_unsquash : forall k1,
level k1 <= n ->
forall U1,
U1 = K1.unsquash k1 ->
K2.unsquash (f k1) = (fst U1, f_F' g (snd U1)).

Lemma gn_unsquash : forall k2,
level k2 <= n ->
forall U2,
U2 = K2.unsquash k2 ->
K1.unsquash (g k2) = (fst U2, g_F' f (snd U2)).