Section FG.
(* We tie it together *)
Fixpoint fg (n : nat) {struct n} : ((K1.knot -> K2.knot) * (K2.knot -> K1.knot)) :=
match n with
| 0 => (f_Z, g_Z)
| S n => match fg n with (fn, gn) => (f_Sn gn, g_Sn fn) end
end.
End FG.
(* Now for the main definitions and theorems *)
Definition f (k : K1.knot) : K2.knot := fst (fg (level k)) k.
Definition g (k : K2.knot) : K1.knot := snd (fg (level k)) k.
Definition fF : TF.F K1.predicate -> TF.F K2.predicate :=
f_F' g.
Definition gF : TF.F K2.predicate -> TF.F K1.predicate :=
g_F' f.

Lemma g_unsquash : forall k2 U2,
U2 = K2.unsquash k2 ->
K1.unsquash (g k2) = (fst U2, gF (snd U2)).