Definition f_F' : TF.F K1.predicate -> TF.F K2.predicate :=
fmap F f_pred'.
Definition g_F' : TF.F K2.predicate -> TF.F K1.predicate :=
fmap F g_pred'.
End Common.
Section Z.
(* The base case.  To keep things simple, we will put definitions first. *)
Definition fZ_pred (p2 : K2.predicate) : K1.predicate :=
fun k1 => T_bot.
Definition gZ_pred (p1 : K1.predicate) : K2.predicate :=
fun k2 => T_bot.
Definition fF_Z : TF.F K1.predicate -> TF.F K2.predicate :=
fmap F gZ_pred.
Definition gF_Z : TF.F K2.predicate -> TF.F K1.predicate :=
fmap F fZ_pred.
Definition f_Z (k1 : K1.knot) : K2.knot :=
match K1.unsquash k1 with
(n, F_p1) => K2.squash (n, fF_Z F_p1)
end.
Definition g_Z (k2 : K2.knot) : K1.knot :=
match K2.unsquash k2 with
(n, F_p2) => K1.squash (n, gF_Z F_p2)
end.

(* We must also prove that f_Sn and g_Sn preserve the level property. *)
Lemma f_level_Z: forall k, level k = level (f_Z k).